libkdeedu/keduvocdocument
keduvocconjugation.cpp
Go to the documentation of this file.00001 /*************************************************************************** 00002 00003 C++ Implementation: keduvocconjugation 00004 00005 ----------------------------------------------------------------------- 00006 00007 begin : Di Aug 28 2007 00008 00009 copyright : (C) 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net> 00010 00011 ----------------------------------------------------------------------- 00012 00013 ***************************************************************************/ 00014 00015 /*************************************************************************** 00016 * * 00017 * This program is free software; you can redistribute it and/or modify * 00018 * it under the terms of the GNU General Public License as published by * 00019 * the Free Software Foundation; either version 2 of the License, or * 00020 * (at your option) any later version. * 00021 * * 00022 ***************************************************************************/ 00023 00024 #include "keduvocconjugation.h" 00025 #include "keduvoccommon_p.h" 00026 #include "kvtml2defs.h" 00027 00028 #include <KLocalizedString> 00029 #include <KDebug> 00030 #include <QtXml/QDomDocument> 00031 00032 class KEduVocConjugation::Private 00033 { 00034 public: 00035 QMap<KEduVocWordFlags, KEduVocText> m_conjugations; 00036 }; 00037 00038 00039 KEduVocConjugation::KEduVocConjugation() 00040 : d( new Private ) 00041 {} 00042 00043 00044 KEduVocConjugation::KEduVocConjugation( const KEduVocConjugation& other ) 00045 : d( new Private ) 00046 { 00047 d->m_conjugations = other.d->m_conjugations; 00048 } 00049 00050 00051 KEduVocConjugation::~KEduVocConjugation() 00052 { 00053 delete d; 00054 } 00055 00056 KEduVocConjugation& KEduVocConjugation::operator = ( const KEduVocConjugation& other ) 00057 { 00058 d->m_conjugations = other.d->m_conjugations; 00059 return *this; 00060 } 00061 00062 bool KEduVocConjugation::operator ==(const KEduVocConjugation& other) const 00063 { 00064 return d->m_conjugations == other.d->m_conjugations; 00065 } 00066 00067 00068 00069 KEduVocText& KEduVocConjugation::conjugation(KEduVocWordFlags flags) const 00070 { 00071 return d->m_conjugations[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers | KEduVocWordFlag::genders)]; 00072 } 00073 00074 void KEduVocConjugation::setConjugation(const KEduVocText& conjugation, KEduVocWordFlags flags) 00075 { 00076 d->m_conjugations[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers | KEduVocWordFlag::genders)] = conjugation; 00077 } 00078 00079 bool KEduVocConjugation::isEmpty() 00080 { 00081 return d->m_conjugations.count() == 0; 00082 } 00083 00084 QList< KEduVocWordFlags > KEduVocConjugation::keys() 00085 { 00086 return d->m_conjugations.keys(); 00087 } 00088 00089 00090 00091 void KEduVocConjugation::toKVTML2(QDomElement & parent, const QString &tense) 00092 { 00093 if (isEmpty()) { 00094 return; 00095 } 00096 00097 QMap<int, KEduVocWordFlag::Flags> numbers; 00098 numbers[0] = KEduVocWordFlag::Singular; 00099 numbers[1] = KEduVocWordFlag::Dual; 00100 numbers[2] = KEduVocWordFlag::Plural; 00101 QMap<int, KEduVocWordFlag::Flags> persons; 00102 persons[0] = KEduVocWordFlag::First; 00103 persons[1] = KEduVocWordFlag::Second; 00104 persons[2] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Masculine); 00105 persons[3] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Feminine); 00106 persons[4] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Neuter); 00107 00108 // write the tense tag 00109 QDomDocument domDoc = parent.ownerDocument(); 00110 QDomElement tenseElement = domDoc.createElement( KVTML_TENSE ); 00111 tenseElement.appendChild( domDoc.createTextNode(tense) ); 00112 parent.appendChild(tenseElement); 00113 00114 for ( int num = 0; num <= 2; ++num) { 00115 QDomElement numberElement = domDoc.createElement( KVTML_GRAMMATICAL_NUMBER[num] ); 00116 for ( int person = 0; person < 5; ++person) { 00117 if (!conjugation(numbers[num] | persons[person]).isEmpty()) { 00118 QDomElement personElement = domDoc.createElement( KVTML_GRAMMATICAL_PERSON[person] ); 00119 numberElement.appendChild(personElement); 00120 conjugation(persons[person] | numbers[num]).toKVTML2(personElement); 00121 } 00122 } 00123 if (numberElement.hasChildNodes()) { 00124 parent.appendChild( numberElement ); 00125 } 00126 } 00127 } 00128 00129 /* 00130 00131 QString first = conjugation.conjugation( 00132 KEduVocConjugation::First, num ); 00133 QString second = conjugation.conjugation( 00134 KEduVocConjugation::Second, num ); 00135 QString third_male = conjugation.conjugation( 00136 KEduVocConjugation::ThirdMale, num ); 00137 QString third_female = conjugation.conjugation( 00138 KEduVocConjugation::ThirdFemale, num ); 00139 QString third_neutral = conjugation.conjugation( 00140 KEduVocConjugation::ThirdNeutralCommon, num ); 00141 00142 if ( !first.isEmpty() || !second.isEmpty() || !third_female.isEmpty() || 00143 !third_male.isEmpty() || !third_neutral.isEmpty() ) { 00144 QDomElement number; 00145 switch (num) { 00146 case KEduVocConjugation::Singular: 00147 number = m_domDoc.createElement( KVTML_SINGULAR ); 00148 break; 00149 case KEduVocConjugation::Dual: 00150 number = m_domDoc.createElement( KVTML_DUAL ); 00151 break; 00152 case KEduVocConjugation::Plural: 00153 number = m_domDoc.createElement( KVTML_PLURAL ); 00154 break; 00155 } 00156 00157 number.appendChild( newTextElement( KVTML_1STPERSON, first ) ); 00158 number.appendChild( newTextElement( KVTML_2NDPERSON, second ) ); 00159 number.appendChild( newTextElement( KVTML_THIRD_MALE, third_male ) ); 00160 number.appendChild( newTextElement( KVTML_THIRD_FEMALE, third_female ) ); 00161 number.appendChild( newTextElement( KVTML_THIRD_NEUTRAL_COMMON, third_neutral ) ); 00162 00163 conjugationElement.appendChild( number ); 00164 } 00165 }*/ 00166 00167 00168 /* 00169 for ( KEduVocWordFlag::DeclensionNumber num = KEduVocWordFlag::Singular; num <= KEduVocWordFlag::Plural; num = KEduVocWordFlag::DeclensionNumber(num +1) ) { 00170 QDomElement numberElement = domDoc.createElement( KVTML_GRAMMATICAL_NUMBER[num] ); 00171 for ( KEduVocWordFlag::DeclensionCase dcase = KEduVocWordFlag::Nominative; dcase < KEduVocWordFlag::DeclensionCaseMAX; dcase = KEduVocWordFlag::DeclensionCase(dcase +1) ) { 00172 QDomElement caseElement = domDoc.createElement( KVTML_DECLENSION_CASE[dcase] ); 00173 declension(num, dcase).toKVTML2(caseElement); 00174 00175 if (caseElement.hasChildNodes()) { 00176 numberElement.appendChild(caseElement); 00177 } 00178 } 00179 if (numberElement.hasChildNodes()) { 00180 declensionElement.appendChild(numberElement); 00181 } 00182 } 00183 00184 */ 00185 00186 00187 00188 KEduVocConjugation* KEduVocConjugation::fromKVTML2(QDomElement & parent) 00189 { 00190 // sanity check 00191 if (parent.isNull()) { 00192 return 0; 00193 } 00194 00195 QMap<int, KEduVocWordFlag::Flags> numbers; 00196 numbers[0] = KEduVocWordFlag::Singular; 00197 numbers[1] = KEduVocWordFlag::Dual; 00198 numbers[2] = KEduVocWordFlag::Plural; 00199 QMap<int, KEduVocWordFlag::Flags> persons; 00200 persons[0] = KEduVocWordFlag::First; 00201 persons[1] = KEduVocWordFlag::Second; 00202 persons[2] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Masculine); 00203 persons[3] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Feminine); 00204 persons[4] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Neuter); 00205 00206 00207 KEduVocConjugation* conjugation = new KEduVocConjugation; 00208 00209 for ( int num = 0; num <= 2; num++ ) { 00210 QDomElement numberElement = parent.firstChildElement( KVTML_GRAMMATICAL_NUMBER[num] ); 00211 00212 if (numberElement.hasChildNodes()) { 00213 for (int person = 0; person < 5; person++) { 00214 QDomElement personElement = numberElement.firstChildElement( KVTML_GRAMMATICAL_PERSON[person] ); 00215 if (!personElement.isNull()) { 00216 KEduVocText text; 00217 text.fromKVTML2(personElement); 00218 if (text.text().isEmpty()) { 00219 // compatibility for kde 4.0. There the text was directly below the person, not enabling grades per conjugation form. 00220 text.setText(personElement.text()); 00221 } 00222 conjugation->setConjugation(text, persons[person] | numbers[num]); 00223 } 00224 } 00225 } 00226 } 00227 return conjugation; 00228 } 00229 00230
KDE 4.2 API Reference