From: Peter Hedlund Date: Tue, 1 May 2007 21:26:15 +0000 (+0000) Subject: New readers for Pauker and xdxf based on QXmlStreamReader. X-Git-Tag: v3.90.1~1 X-Git-Url: https://git.rmz.fi/?a=commitdiff_plain;h=cc9cee732c519d078e7e09ab4d283a46acb86bd1;p=libqmvoc.git New readers for Pauker and xdxf based on QXmlStreamReader. svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=660184 --- diff --git a/kdeeducore/keduvocdocument.cpp b/kdeeducore/keduvocdocument.cpp index bb83d96..4de1e6d 100644 --- a/kdeeducore/keduvocdocument.cpp +++ b/kdeeducore/keduvocdocument.cpp @@ -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")); } diff --git a/kdeeducore/keduvocpaukerreader.cpp b/kdeeducore/keduvocpaukerreader.cpp index 3f13f64..064783c 100644 --- a/kdeeducore/keduvocpaukerreader.cpp +++ b/kdeeducore/keduvocpaukerreader.cpp @@ -14,69 +14,140 @@ * * ***************************************************************************/ +#include "keduvocpaukerreader.h" + #include -#include +#include -#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; +} diff --git a/kdeeducore/keduvocpaukerreader.h b/kdeeducore/keduvocpaukerreader.h index 1b2b5c7..32a6a5d 100644 --- a/kdeeducore/keduvocpaukerreader.h +++ b/kdeeducore/keduvocpaukerreader.h @@ -17,26 +17,26 @@ #ifndef KEDUVOCPAUKERREADER_H #define KEDUVOCPAUKERREADER_H -#include +#include 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 diff --git a/kdeeducore/keduvocxdxfreader.cpp b/kdeeducore/keduvocxdxfreader.cpp index 7a1d8d7..5e69f30 100644 --- a/kdeeducore/keduvocxdxfreader.cpp +++ b/kdeeducore/keduvocxdxfreader.cpp @@ -14,81 +14,105 @@ * * ***************************************************************************/ +#include "keduvocxdxfreader.h" + #include -#include +#include -#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); } diff --git a/kdeeducore/keduvocxdxfreader.h b/kdeeducore/keduvocxdxfreader.h index 21c6a11..75909e4 100644 --- a/kdeeducore/keduvocxdxfreader.h +++ b/kdeeducore/keduvocxdxfreader.h @@ -17,24 +17,24 @@ #ifndef KEDUVOCXDXFREADER_H #define KEDUVOCXDXFREADER_H -#include +#include 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