mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-30 00:55:00 +00:00
92 lines
2.4 KiB
JavaScript
92 lines
2.4 KiB
JavaScript
/**
|
|
* Generic attribute expansion handler.
|
|
*
|
|
* @author Gabriel Wicke <gwicke@wikimedia.org>
|
|
*/
|
|
var $ = require('jquery'),
|
|
request = require('request'),
|
|
events = require('events'),
|
|
qs = require('querystring'),
|
|
ParserFunctions = require('./ext.core.ParserFunctions.js').ParserFunctions,
|
|
AttributeTransformManager = require('./mediawiki.TokenTransformManager.js')
|
|
.AttributeTransformManager,
|
|
defines = require('./mediawiki.parser.defines.js');
|
|
|
|
|
|
function AttributeExpander ( manager ) {
|
|
this.reset();
|
|
this.register( manager );
|
|
}
|
|
|
|
AttributeExpander.prototype.reset = function ( token ) {
|
|
return {token: token};
|
|
};
|
|
|
|
// constants
|
|
AttributeExpander.prototype.rank = 1.11;
|
|
|
|
AttributeExpander.prototype.register = function ( manager ) {
|
|
this.manager = manager;
|
|
// Register for template and templatearg tag tokens
|
|
manager.addTransform( this.onToken.bind(this),
|
|
this.rank, 'any' );
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
* Token handler
|
|
*
|
|
* Expands target and arguments (both keys and values) and either directly
|
|
* calls or sets up the callback to _expandTemplate, which then fetches and
|
|
* processes the template.
|
|
*/
|
|
AttributeExpander.prototype.onToken = function ( token, frame, cb ) {
|
|
if ( token.constructor === TagTk && token.attribs && token.attribs.length ) {
|
|
var expandData = {
|
|
token: token,
|
|
cb: cb
|
|
};
|
|
var atm = new AttributeTransformManager(
|
|
this.manager,
|
|
this._returnAttributes.bind( this, expandData )
|
|
);
|
|
if( atm.process( token.attribs ) ) {
|
|
// Attributes were transformed synchronously
|
|
this.manager.env.dp (
|
|
'sync attribs for ', token
|
|
);
|
|
// All attributes are fully expanded synchronously (no IO was needed)
|
|
return { token: token };
|
|
} else {
|
|
// Async attribute expansion is going on
|
|
this.manager.env.dp( 'async return for ', token );
|
|
expandData.async = true;
|
|
return { async: true };
|
|
}
|
|
} else {
|
|
token.rank = this.rank;
|
|
return { token: token };
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Callback for argument (including target) expansion in AttributeTransformManager
|
|
*/
|
|
AttributeExpander.prototype._returnAttributes = function ( expandData,
|
|
attributes )
|
|
{
|
|
this.manager.env.dp( 'AttributeExpander._returnAttributes: ',attributes );
|
|
// Remove the target from the attributes
|
|
expandData.token.attribs = attributes;
|
|
if ( expandData.async ) {
|
|
expandData.token.rank = this.rank;
|
|
expandData.cb( [expandData.token], false );
|
|
}
|
|
};
|
|
|
|
if (typeof module == "object") {
|
|
module.exports.AttributeExpander = AttributeExpander;
|
|
}
|