logo

libbulletml

Library of Bullet Markup Language (forked from https://shinh.skr.jp/libbulletml/index_en.html )git clone https://hacktivis.me/git/libbulletml.git

bulletmlparser-ygg.cpp (2252B)


  1. #include "bulletmlparser.h"
  2. #include "bulletmlparser-ygg.h"
  3. #include "bulletmlerror.h"
  4. #include "bulletmltree.h"
  5. #include "ygg/ygg.h"
  6. #include <string>
  7. #include <cstdio>
  8. using namespace yggdrasil;
  9. void BulletMLParserYggdrasil::on_error(yggdrasil::ygg_error* parse_error) {
  10. if (parse_error->is_error()) {
  11. char buf[2000];
  12. sprintf(buf,
  13. "BulletML sox error !!!\n"
  14. "\tlocation %d:%d\n"
  15. "\tcode %02x:%02x:%02x:%02x\n"
  16. "\tmessage %s\n",
  17. parse_error->get_line(),
  18. parse_error->get_row(),
  19. parse_error->get_genre(),
  20. parse_error->get_category(),
  21. parse_error->get_sequence(),
  22. parse_error->get_sequence_case(),
  23. parse_error->get_message().c_str());
  24. throw BulletMLError(buf);
  25. }
  26. }
  27. void BulletMLParserYggdrasil::start_document(yggdrasil::ygg_node) {
  28. }
  29. void BulletMLParserYggdrasil::end_document(yggdrasil::ygg_node&) {
  30. }
  31. void BulletMLParserYggdrasil::start_element(yggdrasil::ygg_node element) {
  32. BulletMLNode* xmlNode = addContent(trimString(element.get_name()));
  33. if (xmlNode->getName() != BulletMLNode::bulletml) {
  34. MyAttributes mattr;
  35. for (ygg_iterator ite = element["@*"].begin(); ite.is_not_end(); ++ite)
  36. {
  37. mattr.push_back(trimString(ite->get_name()));
  38. mattr.push_back(trimString(ite->get_value()));
  39. }
  40. if (!mattr.empty()) addAttribute(mattr, xmlNode);
  41. if (curNode_ != 0) curNode_->addChild(xmlNode);
  42. }
  43. curNode_ = xmlNode;
  44. }
  45. void BulletMLParserYggdrasil::end_element(yggdrasil::ygg_node element) {
  46. // @todo if (element.get_name() != curNode_
  47. if (curNode_ != 0) curNode_ = curNode_->getParent();
  48. }
  49. void BulletMLParserYggdrasil::catch_text(yggdrasil::ygg_node text) {
  50. curNode_->setValue(trimString(text.get_text()));
  51. }
  52. BulletMLParserYggdrasil::BulletMLParserYggdrasil(const char* filename)
  53. : curNode_(0)
  54. {
  55. setName(filename);
  56. }
  57. BulletMLParserYggdrasil::~BulletMLParserYggdrasil() {}
  58. void BulletMLParserYggdrasil::parse() {
  59. std::string f(name_);
  60. sox_file(f).read(this);
  61. }
  62. std::string BulletMLParserYggdrasil::trimString(const std::string& str) {
  63. std::string ret(str);
  64. if (!ret.empty() && ret[0] == ' ')
  65. ret.erase(0, ret.find_first_not_of(' '));
  66. if (!ret.empty() && ret[str.length()-1] == ' ')
  67. ret.erase(ret.find_last_not_of(' ') + 1);
  68. return ret;
  69. }