import 'dart:developer'; import 'package:flutter/foundation.dart'; import '../constants/model_keys.dart'; import 'lemma.dart'; class PangeaToken { PangeaTokenText text; Lemma lemma; /// [pos] ex "VERB" - part of speech of the token /// https://universaldependencies.org/u/pos/ final String pos; /// [morph] ex {} - morphological features of the token /// https://universaldependencies.org/u/feat/ final Map morph; PangeaToken({ required this.text, required this.lemma, required this.pos, required this.morph, }); static Lemma _getLemmas(String text, dynamic json) { if (json != null) { // July 24, 2024 - we're changing from a list to a single lemma and this is for backwards compatibility // previously sent tokens have lists of lemmas if (json is Iterable) { return json .map( (e) => Lemma.fromJson(e as Map), ) .toList() .cast() .firstOrNull ?? Lemma(text: text, saveVocab: false, form: text); } else { return Lemma.fromJson(json); } } else { // earlier still, we didn't have lemmas so this is for really old tokens return Lemma(text: text, saveVocab: false, form: text); } } factory PangeaToken.fromJson(Map json) { final PangeaTokenText text = PangeaTokenText.fromJson(json[_textKey] as Map); return PangeaToken( text: text, lemma: _getLemmas(text.content, json[_lemmaKey]), pos: json['pos'] ?? '', morph: json['morph'] ?? {}, ); } static const String _textKey = "text"; static const String _lemmaKey = ModelKey.lemma; Map toJson() => { _textKey: text.toJson(), _lemmaKey: lemma.toJson(), 'pos': pos, 'morph': morph, }; int get end => text.offset + text.length; } class PangeaTokenText { int offset; String content; int length; PangeaTokenText({ required this.offset, required this.content, required this.length, }); factory PangeaTokenText.fromJson(Map json) { debugger(when: kDebugMode && json[_offsetKey] == null); return PangeaTokenText( offset: json[_offsetKey], content: json[_contentKey], length: json[_lengthKey] ?? (json[_contentKey] as String).length, ); } static const String _offsetKey = "offset"; static const String _contentKey = "content"; static const String _lengthKey = "length"; Map toJson() => {_offsetKey: offset, _contentKey: content, _lengthKey: length}; }