diff --git a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java index e71e21b..4f44587 100644 --- a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java +++ b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java @@ -59,10 +59,12 @@ public class MarkdownActivity extends CompatActivity { TextView textView = findViewById(R.id.markdownView); new Thread(() -> { try { + Log.d(TAG, "Downloading"); String markdown = new String(Http.doHttpGet(url, true), StandardCharsets.UTF_8); - Log.i(TAG, "Download successful"); + Log.d(TAG, "Done!"); runOnUiThread(() -> { - MainApplication.getINSTANCE().getMarkwon().setMarkdown(textView, markdown); + MainApplication.getINSTANCE().getMarkwon().setMarkdown( + textView, MarkdownUrlLinker.urlLinkify(markdown)); if (markdownBackground != null) { markdownBackground.setClickable(true); markdownBackground.setOnClickListener(v -> this.onBackPressed()); diff --git a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownUrlLinker.java b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownUrlLinker.java new file mode 100644 index 0000000..7036208 --- /dev/null +++ b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownUrlLinker.java @@ -0,0 +1,60 @@ +package com.fox2code.mmm.markdown; + +import android.util.Log; + +import com.fox2code.mmm.BuildConfig; + +import java.util.ArrayList; + +public class MarkdownUrlLinker { + private static final String TAG = "MarkdownUrlLinker"; + + public static String urlLinkify(String url) { + int index = url.indexOf("https://"); + if (index == -1) return url; + ArrayList linkifyTasks = new ArrayList<>(); + int extra = 0; + while (index != -1) { + int end = Math.min(url.indexOf('\n', index), + url.indexOf(' ', index)); + if (end == -1) end = url.length(); + if (index == 0 || + '\n' == url.charAt(index - 1) || + ' ' == url.charAt(index - 1)) { + int endDomain = url.indexOf('/', index + 9); + if (endDomain != -1 && endDomain < end) { + linkifyTasks.add(new LinkifyTask(index, end)); + extra += (end - index) + 4; + if (BuildConfig.DEBUG) { + Log.d(TAG, "Linkify url: " + url.substring(index, end)); + } + } + } + index = url.indexOf("https://", end); + } + if (linkifyTasks.isEmpty()) return url; + LinkifyTask prev = LinkifyTask.NULL; + StringBuilder stringBuilder = new StringBuilder(url.length() + extra); + for (LinkifyTask linkifyTask : linkifyTasks) { + stringBuilder.append(url, prev.end, linkifyTask.start) + .append('[').append(url, linkifyTask.start, linkifyTask.end) + .append("](").append(url, linkifyTask.start, linkifyTask.end).append(')'); + prev = linkifyTask; + } + if (prev.end != url.length()) stringBuilder.append(url, prev.end, url.length()); + Log.d(TAG, "Added Markdown link to " + linkifyTasks.size() + " urls"); + return stringBuilder.toString(); + } + + private static class LinkifyTask { + static final LinkifyTask NULL = new LinkifyTask(0, 0); + + private final int start; + private final int end; + + private LinkifyTask(int start, int end) { + this.start = start; + this.end = end; + } + } +}