Yuvipanda has submitted this change and it was merged. Change subject: When following links with hash/fragments on them, jump to the anchor ......................................................................
When following links with hash/fragments on them, jump to the anchor * Added 'fragment' member to PageTitle * Added tests for processing the fragment * Pass the target fragment through to displaySection in webview * on last section insert, jump to the fragment if present Bug: 61726 Change-Id: Ic651fd3bd130b48addbc1cb565e3d47836e27f2a --- M wikipedia-it/src/main/java/org/wikipedia/test/PageTitleTests.java M wikipedia/assets/bundle-test.js M wikipedia/assets/bundle.js M wikipedia/src/main/java/org/wikipedia/PageTitle.java M wikipedia/src/main/java/org/wikipedia/Site.java M wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java M wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java M www/js/main.js M www/js/sections.js 9 files changed, 62 insertions(+), 25 deletions(-) Approvals: Yuvipanda: Verified; Looks good to me, approved diff --git a/wikipedia-it/src/main/java/org/wikipedia/test/PageTitleTests.java b/wikipedia-it/src/main/java/org/wikipedia/test/PageTitleTests.java index 1be7d32..50b9285 100644 --- a/wikipedia-it/src/main/java/org/wikipedia/test/PageTitleTests.java +++ b/wikipedia-it/src/main/java/org/wikipedia/test/PageTitleTests.java @@ -7,29 +7,29 @@ public void testEquals() throws Exception { assertTrue(new PageTitle(null, "India", new Site("en.wikipedia.org")).equals(new PageTitle(null, "India", new Site("en.wikipedia.org")))); - assertTrue(new PageTitle("Talk", "India", new Site("en.wikipedia.org")).equals(new PageTitle("Talk", "India", new Site("en.wikipedia.org")))); + assertTrue(new PageTitle("Talk", "India", new Site("en.wikipedia.org")).equals(new PageTitle("Talk", "India", new Site("en.wikipedia.org")))); - assertFalse(new PageTitle(null, "India", new Site("ta.wikipedia.org")).equals(new PageTitle(null, "India", new Site("en.wikipedia.org")))); - assertFalse(new PageTitle("Talk", "India", new Site("ta.wikipedia.org")).equals(new PageTitle("Talk", "India", new Site("en.wikipedia.org")))); - assertFalse(new PageTitle("Talk", "India", new Site("ta.wikipedia.org")).equals("Something else")); + assertFalse(new PageTitle(null, "India", new Site("ta.wikipedia.org")).equals(new PageTitle(null, "India", new Site("en.wikipedia.org")))); + assertFalse(new PageTitle("Talk", "India", new Site("ta.wikipedia.org")).equals(new PageTitle("Talk", "India", new Site("en.wikipedia.org")))); + assertFalse(new PageTitle("Talk", "India", new Site("ta.wikipedia.org")).equals("Something else")); } public void testJSONSerialization() throws Exception { Site enwiki = new Site("en.wikipedia.org"); - PageTitle title = new PageTitle(null, "Test title", enwiki); + PageTitle title = new PageTitle(null, "Test title", enwiki); assertEquals(title, new PageTitle(title.toJSON())); - title = new PageTitle("Talk", "Test title", enwiki); + title = new PageTitle("Talk", "Test title", enwiki); assertEquals(title, new PageTitle(title.toJSON())); } public void testPrefixedText() throws Exception { Site enwiki = new Site("en.wikipedia.org"); - assertEquals(new PageTitle(null, "Test title", enwiki).getPrefixedText(), "Test title"); - assertEquals(new PageTitle(null, "Test title", enwiki).getPrefixedText(), "Test title"); - assertEquals(new PageTitle("Talk", "Test title", enwiki).getPrefixedText(), "Talk:Test title"); - assertEquals(new PageTitle(null, "Test title", enwiki).getText(), "Test title"); + assertEquals(new PageTitle(null, "Test title", enwiki).getPrefixedText(), "Test title"); + assertEquals(new PageTitle(null, "Test title", enwiki).getPrefixedText(), "Test title"); + assertEquals(new PageTitle("Talk", "Test title", enwiki).getPrefixedText(), "Talk:Test title"); + assertEquals(new PageTitle(null, "Test title", enwiki).getText(), "Test title"); } public void testFromInternalLink() throws Exception { @@ -40,9 +40,15 @@ assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getNamespace(), "Talk"); assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getText(), "India"); + assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getFragment(), null); + + assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#").getNamespace(), "Talk"); + assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#").getText(), "India"); + assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#").getFragment(), ""); assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getNamespace(), "Talk"); assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getText(), "India"); + assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getFragment(), "History"); } public void testCanonicalURL() throws Exception { diff --git a/wikipedia/assets/bundle-test.js b/wikipedia/assets/bundle-test.js index 01bacac..470914c 100644 --- a/wikipedia/assets/bundle-test.js +++ b/wikipedia/assets/bundle-test.js @@ -54,6 +54,7 @@ } bridge.sendMessage( "imagesListResponse", { "images": imageURLs }); } ); + },{"./bridge":1}],3:[function(require,module,exports){ var bridge = require("../js/bridge"); bridge.registerListener( "injectScript", function( payload ) { diff --git a/wikipedia/assets/bundle.js b/wikipedia/assets/bundle.js index 84e36b6..3ddbe0f 100644 --- a/wikipedia/assets/bundle.js +++ b/wikipedia/assets/bundle.js @@ -102,6 +102,7 @@ } bridge.sendMessage( "imagesListResponse", { "images": imageURLs }); } ); + },{"./bridge":2}],5:[function(require,module,exports){ var bridge = require("./bridge"); @@ -134,7 +135,7 @@ function elementsForSection( section ) { var heading = document.createElement( "h" + ( section.toclevel + 1 ) ); heading.innerHTML = section.line; - heading.id = "heading_" + section.id; + heading.id = section.anchor; heading.setAttribute( 'data-id', section.id ); var editButton = document.createElement( "a" ); @@ -161,6 +162,9 @@ bridge.sendMessage( "requestSection", { index: payload.index + 1 } ); } else { document.getElementById( "loading_sections").className = ""; + if ( typeof payload.fragment === "string" ) { + scrollToSection( payload.fragment ); + } } }); @@ -169,12 +173,16 @@ }); bridge.registerListener( "scrollToSection", function ( payload ) { - var el = document.getElementById( "heading_" + payload.sectionID); + scrollToSection( payload.anchor ); +}); + +function scrollToSection( anchor ) { + var el = document.getElementById( anchor ); // Make sure there's exactly as much space on the left as on the top. // The 48 accounts for the search bar var scrollY = el.offsetTop - 48 - el.offsetLeft; - window.scrollTo(0, scrollY); -}); + window.scrollTo( 0, scrollY ); +} },{"./bridge":2,"./transformer":7}],7:[function(require,module,exports){ function Transformer() { diff --git a/wikipedia/src/main/java/org/wikipedia/PageTitle.java b/wikipedia/src/main/java/org/wikipedia/PageTitle.java index 2e30e9b..9d94d31 100644 --- a/wikipedia/src/main/java/org/wikipedia/PageTitle.java +++ b/wikipedia/src/main/java/org/wikipedia/PageTitle.java @@ -15,12 +15,18 @@ public class PageTitle implements Parcelable { private final String namespace; private final String text; + private final String fragment; private final Site site; - public PageTitle(final String namespace, final String text, final Site site) { + public PageTitle(final String namespace, final String text, final String fragment, final Site site) { this.namespace = namespace; this.text = text; + this.fragment = fragment; this.site = site; + } + + public PageTitle(final String namespace, final String text, final Site site) { + this(namespace, text, null, site); } public String getNamespace() { @@ -34,6 +40,8 @@ public String getText() { return text; } + + public String getFragment() { return fragment; } public String getDisplayText() { return getText().replace("_", " "); @@ -49,6 +57,7 @@ json.put("site", site.getDomain()); json.put("namespace", getNamespace()); json.put("text", getText()); + json.put("fragment", getFragment()); return json; } catch (JSONException e) { // This will also never happen @@ -59,16 +68,18 @@ public PageTitle(JSONObject json) { this.site = new Site(json.optString("site")); this.namespace = json.optString("namespace", null); + this.fragment = json.optString("fragment", null); this.text = json.optString("text", null); } public String getCanonicalUri() { try { return String.format( - "%1$s://%2$s/wiki/%3$s", + "%1$s://%2$s/wiki/%3$s%4$s", WikipediaApp.PROTOCOL, getSite().getDomain(), - URLEncoder.encode(getPrefixedText().replace(" ", "_"), "utf-8") + URLEncoder.encode(getPrefixedText().replace(" ", "_"), "utf-8"), + (this.fragment != null && this.fragment.length() > 0) ? ("#" + this.fragment) : "" ); } catch (UnsupportedEncodingException e) { // This shouldn't happen @@ -114,6 +125,7 @@ private PageTitle(Parcel in) { namespace = in.readString(); text = in.readString(); + fragment = in.readString(); site = in.readParcelable(Site.class.getClassLoader()); } @@ -121,6 +133,7 @@ public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(namespace); parcel.writeString(text); + parcel.writeString(fragment); parcel.writeParcelable(site, flags); } diff --git a/wikipedia/src/main/java/org/wikipedia/Site.java b/wikipedia/src/main/java/org/wikipedia/Site.java index e58317c..7763060 100644 --- a/wikipedia/src/main/java/org/wikipedia/Site.java +++ b/wikipedia/src/main/java/org/wikipedia/Site.java @@ -68,7 +68,7 @@ * 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/(?:([^:]+):)?([^#]*)(?:#(.+))?"); + public static Pattern internalLinkMatchPattern = Pattern.compile("/wiki/(?:([^:]+):)?([^#]*)(?:#(.*))?"); /** * Create a PageTitle object from an internal link string. @@ -85,7 +85,8 @@ try { String namespace = matches.group(1) != null ? URLDecoder.decode(matches.group(1), "utf-8") : null; String pageText = URLDecoder.decode(matches.group(2), "utf-8"); - return new PageTitle(namespace, pageText, this); + String fragment = matches.group(3); + return new PageTitle(namespace, pageText, fragment, this); } catch (UnsupportedEncodingException e) { // NOT HAPPENING! JESUS CHRIST JAVA! throw new RuntimeException(e); diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java index 6a8f075..c8da5b7 100644 --- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java +++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java @@ -180,6 +180,7 @@ wrapper.put("section", page.getSections().get(index).toJSON()); wrapper.put("index", index); wrapper.put("isLast", index == page.getSections().size() - 1); + wrapper.put("fragment", page.getTitle().getFragment()); bridge.sendMessage("displaySection", wrapper); } catch (JSONException e) { // Won't happen diff --git a/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java b/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java index 80978f6..c1a85fa 100644 --- a/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java +++ b/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java @@ -25,7 +25,7 @@ private void scrollToSection(Section section) { JSONObject payload = new JSONObject(); try { - payload.put("sectionID", section.getId()); + payload.put("anchor", section.getAnchor()); } catch (JSONException e) { // This won't happen throw new RuntimeException(e); diff --git a/www/js/main.js b/www/js/main.js index 52c744a..ab9ae9c 100644 --- a/www/js/main.js +++ b/www/js/main.js @@ -14,4 +14,4 @@ imageURLs.push( images[i].src ); } bridge.sendMessage( "imagesListResponse", { "images": imageURLs }); -} ); \ No newline at end of file +} ); diff --git a/www/js/sections.js b/www/js/sections.js index 3aa2d4e..dc48dd3 100644 --- a/www/js/sections.js +++ b/www/js/sections.js @@ -23,7 +23,7 @@ function elementsForSection( section ) { var heading = document.createElement( "h" + ( section.toclevel + 1 ) ); heading.innerHTML = section.line; - heading.id = "heading_" + section.id; + heading.id = section.anchor; heading.setAttribute( 'data-id', section.id ); var editButton = document.createElement( "a" ); @@ -50,6 +50,9 @@ bridge.sendMessage( "requestSection", { index: payload.index + 1 } ); } else { document.getElementById( "loading_sections").className = ""; + if ( typeof payload.fragment === "string" ) { + scrollToSection( payload.fragment ); + } } }); @@ -58,9 +61,13 @@ }); bridge.registerListener( "scrollToSection", function ( payload ) { - var el = document.getElementById( "heading_" + payload.sectionID); + scrollToSection( payload.anchor ); +}); + +function scrollToSection( anchor ) { + var el = document.getElementById( anchor ); // Make sure there's exactly as much space on the left as on the top. // The 48 accounts for the search bar var scrollY = el.offsetTop - 48 - el.offsetLeft; - window.scrollTo(0, scrollY); -}); + window.scrollTo( 0, scrollY ); +} -- To view, visit https://gerrit.wikimedia.org/r/116184 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ic651fd3bd130b48addbc1cb565e3d47836e27f2a Gerrit-PatchSet: 4 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Nicole <nic...@hitori.org> Gerrit-Reviewer: Yuvipanda <yuvipa...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits