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

Reply via email to