diff --git a/TMessagesProj/src/main/java/org/spacegram/translator/TranslationHelper.java b/TMessagesProj/src/main/java/org/spacegram/translator/TranslationHelper.java index 20d9025658b..750c4a14a53 100644 --- a/TMessagesProj/src/main/java/org/spacegram/translator/TranslationHelper.java +++ b/TMessagesProj/src/main/java/org/spacegram/translator/TranslationHelper.java @@ -12,6 +12,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Helper class to handle translation based on SpaceGramConfig.translateStyle. @@ -134,12 +137,14 @@ private static void translateInline( } private static class LinkPlaceholder { + final int id; final String token; final String visibleText; final String url; final boolean textUrl; - LinkPlaceholder(String token, String visibleText, String url, boolean textUrl) { + LinkPlaceholder(int id, String token, String visibleText, String url, boolean textUrl) { + this.id = id; this.token = token; this.visibleText = visibleText; this.url = url; @@ -189,10 +194,11 @@ private static LinkMaskedText maskLinks(String text, ArrayList placeholders, ArrayList outputEntities) { + HashMap byId = new HashMap<>(); + for (int i = 0; i < placeholders.size(); i++) { + LinkPlaceholder placeholder = placeholders.get(i); + byId.put(placeholder.id, placeholder); + } + + Pattern pattern = Pattern.compile("\\[\\[ENT_START_(\\d+)\\]\\](.*?)\\[\\[ENT_END_\\1\\]\\]", Pattern.DOTALL); + Matcher matcher = pattern.matcher(translatedText); + StringBuilder plainText = new StringBuilder(); + int cursor = 0; + boolean changed = false; + + while (matcher.find()) { + changed = true; + if (matcher.start() > cursor) { + plainText.append(translatedText, cursor, matcher.start()); + } + + int start = plainText.length(); + int placeholderId; + try { + placeholderId = Integer.parseInt(matcher.group(1)); + } catch (Exception ignore) { + placeholderId = -1; + } + String translatedVisibleText = matcher.group(2); + if (translatedVisibleText == null) { + translatedVisibleText = ""; + } + plainText.append(translatedVisibleText); + + LinkPlaceholder placeholder = byId.get(placeholderId); + if (placeholder != null && !TextUtils.isEmpty(placeholder.url) && outputEntities != null) { + if (placeholder.textUrl) { + TLRPC.TL_messageEntityTextUrl entity = new TLRPC.TL_messageEntityTextUrl(); + entity.offset = start; + entity.length = translatedVisibleText.length(); + entity.url = placeholder.url; + outputEntities.add(entity); + } else { + TLRPC.TL_messageEntityUrl entity = new TLRPC.TL_messageEntityUrl(); + entity.offset = start; + entity.length = translatedVisibleText.length(); + outputEntities.add(entity); + } + } + + cursor = matcher.end(); + } + + if (!changed) { + return translatedText; + } + if (cursor < translatedText.length()) { + plainText.append(translatedText, cursor, translatedText.length()); + } + return plainText.toString(); + } + /** * Check if a message is currently translated. */