@@ -25,13 +25,13 @@ namespace inflection::grammar::synthesis {
2525SrGrammarSynthesizer_SrDisplayFunction::SrGrammarSynthesizer_SrDisplayFunction (const ::inflection::dialog::SemanticFeatureModel& model)
2626 : super()
2727 , dictionary(*npc (::inflection::dictionary::DictionaryMetaData::createDictionary(::inflection::util::LocaleUtils::SERBIAN())))
28- , countFeature(model.getFeature(GrammemeConstants::NUMBER))
29- , genderFeature(model.getFeature(GrammemeConstants::GENDER))
30- , partOfSpeechFeature(model.getFeature(GrammemeConstants::POS))
28+ , caseFeature(*npc (model.getFeature(GrammemeConstants::CASE)))
29+ , numberFeature(*npc (model.getFeature(GrammemeConstants::NUMBER)))
30+ , genderFeature(*npc (model.getFeature(GrammemeConstants::GENDER)))
31+ , inflector(::inflection::dictionary::Inflector::getInflector(::inflection::util::LocaleUtils::SERBIAN()))
3132 , tokenizer(::inflection::tokenizer::TokenizerFactory::createTokenizer(::inflection::util::LocaleUtils::SERBIAN()))
3233 , dictionaryInflector(::inflection::util::LocaleUtils::SERBIAN(),{
33- {GrammemeConstants::POS_NOUN (), GrammemeConstants::POS_ADJECTIVE (), GrammemeConstants::POS_VERB ()},
34- {GrammemeConstants::PERSON_THIRD (), GrammemeConstants::PERSON_FIRST (), GrammemeConstants::PERSON_SECOND ()},
34+ {GrammemeConstants::POS_NOUN (), GrammemeConstants::POS_ADJECTIVE ()},
3535 {GrammemeConstants::NUMBER_SINGULAR (), GrammemeConstants::NUMBER_PLURAL ()},
3636 {GrammemeConstants::GENDER_MASCULINE (), GrammemeConstants::GENDER_FEMININE (), GrammemeConstants::GENDER_NEUTER ()}
3737 }, {}, true )
@@ -42,23 +42,54 @@ SrGrammarSynthesizer_SrDisplayFunction::~SrGrammarSynthesizer_SrDisplayFunction(
4242{
4343}
4444
45- ::inflection::dialog::DisplayValue * SrGrammarSynthesizer_SrDisplayFunction::getDisplayValue (const dialog::SemanticFeatureModel_DisplayData &displayData, const :: std::map<::inflection::dialog::SemanticFeature, ::std::u16string> & constraints, bool enableInflectionGuess ) const
45+ ::std::u16string SrGrammarSynthesizer_SrDisplayFunction::inflectString (const :: std::map<::inflection::dialog::SemanticFeature, ::std::u16string>& constraints, const ::std::u16string& lemma ) const
4646{
47- const auto displayValue = GrammarSynthesizerUtil::getTheBestDisplayValue (displayData, constraints);
48- if (displayValue == nullptr ) {
49- return nullptr ;
47+ ::std::u16string countString (GrammarSynthesizerUtil::getFeatureValue (constraints, numberFeature));
48+ ::std::u16string caseString (GrammarSynthesizerUtil::getFeatureValue (constraints, caseFeature));
49+ auto genderString = GrammarSynthesizerUtil::getFeatureValue (constraints, genderFeature);
50+
51+ ::std::u16string inflection;
52+
53+ // The nominative/caseless is unmarked in the patterns so we need to do something like this
54+ ::std::vector<::std::u16string> string_constraints;
55+ if (!countString.empty ()) {
56+ string_constraints.emplace_back (countString);
5057 }
51- ::std::u16string displayString = displayValue->getDisplayString ();
52- if (displayString.empty ()) {
53- return nullptr ;
58+ if (!caseString.empty () && caseString != GrammemeConstants::CASE_NOMINATIVE ()) {
59+ string_constraints.emplace_back (caseString);
5460 }
61+ if (!genderString.empty ()) {
62+ string_constraints.emplace_back (genderString);
63+ }
64+ // The nominative/caseless is unmarked in the patterns, so we need to do something like this
65+ int64_t wordGrammemes = 0 ;
66+ dictionary.getCombinedBinaryType (&wordGrammemes, lemma);
5567
56- // To make compiler quiet about unused variable.
57- if (enableInflectionGuess)
58- return nullptr ;
68+ auto inflectionResult = dictionaryInflector.inflect (lemma, wordGrammemes, string_constraints, {});
69+ if (inflectionResult) {
70+ inflection = *inflectionResult;
71+ }
72+
73+ if (inflection.empty ()) {
74+ return lemma;
75+ }
76+
77+ return inflection;
78+ }
5979
60- // TODO Implement the rest
61- return nullptr ;
80+ ::inflection::dialog::DisplayValue * SrGrammarSynthesizer_SrDisplayFunction::getDisplayValue (const dialog::SemanticFeatureModel_DisplayData &displayData, const ::std::map<::inflection::dialog::SemanticFeature, ::std::u16string> &constraints, bool /* enableInflectionGuess */ ) const
81+ {
82+ ::std::u16string displayString;
83+ if (!displayData.getValues ().empty ()) {
84+ displayString = displayData.getValues ()[0 ].getDisplayString ();
85+ }
86+ if (displayString.empty ()) {
87+ return nullptr ;
88+ }
89+ if (dictionary.isKnownWord (displayString)) {
90+ displayString = inflectString (constraints, displayString);
91+ }
92+ return new ::inflection::dialog::DisplayValue (displayString, constraints);
6293}
6394
6495} // namespace inflection::grammar::synthesis
0 commit comments