]> Git trees. - libqmvoc.git/commitdiff
New readers for Pauker and xdxf based on QXmlStreamReader.
authorPeter Hedlund <peter@peterandlinda.com>
Tue, 1 May 2007 21:26:15 +0000 (21:26 +0000)
committerPeter Hedlund <peter@peterandlinda.com>
Tue, 1 May 2007 21:26:15 +0000 (21:26 +0000)
svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=660184

kdeeducore/keduvocdocument.cpp
kdeeducore/keduvocpaukerreader.cpp
kdeeducore/keduvocpaukerreader.h
kdeeducore/keduvocxdxfreader.cpp
kdeeducore/keduvocxdxfreader.h

index bb83d96ab51042536b1aa75029eb2c4efc0b1c0c..4de1e6d6129ff6a1b5d363cf0cc6f24ae5c46c93 100644 (file)
@@ -277,11 +277,11 @@ bool KEduVocDocument::open(const KUrl& url)
 
       case pauker:
       {
-        KEduVocPaukerReader paukerReader(f);
+        KEduVocPaukerReader paukerReader(this);
         d->m_url.setFileName(i18n("Untitled"));
-        read = paukerReader.readDoc(this);
+        read = paukerReader.read(f);
         if (!read)
-          errorMessage = paukerReader.errorMessage();
+          errorMessage = i18n("Parse error at line %1, column %2:\n%3", paukerReader.lineNumber(), paukerReader.columnNumber(), paukerReader.errorString());
       }
       break;
 
@@ -306,11 +306,11 @@ bool KEduVocDocument::open(const KUrl& url)
 
       case xdxf:
       {
-        KEduVocXdxfReader xdxfReader(f);
+        KEduVocXdxfReader xdxfReader(this);
         d->m_url.setFileName(i18n("Untitled"));
-        read = xdxfReader.readDoc(this);
+        read = xdxfReader.read(f);
         if (!read)
-          errorMessage = xdxfReader.errorMessage();
+          errorMessage = i18n("Parse error at line %1, column %2:\n%3", xdxfReader.lineNumber(), xdxfReader.columnNumber(), xdxfReader.errorString());
       }
       break;
 
@@ -326,7 +326,7 @@ bool KEduVocDocument::open(const KUrl& url)
     QApplication::restoreOverrideCursor();
 
     if (!read) {
-      QString msg = i18n("Could not open \"%1\"\n(Error reported: %2)", url.path(), errorMessage);
+      QString msg = i18n("Could not open or properly read \"%1\"\n(Error reported: %2)", url.path(), errorMessage);
       KMessageBox::error(0, msg, i18n("Error Opening File"));
     }
 
index 3f13f645159907d59f6dd10a212a864c16e681f0..064783c28c9382817be4034677ee5463b8adffcc 100644 (file)
  *                                                                         *
  ***************************************************************************/
 
+#include "keduvocpaukerreader.h"
+
 #include <QIODevice>
 
-#include <klocale.h>
+#include <KLocale>
 
-#include "keduvocpaukerreader.h"
 #include "keduvocexpression.h"
 #include "keduvocdocument.h"
 
-KEduVocPaukerReader::KEduVocPaukerReader(QIODevice * file)
+KEduVocPaukerReader::KEduVocPaukerReader(KEduVocDocument * doc)
 {
-  // the file must be already open
-  m_inputFile = file;
-  m_errorMessage = "";
+    m_doc = doc;
 }
 
 
-bool KEduVocPaukerReader::readDoc(KEduVocDocument * doc)
+bool KEduVocPaukerReader::read(QIODevice * device)
 {
-  m_doc = doc;
-  QString front;
-  QString back;
-
-  QDomDocument domDoc("Pauker");
-  if (!domDoc.setContent(m_inputFile, &m_errorMessage))
-    return false;
-
-  QDomElement description = domDoc.documentElement().firstChildElement("Description");
-  if(!description.isNull())
-    m_doc->setDocumentRemark(description.text());
-
-  QDomNodeList entries = domDoc.elementsByTagName("Card");
-
-  if (entries.count() <= 0) {
-    m_errorMessage = i18n("Error while reading file");
-    return false;
-  }
-
-  m_doc->setAuthor("http://pauker.sf.net");
-  ///Pauker does not provide any column titles
-  m_doc->appendIdentifier(i18n("Front Side"));
-  m_doc->appendIdentifier(i18n("Reverse Side"));
-
-  for (int i = 0; i < entries.count(); i++) {
-    QDomNode entry = entries.at(i);
-    if(!entry.isNull()) {
-      front = cardText(entry, "FrontSide");
-      back = cardText(entry, "ReverseSide");
-      KEduVocExpression expr = KEduVocExpression(front);
-      expr.setTranslation(1, back);
-      m_doc->appendEntry(&expr);
+    setDevice(device);
+
+    while (!atEnd()) {
+        readNext();
+
+        if (isStartElement()) {
+            if (name() == "Lesson")
+                readPauker();
+            else
+                raiseError(i18n("This is not a Pauker document"));
+        }
     }
-  }
-  return true;
+
+    return !error();
 }
 
 
-QString KEduVocPaukerReader::cardText(const QDomNode & entry, const QString & tagName) const
+void KEduVocPaukerReader::readUnknownElement()
 {
-  QDomElement element = entry.firstChildElement(tagName);
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement())
+            readUnknownElement();
+    }
+}
 
-  if(!element.isNull())
-    return element.text();
-  else
-    return QString();
+
+void KEduVocPaukerReader::readPauker()
+{
+    m_doc->setAuthor("http://pauker.sf.net");
+    ///Pauker does not provide any column titles
+    m_doc->appendIdentifier(i18n("Front Side"));
+    m_doc->appendIdentifier(i18n("Reverse Side"));
+
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement()) {
+            if (name() == "Description")
+                m_doc->setDocumentRemark(readElementText());
+            else if (name() == "Batch")
+                readBatch();
+            else
+                readUnknownElement();
+        }
+    }
 }
 
+
+void KEduVocPaukerReader::readBatch()
+{
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement()) {
+            if (name() == "Card")
+                readCard();
+            else
+                readUnknownElement();
+        }
+    }
+}
+
+
+void KEduVocPaukerReader::readCard()
+{
+    QString front;
+    QString back;
+
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement()) {
+            if (name() == "FrontSide")
+                front = readText();
+            else if (name() == "ReverseSide")
+                back = readText();
+            else
+                readUnknownElement();
+        }
+    }
+
+    KEduVocExpression expr = KEduVocExpression(front);
+    expr.setTranslation(1, back);
+    m_doc->appendEntry(&expr);
+}
+
+
+QString KEduVocPaukerReader::readText()
+{
+    QString result;
+
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement()) {
+            if (name() == "Text")
+                result = readElementText();
+            else
+                readUnknownElement();
+        }
+    }
+    return result;
+}
index 1b2b5c7cea937fe2c6ca703b7235647af2841945..32a6a5d21c43e7d0c78c233baf5fda2313898b21 100644 (file)
 #ifndef KEDUVOCPAUKERREADER_H
 #define KEDUVOCPAUKERREADER_H
 
-#include <QtXml>
+#include <QXmlStreamReader>
 
 class QIODevice;
 class KEduVocDocument;
 
-class KEduVocPaukerReader : public QObject
+class KEduVocPaukerReader : public QXmlStreamReader
 {
 public:
-  KEduVocPaukerReader(QIODevice *file);
+    KEduVocPaukerReader(KEduVocDocument *doc);
 
-  bool readDoc(KEduVocDocument *doc);
-
-  QString errorMessage() const {return m_errorMessage;}
+    bool read(QIODevice *device);
 
 private:
-  QString cardText(const QDomNode &entry, const QString &tagName) const;
+    void readUnknownElement();
+    void readPauker();
+    void readBatch();
+    void readCard();
+    QString readText();
 
-  QIODevice *m_inputFile;
-  KEduVocDocument *m_doc;
-  QString m_errorMessage;
+    KEduVocDocument *m_doc;
 };
 
 #endif
index 7a1d8d76bdafceff4bb63901411470abe140a392..5e69f3083460a5f108b35571d06356cd8c03247f 100644 (file)
  *                                                                         *
  ***************************************************************************/
 
+#include "keduvocxdxfreader.h"
+
 #include <QIODevice>
 
-#include <klocale.h>
+#include <KLocale>
 
-#include "keduvocxdxfreader.h"
 #include "keduvocexpression.h"
 #include "keduvocdocument.h"
 
-KEduVocXdxfReader::KEduVocXdxfReader(QIODevice * file)
+KEduVocXdxfReader::KEduVocXdxfReader(KEduVocDocument *doc)
 {
-  // the file must be already open
-  m_inputFile = file;
-  m_errorMessage = "";
+    m_doc = doc;
 }
 
 
-bool KEduVocXdxfReader::readDoc(KEduVocDocument * doc)
+bool KEduVocXdxfReader::read(QIODevice *device)
 {
-  m_doc = doc;
-  QString front;
-  QString back;
-
-  QDomDocument domDoc("XDXF");
-  if (!domDoc.setContent(m_inputFile, &m_errorMessage))
-    return false;
-
-  if (domDoc.doctype().name() != "xdxf") {
-    m_errorMessage = i18n("This is not a XDXF document");
-    return false;
-  }
-
-  QDomElement description = domDoc.documentElement().firstChildElement("description");
-  if(!description.isNull())
-    m_doc->setDocumentRemark(description.text());
-
-  QDomElement title = domDoc.documentElement().firstChildElement("full_name");
-  if(!title.isNull())
-    m_doc->setTitle(title.text());
-
-  ///The language attributes are required and should be ISO 639-2 codes, but you never know...
-  QDomAttr id1 = domDoc.documentElement().attributeNode("lang_from");
-  if(!id1.isNull())
-    m_doc->appendIdentifier(id1.value().toLower());
-  else
-    m_doc->appendIdentifier(i18n("Original"));
-
-  QDomAttr id2 = domDoc.documentElement().attributeNode("lang_to");
-  if(!id2.isNull())
-    m_doc->appendIdentifier(id2.value().toLower());
-  else
-    m_doc->appendIdentifier(i18n("Translation"));
-
-  QDomNodeList entries = domDoc.elementsByTagName("ar");
-
-  if (entries.count() <= 0) {
-    m_errorMessage = i18n("Error while reading file");
-    return false;
-  }
-
-  m_doc->setAuthor("http://xdxf.sf.net");
-
-  for (int i = 0; i < entries.count(); i++) {
-    QDomNode entry = entries.at(i);
-    if(!entry.isNull()) {
-      QDomElement from = entry.firstChildElement("k");
-      if(!from.isNull())
-        front = from.text();
-      else
-        front = QString(); 
-
-      back = entry.toElement().lastChild().toText().data();
-      KEduVocExpression expr = KEduVocExpression(front);
-      expr.setTranslation(1, back);
-      m_doc->appendEntry(&expr);
+    setDevice(device);
+
+    while (!atEnd()) {
+        readNext();
+
+        if (isStartElement()) {
+            if (name() == "xdxf")
+                readXdxf();
+            else
+                raiseError(i18n("This is not a XDXF document"));
+        }
+    }
+
+    return !error();
+}
+
+
+void KEduVocXdxfReader::readUnknownElement()
+{
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement())
+            readUnknownElement();
     }
-  }
-  return true;
+}
+
+
+void KEduVocXdxfReader::readXdxf()
+{
+    ///The language attributes are required and should be ISO 639-2 codes, but you never know...
+    QStringRef id1 = attributes().value("lang_from");
+    if(!id1.isNull())
+        m_doc->appendIdentifier(id1.toString().toLower());
+    else
+        m_doc->appendIdentifier(i18n("Original"));
+
+    QStringRef id2 = attributes().value("lang_to");
+    if(!id2.isNull())
+        m_doc->appendIdentifier(id2.toString().toLower());
+    else
+        m_doc->appendIdentifier(i18n("Translation"));
+
+    while (!atEnd()) {
+        readNext();
+
+        if (isEndElement())
+            break;
+
+        if (isStartElement()) {
+            if (name() == "description")
+                m_doc->setDocumentRemark(readElementText());
+            else if (name() == "full_name")
+                m_doc->setTitle(readElementText());
+            else if (name() == "ar")
+                readEntry();
+            else
+                readUnknownElement();
+        }
+    }
+
+    m_doc->setAuthor("http://xdxf.sf.net");
+}
+
+
+void KEduVocXdxfReader::readEntry()
+{
+    QString front;
+    QString back;
+
+    while (!(isEndElement() && name() == "ar")) {
+        readNext();
+        if (isStartElement() && name() == "k")
+            front = readElementText();
+        else if (isCharacters() || isEntityReference())
+            back.append(text().toString());
+    }
+
+    KEduVocExpression expr = KEduVocExpression(front);
+    expr.setTranslation(1, back);
+    m_doc->appendEntry(&expr);
 }
index 21c6a119baa30b00b4f9ed62db45405c086389b2..75909e476a03343dc549ca47bf7d44580e32d150 100644 (file)
 #ifndef KEDUVOCXDXFREADER_H
 #define KEDUVOCXDXFREADER_H
 
-#include <QtXml>
+#include <QXmlStreamReader>
 
 class QIODevice;
 class KEduVocDocument;
 
-class KEduVocXdxfReader : public QObject
+class KEduVocXdxfReader : public QXmlStreamReader
 {
 public:
-  KEduVocXdxfReader(QIODevice *file);
+    KEduVocXdxfReader(KEduVocDocument *doc);
 
-  bool readDoc(KEduVocDocument *doc);
-
-  QString errorMessage() const {return m_errorMessage;}
+    bool read(QIODevice *device);
 
 private:
-  QIODevice *m_inputFile;
-  KEduVocDocument *m_doc;
-  QString m_errorMessage;
+    void readUnknownElement();
+    void readXdxf();
+    void readEntry();
+
+    KEduVocDocument *m_doc;
 };
 
 #endif