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 }