]> Git trees. - libqmvoc.git/commitdiff
Work on a Pauker import filter. Does not work yet due to the compressed format.
authorPeter Hedlund <peter@peterandlinda.com>
Tue, 20 Feb 2007 05:02:45 +0000 (05:02 +0000)
committerPeter Hedlund <peter@peterandlinda.com>
Tue, 20 Feb 2007 05:02:45 +0000 (05:02 +0000)
svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=635457

kdeeducore/CMakeLists.txt
kdeeducore/keduvocdocument.cpp
kdeeducore/keduvocdocument.h
kdeeducore/keduvocpaukerreader.cpp [new file with mode: 0644]
kdeeducore/keduvocpaukerreader.h [new file with mode: 0644]

index 55cc383a572f5ea8622bb40a3a8e914ce2af13ee..77fe3f1cc310f78467fec8b77bb19895bff6f883 100644 (file)
@@ -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
index eaf32733b14514bc60a39c9534b1f4d98352293a..febbb354d279c1be3de0fc1b88f8526346c62e6a 100644 (file)
 #include <QList>
 #include <QTextStream>
 #include <QtAlgorithms>
+#include <QIODevice>
 
 #include <klocale.h>
 #include <kdebug.h>
 #include <kmessagebox.h>
 #include <kio/netaccess.h>
 #include <krandomsequence.h>
+#include <kfilterdev.h>
 
 #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);
index 15c3240729d3e51aa293bf325cba1e8d938bc996..ad2a683f032d531fbc29f26ab1a790a6da160b60 100644 (file)
@@ -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 (file)
index 0000000..f4c0550
--- /dev/null
@@ -0,0 +1,156 @@
+/***************************************************************************
+                     create a KEduVocDocument from a Pauker file
+    -----------------------------------------------------------------------
+    copyright     : (C) 2004, 2007 Peter Hedlund <peter.hedlund@kdemail.net>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 <klocale.h>
+
+#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 (file)
index 0000000..dedf907
--- /dev/null
@@ -0,0 +1,75 @@
+/***************************************************************************
+                  create a KEduVocDocument from a Pauker file
+    -----------------------------------------------------------------------
+    copyright     : (C) 2004, 2007 Peter Hedlund <peter.hedlund@kdemail.net>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 <libkdeedu_core_export.h>
+
+#include <QtXml>
+#include <QFile>
+
+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<PaukerDataItem> PaukerDataItemList;
+
+class PaukerData
+{
+public:
+  PaukerData();
+  PaukerDataItemList parse(const QString &fileName);
+  int colWidth(int col);
+  int numRows();
+  QString language(int col);
+
+private:
+  QDomDocument* document;
+};
+*/
+#endif