File indexing completed on 2022-10-04 13:56:32

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