BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/148506
Change subject: [WIP] Show page issues ...................................................................... [WIP] Show page issues Add a link to a page that has issues. When it's pressed show a dialog with the issues. Change-Id: Ibd3054cc3e7142447de8d35021a006fbccd12bb9 --- A icon-svgs/32/ic_flag.svg M wikipedia/assets/bundle.js M wikipedia/assets/preview.js A wikipedia/res/drawable-hdpi/ic_flag.png A wikipedia/res/drawable-ldpi/ic_flag.png A wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png A wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png A wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png A wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png A wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png A wikipedia/res/drawable-mdpi/ic_flag.png A wikipedia/res/drawable-xhdpi/ic_flag.png A wikipedia/res/drawable-xxhdpi/ic_flag.png A wikipedia/res/layout/dialog_issues.xml A wikipedia/res/layout/item_issue.xml M wikipedia/res/values-qq/strings.xml M wikipedia/res/values/color.xml M wikipedia/res/values/strings.xml M wikipedia/src/main/java/org/wikipedia/Utils.java M wikipedia/src/main/java/org/wikipedia/WikipediaApp.java A wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java M wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java M www/Gruntfile.js M www/js/actions.js A www/js/issues.js M www/js/sections.js 26 files changed, 335 insertions(+), 58 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/06/148506/1 diff --git a/icon-svgs/32/ic_flag.svg b/icon-svgs/32/ic_flag.svg new file mode 100644 index 0000000..2494112 --- /dev/null +++ b/icon-svgs/32/ic_flag.svg @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve"> +<path d="M16.569,6.62c-5.162-2.593-9.306-2.23-9.306-2.23v23.193c0,0,1.939,0.339,1.939-0.848c0-1.188,0-9.888,0-9.888 + c1.115-0.364,3.054-0.679,7.392,2.133c5.574,3.272,8.143-0.994,8.143-0.994V5.626C24.711,5.627,21.755,9.092,16.569,6.62z"/> +</svg> diff --git a/wikipedia/assets/bundle.js b/wikipedia/assets/bundle.js index 1817830..0c8f4fc 100644 --- a/wikipedia/assets/bundle.js +++ b/wikipedia/assets/bundle.js @@ -26,6 +26,40 @@ } curNode = curNode.parentNode; } + + function collectIssues( sourceNode ) { + var res = []; + var issues = sourceNode.parentNode.querySelectorAll( 'table.ambox' ); + var i = 0, + len = issues.length; + for (; i < len; i++) { + // .ambox- is used e.g. on eswiki + res.push( issues[i].querySelector( '.mbox-text, .ambox-text' ).innerHTML ); + } + + bridge.sendMessage( 'issuesClicked', { "issues": res } ); + } + + function handleReference( targetId ) { + var target = document.getElementById(targetId); + if ( target === null ) { + console.log( "reference target not found: " + targetId ); + } else if ( href.slice(0, 10) === "#cite_note" ) { + try { + var refTexts = target.getElementsByClassName( "reference-text" ); + if (refTexts.length > 0) { + target = refTexts[0]; + } + bridge.sendMessage( 'referenceClicked', { "ref": target.innerHTML } ); + } catch (e) { + target.scrollIntoView(); + } + } else { + // If it is a link to an anchor in the current page, just scroll to it + target.scrollIntoView(); + } + } + if (sourceNode) { if ( sourceNode.hasAttribute( "data-action" ) ) { var action = sourceNode.getAttribute( "data-action" ); @@ -37,22 +71,10 @@ var href = sourceNode.getAttribute( "href" ); if ( href[0] === "#" ) { var targetId = href.slice(1); - var target = document.getElementById( targetId ); - if ( target === null ) { - console.log( "reference target not found: " + targetId ); - } else if ( href.slice(0, 10) === "#cite_note" ) { - try { - var refTexts = target.getElementsByClassName( "reference-text" ); - if ( refTexts.length > 0 ) { - target = refTexts[0]; - } - bridge.sendMessage( 'referenceClicked', { "ref": target.innerHTML } ); - } catch (e) { - target.scrollIntoView(); - } + if ( "issues" === targetId ) { + collectIssues( sourceNode ); } else { - // If it is a link to an anchor in the current page, just scroll to it - target.scrollIntoView(); + handleReference( targetId ); } } else { bridge.sendMessage( 'linkClicked', { "href": href } ); @@ -112,6 +134,29 @@ } ); },{"./actions":1,"./bridge":2}],4:[function(require,module,exports){ +var transformer = require('./transformer'); + +transformer.register( 'displayIssuesLink', function( content ) { + var issues = content.querySelectorAll( "table.ambox" ); + if ( issues.length > 0 ) { + var el = issues[0]; + var wrapper = document.createElement( 'div' ); + var link = document.createElement( 'a' ); + link.setAttribute( 'href', '#issues') ; + link.innerHTML = 'Issues'; + wrapper.appendChild( link ); + el.parentNode.replaceChild( wrapper, el ); + + var i = 0, + len = issues.length; + for (; i < len; i++) { + wrapper.appendChild( issues[i] ); + } + } + return content; +} ); + +},{"./transformer":10}],5:[function(require,module,exports){ var bridge = require( "./bridge" ); function addStyleLink( href ) { @@ -133,7 +178,7 @@ module.exports = { addStyleLink: addStyleLink }; -},{"./bridge":2}],5:[function(require,module,exports){ +},{"./bridge":2}],6:[function(require,module,exports){ var bridge = require( "./bridge" ); bridge.registerListener( "displayAttribution", function( payload ) { var directionality = document.getElementsByTagName( "html" )[0].classList.contains( "ui-rtl" ) ? "rtl" : "ltr"; @@ -200,7 +245,7 @@ } ); -},{"./bridge":2}],6:[function(require,module,exports){ +},{"./bridge":2}],7:[function(require,module,exports){ var parseCSSColor = require("../lib/js/css-color-parser"); var bridge = require("./bridge"); var loader = require("./loader"); @@ -279,7 +324,7 @@ invertElement: invertElement }; -},{"../lib/js/css-color-parser":12,"./bridge":2,"./loader":4}],7:[function(require,module,exports){ +},{"../lib/js/css-color-parser":13,"./bridge":2,"./loader":5}],8:[function(require,module,exports){ var bridge = require("./bridge"); bridge.registerListener( "setDirectionality", function( payload ) { @@ -289,7 +334,7 @@ html.classList.add( "ui-" + payload.uiDirection ); } ); -},{"./bridge":2}],8:[function(require,module,exports){ +},{"./bridge":2}],9:[function(require,module,exports){ var bridge = require("./bridge"); var transformer = require("./transformer"); @@ -319,6 +364,7 @@ content.id = "#content_block_0"; content = transformer.transform( "leadSection", content ); content = transformer.transform( "section", content ); + content = transformer.transform( "displayIssuesLink", content ); document.getElementById( "content" ).appendChild( content ); document.getElementById( "loading_sections").className = "loading"; @@ -419,7 +465,7 @@ bridge.sendMessage( "currentSectionResponse", { sectionID: getCurrentSection() } ); } ); -},{"./bridge":2,"./transformer":9}],9:[function(require,module,exports){ +},{"./bridge":2,"./transformer":10}],10:[function(require,module,exports){ function Transformer() { } @@ -443,7 +489,7 @@ module.exports = new Transformer(); -},{}],10:[function(require,module,exports){ +},{}],11:[function(require,module,exports){ var transformer = require("./transformer"); var night = require("./night"); @@ -481,7 +527,7 @@ return content; } ); -},{"./night":6,"./transformer":9}],11:[function(require,module,exports){ +},{"./night":7,"./transformer":10}],12:[function(require,module,exports){ /** * MIT LICENSCE * From: https://github.com/remy/polyfills @@ -558,7 +604,7 @@ })(); -},{}],12:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ // (c) Dean McNamee <[email protected]>, 2012. // // https://github.com/deanm/css-color-parser-js @@ -760,4 +806,4 @@ try { module.exports = parseCSSColor } catch(e) { } -},{}]},{},[4,12,5,6,9,10,2,1,3,8,7,11]) \ No newline at end of file +},{}]},{},[5,13,6,7,10,11,2,1,3,4,9,8,12]) \ No newline at end of file diff --git a/wikipedia/assets/preview.js b/wikipedia/assets/preview.js index 83fd816..b0dedb6 100644 --- a/wikipedia/assets/preview.js +++ b/wikipedia/assets/preview.js @@ -26,6 +26,40 @@ } curNode = curNode.parentNode; } + + function collectIssues( sourceNode ) { + var res = []; + var issues = sourceNode.parentNode.querySelectorAll( 'table.ambox' ); + var i = 0, + len = issues.length; + for (; i < len; i++) { + // .ambox- is used e.g. on eswiki + res.push( issues[i].querySelector( '.mbox-text, .ambox-text' ).innerHTML ); + } + + bridge.sendMessage( 'issuesClicked', { "issues": res } ); + } + + function handleReference( targetId ) { + var target = document.getElementById(targetId); + if ( target === null ) { + console.log( "reference target not found: " + targetId ); + } else if ( href.slice(0, 10) === "#cite_note" ) { + try { + var refTexts = target.getElementsByClassName( "reference-text" ); + if (refTexts.length > 0) { + target = refTexts[0]; + } + bridge.sendMessage( 'referenceClicked', { "ref": target.innerHTML } ); + } catch (e) { + target.scrollIntoView(); + } + } else { + // If it is a link to an anchor in the current page, just scroll to it + target.scrollIntoView(); + } + } + if (sourceNode) { if ( sourceNode.hasAttribute( "data-action" ) ) { var action = sourceNode.getAttribute( "data-action" ); @@ -37,22 +71,10 @@ var href = sourceNode.getAttribute( "href" ); if ( href[0] === "#" ) { var targetId = href.slice(1); - var target = document.getElementById( targetId ); - if ( target === null ) { - console.log( "reference target not found: " + targetId ); - } else if ( href.slice(0, 10) === "#cite_note" ) { - try { - var refTexts = target.getElementsByClassName( "reference-text" ); - if ( refTexts.length > 0 ) { - target = refTexts[0]; - } - bridge.sendMessage( 'referenceClicked', { "ref": target.innerHTML } ); - } catch (e) { - target.scrollIntoView(); - } + if ( "issues" === targetId ) { + collectIssues( sourceNode ); } else { - // If it is a link to an anchor in the current page, just scroll to it - target.scrollIntoView(); + handleReference( targetId ); } } else { bridge.sendMessage( 'linkClicked', { "href": href } ); diff --git a/wikipedia/res/drawable-hdpi/ic_flag.png b/wikipedia/res/drawable-hdpi/ic_flag.png new file mode 100644 index 0000000..e00898c --- /dev/null +++ b/wikipedia/res/drawable-hdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-ldpi/ic_flag.png b/wikipedia/res/drawable-ldpi/ic_flag.png new file mode 100644 index 0000000..250d105 --- /dev/null +++ b/wikipedia/res/drawable-ldpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png b/wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png new file mode 100644 index 0000000..6a56544 --- /dev/null +++ b/wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png b/wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png new file mode 100644 index 0000000..61167f0 --- /dev/null +++ b/wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png b/wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png new file mode 100644 index 0000000..631e677 --- /dev/null +++ b/wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png b/wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png new file mode 100644 index 0000000..02f6035 --- /dev/null +++ b/wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png b/wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png new file mode 100644 index 0000000..322812b --- /dev/null +++ b/wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-mdpi/ic_flag.png b/wikipedia/res/drawable-mdpi/ic_flag.png new file mode 100644 index 0000000..9ef1b71 --- /dev/null +++ b/wikipedia/res/drawable-mdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-xhdpi/ic_flag.png b/wikipedia/res/drawable-xhdpi/ic_flag.png new file mode 100644 index 0000000..5fdfe6b --- /dev/null +++ b/wikipedia/res/drawable-xhdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/drawable-xxhdpi/ic_flag.png b/wikipedia/res/drawable-xxhdpi/ic_flag.png new file mode 100644 index 0000000..65a3c9c --- /dev/null +++ b/wikipedia/res/drawable-xxhdpi/ic_flag.png Binary files differ diff --git a/wikipedia/res/layout/dialog_issues.xml b/wikipedia/res/layout/dialog_issues.xml new file mode 100644 index 0000000..1067352 --- /dev/null +++ b/wikipedia/res/layout/dialog_issues.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> + +<ListView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/list" + android:layout_width="match_parent" + android:layout_height="match_parent"/> diff --git a/wikipedia/res/layout/item_issue.xml b/wikipedia/res/layout/item_issue.xml new file mode 100644 index 0000000..046e60e --- /dev/null +++ b/wikipedia/res/layout/item_issue.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="8dp"> + + <ImageView + android:id="@+id/issues_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginLeft="8dp" + android:src="@drawable/ic_flag" /> + + <TextView + android:id="@+id/issue_text" + style="?android:textAppearanceMedium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:padding="8dp" /> + +</LinearLayout> diff --git a/wikipedia/res/values-qq/strings.xml b/wikipedia/res/values-qq/strings.xml index c5646c9..a2a44c9 100644 --- a/wikipedia/res/values-qq/strings.xml +++ b/wikipedia/res/values-qq/strings.xml @@ -273,6 +273,7 @@ <string name="abusefilter_title_disallow">Message that informs the user that their edit is not allowed, and that the user must go back and modify the edit.</string> <string name="abusefilter_text_warn">Explanation of why the edit may be flagged as unconstructive: Typing in all caps, Blanking articles or Spamming, Irrelevant external links or images, Repeating characters</string> <string name="abusefilter_text_disallow">Explanation of why the edit was not allowed: potentially unconstructive, or potential vandalism.</string> + <string name="dialog_page_issues">Dialog title for page/article issues list</string> <string name="menu_themechooser">Menu item for choosing text size and color scheme</string> <string name="text_size_select">Label that describes text size selection</string> <string name="color_theme_select">Label that describes color theme selection</string> diff --git a/wikipedia/res/values/color.xml b/wikipedia/res/values/color.xml index e8d28e1..54612b9 100644 --- a/wikipedia/res/values/color.xml +++ b/wikipedia/res/values/color.xml @@ -26,6 +26,7 @@ <color name="gray_highlight">#ff808080</color> <color name="link_light">#ff347BFF</color> + <color name="button_light">#ff777777</color> <color name="window_background_light">#fff2f2f2</color> <color name="actionbar_background_light">#ffffffff</color> <color name="search_background_light">#ffffffff</color> @@ -35,6 +36,7 @@ <color name="edit_text_light">#ff000000</color> <color name="link_dark">#ff2B6FB2</color> + <color name="button_dark">#ff2B6FB2</color> <color name="window_background_dark">#ff000000</color> <color name="actionbar_background_dark">#ff303030</color> <color name="search_background_dark">#ff404040</color> @@ -50,4 +52,4 @@ <color name="holo_green_light">#ff99cc00</color> <color name="holo_red_dark">#ffcc0000</color> <color name="primary_text_holo_light">#ff000000</color> -</resources> \ No newline at end of file +</resources> diff --git a/wikipedia/res/values/strings.xml b/wikipedia/res/values/strings.xml index 0268e93..f10d270 100644 --- a/wikipedia/res/values/strings.xml +++ b/wikipedia/res/values/strings.xml @@ -204,6 +204,7 @@ <string name="abusefilter_title_disallow">You cannot save this edit. Please go back and change it.</string> <string name="abusefilter_text_warn"><![CDATA[An automated filter has identified this edit as potentially unconstructive. It may contain one or more of the following:<br /><br />· Typing in all caps<br />· Blanking articles or spamming<br />· Irrelevant external links or images<br />· Repeating characters]]></string> <string name="abusefilter_text_disallow"><![CDATA[An automated filter has identified this edit as potentially unconstructive, or potential vandalism.<br /><br />Wikipedia is an encyclopedia and only neutral, notable content belongs here.]]></string> + <string name="dialog_page_issues">Page Issues</string> <string name="menu_themechooser">Font and theme</string> <string name="text_size_select">Font size</string> <string name="color_theme_select">Theme</string> diff --git a/wikipedia/src/main/java/org/wikipedia/Utils.java b/wikipedia/src/main/java/org/wikipedia/Utils.java index 65b5425..a3c43fc 100644 --- a/wikipedia/src/main/java/org/wikipedia/Utils.java +++ b/wikipedia/src/main/java/org/wikipedia/Utils.java @@ -29,6 +29,7 @@ import android.widget.EditText; import android.widget.Toast; import com.squareup.otto.Bus; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.mediawiki.api.json.ApiResult; @@ -553,6 +554,23 @@ } /** + * Convert a JSONArray object to a String Array. + * + * @param array a JSONArray containing only Strings + * @return a String[] with all the items in the JSONArray + */ + public static String[] jsonArrayToStringArray(JSONArray array) { + if (array == null) { + return null; + } + String[] stringArray = new String[array.length()]; + for (int i = 0; i < array.length(); i++) { + stringArray[i] = array.optString(i); + } + return stringArray; + } + + /** * Resolves a potentially protocol relative URL to a 'full' URL * * @param url Url to check for (and fix) protocol relativeness diff --git a/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java b/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java index 1c050d1..afc1c09 100644 --- a/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java +++ b/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java @@ -449,6 +449,19 @@ } } + /** + * Make adjustments to a link or button Drawable object to look better in the current theme. + * (e.g. apply a blue color filter for night mode, ) + * @param d Drawable to be adjusted. + */ + public void adjustLinkDrawableToTheme(Drawable d) { + if (getCurrentTheme() == THEME_DARK) { + d.setColorFilter(getResources().getColor(R.color.button_dark), PorterDuff.Mode.SRC_ATOP); + } else { + d.setColorFilter(getResources().getColor(R.color.button_light), PorterDuff.Mode.SRC_ATOP); + } + } + public int getFontSizeMultiplier() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); return prefs.getInt(WikipediaApp.PREFERENCE_TEXT_SIZE_MULTIPLIER, 0); diff --git a/wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java b/wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java new file mode 100644 index 0000000..d9a9461 --- /dev/null +++ b/wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java @@ -0,0 +1,85 @@ +package org.wikipedia.page; + +import android.app.Activity; +import android.app.AlertDialog; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.TextView; +import org.json.JSONException; +import org.json.JSONObject; +import org.wikipedia.R; +import org.wikipedia.Utils; +import org.wikipedia.WikipediaApp; +import org.wikipedia.bridge.CommunicationBridge; + +/** + * Handles the #issues links coming from a {@link org.wikipedia.page.PageViewFragment}. + * Shows a dialog with a list of issues when the issues link is clicked. + */ +public class IssuesHandler implements CommunicationBridge.JSEventListener { + + private final Activity activity; + + public IssuesHandler(final Activity activity, CommunicationBridge bridge) { + this.activity = activity; + bridge.addListener("issuesClicked", this); + } + + // message from JS bridge: + @Override + public void onMessage(String messageType, JSONObject messagePayload) { + try { + show(Utils.jsonArrayToStringArray(messagePayload.getJSONArray("issues"))); + } catch (JSONException e) { + throw new RuntimeException(e); + } + } + + public void show(final String[] items) { + final WikipediaApp app = (WikipediaApp) activity.getApplicationContext(); + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + ListAdapter adapter = new ArrayAdapter<String>(activity, 0, items) { + + private ViewHolder holder; + + class ViewHolder { + private ImageView icon; + private TextView title; + } + + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater inflater = activity.getLayoutInflater(); + + if (convertView == null) { + convertView = inflater.inflate(R.layout.item_issue, null); + + holder = new ViewHolder(); + holder.icon = (ImageView) convertView.findViewById(R.id.issues_icon); + holder.title = (TextView) convertView.findViewById(R.id.issue_text); + convertView.setTag(holder); + } else { + // view already defined, retrieve view holder + holder = (ViewHolder) convertView.getTag(); + } + + final String issueText = items[position].replaceAll(" href\\s*=", " x="); + holder.title.setText(Html.fromHtml(issueText)); + +// holder.icon.setImageResource(icons[position]); + app.adjustLinkDrawableToTheme(holder.icon.getDrawable()); + return convertView; + } + }; + + builder.setAdapter(adapter, null); + builder.setTitle(R.string.dialog_page_issues); + + builder.create().show(); + } +} diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java index 8193eca..cca11dc 100644 --- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java +++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java @@ -120,13 +120,14 @@ private View pageDoesNotExistError; private DisableableDrawerLayout tocDrawer; private View pageFragmentContainer; - private ReferenceDialog referenceDialog; private Page page; private HistoryEntry curEntry; private CommunicationBridge bridge; private LinkHandler linkHandler; private ReferenceHandler referenceHandler; + private ReferenceDialog referenceDialog; + private IssuesHandler issuesHandler; private EditHandler editHandler; private NightModeHandler nightModeHandler; @@ -342,6 +343,8 @@ } }; + issuesHandler = new IssuesHandler(getActivity(), bridge); + api = ((WikipediaApp)getActivity().getApplicationContext()).getAPIForSite(title.getSite()); bridge.injectStyleBundle(app.getStyleLoader().getAvailableBundle(StyleLoader.BUNDLE_PAGEVIEW, title.getSite())); @@ -521,6 +524,7 @@ Log.d("PageViewFragment", "Detached from activity, so stopping update."); return; } + page = new Page(title, (ArrayList<Section>) result, pageProperties); editHandler.setPage(page); displayLeadSection(); diff --git a/www/Gruntfile.js b/www/Gruntfile.js index f27e762..842da08 100644 --- a/www/Gruntfile.js +++ b/www/Gruntfile.js @@ -6,6 +6,7 @@ "js/bridge.js", "js/actions.js", "js/editaction.js", + "js/issues.js", "js/sections.js", "js/rtlsupport.js", "lib/js/classList.js", @@ -27,14 +28,15 @@ files: { "bundle.js": [ "js/loader.js", - "lib/js/css-color-parser.js", + "lib/js/css-color-parser.js", "js/main.js", - "js/night.js", + "js/night.js", "js/transformer.js", "js/transforms.js", "js/bridge.js", "js/actions.js", "js/editaction.js", + "js/issues.js", "js/sections.js", "js/rtlsupport.js" ].concat( oldDroidPolyfills ), diff --git a/www/js/actions.js b/www/js/actions.js index 71c098e..c207c95 100644 --- a/www/js/actions.js +++ b/www/js/actions.js @@ -25,6 +25,40 @@ } curNode = curNode.parentNode; } + + function collectIssues( sourceNode ) { + var res = []; + var issues = sourceNode.parentNode.querySelectorAll( 'table.ambox' ); + var i = 0, + len = issues.length; + for (; i < len; i++) { + // .ambox- is used e.g. on eswiki + res.push( issues[i].querySelector( '.mbox-text, .ambox-text' ).innerHTML ); + } + + bridge.sendMessage( 'issuesClicked', { "issues": res } ); + } + + function handleReference( targetId ) { + var target = document.getElementById(targetId); + if ( target === null ) { + console.log( "reference target not found: " + targetId ); + } else if ( href.slice(0, 10) === "#cite_note" ) { + try { + var refTexts = target.getElementsByClassName( "reference-text" ); + if (refTexts.length > 0) { + target = refTexts[0]; + } + bridge.sendMessage( 'referenceClicked', { "ref": target.innerHTML } ); + } catch (e) { + target.scrollIntoView(); + } + } else { + // If it is a link to an anchor in the current page, just scroll to it + target.scrollIntoView(); + } + } + if (sourceNode) { if ( sourceNode.hasAttribute( "data-action" ) ) { var action = sourceNode.getAttribute( "data-action" ); @@ -36,22 +70,10 @@ var href = sourceNode.getAttribute( "href" ); if ( href[0] === "#" ) { var targetId = href.slice(1); - var target = document.getElementById( targetId ); - if ( target === null ) { - console.log( "reference target not found: " + targetId ); - } else if ( href.slice(0, 10) === "#cite_note" ) { - try { - var refTexts = target.getElementsByClassName( "reference-text" ); - if ( refTexts.length > 0 ) { - target = refTexts[0]; - } - bridge.sendMessage( 'referenceClicked', { "ref": target.innerHTML } ); - } catch (e) { - target.scrollIntoView(); - } + if ( "issues" === targetId ) { + collectIssues( sourceNode ); } else { - // If it is a link to an anchor in the current page, just scroll to it - target.scrollIntoView(); + handleReference( targetId ); } } else { bridge.sendMessage( 'linkClicked', { "href": href } ); diff --git a/www/js/issues.js b/www/js/issues.js new file mode 100644 index 0000000..4637776 --- /dev/null +++ b/www/js/issues.js @@ -0,0 +1,21 @@ +var transformer = require('./transformer'); + +transformer.register( 'displayIssuesLink', function( content ) { + var issues = content.querySelectorAll( "table.ambox" ); + if ( issues.length > 0 ) { + var el = issues[0]; + var wrapper = document.createElement( 'div' ); + var link = document.createElement( 'a' ); + link.setAttribute( 'href', '#issues') ; + link.innerHTML = 'Issues'; + wrapper.appendChild( link ); + el.parentNode.replaceChild( wrapper, el ); + + var i = 0, + len = issues.length; + for (; i < len; i++) { + wrapper.appendChild( issues[i] ); + } + } + return content; +} ); diff --git a/www/js/sections.js b/www/js/sections.js index 66bbc2c..27c6dee 100644 --- a/www/js/sections.js +++ b/www/js/sections.js @@ -27,6 +27,7 @@ content.id = "#content_block_0"; content = transformer.transform( "leadSection", content ); content = transformer.transform( "section", content ); + content = transformer.transform( "displayIssuesLink", content ); document.getElementById( "content" ).appendChild( content ); document.getElementById( "loading_sections").className = "loading"; -- To view, visit https://gerrit.wikimedia.org/r/148506 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibd3054cc3e7142447de8d35021a006fbccd12bb9 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: BearND <[email protected]> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
