From 17d83bdb9e9dd285bb6d3f5b679df64fb306df81 Mon Sep 17 00:00:00 2001 From: Andy Klimczak Date: Tue, 21 Mar 2017 16:14:56 +0000 Subject: [PATCH] Refactor detectLinks (#297) * Refactor detect-links * Add autolink-java license --- Clover/app/build.gradle | 1 + Clover/app/src/main/assets/html/licenses.html | 28 +++++++++++++ .../java/org/floens/chan/chan/ChanParser.java | 42 ++++++------------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Clover/app/build.gradle b/Clover/app/build.gradle index cfd47174..aa4d8177 100644 --- a/Clover/app/build.gradle +++ b/Clover/app/build.gradle @@ -130,4 +130,5 @@ dependencies { compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0' compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'de.greenrobot:eventbus:2.4.0' + compile 'org.nibor.autolink:autolink:0.6.0' } diff --git a/Clover/app/src/main/assets/html/licenses.html b/Clover/app/src/main/assets/html/licenses.html index f7726300..a0ae3211 100644 --- a/Clover/app/src/main/assets/html/licenses.html +++ b/Clover/app/src/main/assets/html/licenses.html @@ -194,5 +194,33 @@ The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
+

autolink-java

+ https://github.com/robinst/autolink-java +
+        
+The MIT License (MIT)
+
+Copyright (c) 2015 Robin Stocker
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+        
+    
+
diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanParser.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanParser.java index 5158917e..9a24d50f 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanParser.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanParser.java @@ -47,8 +47,12 @@ import org.jsoup.parser.Parser; import org.jsoup.select.Elements; import org.jsoup.select.NodeTraversor; import org.jsoup.select.NodeVisitor; +import org.nibor.autolink.LinkExtractor; +import org.nibor.autolink.LinkSpan; +import org.nibor.autolink.LinkType; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; @@ -63,6 +67,8 @@ public class ChanParser { private static ChanParser instance = new ChanParser(); private final DatabaseManager databaseManager; + private final LinkExtractor linkExtractor = LinkExtractor.builder().linkTypes(EnumSet.of(LinkType.URL)).build(); + public ChanParser() { databaseManager = Chan.getDatabaseManager(); } @@ -445,40 +451,16 @@ public class ChanParser { } private void detectLinks(Theme theme, Post post, String text, SpannableString spannable) { - int startPos = 0; - int endPos; - while (true) { - startPos = text.indexOf("://", startPos); - if (startPos < 0) break; - - // go back to the first space - while (startPos > 0 && !isWhitespace(text.charAt(startPos - 1))) { - startPos--; - } - - // find the last non whitespace character - endPos = startPos; - while (endPos < text.length() - 1 && !isWhitespace(text.charAt(endPos + 1))) { - endPos++; - } - - // one past - endPos++; - - String linkString = text.substring(startPos, endPos); - - PostLinkable pl = new PostLinkable(theme, post, linkString, linkString, PostLinkable.Type.LINK); - spannable.setSpan(pl, startPos, endPos, 0); + // use autolink-java lib to detect links + final Iterable links = linkExtractor.extractLinks(text); + for(final LinkSpan link : links) { + final String linkText = text.substring(link.getBeginIndex(), link.getEndIndex()); + final PostLinkable pl = new PostLinkable(theme, post, linkText, linkText, PostLinkable.Type.LINK); + spannable.setSpan(pl, link.getBeginIndex(), link.getEndIndex(), 0); post.linkables.add(pl); - - startPos = endPos; } } - private boolean isWhitespace(char c) { - return Character.isWhitespace(c) || c == '>'; // consider > as a link separator - } - // Below code taken from org.jsoup.nodes.Element.text(), but it preserves
private String getNodeText(Element node) { final StringBuilder accum = new StringBuilder();