diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index ab38fc124..941cbc17b 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -33,6 +33,7 @@ import android.text.Html; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.util.Log; +import android.util.Patterns; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -63,7 +64,11 @@ import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; import fr.gouv.etalab.mastodon.activities.MediaActivity; import fr.gouv.etalab.mastodon.activities.ShowAccountActivity; @@ -104,6 +109,8 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf private final int FAVOURITE = 2; private RetrieveFeedsAsyncTask.Type type; private String targetedId; + private HashMap urlConversion; + private HashMap tagConversion; public StatusListAdapter(Context context, RetrieveFeedsAsyncTask.Type type, String targetedId, boolean isOnWifi, int behaviorWithAttachments, List statuses){ this.context = context; @@ -301,8 +308,41 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf @Override public void onClick(View v) { try { + String text = status.getContent(); if( !status.isTranslated() ){ - new YandexQuery(StatusListAdapter.this).getYandexTextview(position, status.getContent(), currentLocale); + tagConversion = new HashMap<>(); + urlConversion = new HashMap<>(); + Matcher matcher; + //Extracts urls + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) + matcher = Patterns.WEB_URL.matcher(text); + else + matcher = Helper.urlPattern.matcher(text); + int i = 0; + //replaces them by a kind of variable which shouldn't be translated ie: __u0__, __u1__, etc. + while (matcher.find()){ + String key = "__u" + String.valueOf(i) + "__"; + String value = matcher.group(0); + if( value != null) { + urlConversion.put(key, value); + text = text.replace(value, key); + } + i++; + } + i = 0; + //Same for tags with __t0__, __t1__, etc. + matcher = Helper.hashtagPattern.matcher(text); + while (matcher.find()){ + String key = "__t" + String.valueOf(i) + "__"; + String value = matcher.group(0); + tagConversion.put(key, value); + if( value != null) { + tagConversion.put(key, value); + text = text.replace(value, key); + } + i++; + } + new YandexQuery(StatusListAdapter.this).getYandexTextview(position, text, currentLocale); }else { status.setTranslationShown(!status.isTranslationShown()); statusListAdapter.notifyDataSetChanged(); @@ -872,6 +912,18 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf }else if( statuses.size() > position) { try { String aJsonString = yandexTranslateToText(translatedResult); + Iterator itU = urlConversion.entrySet().iterator(); + while (itU.hasNext()) { + Map.Entry pair = (Map.Entry)itU.next(); + aJsonString = aJsonString.replace(pair.getKey().toString(), pair.getValue().toString()); + itU.remove(); + } + Iterator itT = tagConversion.entrySet().iterator(); + while (itT.hasNext()) { + Map.Entry pair = (Map.Entry)itT.next(); + aJsonString = aJsonString.replace(pair.getKey().toString(), pair.getValue().toString()); + itT.remove(); + } statuses.get(position).setTranslated(true); statuses.get(position).setTranslationShown(true); statuses.get(position).setContent_translated(aJsonString); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index eade9fdc7..eae6ad4de 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -247,11 +247,11 @@ public class Helper { private static final Pattern SHORTNAME_PATTERN = Pattern.compile(":([-+\\w]+):"); - private static final Pattern urlPattern = Pattern.compile( + public static final Pattern urlPattern = Pattern.compile( "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); - private static final Pattern hashtagPattern = Pattern.compile("(#[\\w_À-ú-]{1,})"); + public static final Pattern hashtagPattern = Pattern.compile("(#[\\w_À-ú-]{1,})"); /** * Converts emojis in input to unicode * @param input String diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/translation/YandexQuery.java b/app/src/main/java/fr/gouv/etalab/mastodon/translation/YandexQuery.java index 93c808890..e3310c9d1 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/translation/YandexQuery.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/translation/YandexQuery.java @@ -25,7 +25,6 @@ import fr.gouv.etalab.mastodon.interfaces.OnTranslatedInterface; public class YandexQuery { private OnTranslatedInterface listener; - public YandexQuery(OnTranslatedInterface listenner) { this.listener = listenner; } @@ -35,6 +34,7 @@ public class YandexQuery { YandexClient.get(text, toLanguage, new AsyncHttpResponseHandler() { @Override public void onStart() { + } @Override