diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 2d0a3c823..58db298d0 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4158,7 +4158,9 @@ "goToSpace": "Go to space: {space}", "@goToSpace": { "type": "text", - "space": {} + "placeholders": { + "space": {} + } }, "markAsUnread": "Mark as unread", "userLevel": "{level} - User", @@ -4245,7 +4247,7 @@ "grammarCopyPUNCTTYPEqest": "Question", "grammarCopyASPECTperf": "Perfect", "grammarCopyCASEaccnom": "Accusative, Nominative", - "grammarCopyCASEobl": "Oblique Case", + "grammarCopyCASEobl": "Oblique", "grammarCopyVOICEact": "Active", "grammarCopyPUNCTTYPEbrck": "Bracket", "grammarCopyNOUNTYPEart": "Article", @@ -4288,7 +4290,7 @@ "grammarCopyPRONTYPErel": "Relative", "grammarCopyVERBFORMfinalEnding": "Final Ending", "grammarCopyPRONTYPEdem": "Demonstrative", - "grammarCopyPREPCASEpre": "Preposition", + "grammarCopyPREPCASEpre": "Prepositional", "grammarCopyVERBFORMfin": "Finite", "grammarCopyDEGREEpos": "Positive", "grammarCopyPUNCTTYPEquot": "Quotation", @@ -4304,36 +4306,36 @@ "grammarCopyCASEloc": "Locative", "grammarCopyMOODind": "Indicative", "grammarCopyDEGREEcmp": "Comparative", - "grammarCopyCASErelativeCase": "Relative Case", + "grammarCopyCASErelativeCase": "Relative", "grammarCopyPUNCTTYPEexcl": "Exclamative", "grammarCopyPERSON1": "First Person", "grammarCopyPUNCTSIDEini": "Initial", "grammarCopyGENDERperson": "Person", "grammarCopyFOREIGNyes": "Foreign", "grammarCopyVOICEvoice": "Voice", - "grammarCopyVERBTYPEverbType": "Verb Type", + "grammarCopyVERBTYPEverbType": "Verb", "grammarCopyPOSSpass": "Possessive", - "grammarCopyPREPCASEprepCase": "Prepositional Case", - "grammarCopyNUMTYPEnumType": "Numeral Type", - "grammarCopyNOUNTYPEnounType": "Noun Type", + "grammarCopyPREPCASEprepCase": "Prepositional", + "grammarCopyNUMTYPEnumType": "Numeral", + "grammarCopyNOUNTYPEnounType": "Noun", "grammarCopyREFLEXreflex": "Reflexive", - "grammarCopyPRONTYPEpronType": "Pronoun Type", + "grammarCopyPRONTYPEpronType": "Pronoun", "grammarCopyPUNCTSIDEpunctSide": "Punctuation Side", - "grammarCopyVERBFORMverbForm": "Verb Form", + "grammarCopyVERBFORMverbForm": "Verb", "grammarCopyGENDERgender": "Gender", "grammarCopyMOODmood": "Mood", "grammarCopyASPECTaspect": "Aspect", - "grammarCopyPUNCTTYPEpunctType": "Punctuation Type", + "grammarCopyPUNCTTYPEpunctType": "Punctuation", "grammarCopyTENSEtense": "Tense", "grammarCopyDEGREEdegree": "Degree", "grammarCopyPOLITEpolite": "Politeness", - "grammarCopyADVTYPEadvType": "Adverb Type", + "grammarCopyADVTYPEadvType": "Adverb", "grammarCopyNUMFORMnumber": "Number", - "grammarCopyCONJTYPEconjType": "Conjunction Type", + "grammarCopyCONJTYPEconjType": "Conjunction", "grammarCopyPOLARITYpolarity": "Polarity", "grammarCopyCASEcase": "Case", "grammarCopyDEFINITEdefinite": "Definiteness", - "grammarCopyNUMFORMnumForm": "Numeral Form", + "grammarCopyNUMFORMnumForm": "Numeral", "grammarCopyPRONTYPEadn": "Adnominal", "grammarCopyVOCvoc": "Vocative", "grammarCopyCMPLcmpl": "Complementizer", @@ -4344,74 +4346,74 @@ "grammarCopyPARTTYPEpar": "Partitive", "grammarCopySPCspc": "Specific", "grammarCopyTENSEpqp": "Pluperfect", - "grammarCopyREFLEXref": "Reflexive Case", + "grammarCopyREFLEXref": "Reflexive", "grammarCopyPUNCTTYPEnshrt": "Short", "grammarCopyNUMBERdual": "Dual", "grammarCopyNUMFORMlng": "Long", - "grammarCopyVOICEmid": "Middle Voice", + "grammarCopyVOICEmid": "Middle", "grammarCopyINTRELintRel": "Interrogative, Relative", "grammarCopyINTint": "Interrogative", - "grammarCopyVOICEcaus": "Causative Voice", + "grammarCopyVOICEcaus": "Causative", "grammarCopyUnknown": "Unknown", "grammarCopyEVIDENTevident": "Evidentiality", "grammarCopyNUMFORMnumberPsor": "Possessor's Number", "grammarCopyASPECThab": "Habitual", - "grammarCopyCASEabl": "Ablative Case", - "grammarCopyCASEall": "Allative Case", - "grammarCopyCASEess": "Essive Case", - "grammarCopyCASEtra": "Translative Case", - "grammarCopyCASEequ": "Equative Case", - "grammarCopyCASEdis": "Distributive Case", - "grammarCopyCASEabs": "Absolutive Case", - "grammarCopyCASEerg": "Ergative Case", - "grammarCopyCASEcau": "Causal Case", - "grammarCopyCASEben": "Benefactive Case", - "grammarCopyCASEtem": "Temporal Case", - "grammarCopyCONJTYPEcoord": "Coordinating Conjunction", + "grammarCopyCASEabl": "Ablative", + "grammarCopyCASEall": "Allative", + "grammarCopyCASEess": "Essive", + "grammarCopyCASEtra": "Translative", + "grammarCopyCASEequ": "Equative", + "grammarCopyCASEdis": "Distributive", + "grammarCopyCASEabs": "Absolutive", + "grammarCopyCASEerg": "Ergative", + "grammarCopyCASEcau": "Causal", + "grammarCopyCASEben": "Benefactive", + "grammarCopyCASEtem": "Temporal", + "grammarCopyCONJTYPEcoord": "Coordinating", "grammarCopyDEFINITEcons": "Construct State", "grammarCopyDEGREEabs": "Absolute Degree", "grammarCopyEVIDENTfh": "Factual Evidentiality", "grammarCopyEVIDENTnfh": "Non-factual Evidentiality", - "grammarCopyMOODopt": "Optative Mood", - "grammarCopyMOODadm": "Admirative Mood", - "grammarCopyMOODdes": "Desiderative Mood", - "grammarCopyMOODnec": "Necessitative Mood", - "grammarCopyMOODpot": "Potential Mood", - "grammarCopyMOODprp": "Propositive Mood", - "grammarCopyMOODqot": "Quotative Mood", + "grammarCopyMOODopt": "Optative", + "grammarCopyMOODadm": "Admirative", + "grammarCopyMOODdes": "Desiderative", + "grammarCopyMOODnec": "Necessitative", + "grammarCopyMOODpot": "Potential", + "grammarCopyMOODprp": "Propositive", + "grammarCopyMOODqot": "Quotative", "grammarCopyNUMFORMword": "Word Form", "grammarCopyNUMFORMroman": "Roman Numeral", "grammarCopyNUMFORMletter": "Letter Form", - "grammarCopyNUMTYPEmult": "Multiplicative Numeral", - "grammarCopyNUMTYPEfrac": "Fractional Numeral", - "grammarCopyNUMTYPEsets": "Set Numeral", - "grammarCopyNUMTYPErange": "Range Numeral", - "grammarCopyNUMTYPEdist": "Distributive Numeral", - "grammarCopyNUMBERtri": "Trial Number", - "grammarCopyNUMBERpauc": "Paucal Number", - "grammarCopyNUMBERgrpa": "Greater Paucal Number", - "grammarCopyNUMBERgrpl": "Greater Plural Number", - "grammarCopyNUMBERinv": "Inverse Number", - "grammarCopyPERSON0": "Zero Person", - "grammarCopyPERSON4": "Fourth Person", - "grammarCopyPOLITEform": "Formal Politeness", - "grammarCopyPOLITEelev": "Elevated Politeness", - "grammarCopyPOLITEhumb": "Humble Politeness", - "grammarCopyPRONTYPEemp": "Emphatic Pronoun", - "grammarCopyPRONTYPEexc": "Exclamative Pronoun", - "grammarCopyPRONTYPErcp": "Reciprocal Pronoun", - "grammarCopyPRONTYPEintRelPronType": "Interrogative-Relative Pronoun", - "grammarCopyTENSEaor": "Aorist Tense", - "grammarCopyTENSEeps": "Epistemic Tense", - "grammarCopyTENSEprosp": "Prospective Tense", - "grammarCopyVERBFORMpart": "Participle Form", - "grammarCopyVERBFORMconv": "Converb Form", + "grammarCopyNUMTYPEmult": "Multiplicative", + "grammarCopyNUMTYPEfrac": "Fractional", + "grammarCopyNUMTYPEsets": "Set", + "grammarCopyNUMTYPErange": "Range", + "grammarCopyNUMTYPEdist": "Distributive", + "grammarCopyNUMBERtri": "Trial", + "grammarCopyNUMBERpauc": "Paucal", + "grammarCopyNUMBERgrpa": "Greater Paucal", + "grammarCopyNUMBERgrpl": "Greater Plural", + "grammarCopyNUMBERinv": "Inverse", + "grammarCopyPERSON0": "Zero", + "grammarCopyPERSON4": "Fourth", + "grammarCopyPOLITEform": "Formal", + "grammarCopyPOLITEelev": "Elevated", + "grammarCopyPOLITEhumb": "Humble", + "grammarCopyPRONTYPEemp": "Emphatic", + "grammarCopyPRONTYPEexc": "Exclamative", + "grammarCopyPRONTYPErcp": "Reciprocal", + "grammarCopyPRONTYPEintRelPronType": "Interrogative-Relative", + "grammarCopyTENSEaor": "Aorist", + "grammarCopyTENSEeps": "Epistemic", + "grammarCopyTENSEprosp": "Prospective", + "grammarCopyVERBFORMpart": "Participle", + "grammarCopyVERBFORMconv": "Converb", "grammarCopyVERBFORMvnoun": "Verbal Noun", - "grammarCopyVOICEantip": "Antipassive Voice", - "grammarCopyVOICEcauVoice": "Causative Voice", - "grammarCopyVOICedir": "Direct Voice", - "grammarCopyVOICEinvVoice": "Inverse Voice", - "grammarCopyVOICErcpVoice": "Reciprocal Voice", + "grammarCopyVOICEantip": "Antipassive", + "grammarCopyVOICEcauVoice": "Causative", + "grammarCopyVOICedir": "Direct", + "grammarCopyVOICEinvVoice": "Inverse", + "grammarCopyVOICErcpVoice": "Reciprocal", "grammarCopyPOS": "Part of Speech", "grammarCopyGENDER": "Gender", "grammarCopyPERSON": "Person", @@ -4447,18 +4449,18 @@ "grammarCopyNUMBERPSOR": "Possessor's Number", "grammarCopyPOSS": "Possessive", "grammarCopyASPECTimp": "Imperfective Aspect", - "grammarCopyCASEvoc": "Vocative Case", - "grammarCopyCASEcom": "Comitative Case", - "grammarCopyCASEpar": "Partitive Case", - "grammarCopyCASEadv": "Adverbial Case", - "grammarCopyCASEref": "Referential Case", - "grammarCopyCASErel": "Relative Case", - "grammarCopyCASEsub": "Subessive Case", - "grammarCopyCASEsup": "Superessive Case", - "grammarCopyCASEaccdat": "Accusative-Dative Case", - "grammarCopyCASEpre": "Prepositional Case", - "grammarCopyCONJTYPEsub": "Subordinating Conjunction", - "grammarCopyCONJTYPEcmp": "Comparative Conjunction", + "grammarCopyCASEvoc": "Vocative", + "grammarCopyCASEcom": "Comitative", + "grammarCopyCASEpar": "Partitive", + "grammarCopyCASEadv": "Adverbial", + "grammarCopyCASEref": "Referential", + "grammarCopyCASErel": "Relative", + "grammarCopyCASEsub": "Subessive", + "grammarCopyCASEsup": "Superessive", + "grammarCopyCASEaccdat": "Accusative-Dative", + "grammarCopyCASEpre": "Prepositional", + "grammarCopyCONJTYPEsub": "Subordinating", + "grammarCopyCONJTYPEcmp": "Comparative", "grammarCopyDEFINITEind": "Indefinite", "grammarCopyMOODint": "Interrogative Mood", "grammarCopyNOUNTYPEcomm": "Common Noun", @@ -4468,25 +4470,26 @@ "grammarCopyPOLARITYpos": "Positive Polarity", "grammarCopyPOSSyes": "Possessive", "grammarCopyPREPCASEnpr": "Non-prepositional", - "grammarCopyPRONTYPEprs": "Personal Pronoun", - "grammarCopyPRONTYPEint": "Interrogative Pronoun", - "grammarCopyPRONTYPEtot": "Total Pronoun", - "grammarCopyPRONTYPEneg": "Negative Pronoun", - "grammarCopyPRONTYPEart": "Article Pronoun", - "grammarCopyPRONTYPEind": "Indefinite Pronoun", - "grammarCopyPRONTYPEintrel": "Interrogative-Relative Pronoun", + "grammarCopyPRONTYPEprs": "Personal", + "grammarCopyPRONTYPEint": "Interrogative", + "grammarCopyPRONTYPEtot": "Total", + "grammarCopyPRONTYPEneg": "Negative", + "grammarCopyPRONTYPEart": "Article", + "grammarCopyPRONTYPEind": "Indefinite", + "grammarCopyPRONTYPEintrel": "Interrogative-Relative", + "grammarCopyPRONTYPEint": "Interrogative", "grammarCopyPUNCTSIDEfin": "Final Punctuation", "grammarCopyPUNCTTYPEperi": "Period", "grammarCopyREFLEXyes": "Reflexive", - "grammarCopyTENSEimp": "Imperfect Tense", - "grammarCopyVERBFORMsup": "Supine Form", - "grammarCopyVERBFORMadn": "Adnominal Form", - "grammarCopyVERBFORMlng": "Long Form", + "grammarCopyTENSEimp": "Imperfect", + "grammarCopyVERBFORMsup": "SuApine", + "grammarCopyVERBFORMadn": "Adnominal", + "grammarCopyVERBFORMlng": "Long", "grammarCopyVERBTYPEcaus": "Causative Verb", - "grammarCopyVOICEcau": "Causative Voice", - "grammarCopyVOICEdir": "Direct Voice", - "grammarCopyVOICEinv": "Inverse Voice", - "grammarCopyVOICErcp": "Reciprocal Voice", + "grammarCopyVOICEcau": "Causative", + "grammarCopyVOICEdir": "Direct", + "grammarCopyVOICEinv": "Inverse", + "grammarCopyVOICErcp": "Reciprocal", "enterPrompt": "Please enter a system prompt", "selectBotLanguage": "Select bot language", "chooseVoice": "Choose a voice", diff --git a/lib/pangea/constants/morph_categories_and_labels.dart b/lib/pangea/constants/morph_categories_and_labels.dart new file mode 100644 index 000000000..6eb056a53 --- /dev/null +++ b/lib/pangea/constants/morph_categories_and_labels.dart @@ -0,0 +1,167 @@ +const Map> morphCategoriesAndLabels = { + "Pos": [ + "ADJ", + "ADP", + "ADV", + "AFFIX", + "AUX", + "CCONJ", + "DET", + "INTJ", + "NOUN", + "NUM", + "PART", + "PRON", + "PROPN", + "PUNCT", + "SCONJ", + "SPACE", + "SYM", + "VERB", + "X", + ], + "AdvType": ["Adverbial", "Tim"], + "Aspect": [ + "Imp", + "Perf", + "Prog", + "Hab", + ], + "Case": [ + "Nom", + "Acc", + "Dat", + "Gen", + "Voc", + "Abl", + "Loc", + "All", + "Ins", + "Ess", + "Tra", + "Com", + "Par", + "Adv", + "Ref", + "Rel", + "Equ", + "Dis", + "Abs", + "Erg", + "Cau", + "Ben", + "Sub", + "Sup", + "Tem", + "Obl", + "Acc,Dat", + "Acc,Nom", + "Pre", + ], + "ConjType": ["Coord", "Sub", "Cmp"], + "Definite": ["Def", "Ind", "Cons"], + "Degree": [ + "Pos", + "Cmp", + "Sup", + "Abs", + ], + "Evident": ["Fh", "Nfh"], + "Foreign": ["Yes"], + "Gender": ["Masc", "Fem", "Neut", "Com"], + "Mood": [ + "Ind", + "Imp", + "Sub", + "Cnd", + "Opt", + "Jus", + "Adm", + "Des", + "Nec", + "Pot", + "Prp", + "Qot", + "Int", + ], + "NounType": ["Prop", "Comm", "Not_proper"], + "NumForm": [ + "Digit", + "Word", + "Roman", + "Letter", + ], + "NumType": [ + "Card", + "Ord", + "Mult", + "Frac", + "Sets", + "Range", + "Dist", + ], + "Number": [ + "Sing", + "Plur", + "Dual", + "Tri", + "Pauc", + "Grpa", + "Grpl", + "Inv", + ], + "Number[psor]": ["Sing", "Plur", "Dual"], + "Person": [ + "0", + "1", + "2", + "3", + "4", + ], + "Polarity": ["Pos", "Neg"], + "Polite": ["Infm", "Form", "Elev", "Humb"], + "Poss": ["Yes"], + "PrepCase": ["Npr"], + "PronType": [ + "Prs", + "Int", + "Rel", + "Dem", + "Tot", + "Neg", + "Art", + "Emp", + "Exc", + "Ind", + "Rcp", + "Int,Rel", + ], + "PunctSide": ["Ini", "Fin"], + "PunctType": [ + "Brck", + "Dash", + "Excl", + "Peri", + "Qest", + "Quot", + "Semi", + "Colo", + "Comm", + ], + "Reflex": ["Yes"], + "Tense": ["Pres", "Past", "Fut", "Imp", "Pqp", "Aor", "Eps", "Prosp"], + "VerbForm": [ + "Fin", + "Inf", + "Sup", + "Part", + "Conv", + "Vnoun", + "Ger", + "Adn", + "Lng", + ], + "VerbType": ["Mod", "Caus"], + "Voice": ["Act", "Mid", "Pass", "Antip", "Cau", "Dir", "Inv", "Rcp", "Caus"], + "X": ["X"], +}; diff --git a/lib/pangea/controllers/put_analytics_controller.dart b/lib/pangea/controllers/put_analytics_controller.dart index 063f163cc..8ced8b76b 100644 --- a/lib/pangea/controllers/put_analytics_controller.dart +++ b/lib/pangea/controllers/put_analytics_controller.dart @@ -189,6 +189,7 @@ class PutAnalyticsController extends BaseController { OneConstructUse( useType: useType, lemma: entry.value, + form: token.text.content, category: entry.key, constructType: ConstructTypeEnum.morph, metadata: metadata, diff --git a/lib/pangea/models/analytics/construct_list_model.dart b/lib/pangea/models/analytics/construct_list_model.dart index bc82855f6..eeb3696bb 100644 --- a/lib/pangea/models/analytics/construct_list_model.dart +++ b/lib/pangea/models/analytics/construct_list_model.dart @@ -52,16 +52,21 @@ class ConstructListModel { _updateMetrics(); } + int _sortConstructs(ConstructUses a, ConstructUses b) { + final comp = b.points.compareTo(a.points); + if (comp != 0) return comp; + return a.lemma.compareTo(b.lemma); + } + /// A map of lemmas to ConstructUses, each of which contains a lemma /// key = lemmma + constructType.string, value = ConstructUses void _updateConstructMap(final List newUses) { for (final use in newUses) { - if (use.lemma == null) continue; final currentUses = _constructMap[use.identifier.string] ?? ConstructUses( uses: [], constructType: use.constructType, - lemma: use.lemma!, + lemma: use.lemma, category: use.category, ); currentUses.uses.add(use); @@ -75,11 +80,7 @@ class ConstructListModel { void _updateConstructList() { // TODO check how expensive this is _constructList = _constructMap.values.toList(); - _constructList.sort((a, b) { - final comp = b.uses.length.compareTo(a.uses.length); - if (comp != 0) return comp; - return a.lemma.compareTo(b.lemma); - }); + _constructList.sort(_sortConstructs); } void _updateCategoriesToUses() { diff --git a/lib/pangea/models/analytics/constructs_model.dart b/lib/pangea/models/analytics/constructs_model.dart index b945155d8..3fd2feaa0 100644 --- a/lib/pangea/models/analytics/constructs_model.dart +++ b/lib/pangea/models/analytics/constructs_model.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:fluffychat/pangea/constants/morph_categories_and_labels.dart'; import 'package:fluffychat/pangea/enum/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; @@ -49,20 +50,15 @@ class ConstructAnalyticsModel { } class OneConstructUse { - /// the lemma of vocab or the text of a morph tag - /// e.g. "be" or "Present" - String? lemma; + String lemma; - /// exact text as it appeared in the text + // practice activities do not currently include form in the target_construct info + // for that, this is nullable String? form; /// For vocab constructs, this is the POS. For morph /// constructs, this is the morphological category. - /// e.g. "are" or "Tense" - /// TODO - for old uses without category, we should - /// try guessing the category from the lemma as best we can - /// while it's not 1-to-1, most morph tags are unique - String? category; + String category; ConstructTypeEnum constructType; ConstructUseTypeEnum useType; @@ -78,8 +74,8 @@ class OneConstructUse { required this.lemma, required this.constructType, required this.metadata, - this.category, - this.form, + required this.category, + required this.form, this.id, }); @@ -88,27 +84,20 @@ class OneConstructUse { DateTime get timeStamp => metadata.timeStamp; factory OneConstructUse.fromJson(Map json) { - final constructType = json['constructType'] != null - ? ConstructTypeUtil.fromString(json['constructType']) - : null; - debugger(when: kDebugMode && constructType == null); + debugger(when: kDebugMode && json['constructType'] == null); - final categoryEntry = json['cat'] ?? json['categories']; - String? category; - if (categoryEntry != null) { - if ((categoryEntry is List) && categoryEntry.isNotEmpty) { - category = categoryEntry.first; - } else if (categoryEntry is String) { - category = categoryEntry; - } - } + final ConstructTypeEnum constructType = json['constructType'] != null + ? ConstructTypeUtil.fromString(json['constructType']) + : ConstructTypeEnum.vocab; return OneConstructUse( useType: ConstructUseTypeUtil.fromString(json['useType']), lemma: json['lemma'], form: json['form'], - category: category, - constructType: constructType ?? ConstructTypeEnum.vocab, + category: constructType == ConstructTypeEnum.morph + ? getCategory(json) + : "Other", + constructType: constructType, id: json['id'], metadata: ConstructUseMetaData( eventId: json['msgId'], @@ -118,21 +107,53 @@ class OneConstructUse { ); } - Map toJson() { - final Map data = { - 'useType': useType.string, - 'chatId': metadata.roomId, - 'timeStamp': metadata.timeStamp.toIso8601String(), - 'form': form, - 'msgId': metadata.eventId, - }; + Map toJson() => { + 'useType': useType.string, + 'chatId': metadata.roomId, + 'timeStamp': metadata.timeStamp.toIso8601String(), + 'form': form, + 'msgId': metadata.eventId, + 'lemma': lemma, + 'constructType': constructType.string, + 'categories': category, + 'id': id, + }; + + static String getCategory(Map json) { + final categoryEntry = json['cat'] ?? json['categories']; + + if (categoryEntry == null) { + return _guessGrammarCategory(json["lemma"]); + } - data['lemma'] = lemma!; - data['constructType'] = constructType.string; + if ((categoryEntry is List)) { + if (categoryEntry.isEmpty) { + return _guessGrammarCategory(json["lemma"]); + } + return categoryEntry.first; + } else if (categoryEntry is String) { + return categoryEntry; + } - if (id != null) data['id'] = id; - data['categories'] = category; - return data; + debugPrint( + "Category entry is not a list or string -${json['cat'] ?? json['categories']}-", + ); + return _guessGrammarCategory(json["lemma"]); + } + + static String _guessGrammarCategory(String morphLemma) { + for (final String category in morphCategoriesAndLabels.keys) { + if (morphCategoriesAndLabels[category]!.contains(morphLemma)) { + debugPrint( + "found missing construct category for $morphLemma: $category", + ); + return category; + } + } + ErrorHandler.logError( + m: "Morph construct lemma $morphLemma not found in morph categories and labels", + ); + return "Other"; } Room? getRoom(Client client) { @@ -148,9 +169,9 @@ class OneConstructUse { int get pointValue => useType.pointValue; ConstructIdentifier get identifier => ConstructIdentifier( - lemma: lemma!, + lemma: lemma, type: constructType, - category: category ?? "", + category: category, ); } diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart index b1a7e8863..d60ee3575 100644 --- a/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart +++ b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart @@ -158,6 +158,8 @@ class ActivityRecordResponse { .map( (construct) => OneConstructUse( lemma: construct.lemma, + // TODO - add form to practiceActivity target_construct data somehow + form: null, constructType: construct.type, useType: useType(practiceActivity.activityType), metadata: metadata, diff --git a/lib/pangea/models/representation_content_model.dart b/lib/pangea/models/representation_content_model.dart index c3f649069..3d21d7ff6 100644 --- a/lib/pangea/models/representation_content_model.dart +++ b/lib/pangea/models/representation_content_model.dart @@ -159,6 +159,7 @@ class PangeaRepresentation { OneConstructUse( useType: useType, lemma: entry.value, + form: token.text.content, category: entry.key, constructType: ConstructTypeEnum.morph, metadata: metadata, @@ -210,6 +211,7 @@ class PangeaRepresentation { OneConstructUse( useType: ConstructUseTypeEnum.ga, lemma: entry.value, + form: token.text.content, category: entry.key, constructType: ConstructTypeEnum.morph, metadata: metadata, @@ -227,6 +229,7 @@ class PangeaRepresentation { OneConstructUse( useType: ConstructUseTypeEnum.wa, lemma: entry.value, + form: token.text.content, category: entry.key, constructType: ConstructTypeEnum.morph, metadata: metadata, diff --git a/lib/pangea/utils/get_grammar_copy.dart b/lib/pangea/utils/grammar/get_grammar_copy.dart similarity index 98% rename from lib/pangea/utils/get_grammar_copy.dart rename to lib/pangea/utils/grammar/get_grammar_copy.dart index fa7178cf9..b8e406faf 100644 --- a/lib/pangea/utils/get_grammar_copy.dart +++ b/lib/pangea/utils/grammar/get_grammar_copy.dart @@ -411,6 +411,8 @@ String? getGrammarCopy({ return L10n.of(context)!.grammarCopyPRONTYPEexc; case 'grammarCopyPRONTYPErcp': return L10n.of(context)!.grammarCopyPRONTYPErcp; + case 'grammarCopyPRONTYPEint': + return L10n.of(context)!.grammarCopyPRONTYPEint; case 'grammarCopyPRONTYPEintrel': return L10n.of(context)!.grammarCopyPRONTYPEintrel; case 'grammarCopyPRONTYPEintRelPronType': @@ -439,6 +441,8 @@ String? getGrammarCopy({ return L10n.of(context)!.grammarCopyVOICEinvVoice; case 'grammarCopyVOICErcpVoice': return L10n.of(context)!.grammarCopyVOICErcpVoice; + case "grammarCopyCASEaccdat": + return L10n.of(context)!.grammarCopyCASEaccdat; // Handle empty tag case '': ErrorHandler.logError( @@ -458,6 +462,6 @@ String? getGrammarCopy({ 'context': context, }, ); - return key; // Fallback to the key itself if no match is found + return lemma; // Fallback to the lemma itself if no match is found } } diff --git a/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_popup.dart b/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_popup.dart index cc1806b30..4fae8c71c 100644 --- a/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_popup.dart +++ b/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_popup.dart @@ -1,4 +1,3 @@ -import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/enum/progress_indicators_enum.dart'; import 'package:fluffychat/pangea/models/analytics/construct_list_model.dart'; @@ -94,11 +93,7 @@ class AnalyticsPopupState extends State { dialogContent = Center(child: Text(L10n.of(context)!.noDataFound)); } else if (hasNoCategories || !widget.showGroups) { dialogContent = ConstructsTileList( - _constructsModel.constructList(type: widget.type).sorted((a, b) { - final comp = b.points.compareTo(a.points); - if (comp != 0) return comp; - return a.lemma.compareTo(b.lemma); - }), + _constructsModel.constructList(type: widget.type), ); } else { dialogContent = ListView.builder( diff --git a/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_xp_tile.dart b/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_xp_tile.dart index 66710b3d6..13440c695 100644 --- a/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_xp_tile.dart +++ b/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup/analytics_xp_tile.dart @@ -2,7 +2,7 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/enum/progress_indicators_enum.dart'; import 'package:fluffychat/pangea/models/analytics/construct_use_model.dart'; -import 'package:fluffychat/pangea/utils/get_grammar_copy.dart'; +import 'package:fluffychat/pangea/utils/grammar/get_grammar_copy.dart'; import 'package:flutter/material.dart'; class ConstructUsesXPTile extends StatelessWidget {