You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kanagram/src/grammarmanager.cpp

504 lines
10 KiB

/***************************************************************************
manage grammar parts (articles, conjugation)
-----------------------------------------------------------------------
begin : Sat Nov 27 09:50:53 MET 1999
copyright : (C) 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
(C) 2001 The KDE-EDU team
(C) 2004-2005 Peter Hedlund <peter.hedlund@kdemail.net>
-----------------------------------------------------------------------
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "grammarmanager.h"
#include <tdelocale.h>
Conjugation::conjug_name_t
Conjugation::names [] =
{
{ CONJ_SIMPLE_PRESENT, I18N_NOOP("Simple Present") },
{ CONJ_PRESENT_PROGR, I18N_NOOP("Present Progressive") },
{ CONJ_PRESENT_PERFECT, I18N_NOOP("Present Perfect") },
{ CONJ_SIMPLE_PAST, I18N_NOOP("Simple Past") },
{ CONJ_PAST_PROGR, I18N_NOOP("Past Progressive") },
{ CONJ_PAST_PARTICIPLE, I18N_NOOP("Past Participle") },
{ CONJ_FUTURE, I18N_NOOP("Future") }
};
vector<TQString> Conjugation::userTenses;
//================================================================
Comparison::Comparison (
const TQString &l1,
const TQString &l2,
const TQString &l3
)
{
setL1 (l1);
setL2 (l2);
setL3 (l3);
}
bool Comparison::isEmpty() const
{
return ls1.stripWhiteSpace().isEmpty()
&& ls2.stripWhiteSpace().isEmpty()
&& ls3.stripWhiteSpace().isEmpty();
}
void Comparison::clear()
{
ls1 = "";
ls2 = "";
ls3 = "";
}
//=================================================================
Article::Article
(const TQString &fem_def, const TQString &fem_indef,
const TQString &mal_def, const TQString &mal_indef,
const TQString &nat_def, const TQString &nat_indef
)
{
setFemale (fem_def, fem_indef);
setMale (mal_def, mal_indef);
setNatural (nat_def, nat_indef);
}
void Article::setFemale
(const TQString &def, const TQString &indef)
{
fem_def = def;
fem_indef = indef;
}
void Article::setMale
(const TQString &def, const TQString &indef)
{
mal_def = def;
mal_indef = indef;
}
void Article::setNatural
(const TQString &def, const TQString &indef)
{
nat_def = def;
nat_indef = indef;
}
void Article::female
(TQString &def, TQString &indef) const
{
def = fem_def;
indef = fem_indef;
}
void Article::male
(TQString &def, TQString &indef) const
{
def = mal_def;
indef = mal_indef;
}
void Article::natural
(TQString &def, TQString &indef) const
{
def = nat_def;
indef = nat_indef;
}
//==============================================================
int Conjugation::numEntries() const
{
return conjugations.size();
}
vector<TenseRelation> Conjugation::getRelation ()
{
vector<TenseRelation> vec;
for (int i = 0; i < numInternalNames(); i++) {
vec.push_back(TenseRelation(names[i].abbrev,
i18n(names[i].name)));
}
for (int i = 0; i < (int) userTenses.size(); i++) {
TQString s;
s.setNum(i+1);
s.insert(0, UL_USER_TENSE);
vec.push_back(TenseRelation(s, userTenses[i]));
}
return vec;
}
void Conjugation::setTenseNames (vector<TQString> names)
{
userTenses = names;
}
TQString Conjugation::getName (const TQString &abbrev)
{
if (abbrev.length() >= 2 && abbrev[0] == TQString(UL_USER_TENSE)) {
TQString s = abbrev;
s.remove(0, 1);
int i = s.toInt() - 1;
if (i < (int) userTenses.size() )
return userTenses[i];
else
return "";
}
else {
for (int i = 0; i < (int) numInternalNames(); i++)
if (names[i].abbrev == abbrev) {
return i18n(names[i].name);
}
}
return "";
}
TQString Conjugation::getName (int idx)
{
if (idx < numInternalNames() )
return i18n(names[idx].name);
else if (idx < numTenses() )
return userTenses[idx-numInternalNames()];
else
return "";
}
TQString Conjugation::getAbbrev (const TQString &name)
{
for (int i = 0; i < (int) userTenses.size(); i++)
if (userTenses[i] == name) {
TQString s;
s.setNum(i+1);
s.insert(0, UL_USER_TENSE);
return s;
}
for (int i = 0; i < (int) numInternalNames(); i++)
if (names[i].name == name)
return names[i].abbrev;
return "";
}
TQString Conjugation::getAbbrev (int idx)
{
if (idx < numInternalNames() )
return names[idx].abbrev;
else if (idx < numTenses() ) {
TQString s;
s.setNum(idx-numInternalNames()+1);
s.insert(0, UL_USER_TENSE);
return s;
}
else
return "";
}
int Conjugation::numInternalNames()
{
return sizeof(names) / sizeof(names[0]);
}
int Conjugation::numTenses()
{
return numInternalNames()+userTenses.size();
}
TQString Conjugation::getType (int idx)
{
if (idx >= (int) conjugations.size() )
return "";
return conjugations[idx].type;
}
void Conjugation::setType (int idx, const TQString & type)
{
if (idx >= (int) conjugations.size() )
return;
conjugations[idx].type = type;
}
void Conjugation::cleanUp ()
{
for (int i = (int)conjugations.size()-1; i >= 0; i--) {
const conjug_t *ctp = &conjugations[i];
if ( ctp->pers1_sing.stripWhiteSpace().isEmpty()
&& ctp->pers2_sing.stripWhiteSpace().isEmpty()
&& ctp->pers3_m_sing.stripWhiteSpace().isEmpty()
&& ctp->pers3_f_sing.stripWhiteSpace().isEmpty()
&& ctp->pers3_n_sing.stripWhiteSpace().isEmpty()
&& ctp->pers1_plur.stripWhiteSpace().isEmpty()
&& ctp->pers2_plur.stripWhiteSpace().isEmpty()
&& ctp->pers3_m_plur.stripWhiteSpace().isEmpty()
&& ctp->pers3_f_plur.stripWhiteSpace().isEmpty()
&& ctp->pers3_n_plur.stripWhiteSpace().isEmpty()
)
conjugations.erase(conjugations.begin() + i);
}
}
bool Conjugation::isEmpty (int idx)
{
if (idx < (int) conjugations.size()) {
const conjug_t *ctp = &conjugations[idx];
return ctp->pers1_sing.stripWhiteSpace().isEmpty()
&& ctp->pers2_sing.stripWhiteSpace().isEmpty()
&& ctp->pers3_m_sing.stripWhiteSpace().isEmpty()
&& ctp->pers3_f_sing.stripWhiteSpace().isEmpty()
&& ctp->pers3_n_sing.stripWhiteSpace().isEmpty()
&& ctp->pers1_plur.stripWhiteSpace().isEmpty()
&& ctp->pers2_plur.stripWhiteSpace().isEmpty()
&& ctp->pers3_m_plur.stripWhiteSpace().isEmpty()
&& ctp->pers3_f_plur.stripWhiteSpace().isEmpty()
&& ctp->pers3_n_plur.stripWhiteSpace().isEmpty();
}
return true;
}
#define _GET_CON_(elem, type, default) \
for (int i = 0; i < (int) conjugations.size(); i++) \
if (conjugations[i].type == type) \
return conjugations[i].elem; \
return default;
bool Conjugation::pers3SingularCommon(const TQString &type) const
{
_GET_CON_(s3common, type, false);
}
bool Conjugation::pers3PluralCommon(const TQString &type) const
{
_GET_CON_(p3common, type, false);
}
TQString Conjugation::pers1Singular
(const TQString &type) const
{
_GET_CON_(pers1_sing, type, "");
}
TQString Conjugation::pers2Singular
(const TQString &type) const
{
_GET_CON_(pers2_sing, type, "");
}
TQString Conjugation::pers3FemaleSingular
(const TQString &type) const
{
_GET_CON_(pers3_f_sing, type, "");
}
TQString Conjugation::pers3MaleSingular
(const TQString &type) const
{
_GET_CON_(pers3_m_sing, type, "");
}
TQString Conjugation::pers3NaturalSingular
(const TQString &type) const
{
_GET_CON_(pers3_n_sing, type, "");
}
TQString Conjugation::pers1Plural
(const TQString &type) const
{
_GET_CON_(pers1_plur, type, "");
}
TQString Conjugation::pers2Plural
(const TQString &type) const
{
_GET_CON_(pers2_plur, type, "");
}
TQString Conjugation::pers3FemalePlural
(const TQString &type) const
{
_GET_CON_(pers3_f_plur, type, "");
}
TQString Conjugation::pers3MalePlural
(const TQString &type) const
{
_GET_CON_(pers3_m_plur, type, "");
}
TQString Conjugation::pers3NaturalPlural
(const TQString &type) const
{
_GET_CON_(pers3_n_plur, type, "");
}
#undef _GET_CON_
#define _SET_CON_(elem, type, str) \
for (int i = 0; i < (int) conjugations.size(); i++) \
if (conjugations[i].type == type) { \
conjugations[i].elem = str; \
return; \
} \
conjug_t ct; \
ct.type = type; \
ct.elem = str; \
conjugations.push_back(ct);
void Conjugation::setPers3PluralCommon(const TQString &type, bool f)
{
_SET_CON_(p3common, type, f);
}
void Conjugation::setPers3SingularCommon(const TQString &type, bool f)
{
_SET_CON_(s3common, type, f);
}
void Conjugation::setPers1Singular
(const TQString &type, const TQString &str)
{
_SET_CON_(pers1_sing, type, str);
}
void Conjugation::setPers2Singular
(const TQString &type, const TQString &str)
{
_SET_CON_(pers2_sing, type, str);
}
void Conjugation::setPers3FemaleSingular
(const TQString &type, const TQString &str)
{
_SET_CON_(pers3_f_sing, type, str);
}
void Conjugation::setPers3MaleSingular
(const TQString &type, const TQString &str)
{
_SET_CON_(pers3_m_sing, type, str);
}
void Conjugation::setPers3NaturalSingular
(const TQString &type, const TQString &str)
{
_SET_CON_(pers3_n_sing, type, str);
}
void Conjugation::setPers1Plural
(const TQString &type, const TQString &str)
{
_SET_CON_(pers1_plur, type, str);
}
void Conjugation::setPers2Plural
(const TQString &type, const TQString &str)
{
_SET_CON_(pers2_plur, type, str);
}
void Conjugation::setPers3FemalePlural
(const TQString &type, const TQString &str)
{
_SET_CON_(pers3_f_plur, type, str);
}
void Conjugation::setPers3MalePlural
(const TQString &type, const TQString &str)
{
_SET_CON_(pers3_m_plur, type, str);
}
void Conjugation::setPers3NaturalPlural
(const TQString &type, const TQString &str)
{
_SET_CON_(pers3_n_plur, type, str);
}
#undef _SET_CON_