Warning, file /education/libkeduvocdocument/keduvocdocument/keduvocdeclension.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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 }