summaryrefslogtreecommitdiffstats
path: root/kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp')
-rw-r--r--kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp464
1 files changed, 464 insertions, 0 deletions
diff --git a/kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp b/kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp
new file mode 100644
index 00000000..8179bfa6
--- /dev/null
+++ b/kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp
@@ -0,0 +1,464 @@
+/***************************************************************************
+
+ read big body of a kvtml document
+
+ -----------------------------------------------------------------------
+
+ begin : Thu Mar 11 20:50:53 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 "QueryManager.h"
+
+#include <klocale.h>
+
+
+bool kvoctrainDoc::parseBody_e (XmlElement elem, XmlReader& xml)
+{
+ grade_t grade,
+ r_grade;
+ int qcount,
+ r_qcount;
+ int bcount,
+ r_bcount;
+ QString remark;
+ QString pronunce;
+ time_t qdate,
+ r_qdate;
+ bool inquery;
+ bool active;
+ QString lang;
+ QString textstr;
+ QString exprtype;
+ bool org_found = false;
+ QString q_org,
+ q_trans;
+ QString query_id;
+ kvoctrainExpr expr;
+ int lesson;
+ int width;
+ QString type;
+ QString faux_ami_f;
+ QString faux_ami_t;
+ QString synonym;
+ QString example;
+ QString antonym;
+ QString usage;
+ QString paraphrase;
+ vector<Conjugation> conjug;
+ Comparison comparison;
+ MultipleChoice mc;
+
+ if (!extract_KVT_E_attr (xml, elem, lesson, inquery, active, exprtype))
+ return false;
+
+ if (lesson
+ && lesson > (int) lesson_descr.size() ) { // description missing ?
+ QString s;
+ for (int i = lesson_descr.size(); i < lesson; i++) {
+ s.setNum (i+1);
+ s.insert (0, "#"); // invent descr according to number
+ lesson_descr.push_back (s);
+ }
+ }
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+
+ if (elem.tag() == KV_EXPR && !elem.isEndTag() ) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("disallowed occurrence of tag <%1>").arg(elem.tag()));
+ return false;
+ }
+
+ unsigned int count = 0;
+ org_found = false;
+ while (elem.tag() != KV_EXPR) {
+
+ // now want "original" and one or more "translations"
+
+ // found original <o>
+
+ if (elem.tag() == KV_ORG && !elem.isEndTag() ) {
+ if (org_found) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("repeated occurrence of tag <%1>").arg(elem.tag()));
+ return false;
+ }
+ org_found = true;
+
+ type = exprtype;
+ if (!extract_O_T_attr (
+ xml,
+ elem,
+ lang,
+ grade, r_grade,
+ qcount, r_qcount,
+ qdate, r_qdate,
+ remark,
+ bcount, r_bcount,
+ query_id,
+ pronunce,
+ width,
+ type,
+ faux_ami_t,
+ faux_ami_f,
+ synonym,
+ example,
+ antonym,
+ usage,
+ paraphrase))
+ return false;
+
+
+ if (vocabulary.size() == 0) { // only accept in first entry
+ if (width >= 0)
+ setSizeHint (count, width);
+
+ if (query_id == KV_O)
+ q_org = lang;
+
+ if (query_id == KV_T)
+ q_trans = lang;
+ }
+
+ if (langs.size() == 0) { // first entry
+ if (lang.isEmpty()) // no definition in first entry
+ lang = "original";
+ langs.push_back(lang);
+
+ }
+ else {
+ if (lang != langs[0] && !lang.isEmpty()) { // different originals ?
+ errorKvtMl (xml.lineNumber(),
+ i18n("ambiguous definition of language code"));
+ return false;
+ }
+ }
+ count = 0;
+
+//========================================
+// FIXME:: make loop for this
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+
+ if (elem.tag () == KV_CONJUG_GRP && !elem.isEndTag() ) {
+ if (!loadConjugKvtMl (conjug, (QString) KV_CON_TYPE, elem, xml))
+ return false;
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+
+ comparison.clear();
+ if (elem.tag () == KV_COMPARISON_GRP && !elem.isEndTag() ) {
+ if (!loadComparison (comparison, elem, xml))
+ return false;
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+
+ mc.clear();
+ if (elem.tag () == KV_MULTIPLECHOICE_GRP && !elem.isEndTag() ) {
+ if (!loadMultipleChoice (mc, elem, xml))
+ return false;
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+
+ if (elem.tag() == "#PCDATA") { // element data
+ textstr = xml.getText();
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+
+ if (elem.tag() != KV_ORG || !elem.isEndTag() ) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("expected ending tag <%1>").arg(KV_ORG));
+ return false;
+ }
+ }
+ else {
+ if (elem.tag() != KV_ORG || !elem.isEndTag() ) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("expected ending tag <%1>").arg(KV_ORG));
+ return false;
+ }
+ textstr = "";
+ }
+
+//========================================
+
+ expr = kvoctrainExpr (textstr);
+ expr.setLesson (lesson);
+ expr.setInQuery(inquery);
+ expr.setActive(active);
+
+ if (conjug.size() > 0) {
+ expr.setConjugation(0, conjug[0]);
+ conjug.clear();
+ }
+ if (!comparison.isEmpty()) {
+ expr.setComparison(0, comparison);
+ comparison.clear();
+ }
+ if (!mc.isEmpty()) {
+ expr.setMultipleChoice(0, mc);
+ mc.clear();
+ }
+ if (!remark.isEmpty() )
+ expr.setRemark (0, remark);
+ if (!pronunce.isEmpty() )
+ expr.setPronunce (0, pronunce);
+ if (!type.isEmpty() )
+ expr.setType(0, type);
+ if (!synonym.isEmpty() )
+ expr.setSynonym(0, synonym);
+ if (!example.isEmpty() )
+ expr.setExample(0, example);
+ if (!usage.isEmpty() )
+ expr.setUsageLabel(0, usage);
+ if (!paraphrase.isEmpty() )
+ expr.setParaphrase(0, paraphrase);
+ if (!antonym.isEmpty() )
+ expr.setAntonym(0, antonym);
+ }
+
+ // found translation <t>
+
+ else if (elem.tag() == KV_TRANS && !elem.isEndTag() ) {
+ if (!org_found) { // must be preceded by "original"
+ errorKvtMl (xml.lineNumber(),
+ i18n("starting tag <%1> is missing").arg(KV_ORG));
+ return false;
+ }
+
+ count++;
+ type = exprtype;
+ if (!extract_O_T_attr (
+ xml,
+ elem,
+ lang,
+ grade, r_grade,
+ qcount, r_qcount,
+ qdate, r_qdate,
+ remark,
+ bcount, r_bcount,
+ query_id,
+ pronunce,
+ width,
+ type,
+ faux_ami_f,
+ faux_ami_t,
+ synonym,
+ example,
+ antonym,
+ usage,
+ paraphrase))
+ return false;
+
+ if (vocabulary.size() == 0) { // only accept in first entry
+ if (width >= 0)
+ setSizeHint (count, width);
+
+ if (query_id == KV_O)
+ q_org = lang;
+
+ if (query_id == KV_T)
+ q_trans = lang;
+
+ }
+
+ if (langs.size() <= count) { // new translation
+ if (lang.isEmpty()) { // no definition in first entry ?
+ lang.setNum (langs.size() );
+ lang.insert (0, "translation ");
+ }
+ langs.push_back(lang);
+
+ }
+ else {
+ if (lang != langs[count] && !lang.isEmpty()) { // different language ?
+ errorKvtMl (xml.lineNumber(),
+ i18n("ambiguous definition of language code"));
+ return false;
+ }
+ }
+
+//========================================
+// FIXME:: make loop for this
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+
+ if (elem.tag () == KV_CONJUG_GRP && !elem.isEndTag() ) {
+ if (!loadConjugKvtMl (conjug, (QString) KV_CON_TYPE, elem, xml))
+ return false;
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+
+ comparison.clear();
+ if (elem.tag () == KV_COMPARISON_GRP && !elem.isEndTag() ) {
+ if (!loadComparison (comparison, elem, xml))
+ return false;
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+
+ mc.clear();
+ if (elem.tag () == KV_MULTIPLECHOICE_GRP && !elem.isEndTag() ) {
+ if (!loadMultipleChoice (mc, elem, xml))
+ return false;
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+
+ textstr = "";
+ if (elem.tag() == "#PCDATA") { // element data
+ textstr = xml.getText();
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+
+ if (elem.tag() != KV_TRANS || !elem.isEndTag() ) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("expected ending tag <%1>").arg(KV_TRANS));
+ return false;
+ }
+ // expr ...
+ }
+ else {
+ if (elem.tag() != KV_TRANS || !elem.isEndTag() ) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("expected ending tag <%1>").arg(KV_TRANS));
+ return false;
+ }
+ textstr = "";
+ }
+
+//========================================
+
+ if (!org_found) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("starting tag <%1> is missing").arg(KV_ORG));
+ return false;
+ }
+/*
+ if (qcount == 0) {
+ grade = KV_NORM_GRADE;
+ }
+
+ if (r_qcount == 0) {
+ r_grade = KV_NORM_GRADE;
+ }
+*/
+ expr.addTranslation (textstr, grade, r_grade);
+ expr.setQueryCount (count, qcount, false);
+ expr.setQueryCount (count, r_qcount, true);
+ expr.setBadCount (count, bcount, false);
+ expr.setBadCount (count, r_bcount, true);
+ expr.setQueryDate (count, qdate, false);
+ expr.setQueryDate (count, r_qdate, true);
+
+ if (conjug.size() > 0) {
+ expr.setConjugation(count, conjug[0]);
+ conjug.clear();
+ }
+ if (!comparison.isEmpty()) {
+ expr.setComparison(count, comparison);
+ comparison.clear();
+ }
+ if (!mc.isEmpty()) {
+ expr.setMultipleChoice(count, mc);
+ mc.clear();
+ }
+ if (!type.isEmpty() )
+ expr.setType (count, type);
+ if (!remark.isEmpty() )
+ expr.setRemark (count, remark);
+ if (!pronunce.isEmpty() )
+ expr.setPronunce (count, pronunce);
+ if (!faux_ami_f.isEmpty() )
+ expr.setFauxAmi (count, faux_ami_f, false);
+ if (!faux_ami_t.isEmpty() )
+ expr.setFauxAmi (count, faux_ami_t, true);
+ if (!synonym.isEmpty() )
+ expr.setSynonym (count, synonym);
+ if (!example.isEmpty() )
+ expr.setExample (count, example);
+ if (!usage.isEmpty() )
+ expr.setUsageLabel (count, usage);
+ if (!paraphrase.isEmpty() )
+ expr.setParaphrase (count, paraphrase);
+ if (!antonym.isEmpty() )
+ expr.setAntonym (count, antonym);
+ }
+ else {
+ if (elem.isEndTag() ) {
+ errorKvtMl (xml.lineNumber(),
+ i18n("unexpected ending tag <%1>" ).arg(elem.tag()));
+ return false;
+ }
+ else {
+ unknownElement (xml.lineNumber(), elem.tag());
+ return false;
+ }
+ }
+
+ if (! xml.readElement (elem) ) {
+ errorKvtMl (xml.lineNumber(), i18n("I/O failure") );
+ return false;
+ }
+ }
+ if (numEntries() == 0)
+ setQueryLang (q_org, q_trans);
+ vocabulary.push_back (expr);
+
+ return true;
+}
+
+