Yuvipanda has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/93631


Change subject: Add static method to parse out PageTitle from an internal link
......................................................................

Add static method to parse out PageTitle from an internal link

Also added tests for the same. Does not handle fragment yet, but
it is extracted out anyway. Also does not handle URI Encoding,
which I think is best handled by doing it on the JS side.

Change-Id: Ie82cb3b9f5d12001ba57145a7f8dabe2ff186951
---
M wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
3 files changed, 44 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/31/93631/1

diff --git 
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java 
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
index 608e82e..7fda681 100644
--- 
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
+++ 
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
@@ -10,4 +10,15 @@
         assertEquals(new PageTitle("Talk", "Test title").getPrefixedText(), 
"Talk:Test_title");
         assertEquals(new PageTitle(null, "Test   title").getText(), 
"Test_title");
     }
+
+    public void testFromInternalLink() throws Exception {
+        
assertEquals(PageTitle.fromInternalLink("/wiki/India").getPrefixedText(), 
"India");
+        assertNull(PageTitle.fromInternalLink("/wiki/India").getNamespace());
+
+        
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India").getNamespace(), 
"Talk");
+        assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India").getText(), 
"India");
+
+        
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India#History").getNamespace(),
 "Talk");
+        
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India#History").getText(), 
"India");
+    }
 }
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
index 1bdd059..fb5cbd3 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
@@ -54,8 +54,7 @@
             Log.d("Wikipedia", "Link clicked was " + href);
             if (href.startsWith("/wiki/")) {
                 // TODO: Handle fragments
-                String pageName = href.replace("/wiki/", "");
-                bus.post(new NewWikiPageNavigationEvent(new PageTitle(null, 
pageName)));
+                bus.post(new 
NewWikiPageNavigationEvent(PageTitle.fromInternalLink(href)));
             } else {
                 // Assume everything else is an external link... for now!
                 handleExternalLink(href);
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
index c3f8f70..a3090d4 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
@@ -3,6 +3,9 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * Immutable value object representing the text of a page.
  *
@@ -56,4 +59,33 @@
         parcel.writeString(namespace);
         parcel.writeString(text);
     }
+
+    /**
+     * Regex to match internal relative wikilinks.
+     *
+     * Start with /wiki/, can contain a Namespace indicator and a fragment.
+     * Capturing Group 1 is namespace (or null for no namespace). 2 is Page 
Title text. 3 is Fragment.
+     */
+    public static Pattern internalLinkMatchPattern = 
Pattern.compile("/wiki/(?:([^:]+):)?([^#]*)(?:#(.+))?");
+
+    /**
+     * Create a PageTitle object from an internal link string.
+     *
+     * @param internalLink Internal link target text (eg. /wiki/Target).
+     *                     Should be URL decoded before passing in
+     * @return A {@link PageTitle} object representing the internalLink passed 
in.
+     */
+    public static PageTitle fromInternalLink(String internalLink) {
+        //TODO: Do better validation of internal links!
+        //TODO: Handle fragments better!
+        Matcher matches = internalLinkMatchPattern.matcher(internalLink);
+        if (matches.matches()) {
+            String namespace = matches.group(1);
+            String pageText = matches.group(2);
+            return new PageTitle(namespace, pageText);
+        } else {
+            throw new RuntimeException("Did not  match internalLinkPattern: " 
+ internalLink);
+        }
+
+    }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/93631
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie82cb3b9f5d12001ba57145a7f8dabe2ff186951
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to