fb2xml.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "fb2xml.hpp"
  2. #include <QtDebug>
  3. //---------------------------------------------------------------------------
  4. // FbXmlHandler::NodeHandler
  5. //---------------------------------------------------------------------------
  6. QString FbXmlHandler::NodeHandler::Value(const QXmlStreamAttributes &attributes, const QString &name)
  7. {
  8. for (const auto& attr : attributes) {
  9. if (attr.name().compare(name, Qt::CaseInsensitive) == 0) {
  10. return attr.value().toString();
  11. }
  12. }
  13. return QString();
  14. }
  15. bool FbXmlHandler::NodeHandler::doStart(const QString &name, const QXmlStreamAttributes &attributes)
  16. {
  17. if (m_handler) return m_handler->doStart(name, attributes);
  18. m_handler = NewTag(name, attributes);
  19. if (m_handler) {
  20. if (m_handler->m_closed) {
  21. delete m_handler;
  22. m_handler = NULL;
  23. }
  24. return true;
  25. }
  26. m_handler = new NodeHandler(name);
  27. return true;
  28. }
  29. bool FbXmlHandler::NodeHandler::doText(const QString &text)
  30. {
  31. if (m_handler) m_handler->doText(text); else TxtTag(text);
  32. return true;
  33. }
  34. bool FbXmlHandler::NodeHandler::doEnd(const QString &name, bool & exists)
  35. {
  36. if (m_handler) {
  37. bool found = exists || name == m_name;
  38. m_handler->doEnd(name, found);
  39. if (m_handler->m_closed) { delete m_handler; m_handler = NULL; }
  40. if (found) { exists = true; return true; }
  41. }
  42. bool found = name == m_name;
  43. m_closed = found || exists;
  44. if (m_closed) EndTag(m_name);
  45. exists = found;
  46. return true;
  47. }
  48. //---------------------------------------------------------------------------
  49. // FbXmlHandler
  50. //---------------------------------------------------------------------------
  51. FbXmlHandler::FbXmlHandler()
  52. : QObject()
  53. , m_handler(0)
  54. {
  55. }
  56. FbXmlHandler::~FbXmlHandler()
  57. {
  58. if (m_handler) delete m_handler;
  59. }
  60. bool FbXmlHandler::startElement(const QString &, const QString &, const QString &qName, const QXmlStreamAttributes &attributes)
  61. {
  62. const QString name = qName.toLower();
  63. if (m_handler) return m_handler->doStart(name, attributes);
  64. m_handler = CreateRoot(name, attributes);
  65. return m_handler;
  66. }
  67. bool FbXmlHandler::isWhiteSpace(const QString &str)
  68. {
  69. return str.simplified().isEmpty();
  70. }
  71. bool FbXmlHandler::characters(const QString &str)
  72. {
  73. QString s = str.simplified();
  74. if (s.isEmpty()) return true;
  75. if (isWhiteSpace(str.left(1))) s.prepend(" ");
  76. if (isWhiteSpace(str.right(1))) s.append(" ");
  77. return m_handler && m_handler->doText(s);
  78. }
  79. bool FbXmlHandler::endElement(const QString & namespaceURI, const QString & localName, const QString &qName)
  80. {
  81. Q_UNUSED(namespaceURI);
  82. Q_UNUSED(localName);
  83. bool found = false;
  84. return m_handler && m_handler->doEnd(qName.toLower(), found);
  85. }
  86. bool FbXmlHandler::warning(const QString &msg, int row, int col)
  87. {
  88. emit warning(row, col, msg);
  89. return true;
  90. }
  91. bool FbXmlHandler::error(const QString &msg, int row, int col)
  92. {
  93. emit error(row, col, msg);
  94. return false;
  95. }
  96. bool FbXmlHandler::fatalError(const QString &msg, int row, int col)
  97. {
  98. emit fatal(row, col, msg);
  99. return false;
  100. }
  101. QString FbXmlHandler::errorString() const
  102. {
  103. return m_error;
  104. }