diff --git a/core/modules/parsers/wikiparser/rules/fnprocdef.js b/core/modules/parsers/wikiparser/rules/fnprocdef.js index 037172c57..34ac6d72d 100644 --- a/core/modules/parsers/wikiparser/rules/fnprocdef.js +++ b/core/modules/parsers/wikiparser/rules/fnprocdef.js @@ -3,7 +3,7 @@ title: $:/core/modules/parsers/wikiparser/rules/fnprocdef.js type: application/javascript module-type: wikirule -Wiki pragma rule for function and procedure definitions +Wiki pragma rule for function, procedure and widget definitions ``` \function name(param:defaultvalue,param2:defaultvalue) @@ -13,6 +13,10 @@ definition text \procedure name(param:defaultvalue,param2:defaultvalue) definition text \end + +\widget $mywidget(param:defaultvalue,param2:defaultvalue) +definition text +\end ``` \*/ @@ -31,7 +35,7 @@ Instantiate parse rule exports.init = function(parser) { this.parser = parser; // Regexp to match - this.matchRegExp = /^\\(function|procedure)\s+([^(\s]+)(\(\s*([^)]*)\))?(\s*\r?\n)?/mg; + this.matchRegExp = /^\\(function|procedure|widget)\s+([^(\s]+)(\(\s*([^)]*)\))?(\s*\r?\n)?/mg; }; /* @@ -94,6 +98,8 @@ exports.parse = function() { parseTreeNodes[0].isFunctionDefinition = true; } else if(this.match[1] === "procedure") { parseTreeNodes[0].isProcedureDefinition = true; + } else if(this.match[1] === "widget") { + parseTreeNodes[0].isWidgetDefinition = true; } return parseTreeNodes; }; diff --git a/core/modules/widgets/importvariables.js b/core/modules/widgets/importvariables.js index edea63311..7cbe387b0 100644 --- a/core/modules/widgets/importvariables.js +++ b/core/modules/widgets/importvariables.js @@ -57,7 +57,8 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) { params: parseTreeNode.params, isMacroDefinition: parseTreeNode.isMacroDefinition, isFunctionDefinition: parseTreeNode.isFunctionDefinition, - isProcedureDefinition: parseTreeNode.isProcedureDefinition + isProcedureDefinition: parseTreeNode.isProcedureDefinition, + isWidgetDefinition: parseTreeNode.isWidgetDefinition }; if (parseTreeNode.isMacroDefinition || parseTreeNode.isProcedureDefinition) { // Macro definitions can be folded into diff --git a/core/modules/widgets/setvariable.js b/core/modules/widgets/setvariable.js index 41a5d95c8..f9e7b5a85 100755 --- a/core/modules/widgets/setvariable.js +++ b/core/modules/widgets/setvariable.js @@ -54,6 +54,8 @@ SetWidget.prototype.execute = function() { this.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isFunctionDefinition: true}); } else if(this.parseTreeNode.isProcedureDefinition) { this.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isProcedureDefinition: true}); + } else if(this.parseTreeNode.isWidgetDefinition) { + this.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isWidgetDefinition: true}); } else { this.setVariable(this.setName,this.getValue()); } diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 940ce814c..7fcc39fac 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -185,8 +185,8 @@ TranscludeWidget.prototype.getTransclusionTarget = function() { } } if(parser) { - // Add parameters widget for procedures - if(srcVariable.isProcedureDefinition) { + // Add parameters widget for procedures and custom widgets + if(srcVariable.isProcedureDefinition || srcVariable.isWidgetDefinition) { parser = { tree: [ { diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index e0ee547c3..cf32e71c4 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -94,6 +94,7 @@ isMacroDefinition: true if the variable is set via a \define macro pragma (and h options includes: isProcedureDefinition: true if the variable is set via a \procedure pragma (and hence should not have variable substitution performed) isFunctionDefinition: true if the variable is set via a \function pragma (and hence should not have variable substitution performed) + isWidgetDefinition: true if the variable is set via a \widget pragma (and hence should not have variable substitution performed) */ Widget.prototype.setVariable = function(name,value,params,isMacroDefinition,options) { options = options || {}; @@ -102,7 +103,8 @@ Widget.prototype.setVariable = function(name,value,params,isMacroDefinition,opti params: params, isMacroDefinition: !!isMacroDefinition, isFunctionDefinition: !!options.isFunctionDefinition, - isProcedureDefinition: !!options.isProcedureDefinition + isProcedureDefinition: !!options.isProcedureDefinition, + isWidgetDefinition: !!options.isWidgetDefinition }; }; @@ -434,8 +436,9 @@ Widget.prototype.makeChildWidget = function(parseTreeNode,options) { var self = this; options = options || {}; // Check whether this node type is defined by a custom macro definition - var variableDefinitionName = "<$" + parseTreeNode.type + ">"; - if(!parseTreeNode.isNotRemappable && this.variables[variableDefinitionName] && this.variables[variableDefinitionName].value) { + var variableDefinitionName = "$" + parseTreeNode.type, + variableInfo = this.variables[variableDefinitionName]; + if(!parseTreeNode.isNotRemappable && variableInfo && variableInfo.value && variableInfo.isWidgetDefinition) { var newParseTreeNode = { type: "transclude", children: [ diff --git a/editions/test/tiddlers/tests/data/genesis-widget/RedefineLet.tid b/editions/test/tiddlers/tests/data/genesis-widget/RedefineLet.tid index 5f2a70f58..395411dd1 100644 --- a/editions/test/tiddlers/tests/data/genesis-widget/RedefineLet.tid +++ b/editions/test/tiddlers/tests/data/genesis-widget/RedefineLet.tid @@ -6,7 +6,7 @@ tags: [[$:/tags/wiki-test-spec]] title: Output \whitespace trim -\procedure <$let> +\widget $let \whitespace trim <$setmultiplevariables $names="[<@params>jsonindexes[]]" $values="[<@params>jsonindexes[]] :map[<@params>jsongetaddprefix[--]addsuffix[--]]"> <$slot $name="ts-body"/> diff --git a/editions/test/tiddlers/tests/data/transclude/CustomWidget-ActionWidget.tid b/editions/test/tiddlers/tests/data/transclude/CustomWidget-ActionWidget.tid index 62793dbda..3cddb63cf 100644 --- a/editions/test/tiddlers/tests/data/transclude/CustomWidget-ActionWidget.tid +++ b/editions/test/tiddlers/tests/data/transclude/CustomWidget-ActionWidget.tid @@ -13,7 +13,7 @@ title: Actions \whitespace trim -\procedure <$action-mywidget>(one:'Jaguar') +\widget $action-mywidget(one:'Jaguar') \whitespace trim <$action-setfield $tiddler="Result" $field="text" $value=<>/> \end diff --git a/editions/test/tiddlers/tests/data/transclude/CustomWidget-Override-Codeblock.tid b/editions/test/tiddlers/tests/data/transclude/CustomWidget-Override-Codeblock.tid index 0741e378b..842a92b70 100644 --- a/editions/test/tiddlers/tests/data/transclude/CustomWidget-Override-Codeblock.tid +++ b/editions/test/tiddlers/tests/data/transclude/CustomWidget-Override-Codeblock.tid @@ -16,7 +16,7 @@ title: Output title: Definition \whitespace trim -\procedure <$codeblock>(code) +\widget $codeblock(code) <$genesis $type="codeblock" $remappable="no" code={{{ [addprefix[£]addsuffix[@]] }}}/> \end + diff --git a/editions/test/tiddlers/tests/data/transclude/CustomWidget-OverrideTransclude.tid b/editions/test/tiddlers/tests/data/transclude/CustomWidget-OverrideTransclude.tid index 15a289da8..7b4a8d8aa 100644 --- a/editions/test/tiddlers/tests/data/transclude/CustomWidget-OverrideTransclude.tid +++ b/editions/test/tiddlers/tests/data/transclude/CustomWidget-OverrideTransclude.tid @@ -17,7 +17,7 @@ title: TiddlerOne \whitespace trim -\procedure <$transclude>(one:'Jaguar') +\widget $transclude(one:'Jaguar') \whitespace trim <$text text=<>/> <$slot $name="body"> diff --git a/editions/test/tiddlers/tests/data/transclude/CustomWidget-Simple.tid b/editions/test/tiddlers/tests/data/transclude/CustomWidget-Simple.tid index 3dadabd03..86d181042 100644 --- a/editions/test/tiddlers/tests/data/transclude/CustomWidget-Simple.tid +++ b/editions/test/tiddlers/tests/data/transclude/CustomWidget-Simple.tid @@ -13,7 +13,7 @@ title: TiddlerOne \whitespace trim -\procedure <$mywidget>(one:'Jaguar') +\widget $mywidget(one:'Jaguar') \whitespace trim <$text text=<>/> <$slot $name="ts-body"> diff --git a/editions/test/tiddlers/tests/data/transclude/CustomWidget-TextWidgetOverride.tid b/editions/test/tiddlers/tests/data/transclude/CustomWidget-TextWidgetOverride.tid index 53ba3d7e8..0a65533f6 100644 --- a/editions/test/tiddlers/tests/data/transclude/CustomWidget-TextWidgetOverride.tid +++ b/editions/test/tiddlers/tests/data/transclude/CustomWidget-TextWidgetOverride.tid @@ -13,10 +13,10 @@ title: TiddlerOne \whitespace trim -\procedure <$text>(text:'Jaguar') +\widget $text(text:'Jaguar') \whitespace trim <$genesis $type="text" $remappable="no" text=<>/> -<$set name="<$text>" value=""> +<$set name="$text" value=""> <$slot $name="ts-body"> Whale diff --git a/editions/test/tiddlers/tests/data/transclude/CustomWidget-VariableAttribute.tid b/editions/test/tiddlers/tests/data/transclude/CustomWidget-VariableAttribute.tid index 0b5ba9e81..a7e0e62e3 100644 --- a/editions/test/tiddlers/tests/data/transclude/CustomWidget-VariableAttribute.tid +++ b/editions/test/tiddlers/tests/data/transclude/CustomWidget-VariableAttribute.tid @@ -13,7 +13,7 @@ title: TiddlerOne \whitespace trim -\procedure <$mywidget>($variable:'Jaguar') +\widget $mywidget($variable:'Jaguar') \whitespace trim <$text text=<<$variable>>/> <$slot $name="ts-body">