From 46f019ea8308e405456cd05b1ae4f51d7a69ffd6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Wed, 22 Feb 2012 23:27:38 +0000 Subject: [PATCH] Refactored where we do macro parameter string parsing --- js/Renderer.js | 55 +++++++++++++++++++++++++++++++++++++++------ js/WikiTextRules.js | 44 +----------------------------------- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/js/Renderer.js b/js/Renderer.js index 4850b50a7..115fe62ff 100644 --- a/js/Renderer.js +++ b/js/Renderer.js @@ -10,6 +10,7 @@ Renderer objects "use strict"; var utils = require("./Utils.js"), + ArgParser = require("./ArgParser.js").ArgParser, Dependencies = require("./Dependencies.js").Dependencies; var Node = function(children) { @@ -45,25 +46,25 @@ var MacroNode = function(macroName,srcParams,children,store,dependencies) { // Save the details this.macroName = macroName; this.macro = store.macros[macroName]; - this.srcParams = srcParams; this.children = children; this.store = store; + this.srcParams = typeof srcParams === "string" ? this.parseMacroParamString(srcParams) : srcParams; // Evaluate the dependencies if(dependencies) { this.dependencies = dependencies; } else { this.dependencies = new Dependencies(); - if(srcParams && this.macro) { + if(this.srcParams && this.macro) { if(this.macro.dependentAll) { this.dependencies.dependentAll = true; } for(var m in this.macro.params) { var paramInfo = this.macro.params[m]; - if(m in srcParams && paramInfo.type === "tiddler") { - if(typeof srcParams[m] === "function") { + if(m in this.srcParams && paramInfo.type === "tiddler") { + if(typeof this.srcParams[m] === "function") { this.dependencies.dependentAll = true; } else { - this.dependencies.addDependency(srcParams[m],paramInfo.skinny); + this.dependencies.addDependency(this.srcParams[m],paramInfo.skinny); } } } @@ -77,6 +78,46 @@ var MacroNode = function(macroName,srcParams,children,store,dependencies) { MacroNode.prototype = new Node(); MacroNode.prototype.constructor = MacroNode; +MacroNode.prototype.parseMacroParamString = function(paramString) { + var params = {}, + args = new ArgParser(paramString,{defaultName: "anon", cascadeDefaults: this.macro.cascadeDefaults}), + self = this, + insertParam = function(name,arg) { + if(arg.evaluated) { + params[name] = self.store.jsParser.createTree([ + { + type: "Function", + name: null, + params: ["tiddler","store","utils"], // These are the parameters passed to the parameter expressions + elements: [ { + type: "ReturnStatement", + value: self.store.jsParser.parse(arg.string).tree.elements[0] + } ] + } + ]).compile("application/javascript").render; + } else { + params[name] = arg.string; + } + }; + for(var m in this.macro.params) { + var param = this.macro.params[m], + arg; + if("byPos" in param && args.byPos[param.byPos] && (args.byPos[param.byPos].n === "anon" || args.byPos[param.byPos].n === m)) { + arg = args.byPos[param.byPos].v; + insertParam(m,arg); + } else { + arg = args.getValueByName(m); + if(!arg && param.byName === "default") { + arg = args.getValueByName("anon"); + } + if(arg) { + insertParam(m,arg); + } + } + } + return params; +}; + MacroNode.prototype.clone = function() { return new MacroNode(this.macroName,this.srcParams,this.cloneChildren(),this.store,this.dependencies); }; @@ -166,8 +207,8 @@ MacroNode.prototype.refreshInDom = function(changes) { if(this.dependencies.hasChanged(changes)) { // Ask the macro to rerender itself if it can var tiddler = this.store.getTiddler(this.tiddlerTitle); - if(this.macro.refresh) { - this.macro.refresh.call(this,changes); + if(this.macro.refreshInDom) { + this.macro.refreshInDom.call(this,changes); } else { // Manually reexecute and rerender this macro while(this.domNode.hasChildNodes()) { diff --git a/js/WikiTextRules.js b/js/WikiTextRules.js index fce9b5af6..7f511a90e 100755 --- a/js/WikiTextRules.js +++ b/js/WikiTextRules.js @@ -111,48 +111,6 @@ var insertMacroCall = function(w,output,name,params,children) { } }; -var parseMacroParams = function(w,name,paramString) { - var macro = w.store.macros[name], - params = {}; - if(macro) { - var args = new ArgParser(paramString,{defaultName: "anon", cascadeDefaults: macro.cascadeDefaults}), - insertParam = function(name,arg) { - if(arg.evaluated) { - params[name] = w.store.jsParser.createTree([ - { - type: "Function", - name: null, - params: ["tiddler","store","utils"], // These are the parameters passed to the parameter expressions - elements: [ { - type: "ReturnStatement", - value: w.store.jsParser.parse(arg.string).tree.elements[0] - } ] - } - ]).compile("application/javascript").render; - } else { - params[name] = arg.string; - } - }; - for(var m in macro.params) { - var param = macro.params[m], - arg; - if("byPos" in param && args.byPos[param.byPos] && (args.byPos[param.byPos].n === "anon" || args.byPos[param.byPos].n === m)) { - arg = args.byPos[param.byPos].v; - insertParam(m,arg); - } else { - arg = args.getValueByName(m); - if(!arg && param.byName === "default") { - arg = args.getValueByName("anon"); - } - if(arg) { - insertParam(m,arg); - } - } - } - } - return params; -}; - var rules = [ { name: "table", @@ -460,7 +418,7 @@ var rules = [ if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) { w.nextMatch = this.lookaheadRegExp.lastIndex; var name = lookaheadMatch[1]; - insertMacroCall(w,w.output,name,parseMacroParams(w,name,lookaheadMatch[2])); + insertMacroCall(w,w.output,name,lookaheadMatch[2]); } } },