mediawiki-extensions-Visual.../modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js
Roan Kattouw c7fce9b2be Fix corruption bug in sortkeys containing underscores
We normalize underscores to spaces in sortkeys in toDataElement,
but when toDomElements recomputes the normalization to decide
if the sortkey really changed, it doesn't normalize underscores.
This is broken, both code paths need to use the same normalization;
we do this correctly for the category name.

This bug appears to date back to the introduction of category
support in March 2013 :(

Spotted in https://it.wikipedia.org/?diff=67220927

Change-Id: Ie3257fa335f3bd24a36c8654f3f5a24e89d7a9b9
2014-07-26 00:24:01 +00:00

84 lines
2.4 KiB
JavaScript

/*!
* VisualEditor DataModel MWCategoryMetaItem class.
*
* @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* DataModel category meta item.
*
* @class
* @extends ve.dm.MetaItem
* @constructor
* @param {Object} element Reference to element in meta-linmod
*/
ve.dm.MWCategoryMetaItem = function VeDmMWCategoryMetaItem( element ) {
// Parent constructor
ve.dm.MetaItem.call( this, element );
};
/* Inheritance */
OO.inheritClass( ve.dm.MWCategoryMetaItem, ve.dm.MetaItem );
/* Static Properties */
ve.dm.MWCategoryMetaItem.static.name = 'mwCategory';
ve.dm.MWCategoryMetaItem.static.group = 'mwCategory';
ve.dm.MWCategoryMetaItem.static.matchTagNames = [ 'link' ];
ve.dm.MWCategoryMetaItem.static.matchRdfaTypes = [ 'mw:PageProp/Category' ];
ve.dm.MWCategoryMetaItem.static.toDataElement = function ( domElements ) {
var href = domElements[0].getAttribute( 'href' ),
/*jshint regexp:false */
matches = href.match( /^((?:\.\.?\/)*)(.*?)(?:#(.*))?$/ ),
rawSortkey = matches[3] || '';
return {
'type': this.name,
'attributes': {
'hrefPrefix': matches[1],
'category': decodeURIComponent( matches[2] ).replace( /_/g, ' ' ),
'origCategory': matches[2],
'sortkey': decodeURIComponent( rawSortkey ).replace( /_/g, ' ' ),
'origSortkey': rawSortkey
}
};
};
ve.dm.MWCategoryMetaItem.static.toDomElements = function ( dataElement, doc ) {
var href,
domElement = doc.createElement( 'link' ),
hrefPrefix = dataElement.attributes.hrefPrefix || '',
category = dataElement.attributes.category || '',
sortkey = dataElement.attributes.sortkey || '',
origCategory = dataElement.attributes.origCategory || '',
origSortkey = dataElement.attributes.origSortkey || '',
normalizedOrigCategory = decodeURIComponent( origCategory ).replace( /_/g, ' ' ),
normalizedOrigSortkey = decodeURIComponent( origSortkey ).replace( /_/g, ' ' );
if ( normalizedOrigSortkey === sortkey ) {
sortkey = origSortkey;
} else {
sortkey = encodeURIComponent( sortkey );
}
if ( normalizedOrigCategory === category ) {
category = origCategory;
} else {
category = encodeURIComponent( category );
}
domElement.setAttribute( 'rel', 'mw:PageProp/Category' );
href = hrefPrefix + category;
if ( sortkey !== '' ) {
href += '#' + sortkey;
}
domElement.setAttribute( 'href', href );
return [ domElement ];
};
/* Registration */
ve.dm.modelRegistry.register( ve.dm.MWCategoryMetaItem );