https://www.mediawiki.org/wiki/Special:Code/MediaWiki/112110
Revision: 112110
Author: gwicke
Date: 2012-02-22 14:57:50 +0000 (Wed, 22 Feb 2012)
Log Message:
-----------
Basic fall-through support for #switch parser function
Modified Paths:
--------------
trunk/extensions/VisualEditor/modules/parser/ext.core.ParserFunctions.js
trunk/extensions/VisualEditor/modules/parser/ext.core.TemplateHandler.js
trunk/extensions/VisualEditor/modules/parser/mediawiki.TokenTransformManager.js
trunk/extensions/VisualEditor/modules/parser/mediawiki.parser.environment.js
Modified:
trunk/extensions/VisualEditor/modules/parser/ext.core.ParserFunctions.js
===================================================================
--- trunk/extensions/VisualEditor/modules/parser/ext.core.ParserFunctions.js
2012-02-22 13:56:55 UTC (rev 112109)
+++ trunk/extensions/VisualEditor/modules/parser/ext.core.ParserFunctions.js
2012-02-22 14:57:50 UTC (rev 112110)
@@ -25,24 +25,56 @@
}
};
+ParserFunctions.prototype._switchLookupFallback = function ( kvs, key ) {
+ if ( ! kvs ) {
+ return null;
+ }
+ var kv;
+ for ( var i = 0, l = kvs.length; i < l; i++ ) {
+ kv = kvs[i];
+ // XXX: tokensToString actually strips too much here! Anything
+ // non-stringish should not match at all.
+ if ( this.manager.env.tokensToString( kv.v ) === key ) {
+ // found. now look for the next entry with a non-empty
key.
+ for ( var j = i; j < l; j++) {
+ kv = kvs[j];
+ // XXX: make sure the key is always one of
these!
+ if ( kv.k !== '' && kv.k !== [] ) {
+ return kv;
+ }
+ }
+ // no fall-through found, return.
+ return null;
+ }
+ }
+ // value not found!
+ return null;
+};
+
// TODO: Implement
//
http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#Grouping_results
-ParserFunctions.prototype['pf_#switch'] = function ( target, argList, argDict
) {
+ParserFunctions.prototype['pf_#switch'] = function ( target, argList, argDict,
unnamedArgs ) {
this.manager.env.dp( 'switch enter: ' + target.trim() +
' looking in ', argDict );
target = target.trim();
- if ( target in argDict ) {
+ if ( argDict[target] !== undefined ) {
this.manager.env.dp( 'switch found: ' + target +
' res=', argDict[target] );
return argDict[target];
- } else if ( '#default' in argDict ) {
- return argDict['#default'];
- } else {
- var lastKV = argList[argList.length - 1];
- if ( lastKV && ! lastKV.v.length ) {
- return lastKV.v;
- } else {
- return [];
+ } else {
+ var fallThrough = this._switchLookupFallback( unnamedArgs,
target );
+ //console.warn( 'fallThrough: ' + JSON.stringify( [
unnamedArgs, fallThrough ] ) );
+ if ( fallThrough !== null ) {
+ return fallThrough.v;
+ } else if ( '#default' in argDict ) {
+ return argDict['#default'];
+ } else {
+ var lastKV = argList[argList.length - 1];
+ if ( lastKV && ! lastKV.v.length ) {
+ return lastKV.v;
+ } else {
+ return [];
+ }
}
}
};
Modified:
trunk/extensions/VisualEditor/modules/parser/ext.core.TemplateHandler.js
===================================================================
--- trunk/extensions/VisualEditor/modules/parser/ext.core.TemplateHandler.js
2012-02-22 13:56:55 UTC (rev 112109)
+++ trunk/extensions/VisualEditor/modules/parser/ext.core.TemplateHandler.js
2012-02-22 14:57:50 UTC (rev 112110)
@@ -168,12 +168,12 @@
var prefix = target.split(':', 1)[0].toLowerCase().trim();
if ( prefix && 'pf_' + prefix in this.parserFunctions ) {
var funcArg = target.substr( prefix.length + 1 );
- this.manager.env.tp( 'func prefix: ' + prefix +
- ' args=' + JSON.stringify(
tplExpandData.expandedArgs, null, 2) +
- ' funcArg=' + funcArg);
+ this.manager.env.tp( 'func prefix: ', prefix,
+ ' args=', tplExpandData.expandedArgs,
+ ' funcArg=', funcArg);
//this.manager.env.dp( 'entering prefix', funcArg, args );
res = this.parserFunctions[ 'pf_' + prefix ]( funcArg,
- tplExpandData.expandedArgs, args );
+ tplExpandData.expandedArgs, args,
tplExpandData.origToken.attribs );
// XXX: support async parser functions!
if ( tplExpandData.overallAsync ) {
Modified:
trunk/extensions/VisualEditor/modules/parser/mediawiki.TokenTransformManager.js
===================================================================
---
trunk/extensions/VisualEditor/modules/parser/mediawiki.TokenTransformManager.js
2012-02-22 13:56:55 UTC (rev 112109)
+++
trunk/extensions/VisualEditor/modules/parser/mediawiki.TokenTransformManager.js
2012-02-22 14:57:50 UTC (rev 112110)
@@ -277,6 +277,8 @@
aborted = true;
break;
}
+ // XXX: factor the conversion to String out into a
generic _setRank
+ // method? Would need to add to the string prototype
for that..
if ( res.token.rank === undefined &&
res.token.constructor === String ) {
res.token = new String ( res.token );
}
Modified:
trunk/extensions/VisualEditor/modules/parser/mediawiki.parser.environment.js
===================================================================
---
trunk/extensions/VisualEditor/modules/parser/mediawiki.parser.environment.js
2012-02-22 13:56:55 UTC (rev 112109)
+++
trunk/extensions/VisualEditor/modules/parser/mediawiki.parser.environment.js
2012-02-22 14:57:50 UTC (rev 112110)
@@ -34,6 +34,22 @@
return null;
};
+MWParserEnvironment.prototype.lookupValue = function ( kvs, key ) {
+ if ( ! kvs ) {
+ return null;
+ }
+ var kv;
+ for ( var i = 0, l = kvs.length; i < l; i++ ) {
+ kv = kvs[i];
+ if ( kv.v === key ) {
+ // found, return it.
+ return kv;
+ }
+ }
+ // nothing found!
+ return null;
+};
+
MWParserEnvironment.prototype.KVtoHash = function ( kvs ) {
if ( ! kvs ) {
console.warn( "Invalid kvs!: " + JSON.stringify( kvs, null, 2 )
);
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs