From 71ec36695c1e6111dfea729a6c7243af9c177a04 Mon Sep 17 00:00:00 2001 From: Peter Hedlund Date: Fri, 23 Mar 2007 19:01:03 +0000 Subject: [PATCH] An import filter for the XML Dictionary Exchange Format (http://xdxf.sf.net). Works well with simpler dictionaries, but is of course less useful for complex ones. svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=645864 --- kdeeducore/CMakeLists.txt | 1 + kdeeducore/keduvocdocument.cpp | 13 +++++ kdeeducore/keduvocdocument.h | 1 + kdeeducore/keduvockvtmlreader.cpp | 2 +- kdeeducore/keduvocxdxfreader.cpp | 94 +++++++++++++++++++++++++++++++ kdeeducore/keduvocxdxfreader.h | 40 +++++++++++++ 6 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 kdeeducore/keduvocxdxfreader.cpp create mode 100644 kdeeducore/keduvocxdxfreader.h diff --git a/kdeeducore/CMakeLists.txt b/kdeeducore/CMakeLists.txt index 22e5e4b..ff93e1f 100644 --- a/kdeeducore/CMakeLists.txt +++ b/kdeeducore/CMakeLists.txt @@ -13,6 +13,7 @@ set(kdeeducore_LIB_SRCS keduvocpaukerreader.cpp keduvocvokabelnreader.cpp keduvocwqlreader.cpp + keduvocxdxfreader.cpp leitnerbox.cpp leitnersystem.cpp leitnersystemview.cpp diff --git a/kdeeducore/keduvocdocument.cpp b/kdeeducore/keduvocdocument.cpp index a890ebe..3fa6b84 100644 --- a/kdeeducore/keduvocdocument.cpp +++ b/kdeeducore/keduvocdocument.cpp @@ -38,6 +38,7 @@ #include "keduvocwqlreader.h" #include "keduvocpaukerreader.h" #include "keduvocvokabelnreader.h" +#include "keduvocxdxfreader.h" #include "leitnersystem.h" class KEduVocDocument::Private @@ -217,6 +218,8 @@ KEduVocDocument::FileType KEduVocDocument::detectFileType(const QString &fileNam if (c1 == '<' && c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l') { if (line2.indexOf("pauker", 0) > 0) return pauker; + else if (line2.indexOf("xdxf", 0) > 0) + return xdxf; else return kvtml; } @@ -302,6 +305,15 @@ bool KEduVocDocument::open(const KUrl& url) } break; + case xdxf: + { + KEduVocXdxfReader xdxfReader(f); + read = xdxfReader.readDoc(this); + if (!read) + errorMessage = xdxfReader.errorMessage(); + } + break; + default: { KEduVocKvtmlReader kvtmlReader(f); @@ -1405,6 +1417,7 @@ QString KEduVocDocument::pattern(Mode mode) { true, false, "*.wql", I18N_NOOP("KWordQuiz Document") }, { true, false, "*.xml.qz *.pau.gz", I18N_NOOP("Pauker Lesson") }, { true, false, "*.voc", I18N_NOOP("Vokabeltrainer") }, + { true, false, "*.xdxf", I18N_NOOP("XML Dictionary Exchange Format") }, { true, true, "*.csv", I18N_NOOP("Text") }, // last is marker for the end, do not remove it { false, false, 0, 0 } diff --git a/kdeeducore/keduvocdocument.h b/kdeeducore/keduvocdocument.h index 117604c..db9d2bd 100644 --- a/kdeeducore/keduvocdocument.h +++ b/kdeeducore/keduvocdocument.h @@ -56,6 +56,7 @@ public: wql, pauker, vokabeln, + xdxf, csv }; /** diff --git a/kdeeducore/keduvockvtmlreader.cpp b/kdeeducore/keduvockvtmlreader.cpp index b962a31..c4fb888 100644 --- a/kdeeducore/keduvockvtmlreader.cpp +++ b/kdeeducore/keduvockvtmlreader.cpp @@ -50,7 +50,7 @@ bool KEduVocKvtmlReader::readDoc(KEduVocDocument *doc) QDomElement domElementKvtml = domDoc.documentElement(); if (domElementKvtml.tagName() != KV_DOCTYPE) { - m_errorMessage = i18n("Tag <%1> was expected but tag <%2> was found.", QString(KV_DOCTYPE), domElementKvtml.tagName()); + m_errorMessage = i18n("This is not a KDE Vocabulary document."); return false; } diff --git a/kdeeducore/keduvocxdxfreader.cpp b/kdeeducore/keduvocxdxfreader.cpp new file mode 100644 index 0000000..7a1d8d7 --- /dev/null +++ b/kdeeducore/keduvocxdxfreader.cpp @@ -0,0 +1,94 @@ +/*************************************************************************** + create a KEduVocDocument from a XDXF file + ----------------------------------------------------------------------- + copyright : (C) 2007 Peter Hedlund + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include + +#include + +#include "keduvocxdxfreader.h" +#include "keduvocexpression.h" +#include "keduvocdocument.h" + +KEduVocXdxfReader::KEduVocXdxfReader(QIODevice * file) +{ + // the file must be already open + m_inputFile = file; + m_errorMessage = ""; +} + + +bool KEduVocXdxfReader::readDoc(KEduVocDocument * doc) +{ + 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); + } + } + return true; +} diff --git a/kdeeducore/keduvocxdxfreader.h b/kdeeducore/keduvocxdxfreader.h new file mode 100644 index 0000000..8ce45dd --- /dev/null +++ b/kdeeducore/keduvocxdxfreader.h @@ -0,0 +1,40 @@ +/*************************************************************************** + create a KEduVocDocument from a XDXF file + ----------------------------------------------------------------------- + copyright : (C) 2007 Peter Hedlund + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KEDUVOCXDXFREADER_H +#define KEDUVOCXDXFREADER_H + +#include + +class QIODevice; +class KEduVocDocument; + +class KEduVocXdxfReader : public QObject +{ +public: + KEduVocXdxfReader(QIODevice *file); + + bool readDoc(KEduVocDocument *doc); + + QString errorMessage() const {return m_errorMessage;}; + +private: + QIODevice *m_inputFile; + KEduVocDocument *m_doc; + QString m_errorMessage; +}; + +#endif -- 2.47.3