1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*!
* VisualEditor DataModel MWCategoryMetaItem class.
*
* @copyright 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() {
// Parent constructor
ve.dm.MWCategoryMetaItem.super.apply( this, arguments );
};
/* 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 ) {
// Parsoid: LinkHandlerUtils::serializeAsWikiLink
const href = domElements[ 0 ].getAttribute( 'href' ),
titleAndFragment = href.match( /^(.*?)(?:#(.*))?\s*$/ );
return {
type: this.name,
attributes: {
category: mw.libs.ve.parseParsoidResourceName( titleAndFragment[ 1 ] ).title,
sortkey: titleAndFragment[ 2 ] ? decodeURIComponent( titleAndFragment[ 2 ] ) : ''
}
};
};
ve.dm.MWCategoryMetaItem.static.toDomElements = function ( dataElement, doc, converter ) {
let domElement;
const category = dataElement.attributes.category || '';
if ( converter.isForPreview() ) {
domElement = doc.createElement( 'a' );
const title = mw.Title.newFromText( category );
domElement.setAttribute( 'href', title.getUrl() );
domElement.appendChild( doc.createTextNode( title.getMainText() ) );
} else {
domElement = doc.createElement( 'link' );
const sortkey = dataElement.attributes.sortkey || '';
domElement.setAttribute( 'rel', 'mw:PageProp/Category' );
// Parsoid: WikiLinkHandler::renderCategory
let href = mw.libs.ve.encodeParsoidResourceName( category );
if ( sortkey !== '' ) {
href += '#' + sortkey.replace( /[%? [\]#|<>]/g, ( match ) => encodeURIComponent( match ) );
}
domElement.setAttribute( 'href', href );
}
return [ domElement ];
};
ve.dm.MWCategoryMetaItem.static.isDiffComparable = function ( element, other ) {
// Don't try to compare different categories. Even fixing a typo in a category name
// results in one category being removed and another added, which we shoud show.
return element.type === other.type && element.attributes.category === other.attributes.category;
};
ve.dm.MWCategoryMetaItem.static.describeChange = function ( key, change ) {
if ( key === 'sortkey' ) {
if ( !change.from ) {
return ve.htmlMsg( 'visualeditor-changedesc-mwcategory-sortkey-set', this.wrapText( 'ins', change.to ) );
} else if ( !change.to ) {
return ve.htmlMsg( 'visualeditor-changedesc-mwcategory-sortkey-unset', this.wrapText( 'del', change.from ) );
} else {
return ve.htmlMsg( 'visualeditor-changedesc-mwcategory-sortkey-changed',
this.wrapText( 'del', change.from ),
this.wrapText( 'ins', change.to )
);
}
}
// Parent method
return ve.dm.MWCategoryMetaItem.super.static.describeChange.apply( this, arguments );
};
/* Registration */
ve.dm.modelRegistry.register( ve.dm.MWCategoryMetaItem );
ve.ui.metaListDiffRegistry.register( 'mwCategory', ( diffElement, diffQueue, documentNode /* , documentSpacerNode */ ) => {
diffQueue = diffElement.processQueue( diffQueue );
if ( !diffQueue.length ) {
return;
}
const catLinks = document.createElement( 'div' );
catLinks.setAttribute( 'class', 'catlinks' );
const headerLink = document.createElement( 'a' );
headerLink.appendChild( document.createTextNode( ve.msg( 'pagecategories', diffQueue.length ) ) );
headerLink.setAttribute( 'href', ve.msg( 'pagecategorieslink' ) );
catLinks.appendChild( headerLink );
catLinks.appendChild( document.createTextNode( ve.msg( 'colon-separator' ) ) );
const list = document.createElement( 'ul' );
catLinks.appendChild( list );
const catSpacerNode = document.createElement( 'span' );
catSpacerNode.appendChild( document.createTextNode( ' … ' ) );
// Wrap each item in the queue in an <li>
diffQueue.forEach( ( diffItem ) => {
const listItem = document.createElement( 'li' );
diffElement.renderQueue(
[ diffItem ],
listItem, catSpacerNode
);
list.appendChild( listItem );
} );
documentNode.appendChild( catLinks );
} );
|