setMarkupText method
Set markup text, this is used when you get data that has the mention syntax and you want to initialize the TextField with it.
Implementation
Future<void> setMarkupText(BuildContext context, String markupText) async {
_cachedMentions.clear();
String deconstructedText = '';
int lastStartingRunStart = 0;
for (int i = 0; i < markupText.length; ++i) {
final String character = markupText[i];
for (final MentionSyntax syntax in mentionSyntaxes) {
if (character != syntax.prefix[0]) {
continue;
}
final String subStr = markupText.substring(i, markupText.length);
final RegExpMatch? match = syntax.getRegExp().firstMatch(subStr);
/// Ensure the match starts at the start of our substring
if (match != null && match.start == 0) {
deconstructedText += markupText.substring(lastStartingRunStart, i);
final String matchedMarkup = match.input.substring(match.start, match.end);
final String mentionId = match[3]!;
final MentionObject? mention = await idToMentionObject(context, mentionId);
final String mentionDisplayName = mention?.displayName ?? syntax.missingText;
final String insertText = '${syntax.startingCharacter}$mentionDisplayName';
final int indexToInsertMention = deconstructedText.length;
final int indexToEndInsertion = indexToInsertMention + insertText.length;
_cachedMentions.add(
_TextMention(
id: mentionId,
display: insertText,
start: indexToInsertMention,
end: indexToEndInsertion,
syntax: syntax,
),
);
deconstructedText += insertText;
lastStartingRunStart = i + matchedMarkup.length;
}
}
}
if (lastStartingRunStart != markupText.length) {
deconstructedText += markupText.substring(
lastStartingRunStart,
markupText.length,
);
}
_previousText = deconstructedText;
text = deconstructedText;
}