summaryrefslogtreecommitdiffstats
path: root/kvoctrain/kvoctrain/kvt-core/kvd_csv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kvoctrain/kvoctrain/kvt-core/kvd_csv.cpp')
-rw-r--r--kvoctrain/kvoctrain/kvt-core/kvd_csv.cpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/kvoctrain/kvoctrain/kvt-core/kvd_csv.cpp b/kvoctrain/kvoctrain/kvt-core/kvd_csv.cpp
new file mode 100644
index 00000000..851e0ea9
--- /dev/null
+++ b/kvoctrain/kvoctrain/kvt-core/kvd_csv.cpp
@@ -0,0 +1,243 @@
+/***************************************************************************
+
+ maintain a document in text format
+
+ -----------------------------------------------------------------------
+
+ begin : Sat Sep 06 11:00:53 MET 1999
+
+ copyright : (C) 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
+ (C) 2001 The KDE-EDU team
+ (C) 2005 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 "kvoctrain.h"
+
+#include <qtextcodec.h>
+
+#include <vector>
+using namespace std;
+
+bool kvoctrainDoc::saveTypeNameCsv (QTextStream &)
+{
+ return true;
+}
+
+
+bool kvoctrainDoc::loadTypeNameCsv (QTextStream &)
+{
+ return true;
+}
+
+
+bool kvoctrainDoc::saveLessonCsv (QTextStream &)
+{
+ return true;
+}
+
+
+bool kvoctrainDoc::loadLessonCsv (QTextStream &)
+{
+ return true;
+}
+
+bool kvoctrainDoc::saveToCsv (QTextStream& os, QString &)
+{
+ QString separator = Prefs::separator();
+
+ saveTypeNameCsv (os);
+ saveLessonCsv (os);
+
+ int ent_no = 0;
+ int ent_percent = (int) vocabulary.size () / 100;
+ float f_ent_percent = (int) vocabulary.size () / 100.0;
+ emit progressChanged(this, 0);
+
+ os << i18n("! Title:") << separator << getTitle() << "\n";
+ os << i18n("! Author:") << separator << getAuthor() << "\n";
+
+ vector <int> csv_order = kvoctrainApp::getCsvOrder(this);
+
+ vector<kvoctrainExpr>::const_iterator first = vocabulary.begin ();
+ QString exp;
+
+ os.setCodec(QTextCodec::codecForName("UTF-8"));
+ while (first != vocabulary.end ()) {
+
+ ent_no++;
+ if (ent_percent != 0 && (ent_no % ent_percent) == 0 )
+ emit progressChanged(this, ent_no / (int) f_ent_percent);
+
+ exp = "";
+ // now concat columns according to paste-order
+ bool sep = false;
+ for (int i = 0; i < (int) csv_order.size(); i++) {
+ if (!sep)
+ sep = true;
+ else
+ exp += separator;
+
+ if (csv_order[i] >= 0) {
+ if (csv_order[i] == 0)
+ exp += (*first).getOriginal();
+ else
+ exp += (*first).getTranslation(csv_order[i]);
+ }
+ }
+
+ if (!exp.isEmpty())
+ os << exp << "\n";
+
+ first++;
+ }
+
+ setModified (false);
+ return os.device()->status() == IO_Ok;
+}
+
+
+bool kvoctrainDoc::loadFromCsv (QTextStream& is)
+{
+ QString separator = Prefs::separator();
+ QStringList lang_order = Prefs::pasteOrder();
+
+ langs.clear();
+ vocabulary.clear();
+ loadTypeNameCsv (is);
+ loadLessonCsv (is);
+
+ // autodetect utf8
+ // FIXME: provide choice for Latinx?
+ is.setCodec(QTextCodec::codecForName("ISO 8859-1"));
+ is.setEncoding(QTextStream::Latin1);
+
+ int size = is.device()->size ();
+ int ln = size / 20 / 100; // assume each line about 20 chars
+ float f_ent_percent = size / 100.0;
+ emit progressChanged (this, 0);
+
+ bool utf8_mode = false;
+ int lang_num = 0;
+ for (int l = 0; !is.eof(); l++) {
+ QString s = is.readLine();
+
+ // autodetect utf8
+ if (!utf8_mode) {
+ for (int i = 0; !utf8_mode && i < (int) s.length(); ++i) {
+ ushort trigger = s[i].unicode();
+ if (trigger >= 0x80) {
+ int remain = s.length() - i;
+ if ((trigger & 0xE0) == 0xC0){ // 110x xxxx
+ if ( (remain > 1)
+ && (s[i+1].unicode() & 0xC0) == 0x80)
+ utf8_mode = true;
+ }
+ else if ((trigger & 0xF0) == 0xE0) { // 1110 xxxx
+ if ( remain > 2
+ && s[i+1].unicode() & 0xC0 == 0x80
+ && s[i+2].unicode() & 0xC0 == 0x80)
+ utf8_mode = true;
+ }
+ else if ((trigger & 0xF8) == 0xF0) { // 1111 0xxx
+ if ( remain > 3
+ && s[i+1].unicode() & 0xC0 == 0x80
+ && s[i+2].unicode() & 0xC0 == 0x80
+ && s[i+3].unicode() & 0xC0 == 0x80)
+ utf8_mode = true;
+ }
+ else if ((trigger & 0xFC) == 0xF8) { // 1111 10xx
+ if ( remain > 4
+ && s[i+1].unicode() & 0xC0 == 0x80
+ && s[i+2].unicode() & 0xC0 == 0x80
+ && s[i+3].unicode() & 0xC0 == 0x80
+ && s[i+4].unicode() & 0xC0 == 0x80)
+ utf8_mode = true;
+ }
+ else if ((trigger & 0xFE) == 0xFC) { // 1111 110x
+ if ( remain > 5
+ && s[i+1].unicode() & 0xC0 == 0x80
+ && s[i+2].unicode() & 0xC0 == 0x80
+ && s[i+3].unicode() & 0xC0 == 0x80
+ && s[i+4].unicode() & 0xC0 == 0x80
+ && s[i+5].unicode() & 0xC0 == 0x80)
+ utf8_mode = true;
+ }
+ }
+ }
+
+ if (utf8_mode) {
+ is.setCodec(QTextCodec::codecForName("UTF-8"));
+ is.setEncoding(QTextStream::UnicodeUTF8);
+ s = QString::fromUtf8(s.ascii());
+ }
+
+ }
+
+ ln--;
+ if (ln <= 0) {
+ ln = size / 20 / 100; // assume each line about 20 chars
+ emit progressChanged(this, is.device()->at() / (int) f_ent_percent);
+ }
+
+ // similar in kva_clip.cpp::slotEditPaste()
+
+ if (!s.stripWhiteSpace().isEmpty()) {
+ kvoctrainExpr bucket (s, separator);
+ kvoctrainExpr expr;
+ // now move columns according to paste-order
+ for (int i = 0; i < bucket.numTranslations()+1; i++) {
+ lang_num = QMAX (lang_num, bucket.numTranslations()+1);
+ if (i == 0)
+ expr.setOriginal(bucket.getOriginal());
+ else {
+ QString ts = bucket.getTranslation(i);
+ expr.setTranslation(i, ts);
+ }
+ }
+ appendEntry (&expr);
+ }
+ }
+
+ for (int j = 0; j < lang_num; j++) {
+ if (j < (int) lang_order.count() ) {
+ langs.push_back((lang_order)[j]);
+ }
+ else {
+ if (j == 0)
+ langs.push_back("org");
+ else {
+ QString s;
+ s.setNum(j);
+ s.insert(0, "trans");
+ langs.push_back(s);
+ }
+ }
+ }
+ setModified (false);
+ return is.device()->status() == IO_Ok;
+}
+
+
+void kvoctrainDoc::errorCsv (int /*line*/, const QString &text )
+{
+ unknown_elem = true;
+ QApplication::setOverrideCursor( arrowCursor, true );
+ QString s = kapp->makeStdCaption(i18n("Error in csv file"));
+ QString msg = text;
+ KMessageBox::error( 0, msg, s);
+ QApplication::restoreOverrideCursor();
+}