buildTextTranslationContent static method

MessageTranslationTextContent buildTextTranslationContent(
  1. String text, {
  2. String? serverExtension,
})

Splits text using structured mention ranges from serverExtension.

Implementation

static MessageTranslationTextContent buildTextTranslationContent(
  String text, {
  String? serverExtension,
}) {
  final mentionRanges = <_MessageMentionRange>[];
  if (serverExtension?.isNotEmpty == true) {
    try {
      final extension = jsonDecode(serverExtension!);
      final aitData =
          extension is Map ? extension[ChatMessage.keyAitMsg] : null;
      if (aitData is Map) {
        final aitContacts = AitContactsModel.fromMap(
          aitData.cast<String, dynamic>(),
        );
        for (final value in aitContacts.aitBlocks.values) {
          if (value is! AitMsg) {
            continue;
          }
          for (final segment in value.segments) {
            final range = _resolveMentionRange(text, value, segment);
            if (range == null) {
              continue;
            }
            mentionRanges.add(range);
          }
        }
      }
    } catch (e) {
      Alog.e(
        tag: logTag,
        content: 'parse mention data for translation failed: $e',
      );
    }
  }
  if (mentionRanges.isEmpty) {
    return MessageTranslationTextContent([
      MessageTranslationTextPart(text: text, isMention: false),
    ]);
  }

  mentionRanges.sort((a, b) => a.start.compareTo(b.start));
  final parts = <MessageTranslationTextPart>[];
  var cursor = 0;
  for (final range in mentionRanges) {
    if (range.start < cursor) {
      continue;
    }
    if (range.start > cursor) {
      parts.add(
        MessageTranslationTextPart(
          text: text.substring(cursor, range.start),
          isMention: false,
        ),
      );
    }
    parts.add(
      MessageTranslationTextPart(
        text: text.substring(range.start, range.end),
        isMention: true,
      ),
    );
    cursor = range.end;
  }
  if (cursor < text.length) {
    parts.add(
      MessageTranslationTextPart(
        text: text.substring(cursor),
        isMention: false,
      ),
    );
  }
  return MessageTranslationTextContent(parts);
}