diff --git a/core/modules/widgets/macrocall.js b/core/modules/widgets/macrocall.js index 2f527cc96..bc013cbf4 100644 --- a/core/modules/widgets/macrocall.js +++ b/core/modules/widgets/macrocall.js @@ -55,9 +55,18 @@ MacroCallWidget.prototype.execute = function() { // Are we rendering to HTML? if(this.renderOutput === "text/html") { // If so we'll return the parsed macro - var parser = this.wiki.parseText(this.parseType,text, - {parseAsInline: !this.parseTreeNode.isBlock}); - parseTreeNodes = parser ? parser.tree : []; + // Check if we've already cached parsing this macro + var parser; + if(variableInfo.srcVariable && variableInfo.srcVariable.parser) { + parser = variableInfo.srcVariable.parser; + } else { + parser = this.wiki.parseText(this.parseType,text, + {parseAsInline: !this.parseTreeNode.isBlock}); + if(variableInfo.isCacheable && variableInfo.srcVariable) { + // variableInfo.srcVariable.parser = parser; + } + } + var parseTreeNodes = parser ? parser.tree : []; // Wrap the parse tree in a vars widget assigning the parameters to variables named "__paramname__" var attributes = {}; $tw.utils.each(variableInfo.params,function(param) { diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 22112a516..1925bfe00 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -113,7 +113,8 @@ Widget.prototype.getVariableInfo = function(name,options) { // Check for the variable defined in the parent widget (or an ancestor in the prototype chain) if(parentWidget && name in parentWidget.variables) { var variable = parentWidget.variables[name], - value = variable.value, + originalValue = variable.value, + value = originalValue, params = this.resolveVariableParameters(variable.params,actualParams); // Substitute any parameters specified in the definition $tw.utils.each(params,function(param) { @@ -125,7 +126,9 @@ Widget.prototype.getVariableInfo = function(name,options) { } return { text: value, - params: params + params: params, + srcVariable: variable, + isCacheable: originalValue === value }; } // If the variable doesn't exist in the parent widget then look for a macro module