From bf17b6924b878000d0b27392e0ddcccd136446a1 Mon Sep 17 00:00:00 2001 From: Peter Hedlund Date: Tue, 20 Feb 2007 05:02:45 +0000 Subject: [PATCH] Work on a Pauker import filter. Does not work yet due to the compressed format. svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=635457 --- kdeeducore/CMakeLists.txt | 2 + kdeeducore/keduvocdocument.cpp | 37 +++++-- kdeeducore/keduvocdocument.h | 4 +- kdeeducore/keduvocpaukerreader.cpp | 156 +++++++++++++++++++++++++++++ kdeeducore/keduvocpaukerreader.h | 75 ++++++++++++++ 5 files changed, 265 insertions(+), 9 deletions(-) create mode 100644 kdeeducore/keduvocpaukerreader.cpp create mode 100644 kdeeducore/keduvocpaukerreader.h diff --git a/kdeeducore/CMakeLists.txt b/kdeeducore/CMakeLists.txt index 55cc383..77fe3f1 100644 --- a/kdeeducore/CMakeLists.txt +++ b/kdeeducore/CMakeLists.txt @@ -8,6 +8,7 @@ set(kdeeducore_LIB_SRCS keduvockvtmlreader.cpp keduvockvtmlwriter.cpp keduvocmultiplechoice.cpp + keduvocpaukerreader.cpp keduvocwqlreader.cpp keduvocwqlwriter.cpp leitnerbox.cpp @@ -39,6 +40,7 @@ install(FILES keduvockvtmlreader.h keduvockvtmlwriter.h keduvocmultiplechoice.h + keduvocpaukerreader.h keduvocwqlreader.h keduvocwqlwriter.h leitnerbox.h diff --git a/kdeeducore/keduvocdocument.cpp b/kdeeducore/keduvocdocument.cpp index eaf3273..febbb35 100644 --- a/kdeeducore/keduvocdocument.cpp +++ b/kdeeducore/keduvocdocument.cpp @@ -22,17 +22,20 @@ #include #include #include +#include #include #include #include #include #include +#include #include "keduvockvtmlwriter.h" #include "keduvockvtmlreader.h" #include "keduvocwqlwriter.h" #include "keduvocwqlreader.h" +#include "keduvocpaukerreader.h" #include "leitnersystem.h" /**@todo possibly implement @@ -121,11 +124,12 @@ void KEduVocDocument::Init () KEduVocDocument::FileType KEduVocDocument::detectFileType(const QString &fileName) { - QFile f(fileName); - if (!f.open(QIODevice::ReadOnly)) + QIODevice * f = KFilterDev::deviceForFile(fileName); + //QFile f(fileName); + if (!f->open(QIODevice::ReadOnly)) return csv; - QDataStream is(&f); + QDataStream is(f); qint8 c1, c2, c3, c4, c5; is >> c1 @@ -134,9 +138,13 @@ KEduVocDocument::FileType KEduVocDocument::detectFileType(const QString &fileNam >> c4 >> c5; // guess filetype by first x bytes - QTextStream ts(&f); + QTextStream ts(f); QString line; + QString line2; + line = ts.readLine(); + if (!ts.atEnd()) + line2 = ts.readLine(); line.prepend(c5); line.prepend(c4); line.prepend(c3); @@ -146,10 +154,13 @@ KEduVocDocument::FileType KEduVocDocument::detectFileType(const QString &fileNam if (!is.device()->isOpen()) return kvd_none; - f.close(); - if (c1 == '<' && c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l') - return kvtml; - + f->close(); + if (c1 == '<' && c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l') { + if (line2.indexOf("pauker", 0) > 0) + return pauker; + else + return kvtml; + } if (line == WQL_IDENT) return wql; @@ -175,6 +186,8 @@ bool KEduVocDocument::open(const KUrl& url, bool /*append*/) QString temporaryFile; if (KIO::NetAccess::download(url, temporaryFile, 0)) { + ///@todo We need to work with the QIODevice directly for the compressed Pauker files + //QIODevice * fDev = KFilterDev::deviceForFile(temporaryFile); QFile f(temporaryFile); if (!f.open(QIODevice::ReadOnly)) { @@ -204,6 +217,14 @@ bool KEduVocDocument::open(const KUrl& url, bool /*append*/) } break; + case pauker: + { + KEduVocPaukerReader paukerReader(&f); + read = paukerReader.readDoc(this); + if (!read) + errorMessage = paukerReader.errorMessage(); + } + case vt_lex: { QTextStream is (&f); diff --git a/kdeeducore/keduvocdocument.h b/kdeeducore/keduvocdocument.h index 15c3240..ad2a683 100644 --- a/kdeeducore/keduvocdocument.h +++ b/kdeeducore/keduvocdocument.h @@ -261,9 +261,11 @@ class KDEEDUCORE_EXPORT KEduVocDocument : public QObject public: - enum FileType { kvd_none, automatic, + enum FileType { kvd_none, + automatic, kvtml, wql, + pauker, kvtbin, vt_lex, vt_vcb, csv /*, kvoclearn, qvocab*/ }; diff --git a/kdeeducore/keduvocpaukerreader.cpp b/kdeeducore/keduvocpaukerreader.cpp new file mode 100644 index 0000000..f4c0550 --- /dev/null +++ b/kdeeducore/keduvocpaukerreader.cpp @@ -0,0 +1,156 @@ +/*************************************************************************** + create a KEduVocDocument from a Pauker file + ----------------------------------------------------------------------- + copyright : (C) 2004, 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 "keduvocpaukerreader.h" +#include "keduvocexpression.h" +#include "keduvocdocument.h" + +/* +PaukerDataItem::PaukerDataItem() +{ +} + +PaukerDataItem::PaukerDataItem(QDomElement &entry) +{ + domElement = entry; +} + +PaukerDataItem::~PaukerDataItem() +{ +} + +QString PaukerDataItem::frontSide() const +{ + return getText("FrontSide"); +} + +QString PaukerDataItem::backSide() const +{ + return getText("BackSide"); +} + +QString PaukerDataItem::getText(const QString &tagName) const +{ + if(!domElement.isNull()) { + + QDomNodeList list = domElement.elementsByTagName(tagName); + + if(list.count() > 0) { + + QDomElement element = list.item(0).toElement(); + + if(!element.isNull()) { + return element.text(); + } + else + return QString::null; + } + else + return QString::null; + } + else + return QString::null; +} + +PaukerData::PaukerData() +{ + document = new QDomDocument(); +} + +PaukerDataItemList PaukerData::parse(const QString &fileName) +{ + PaukerDataItemList list; + + QIODevice * file = KFilterDev::deviceForFile(fileName); + document->setContent(file); + + QDomNodeList entries = document->elementsByTagName("Card"); + + // loop through the "Card" tags looking for data + for(uint i = 0 ; i < entries.count() ; i++) { + + // get an entry to operate on + QDomElement entry = entries.item(i).toElement(); + + // if the "node" is in fact an element -- i.e. not null + if(!entry.isNull()) { + PaukerDataItem item(entry); + list.append(item); + } + } + delete file; + return list; +} +*/ +KEduVocPaukerReader::KEduVocPaukerReader(QFile * file) +{ + // the file must be already open + m_inputFile = file; + m_errorMessage = ""; +} + + +bool KEduVocPaukerReader::readDoc(KEduVocDocument * doc) +{ + m_doc = doc; + QString front; + QString back; + + QDomDocument domDoc("Pauker"); + if (!domDoc.setContent(m_inputFile, &m_errorMessage)) + return false; + + QDomNodeList entries = domDoc.elementsByTagName("Card"); + + if (entries.count() <= 0) { + m_errorMessage = i18n("Error while reading file"); + return false; + } + + for (int i = 0; entries.count() - 1; i++) { + QDomElement entry = entries.at(i).toElement(); + if(!entry.isNull()) { + front = cardText(entry, "FrontSide"); + back = cardText(entry, "BackSide"); + KEduVocExpression expr = KEduVocExpression(front); + expr.setTranslation(1, back); + m_doc->appendEntry(&expr); + } + } +} + + +QString KEduVocPaukerReader::cardText(const QDomElement & entry, const QString & tagName) const +{ + QDomNodeList list = entry.elementsByTagName(tagName); + + if(list.count() > 0) { + QDomElement element = list.item(0).toElement(); + + if(!element.isNull()) { + return element.text(); + } + else + return QString::null; + } + else + return QString::null; + +} + + diff --git a/kdeeducore/keduvocpaukerreader.h b/kdeeducore/keduvocpaukerreader.h new file mode 100644 index 0000000..dedf907 --- /dev/null +++ b/kdeeducore/keduvocpaukerreader.h @@ -0,0 +1,75 @@ +/*************************************************************************** + create a KEduVocDocument from a Pauker file + ----------------------------------------------------------------------- + copyright : (C) 2004, 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 KEDUVOCPAUKERREADER_H +#define KEDUVOCPAUKERREADER_H + +#include + +#include +#include + +class KEduVocDocument; + +class KDEEDUCORE_EXPORT KEduVocPaukerReader : public QObject +{ +public: + KEduVocPaukerReader(QFile *file); + + bool readDoc(KEduVocDocument *doc); + + QString errorMessage() const {return m_errorMessage;}; +private: + QString cardText(const QDomElement &entry, const QString &tagName) const; + + QFile *m_inputFile; + KEduVocDocument *m_doc; + QString m_errorMessage; +}; +/* +class PaukerDataItem +{ +public: + PaukerDataItem(); + PaukerDataItem(QDomElement &entry); + virtual ~PaukerDataItem(); + + QString frontSide() const; + QString backSide() const; + +protected: + QString getText(const QString &tagName) const; + +private: + QDomElement domElement; +}; + +typedef QValueList PaukerDataItemList; + +class PaukerData +{ +public: + PaukerData(); + PaukerDataItemList parse(const QString &fileName); + int colWidth(int col); + int numRows(); + QString language(int col); + +private: + QDomDocument* document; +}; +*/ +#endif -- 2.47.3