File indexing completed on 2024-04-21 03:48:20

0001 /*
0002  * C++ Implementation: keduvocdeclension
0003  * SPDX-FileCopyrightText: 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "keduvocdeclension.h"
0007 
0008 #include "keduvockvtml2writer.h"
0009 #include "kvtml2defs.h"
0010 #include <QDomDocument>
0011 
0012 #include <QMap>
0013 
0014 class KEduVocDeclension::Private
0015 {
0016 public:
0017     QMap<KEduVocWordFlags, KEduVocText> m_declensions;
0018 };
0019 
0020 KEduVocDeclension::KEduVocDeclension()
0021     : d(new Private)
0022 {
0023 }
0024 
0025 KEduVocDeclension::KEduVocDeclension(const KEduVocDeclension &other)
0026     : d(new Private)
0027 {
0028     d->m_declensions = other.d->m_declensions;
0029 }
0030 
0031 KEduVocDeclension &KEduVocDeclension::operator=(const KEduVocDeclension &other)
0032 {
0033     d->m_declensions = other.d->m_declensions;
0034     return *this;
0035 }
0036 
0037 KEduVocDeclension::~KEduVocDeclension()
0038 {
0039     delete d;
0040 }
0041 
0042 KEduVocText &KEduVocDeclension::declension(KEduVocWordFlags flags)
0043 {
0044     return d->m_declensions[flags];
0045 }
0046 
0047 void KEduVocDeclension::setDeclension(const KEduVocText &declension, KEduVocWordFlags flags)
0048 {
0049     d->m_declensions[flags] = declension;
0050 }
0051 
0052 bool KEduVocDeclension::isEmpty()
0053 {
0054     return d->m_declensions.isEmpty();
0055 }
0056 
0057 void KEduVocDeclension::toKVTML2(QDomElement &parent)
0058 {
0059     if (isEmpty()) {
0060         return;
0061     }
0062     QDomDocument domDoc = parent.ownerDocument();
0063     QDomElement declensionElement = domDoc.createElement(KVTML_DECLENSION);
0064 
0065     QMap<int, KEduVocWordFlags> genders;
0066     genders[0] = KEduVocWordFlag::Masculine;
0067     genders[1] = KEduVocWordFlag::Feminine;
0068     genders[2] = KEduVocWordFlag::Neuter;
0069 
0070     QMap<int, KEduVocWordFlags> numbers;
0071     numbers[0] = KEduVocWordFlag::Singular;
0072     numbers[1] = KEduVocWordFlag::Dual;
0073     numbers[2] = KEduVocWordFlag::Plural;
0074 
0075     QMap<int, KEduVocWordFlags> cases;
0076     cases[0] = KEduVocWordFlag::Nominative;
0077     cases[1] = KEduVocWordFlag::Genitive;
0078     cases[2] = KEduVocWordFlag::Dative;
0079     cases[3] = KEduVocWordFlag::Accusative;
0080     cases[4] = KEduVocWordFlag::Ablative;
0081     cases[5] = KEduVocWordFlag::Locative;
0082     cases[6] = KEduVocWordFlag::Vocative;
0083 
0084     for (int gen = 0; gen <= 2; ++gen) {
0085         QDomElement genderElement = domDoc.createElement(KVTML_GRAMMATICAL_GENDER[gen]);
0086         for (int num = 0; num <= 2; ++num) {
0087             QDomElement numberElement = domDoc.createElement(KVTML_GRAMMATICAL_NUMBER[num]);
0088             for (int dcase = 0; dcase <= 6; ++dcase) {
0089                 QDomElement caseElement = domDoc.createElement(KVTML_DECLENSION_CASE[dcase]);
0090                 declension(genders[gen] | numbers[num] | cases[dcase]).toKVTML2(caseElement);
0091 
0092                 if (caseElement.hasChildNodes()) {
0093                     numberElement.appendChild(caseElement);
0094                 }
0095             }
0096             if (numberElement.hasChildNodes()) {
0097                 genderElement.appendChild(numberElement);
0098             }
0099         }
0100         if (genderElement.hasChildNodes()) {
0101             declensionElement.appendChild(genderElement);
0102         }
0103     }
0104     if (declensionElement.hasChildNodes()) {
0105         parent.appendChild(declensionElement);
0106     }
0107 }
0108 
0109 KEduVocDeclension *KEduVocDeclension::fromKVTML2(QDomElement &parent)
0110 {
0111     QDomElement declensionElement = parent.firstChildElement(KVTML_DECLENSION);
0112     // we don't create empty objects, if necessary, create later on demand.
0113     if (declensionElement.isNull()) {
0114         return nullptr;
0115     }
0116 
0117     QMap<int, KEduVocWordFlags> genders;
0118     genders[0] = KEduVocWordFlag::Masculine;
0119     genders[1] = KEduVocWordFlag::Feminine;
0120     genders[2] = KEduVocWordFlag::Neuter;
0121 
0122     QMap<int, KEduVocWordFlags> numbers;
0123     numbers[0] = KEduVocWordFlag::Singular;
0124     numbers[1] = KEduVocWordFlag::Dual;
0125     numbers[2] = KEduVocWordFlag::Plural;
0126 
0127     QMap<int, KEduVocWordFlags> cases;
0128     cases[0] = KEduVocWordFlag::Nominative;
0129     cases[1] = KEduVocWordFlag::Genitive;
0130     cases[2] = KEduVocWordFlag::Dative;
0131     cases[3] = KEduVocWordFlag::Accusative;
0132     cases[4] = KEduVocWordFlag::Ablative;
0133     cases[5] = KEduVocWordFlag::Locative;
0134     cases[6] = KEduVocWordFlag::Vocative;
0135 
0136     KEduVocDeclension *declension = new KEduVocDeclension;
0137 
0138     for (int gen = 0; gen <= 2; ++gen) {
0139         QDomElement genderElement = declensionElement.firstChildElement(KVTML_GRAMMATICAL_GENDER[gen]);
0140         if (!genderElement.isNull()) {
0141             for (int num = 0; num <= 2; ++num) {
0142                 QDomElement numberElement = genderElement.firstChildElement(KVTML_GRAMMATICAL_NUMBER[num]);
0143                 if (!numberElement.isNull()) {
0144                     for (int dcase = 0; dcase <= 6; ++dcase) {
0145                         QDomElement caseElement = numberElement.firstChildElement(KVTML_DECLENSION_CASE[dcase]);
0146                         if (!caseElement.isNull()) {
0147                             KEduVocText text;
0148                             text.fromKVTML2(caseElement);
0149                             declension->setDeclension(text, genders[gen] | numbers[num] | cases[dcase]);
0150                         }
0151                     }
0152                 }
0153             }
0154         }
0155     }
0156     return declension;
0157 }