setMarkupText method

Future<void> setMarkupText(
  1. BuildContext context,
  2. String markupText
)

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;
}