1
0

fb2xml.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "fb2xml.h"
  2. #include <QtDebug>
  3. //---------------------------------------------------------------------------
  4. // Fb2XmlHandler::NodeHandler
  5. //---------------------------------------------------------------------------
  6. bool Fb2XmlHandler::NodeHandler::doStart(const QString &name, const QXmlAttributes &attributes)
  7. {
  8. if (m_handler) return m_handler->doStart(name, attributes);
  9. m_handler = NewTag(name, attributes); if (m_handler) return true;
  10. // qCritical() << QObject::tr("Unknown XML child tag: <%1> <%2>").arg(m_name).arg(name);
  11. m_handler = new NodeHandler(name);
  12. return true;
  13. }
  14. bool Fb2XmlHandler::NodeHandler::doText(const QString &text)
  15. {
  16. if (m_handler) m_handler->doText(text); else TxtTag(text);
  17. return true;
  18. }
  19. bool Fb2XmlHandler::NodeHandler::doEnd(const QString &name, bool & exists)
  20. {
  21. if (m_handler) {
  22. bool found = exists || name == m_name;
  23. m_handler->doEnd(name, found);
  24. if (m_handler->m_closed) { delete m_handler; m_handler = NULL; }
  25. if (found) { exists = true; return true; }
  26. }
  27. bool found = name == m_name;
  28. if (!found) qCritical() << QObject::tr("Conglict XML tags: <%1> </%2>").arg(m_name).arg(name);
  29. m_closed = found || exists;
  30. if (m_closed) EndTag(m_name);
  31. exists = found;
  32. return true;
  33. }
  34. //---------------------------------------------------------------------------
  35. // Fb2XmlHandler
  36. //---------------------------------------------------------------------------
  37. Fb2XmlHandler::Fb2XmlHandler()
  38. : QXmlDefaultHandler()
  39. , m_handler(0)
  40. {
  41. }
  42. Fb2XmlHandler::~Fb2XmlHandler()
  43. {
  44. if (m_handler) delete m_handler;
  45. }
  46. bool Fb2XmlHandler::startElement(const QString & namespaceURI, const QString & localName, const QString &qName, const QXmlAttributes &attributes)
  47. {
  48. Q_UNUSED(namespaceURI);
  49. Q_UNUSED(localName);
  50. const QString name = qName.toLower();
  51. if (m_handler) return m_handler->doStart(name, attributes);
  52. return m_handler = CreateRoot(name);
  53. }
  54. static bool isWhiteSpace(const QString &str)
  55. {
  56. return str.simplified().isEmpty();
  57. }
  58. bool Fb2XmlHandler::characters(const QString &str)
  59. {
  60. QString s = str.simplified();
  61. if (s.isEmpty()) return true;
  62. if (isWhiteSpace(str.left(1))) s.prepend(" ");
  63. if (isWhiteSpace(str.right(1))) s.append(" ");
  64. return m_handler && m_handler->doText(s);
  65. }
  66. bool Fb2XmlHandler::endElement(const QString & namespaceURI, const QString & localName, const QString &qName)
  67. {
  68. Q_UNUSED(namespaceURI);
  69. Q_UNUSED(localName);
  70. bool found = false;
  71. return m_handler && m_handler->doEnd(qName.toLower(), found);
  72. }
  73. bool Fb2XmlHandler::fatalError(const QXmlParseException &exception)
  74. {
  75. qCritical() << QObject::tr("Parse error at line %1, column %2: %3")
  76. .arg(exception.lineNumber())
  77. .arg(exception.columnNumber())
  78. .arg(exception.message());
  79. return false;
  80. }
  81. QString Fb2XmlHandler::errorString() const
  82. {
  83. return m_error;
  84. }