File indexing completed on 2024-04-14 03:46:38
0001 /* 0002 * C++ Implementation: keduvocconjugation 0003 * SPDX-FileCopyrightText: 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net> 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "keduvocconjugation.h" 0008 #include "keduvoccommon_p.h" 0009 #include "kvtml2defs.h" 0010 0011 #include <QDebug> 0012 #include <QDomDocument> 0013 #include <QMap> 0014 0015 class KEduVocConjugation::Private 0016 { 0017 public: 0018 QMap<KEduVocWordFlags, KEduVocText> m_conjugations; 0019 }; 0020 0021 KEduVocConjugation::KEduVocConjugation() 0022 : d(new Private) 0023 { 0024 } 0025 0026 KEduVocConjugation::KEduVocConjugation(const KEduVocConjugation &other) 0027 : d(new Private) 0028 { 0029 d->m_conjugations = other.d->m_conjugations; 0030 } 0031 0032 KEduVocConjugation::~KEduVocConjugation() 0033 { 0034 delete d; 0035 } 0036 0037 KEduVocConjugation &KEduVocConjugation::operator=(const KEduVocConjugation &other) 0038 { 0039 d->m_conjugations = other.d->m_conjugations; 0040 return *this; 0041 } 0042 0043 bool KEduVocConjugation::operator==(const KEduVocConjugation &other) const 0044 { 0045 return d->m_conjugations == other.d->m_conjugations; 0046 } 0047 0048 KEduVocText &KEduVocConjugation::conjugation(KEduVocWordFlags flags) const 0049 { 0050 return d->m_conjugations[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers | KEduVocWordFlag::genders)]; 0051 } 0052 0053 void KEduVocConjugation::setConjugation(const KEduVocText &conjugation, KEduVocWordFlags flags) 0054 { 0055 d->m_conjugations[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers | KEduVocWordFlag::genders)] = conjugation; 0056 } 0057 0058 bool KEduVocConjugation::isEmpty() 0059 { 0060 return d->m_conjugations.isEmpty(); 0061 } 0062 0063 QList<KEduVocWordFlags> KEduVocConjugation::keys() 0064 { 0065 return d->m_conjugations.keys(); 0066 } 0067 0068 void KEduVocConjugation::toKVTML2(QDomElement &parent, const QString &tense) 0069 { 0070 if (isEmpty()) { 0071 return; 0072 } 0073 0074 QMap<int, KEduVocWordFlag::Flags> numbers; 0075 numbers[0] = KEduVocWordFlag::Singular; 0076 numbers[1] = KEduVocWordFlag::Dual; 0077 numbers[2] = KEduVocWordFlag::Plural; 0078 QMap<int, KEduVocWordFlag::Flags> persons; 0079 persons[0] = KEduVocWordFlag::First; 0080 persons[1] = KEduVocWordFlag::Second; 0081 persons[2] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Masculine); 0082 persons[3] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Feminine); 0083 persons[4] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Neuter); 0084 0085 QDomDocument domDoc = parent.ownerDocument(); 0086 0087 // write the tense tag 0088 if (!tense.isEmpty()) { 0089 QDomElement tenseElement = domDoc.createElement(KVTML_TENSE); 0090 tenseElement.appendChild(domDoc.createTextNode(tense)); 0091 parent.appendChild(tenseElement); 0092 } else { 0093 qDebug() << "Saving conjugation with empty tense"; 0094 } 0095 0096 for (int num = 0; num <= 2; ++num) { 0097 QDomElement numberElement = domDoc.createElement(KVTML_GRAMMATICAL_NUMBER[num]); 0098 for (int person = 0; person < 5; ++person) { 0099 KEduVocWordFlags curFlags = numbers[num] | persons[person]; 0100 0101 if (keys().contains(curFlags) && !conjugation(curFlags).isEmpty()) { 0102 QDomElement personElement = domDoc.createElement(KVTML_GRAMMATICAL_PERSON[person]); 0103 numberElement.appendChild(personElement); 0104 conjugation(curFlags).toKVTML2(personElement); 0105 } 0106 } 0107 if (numberElement.hasChildNodes()) { 0108 parent.appendChild(numberElement); 0109 } 0110 } 0111 } 0112 0113 /* 0114 0115 QString first = conjugation.conjugation( 0116 KEduVocConjugation::First, num ); 0117 QString second = conjugation.conjugation( 0118 KEduVocConjugation::Second, num ); 0119 QString third_male = conjugation.conjugation( 0120 KEduVocConjugation::ThirdMale, num ); 0121 QString third_female = conjugation.conjugation( 0122 KEduVocConjugation::ThirdFemale, num ); 0123 QString third_neutral = conjugation.conjugation( 0124 KEduVocConjugation::ThirdNeutralCommon, num ); 0125 0126 if ( !first.isEmpty() || !second.isEmpty() || !third_female.isEmpty() || 0127 !third_male.isEmpty() || !third_neutral.isEmpty() ) { 0128 QDomElement number; 0129 switch (num) { 0130 case KEduVocConjugation::Singular: 0131 number = m_domDoc.createElement( KVTML_SINGULAR ); 0132 break; 0133 case KEduVocConjugation::Dual: 0134 number = m_domDoc.createElement( KVTML_DUAL ); 0135 break; 0136 case KEduVocConjugation::Plural: 0137 number = m_domDoc.createElement( KVTML_PLURAL ); 0138 break; 0139 } 0140 0141 number.appendChild( newTextElement( KVTML_1STPERSON, first ) ); 0142 number.appendChild( newTextElement( KVTML_2NDPERSON, second ) ); 0143 number.appendChild( newTextElement( KVTML_THIRD_MALE, third_male ) ); 0144 number.appendChild( newTextElement( KVTML_THIRD_FEMALE, third_female ) ); 0145 number.appendChild( newTextElement( KVTML_THIRD_NEUTRAL_COMMON, third_neutral ) ); 0146 0147 conjugationElement.appendChild( number ); 0148 } 0149 }*/ 0150 0151 /* 0152 for ( KEduVocWordFlag::DeclensionNumber num = KEduVocWordFlag::Singular; num <= KEduVocWordFlag::Plural; num = KEduVocWordFlag::DeclensionNumber(num +1) ) { 0153 QDomElement numberElement = domDoc.createElement( KVTML_GRAMMATICAL_NUMBER[num] ); 0154 for ( KEduVocWordFlag::DeclensionCase dcase = KEduVocWordFlag::Nominative; dcase < KEduVocWordFlag::DeclensionCaseMAX; dcase = 0155 KEduVocWordFlag::DeclensionCase(dcase +1) ) { QDomElement caseElement = domDoc.createElement( KVTML_DECLENSION_CASE[dcase] ); declension(num, 0156 dcase).toKVTML2(caseElement); 0157 0158 if (caseElement.hasChildNodes()) { 0159 numberElement.appendChild(caseElement); 0160 } 0161 } 0162 if (numberElement.hasChildNodes()) { 0163 declensionElement.appendChild(numberElement); 0164 } 0165 } 0166 0167 */ 0168 0169 KEduVocConjugation *KEduVocConjugation::fromKVTML2(QDomElement &parent) 0170 { 0171 // sanity check 0172 if (parent.isNull()) { 0173 return nullptr; 0174 } 0175 0176 QMap<int, KEduVocWordFlag::Flags> numbers; 0177 numbers[0] = KEduVocWordFlag::Singular; 0178 numbers[1] = KEduVocWordFlag::Dual; 0179 numbers[2] = KEduVocWordFlag::Plural; 0180 QMap<int, KEduVocWordFlag::Flags> persons; 0181 persons[0] = KEduVocWordFlag::First; 0182 persons[1] = KEduVocWordFlag::Second; 0183 persons[2] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Masculine); 0184 persons[3] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Feminine); 0185 persons[4] = (KEduVocWordFlag::Flags)((int)KEduVocWordFlag::Third | (int)KEduVocWordFlag::Neuter); 0186 0187 KEduVocConjugation *conjugation = new KEduVocConjugation; 0188 0189 for (int num = 0; num <= 2; num++) { 0190 QDomElement numberElement = parent.firstChildElement(KVTML_GRAMMATICAL_NUMBER[num]); 0191 0192 if (numberElement.hasChildNodes()) { 0193 for (int person = 0; person < 5; person++) { 0194 QDomElement personElement = numberElement.firstChildElement(KVTML_GRAMMATICAL_PERSON[person]); 0195 if (!personElement.isNull()) { 0196 KEduVocText text; 0197 text.fromKVTML2(personElement); 0198 if (text.text().isEmpty()) { 0199 // compatibility for kde 4.0. There the text was directly below the person, not enabling grades per conjugation form. 0200 text.setText(personElement.text()); 0201 } 0202 conjugation->setConjugation(text, persons[person] | numbers[num]); 0203 } 0204 } 0205 } 0206 } 0207 return conjugation; 0208 }