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