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;
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;
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"));
}
* *
***************************************************************************/
+#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;
+}
#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
* *
***************************************************************************/
+#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);
}
#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