buildTextTranslationContent static method
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);
}