Divec has uploaded a new change for review.

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

Change subject: New decodeURIComponentIntoArticleTitle method
......................................................................

New decodeURIComponentIntoArticleTitle method

This replaces ve.safeDecodeURIComponent(...).replace( /_/g, ' ' ) . This action
is really specific to the quirks of mediawiki title processing.

Change-Id: Ia9e525c9340e6de9e485355899996c97867ccb48
---
M extension.json
M modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
M modules/ve-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
M modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js
M modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
M modules/ve-mw/dm/nodes/ve.dm.MWMagicLinkNode.js
A modules/ve-mw/ve.MWutils.js
7 files changed, 41 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/93/294393/1

diff --git a/extension.json b/extension.json
index 810cb8c..7de529d 100644
--- a/extension.json
+++ b/extension.json
@@ -1109,6 +1109,7 @@
                },
                "ext.visualEditor.mwcore": {
                        "scripts": [
+                               "modules/ve-mw/ve.MWutils.js",
                                "modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js",
                                
"modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.js",
                                "modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js",
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
index 64eb73e0..9fe764e 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
@@ -180,7 +180,7 @@
                                var targetData = 
ve.dm.MWInternalLinkAnnotation.static.getTargetDataFromHref(
                                                this.href, 
transclusionNode.getModelHtmlDocument()
                                        ),
-                                       normalisedHref = 
ve.safeDecodeURIComponent( targetData.title );
+                                       normalisedHref = 
ve.decodeURIComponentIntoArticleTitle( targetData.title, false );
                                if ( mw.Title.newFromText( normalisedHref ) ) {
                                        normalisedHref = mw.Title.newFromText( 
normalisedHref ).getPrefixedText();
                                }
diff --git a/modules/ve-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.js 
b/modules/ve-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
index fafa709..4807da9 100644
--- a/modules/ve-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
+++ b/modules/ve-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.js
@@ -42,7 +42,7 @@
                type: this.name,
                attributes: {
                        hrefPrefix: targetData.hrefPrefix,
-                       title: ve.safeDecodeURIComponent( targetData.title 
).replace( /_/g, ' ' ),
+                       title: ve.decodeURIComponentIntoArticleTitle( 
targetData.title ),
                        normalizedTitle: this.normalizeTitle( targetData.title 
),
                        lookupTitle: this.getLookupTitle( targetData.title ),
                        origTitle: targetData.title
@@ -130,7 +130,7 @@
        var href,
                title = dataElement.attributes.title,
                origTitle = dataElement.attributes.origTitle;
-       if ( origTitle !== undefined && ve.safeDecodeURIComponent( origTitle 
).replace( /_/g, ' ' ) === title ) {
+       if ( origTitle !== undefined && ve.decodeURIComponentIntoArticleTitle( 
origTitle ) === title ) {
                // Restore href from origTitle
                href = origTitle;
                // Only use hrefPrefix if restoring from origTitle
diff --git a/modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js 
b/modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js
index c978373..d04c55d 100644
--- a/modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js
+++ b/modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js
@@ -41,9 +41,9 @@
                type: this.name,
                attributes: {
                        hrefPrefix: matches[ 1 ],
-                       category: ve.safeDecodeURIComponent( matches[ 2 ] 
).replace( /_/g, ' ' ),
+                       category: ve.decodeURIComponentIntoArticleTitle( 
matches[ 2 ] ),
                        origCategory: matches[ 2 ],
-                       sortkey: ve.safeDecodeURIComponent( rawSortkey 
).replace( /_/g, ' ' ),
+                       sortkey: ve.decodeURIComponentIntoArticleTitle( 
rawSortkey ),
                        origSortkey: rawSortkey
                }
        };
@@ -57,8 +57,8 @@
                sortkey = dataElement.attributes.sortkey || '',
                origCategory = dataElement.attributes.origCategory || '',
                origSortkey = dataElement.attributes.origSortkey || '',
-               normalizedOrigCategory = ve.safeDecodeURIComponent( 
origCategory ).replace( /_/g, ' ' ),
-               normalizedOrigSortkey = ve.safeDecodeURIComponent( origSortkey 
).replace( /_/g, ' ' );
+               normalizedOrigCategory = ve.decodeURIComponentIntoArticleTitle( 
origCategory ),
+               normalizedOrigSortkey = ve.decodeURIComponentIntoArticleTitle( 
origSortkey );
        if ( normalizedOrigSortkey === sortkey ) {
                sortkey = origSortkey;
        } else {
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js 
b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
index 0661113..1da006e 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
@@ -209,7 +209,7 @@
        var resource = this.getAttribute( 'resource' ) || '',
                filename = resource.replace( /^(\.+\/)*/, '' );
 
-       return ve.safeDecodeURIComponent( filename );
+       return ve.decodeURIComponentIntoArticleTitle( filename, true );
 };
 
 /**
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWMagicLinkNode.js 
b/modules/ve-mw/dm/nodes/ve.dm.MWMagicLinkNode.js
index 637c8f3..fe28510 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWMagicLinkNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWMagicLinkNode.js
@@ -358,7 +358,7 @@
                return false;
        }
        // conf.specialBooksources has localized name for Special:Booksources
-       normalized = ve.safeDecodeURIComponent( m[ 1 ] ).replace( ' ', '_' );
+       normalized = ve.decodeURIComponentIntoArticleTitle( m[ 1 ], true 
).replace( ' ', '_' );
        if ( normalized !== 'Special:BookSources' && normalized !== 
conf.specialBooksources ) {
                return false;
        }
diff --git a/modules/ve-mw/ve.MWutils.js b/modules/ve-mw/ve.MWutils.js
new file mode 100644
index 0000000..8c8eaac
--- /dev/null
+++ b/modules/ve-mw/ve.MWutils.js
@@ -0,0 +1,31 @@
+/*!
+ * VisualEditor MediaWiki utilities.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see 
http://ve.mit-license.org
+ */
+
+/**
+ * @class ve
+ */
+
+/**
+ * Decode a URI component into a mediawiki article title
+ *
+ * N.B. Illegal article titles can result from fairly reasonable input (e.g. 
"100%25beef");
+ * see https://phabricator.wikimedia.org/T137847 .
+ *
+ * @param {string} s String to decode
+ * @param {boolean} [preserveUnderscores] Don't convert underscores to spaces
+ * @return {string} Decoded string, or original string if decodeURIComponent 
failed
+ */
+ve.decodeURIComponentIntoArticleTitle = function ( s, preserveUnderscores ) {
+       try {
+               s = decodeURIComponent( s );
+       } catch ( e ) {
+               return s;
+       }
+       if ( preserveUnderscores ) {
+               return s;
+       }
+       return s.replace( /_/g, ' ' );
+};

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia9e525c9340e6de9e485355899996c97867ccb48
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Divec <da...@troi.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to