diff options
Diffstat (limited to 'kvoctrain/kvoctrain/spotlight2kvtml.cpp')
-rw-r--r-- | kvoctrain/kvoctrain/spotlight2kvtml.cpp | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/kvoctrain/kvoctrain/spotlight2kvtml.cpp b/kvoctrain/kvoctrain/spotlight2kvtml.cpp new file mode 100644 index 00000000..c0d4ab90 --- /dev/null +++ b/kvoctrain/kvoctrain/spotlight2kvtml.cpp @@ -0,0 +1,347 @@ +/*************************************************************************** + + convert spotlight list to kvtml + + ----------------------------------------------------------------------- + + begin : Thu Sep 30 20:00:00 MET 1999 + + copyright : (C) 1999-2001 Ewald Arnold + (C) 2001 The KDE-EDU team + email : kvoctrain@ewald-arnold.de + + ----------------------------------------------------------------------- + + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 <qfile.h> + +#include <vector> +#include <iostream> +#include <stdlib.h> + +using namespace std; + + +#include <klocale.h> +#include <kapplication.h> + +#define KVD_VERS_PREFIX " v" //#include "kvoctraindoc.h" +#define QM_VERB "v" //#include "QueryManager.h" + +#include "kvoctraincore.h" + +#define SPOT_VERSION "v0.2.1" + +vector<QString> lesson_names; + +struct spotty { + QString type; + int lesson; + QString en_rem, // possibly remarks + de_rem; + QString en, + de; +}; + +vector<spotty> spottys; + +void writeSpotty (QTextStream &os, spotty& spot_line, bool first) { + os << " <e"; + + if (spot_line.lesson != 0 ) + os << " m=\"" << spot_line.lesson << "\""; + + if (!spot_line.type.isEmpty() ) + os << " t=\"" << spot_line.type << "\""; + + os << "><o"; + + if (first) + os << " l=\"en\""; + + if (!spot_line.en_rem.isEmpty() ) + os << " r=\"" << spot_line.en_rem.stripWhiteSpace() << "\""; + + os << ">" << spot_line.en.stripWhiteSpace() << "</o><t"; + + if (first) + os << " l=\"de\""; + + if (!spot_line.de_rem.isEmpty() ) + os << " r=\"" << spot_line.de_rem.stripWhiteSpace() << "\""; + + os << ">" << spot_line.de.stripWhiteSpace() << "</t></e>\n"; +} + + +void readToMem (QTextStream &is, QString month, QString year) +{ + QString line; + bool lesson_pending = false; + QString lesson_str; + spotty spot; + + bool first_line = true; + while (!is.eof() && is.device()->status() == IO_Ok) { + line = is.readLine(); + + int pos; + while ((pos = line.find(" ")) >= 0) + line.remove (pos, 1); + + bool head_line = (!line.stripWhiteSpace().isEmpty() && line == line.upper() ); + + if (first_line && !head_line) { + line = is.readLine(); + head_line = (!line.stripWhiteSpace().isEmpty() && line == line.upper() ); + } + first_line = false; + + if ( line.find ("see p.") >= 0 + || line.find ("see pp.") >= 0 + || line.find ("see also p") >= 0) { + line = ""; + } + + int c = 0x92; + while ((pos = line.find (c)) >= 0) + line[pos] = '\''; + + c = 0x94; + while ((pos = line.find (c)) >= 0) + line[pos] = ' '; + + pos = 0; + while ((pos = line.find ('&', pos)) >= 0) { + line.insert (pos+1, "amp;"); + pos += 5; // skip & + } + + while ((pos = line.find ('<')) >= 0) { + line.remove(pos, 1); + line.insert (pos, "<"); + } + + while ((pos = line.find ('>')) >= 0) { + line.remove(pos, 1); + line.insert (pos, ">"); + } + + if (!line.isEmpty()) { + + if (head_line) { + lesson_pending = true; + lesson_str = line + ", "+month+" "+year; + } + else { + pos = line.find ('\t'); + if (pos < 0) + pos = line.find ('|'); + if (pos >= 0) { + if (lesson_pending) { + lesson_pending = false; + lesson_names.push_back(lesson_str.stripWhiteSpace()); + } + + spot.lesson = lesson_names.size(); + spot.type = ""; + spot.en_rem = ""; + spot.de_rem = ""; + + if (line.left (3) == "to ") { + spot.type = QM_VERB; + line.remove (0, 3); + pos -= 3; + } + spot.en = line.mid(0, pos); + spot.de = line.mid(pos+1, line.length()-pos-1); + + if ((pos = spot.en.find(" UK") ) >= 0) { + spot.en_rem+= i18n("UK ").local8Bit(); + spot.en.remove (pos, 3); + } + if ((pos = spot.en.find("(UK)") ) >= 0) { + spot.en_rem+= i18n("UK ").local8Bit(); + spot.en.remove (pos, 4); + } + + if ((pos = spot.en.find(" N. Am.") ) >= 0) { + spot.en_rem+= i18n("N. Am. ").local8Bit(); + spot.en.remove (pos, 7); + } + if ((pos = spot.en.find("(N. Am.)") ) >= 0) { + spot.en_rem+= i18n("N. Am. ").local8Bit(); + spot.en.remove (pos, 8); + } + + if ((pos = spot.en.find(" US") ) >= 0) { + spot.en_rem+= i18n("US ").local8Bit(); + spot.en.remove (pos, 3); + } + if ((pos = spot.en.find("(US)") ) >= 0) { + spot.en_rem+= i18n("US ").local8Bit(); + spot.en.remove (pos, 4); + } + + if ((pos = spot.en.find("ifml.") ) >= 0) { + spot.en_rem+= i18n("ifml. ").local8Bit(); + spot.en.remove (pos, 5); + } + if ((pos = spot.en.find("(ifml.)") ) >= 0) { + spot.en_rem+= i18n("ifml. ").local8Bit(); + spot.en.remove (pos, 7); + } + + if ((pos = spot.en.find("vulg.") ) >= 0) { + spot.en_rem+= i18n("vulg. ").local8Bit(); + spot.en.remove (pos, 5); + } + if ((pos = spot.en.find("(vulg.)") ) >= 0) { + spot.en_rem+= i18n("vulg. ").local8Bit(); + spot.en.remove (pos, 7); + } + + if (!spot.en.isEmpty() && !spot.de.isEmpty()) + spottys.push_back(spot); + } + } + } + } +} + +void writeToKvtml(QTextStream &os, QString month, QString year) +{ + os << + "<?xml version=\"1.0\"?>\n" + "<!doctype kvtml system \"kvoctrain.dtd\">\n" + "<!--\n" + "This is a machine generated file.\n" + "Be careful when editing here.\n" + "\n" + "Short definition:\n" + "\n" + "lesson lesson group\n" + " desc name\n" + " %no its index\n" + " %current is current lesson\n" + "type type group\n" + " desc name\n" + " %no its index\n" + "e entry of dictionary\n" + " %s is selected\n" + " %m lesson member\n" + " %t common expression type\n" + " o original\n" + " %q in query (\"o\" is given, \"t\" is wanted)\n" + " %l language code\n" + " %r remark\n" + " %p pronunciation\n" + " %width column width\n" + " %t expression type\n" + " t translation ..\n" + " %q in query (\"t\" is given, \"o\" is wanted)\n" + " %l language code\n" + " %r remark\n" + " %p pronunciation\n" + " %width column width\n" + " %t expression type\n" + "\n" + " %d last query date (from;to)\n" + " %w dito, compressed\n" + " %g grade (from;to)\n" + " %c count (from;to)\n" + " %b bad count (from;to)\n" + "\n" + "\n" + "Valid xml means:\n" + " - Close all tags\n" + " - Keep proper hierarchy\n" + " - All options are quoted\n" + "\n" + "--\n" + ">\n" + "<kvtml\n" + " generator=\"spotlight2kvtml " SPOT_VERSION " kvoctrain" KVD_VERS_PREFIX "0.5.0\"\n" + " cols=\"2\"\n" + " lines=\"" << spottys.size() << "\"\n" << + " title=\"" << i18n("Spotlight Online, issue ").local8Bit() << month << " " << "\'" << year << "\"\n" + << " author=" << i18n("\"Spotlight Online, www.spotlight-online.de (converted by spotlight2kvtml)").local8Bit() + << "\">\n\n" + << " <lesson>\n"; + + for (int i = 0; i < (int) lesson_names.size(); i++) { + os << " <desc no=\"" << i+1 << "\">" + << lesson_names[i] << "</desc>\n"; + } + os << " </lesson>\n\n"; + + if (spottys.size() != 0) + writeSpotty (os, spottys[0], true); + + int l = 1; + while (os.device()->status() == IO_Ok && l < (int) spottys.size() ) { + writeSpotty (os, spottys[l], false); + l++; + } + + os << "</kvtml>\n"; +} + + +int main(int argc, char **argv) +{ + // use i18n-strings from kvoctrain + KApplication app(argc,argv, "kvoctrain"); + + if (argc != 4) { + cerr << i18n("usage: spotlight2kvtml spotfile month year\n\n").local8Bit(); + exit (1); + } + + QString spot (argv[1]); + QString kvtml; + + int dot = spot.findRev('.'); + if (dot < 0) { + kvtml = spot + "." KVTML_EXT; + } + else { + kvtml = spot; + kvtml.remove (dot, kvtml.length()-dot); + kvtml += "." KVTML_EXT; + } + + QFile fs(spot); + fs.open( IO_ReadOnly ); + QTextStream is( &fs ); + readToMem (is, argv[2], argv[3]); + fs.close(); + + if (is.device()->status() != IO_Ok ) { + cerr << i18n("Could not read ").local8Bit() << spot.local8Bit() << endl; + exit (1); + } + + QFile fk(kvtml); + fk.open( IO_WriteOnly ); + QTextStream os( &fk ); + writeToKvtml(os, argv[2], argv[3]); + fk.close(); + + if (os.device()->status() != IO_Ok ) { + cerr << i18n("Could not write ").local8Bit() << kvtml.local8Bit() << endl; + exit (1); + } + + exit (0); +} |