diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index c2b3248d..acdf8f8e 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -580,12 +580,11 @@ public final class TermuxActivity extends Activity implements ServiceConnection return false; } - void showUrlSelection() { - String text = getCurrentTermSession().getEmulator().getScreen().getTranscriptText(); + static LinkedHashSet extractUrls(String text) { // Pattern for recognizing a URL, based off RFC 3986 // http://stackoverflow.com/questions/5713558/detect-and-extract-url-from-a-string final Pattern urlPattern = Pattern.compile( - "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)", + "(?:^|[\\W])((ht|f)tp(s?)://|www\\.)" + "(([\\w\\-]+\\.)+?([\\w\\-.~]+/?)*" + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); LinkedHashSet urlSet = new LinkedHashSet<>(); Matcher matcher = urlPattern.matcher(text); @@ -595,7 +594,12 @@ public final class TermuxActivity extends Activity implements ServiceConnection String url = text.substring(matchStart, matchEnd); urlSet.add(url); } + return urlSet; + } + void showUrlSelection() { + String text = getCurrentTermSession().getEmulator().getScreen().getTranscriptText(); + LinkedHashSet urlSet = extractUrls(text); if (urlSet.isEmpty()) { new AlertDialog.Builder(this).setMessage(R.string.select_url_no_found).show(); return; diff --git a/app/src/test/java/com/termux/app/TermuxActivityTest.java b/app/src/test/java/com/termux/app/TermuxActivityTest.java new file mode 100644 index 00000000..e8d811a0 --- /dev/null +++ b/app/src/test/java/com/termux/app/TermuxActivityTest.java @@ -0,0 +1,24 @@ +package com.termux.app; + +import junit.framework.TestCase; + +import java.util.LinkedHashSet; + +public class TermuxActivityTest extends TestCase { + + private void assertUrlsAre(String text, String... urls) { + LinkedHashSet expected = new LinkedHashSet<>(); + for (String url : urls) expected.add(url); + assertEquals(expected, TermuxActivity.extractUrls(text)); + } + + public void testExtractUrls() { + assertUrlsAre("hello http://example.com world", "http://example.com"); + + assertUrlsAre("http://example.com\nhttp://another.com", "http://example.com", "http://another.com"); + + assertUrlsAre("hello http://example.com world and http://more.example.com with secure https://more.example.com", + "http://example.com", "http://more.example.com", "https://more.example.com"); + } + +}