Brion VIBBER has submitted this change and it was merged.
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(-)
Approvals:
Brion VIBBER: Verified; Looks good to me, approved
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 ff74bed..8583d59 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 c81aafe..83e8313 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: merged
Gerrit-Change-Id: Ie82cb3b9f5d12001ba57145a7f8dabe2ff186951
Gerrit-PatchSet: 7
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits