mediawiki-extensions-Cite/modules/ve-cite/ve.ui.MWReference.init.js
Ed Sanders a08febb0af Simplify toolbar registration
VE-MW toolbars now define a placeholder for reference toolbars.

Depends-On: I0bace5e5fe05f9c214d57a74c478b48a7dcaec3b
Change-Id: I7cb0f1f1affbfd7a4013f396b1423b6f84da52ab
2018-05-12 16:42:08 +01:00

152 lines
5.3 KiB
JavaScript

/*!
* VisualEditor MediaWiki Cite initialisation code.
*
* @copyright 2011-2018 VisualEditor Team's Cite sub-team and others; see AUTHORS.txt
* @license MIT
*/
( function () {
var name;
function fixTarget( target ) {
var i, iLen, toolGroup, label, group,
toolGroups = target.static.toolbarGroups;
if ( mw.config.get( 'wgCiteVisualEditorOtherGroup' ) ) {
for ( i = 0, iLen = toolGroups.length; i < iLen; i++ ) {
toolGroup = toolGroups[ i ];
if ( toolGroup.name === 'insert' && ( !toolGroup.demote || toolGroup.demote.indexOf( 'reference' ) === -1 ) ) {
toolGroup.demote = toolGroup.demote || [];
toolGroup.demote.push( { group: 'cite' }, 'reference', 'reference/existing' );
}
}
} else {
// Find the reference placeholder group and replace it
for ( i = 0, iLen = toolGroups.length; i < iLen; i++ ) {
if ( toolGroups[ i ].name === 'reference' ) {
toolGroups[ i ] = group = {
// Change the name so it isn't replaced twice
name: 'cite',
type: 'list',
indicator: 'down',
include: [ { group: 'cite' }, 'reference', 'reference/existing' ],
demote: [ 'reference', 'reference/existing' ]
};
label = OO.ui.deferMsg( 'cite-ve-toolbar-group-label' );
// Treat mobile targets differently
if ( ve.init.mw.MobileArticleTarget && target.prototype instanceof ve.init.mw.MobileArticleTarget ) {
group.header = label;
group.title = label;
group.icon = 'reference';
} else {
group.label = label;
}
break;
}
}
}
}
for ( name in ve.init.mw.targetFactory.registry ) {
fixTarget( ve.init.mw.targetFactory.lookup( name ) );
}
ve.init.mw.targetFactory.on( 'register', function ( name, target ) {
fixTarget( target );
} );
/**
* Add reference insertion tools from on-wiki data.
*
* By adding a definition in JSON to MediaWiki:Visualeditor-cite-tool-definition, the cite menu can
* be populated with tools that create refrences containing a specific templates. The content of the
* definition should be an array containing a series of objects, one for each tool. Each object must
* contain a `name`, `icon` and `template` property. An optional `title` property can also be used
* to define the tool title in plain text. The `name` property is a unique identifier for the tool,
* and also provides a fallback title for the tool by being transformed into a message key. The name
* is prefixed with `visualeditor-cite-tool-name-`, and messages can be defined on Wiki. Some common
* messages are pre-defined for tool names such as `web`, `book`, `news` and `journal`.
*
* Example:
* [ { "name": "web", "icon": "cite-web", "template": "Cite web" }, ... ]
*
*/
( function () {
var i, len, item, name, data, tool, tools, dialog, contextItem,
limit = 5;
try {
// Must use mw.message to avoid JSON being parsed as Wikitext
tools = JSON.parse( mw.message( 'cite-tool-definition.json' ).plain() );
} catch ( e ) {}
if ( !tools ) {
try {
// Must use mw.message to avoid JSON being parsed as Wikitext
tools = JSON.parse( mw.message( 'visualeditor-cite-tool-definition.json' ).plain() );
} catch ( e ) {}
}
if ( Array.isArray( tools ) ) {
for ( i = 0, len = Math.min( limit, tools.length ); i < len; i++ ) {
item = tools[ i ];
data = { template: item.template };
// Generate citation tool
name = 'cite-' + item.name;
if ( !ve.ui.toolFactory.lookup( name ) ) {
tool = function GeneratedMWCitationDialogTool() {
ve.ui.MWCitationDialogTool.apply( this, arguments );
};
OO.inheritClass( tool, ve.ui.MWCitationDialogTool );
tool.static.group = 'cite';
tool.static.name = name;
tool.static.icon = item.icon;
if ( mw.config.get( 'wgCiteVisualEditorOtherGroup' ) ) {
tool.static.title = mw.msg( 'cite-ve-othergroup-item', item.title );
} else {
tool.static.title = item.title;
}
tool.static.commandName = name;
tool.static.template = item.template;
tool.static.autoAddToCatchall = false;
tool.static.autoAddToGroup = true;
tool.static.associatedWindows = [ name ];
ve.ui.toolFactory.register( tool );
ve.ui.commandRegistry.register(
new ve.ui.Command(
name, 'mwcite', 'open', { args: [ name, data ], supportedSelections: [ 'linear' ] }
)
);
}
// Generate citation context item
if ( !ve.ui.contextItemFactory.lookup( name ) ) {
contextItem = function GeneratedMWCitationContextItem() {
// Parent constructor
ve.ui.MWCitationContextItem.apply( this, arguments );
};
OO.inheritClass( contextItem, ve.ui.MWCitationContextItem );
contextItem.static.name = name;
contextItem.static.icon = item.icon;
contextItem.static.label = item.title;
contextItem.static.commandName = name;
contextItem.static.template = item.template;
ve.ui.contextItemFactory.register( contextItem );
}
// Generate dialog
if ( !ve.ui.windowFactory.lookup( name ) ) {
dialog = function GeneratedMWCitationDialog() {
ve.ui.MWCitationDialog.apply( this, arguments );
};
OO.inheritClass( dialog, ve.ui.MWCitationDialog );
dialog.static.name = name;
dialog.static.title = item.title;
ve.ui.windowFactory.register( dialog );
}
}
}
}() );
}() );