You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kvoctrain/kvoctrain/kvt-core/kvd_rb_kvtml2.cpp

465 lines
13 KiB

/***************************************************************************
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 <tdelocale.h>
bool kvoctrainDoc::parseBody_e (XmlElement elem, XmlReader& xml)
{
grade_t grade,
r_grade;
int qcount,
r_qcount;
int bcount,
r_bcount;
TQString remark;
TQString pronunce;
time_t qdate,
r_qdate;
bool inquery;
bool active;
TQString lang;
TQString textstr;
TQString exprtype;
bool org_found = false;
TQString q_org,
q_trans;
TQString query_id;
kvoctrainExpr expr;
int lesson;
int width;
TQString type;
TQString faux_ami_f;
TQString faux_ami_t;
TQString synonym;
TQString example;
TQString antonym;
TQString usage;
TQString 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 ?
TQString 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, (TQString) 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, (TQString) 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;
}