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

Reply via email to