mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-02-25 15:30:02 +00:00
Extend transclude widget to work with old-style macros and use it for the macrocall shortcut syntax
This commit is contained in:
parent
9be05f6f38
commit
e9630328f1
@ -175,7 +175,36 @@ exports.parseMacroParameter = function(source,pos) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Look for a macro invocation. Returns null if not found, or {type: "macrocall", name:, parameters:, start:, end:}
|
Look for a macro invocation. Returns null if not found, or {type: "transclude", attributes:, start:, end:}
|
||||||
|
*/
|
||||||
|
exports.parseMacroInvocationAsTransclusion = function(source,pos) {
|
||||||
|
var node = $tw.utils.parseMacroInvocation(source,pos);
|
||||||
|
if(node) {
|
||||||
|
var positionalName = 0,
|
||||||
|
transclusion = {
|
||||||
|
type: "transclude",
|
||||||
|
start: node.start,
|
||||||
|
end: node.end
|
||||||
|
};
|
||||||
|
$tw.utils.addAttributeToParseTreeNode(transclusion,"$variable",node.name);
|
||||||
|
$tw.utils.each(node.params,function(param) {
|
||||||
|
var name = param.name;
|
||||||
|
if(name) {
|
||||||
|
if(name.charAt(0) === "$") {
|
||||||
|
name = "$" + name;
|
||||||
|
}
|
||||||
|
$tw.utils.addAttributeToParseTreeNode(transclusion,{name: name,type: "string", value: param.value, start: param.start, end: param.end});
|
||||||
|
} else {
|
||||||
|
$tw.utils.addAttributeToParseTreeNode(transclusion,{name: (positionalName++) + "",type: "string", value: param.value, start: param.start, end: param.end});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return transclusion;
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Look for a macro invocation. Returns null if not found, or {type: "macrocall", name:, params:, start:, end:}
|
||||||
*/
|
*/
|
||||||
exports.parseMacroInvocation = function(source,pos) {
|
exports.parseMacroInvocation = function(source,pos) {
|
||||||
var node = {
|
var node = {
|
||||||
|
@ -27,7 +27,7 @@ exports.findNextMatch = function(startPos) {
|
|||||||
var nextStart = startPos;
|
var nextStart = startPos;
|
||||||
// Try parsing at all possible macrocall openers until we match
|
// Try parsing at all possible macrocall openers until we match
|
||||||
while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) {
|
while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) {
|
||||||
var nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart);
|
var nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);
|
||||||
if(nextCall) {
|
if(nextCall) {
|
||||||
var c = this.parser.source.charAt(nextCall.end);
|
var c = this.parser.source.charAt(nextCall.end);
|
||||||
// Ensure EOL after parsed macro
|
// Ensure EOL after parsed macro
|
||||||
|
@ -27,7 +27,7 @@ exports.findNextMatch = function(startPos) {
|
|||||||
var nextStart = startPos;
|
var nextStart = startPos;
|
||||||
// Try parsing at all possible macrocall openers until we match
|
// Try parsing at all possible macrocall openers until we match
|
||||||
while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) {
|
while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) {
|
||||||
this.nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart);
|
this.nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);
|
||||||
if(this.nextCall) {
|
if(this.nextCall) {
|
||||||
return nextStart;
|
return nextStart;
|
||||||
}
|
}
|
||||||
|
@ -166,16 +166,20 @@ TranscludeWidget.prototype.getTransclusionTarget = function() {
|
|||||||
}
|
}
|
||||||
var parser;
|
var parser;
|
||||||
if(this.transcludeVariable) {
|
if(this.transcludeVariable) {
|
||||||
var variableInfo = this.getVariableInfo(this.transcludeVariable).srcVariable;
|
var variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()}),
|
||||||
if(variableInfo) {
|
srcVariable = variableInfo.srcVariable;
|
||||||
|
if(srcVariable) {
|
||||||
var mode = parseAsInline ? "inlineParser" : "blockParser";
|
var mode = parseAsInline ? "inlineParser" : "blockParser";
|
||||||
if(variableInfo[mode]) {
|
if(srcVariable.isCacheable && srcVariable[mode]) {
|
||||||
parser = variableInfo[mode];
|
parser = srcVariable[mode];
|
||||||
} else {
|
} else {
|
||||||
parser = this.wiki.parseText(this.transcludeType,variableInfo.value || "",{parseAsInline: parseAsInline});
|
parser = this.wiki.parseText(this.transcludeType,variableInfo.text || "",{parseAsInline: parseAsInline});
|
||||||
variableInfo[mode] = parser;
|
if(srcVariable.isCacheable) {
|
||||||
|
srcVariable[mode] = parser;
|
||||||
}
|
}
|
||||||
if(parser && variableInfo.isFunctionDefinition) {
|
}
|
||||||
|
if(parser) {
|
||||||
|
if(srcVariable.isFunctionDefinition) {
|
||||||
parser = {
|
parser = {
|
||||||
tree: [
|
tree: [
|
||||||
{
|
{
|
||||||
@ -184,9 +188,23 @@ TranscludeWidget.prototype.getTransclusionTarget = function() {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
$tw.utils.each(variableInfo.params,function(param) {
|
$tw.utils.each(srcVariable.params,function(param) {
|
||||||
$tw.utils.addAttributeToParseTreeNode(parser.tree[0],param.name,param["default"])
|
$tw.utils.addAttributeToParseTreeNode(parser.tree[0],param.name,param["default"])
|
||||||
});
|
});
|
||||||
|
} else if(srcVariable.isMacroDefinition) {
|
||||||
|
// Wrap the parse tree in a vars widget assigning the parameters to variables named "__paramname__"
|
||||||
|
parser = {
|
||||||
|
tree: [
|
||||||
|
{
|
||||||
|
type: "vars",
|
||||||
|
children: parser.tree
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
$tw.utils.each(variableInfo.params,function(param) {
|
||||||
|
$tw.utils.addAttributeToParseTreeNode(parser.tree[0],"__" + param.name + "__",param.value)
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -218,6 +236,39 @@ TranscludeWidget.prototype.getTransclusionTarget = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fetch all the string parameters as an ordered array of {name:, value:} where the name is optional
|
||||||
|
*/
|
||||||
|
TranscludeWidget.prototype.getOrderedTransclusionParameters = function() {
|
||||||
|
var result = [];
|
||||||
|
// Collect the parameters
|
||||||
|
for(var name in this.stringParametersByName) {
|
||||||
|
var value = this.stringParametersByName[name];
|
||||||
|
result.push({name: name, value: value});
|
||||||
|
}
|
||||||
|
// Sort numerical parameter names first
|
||||||
|
result.sort(function(a,b) {
|
||||||
|
var aIsNumeric = !isNaN(a.name),
|
||||||
|
bIsNumeric = !isNaN(b.name);
|
||||||
|
if(aIsNumeric && bIsNumeric) {
|
||||||
|
return a.name - b.name;
|
||||||
|
} else if(aIsNumeric) {
|
||||||
|
return -1;
|
||||||
|
} else if(bIsNumeric) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return a.name === b.name ? 0 : (a.name < b.name ? -1 : 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Remove names from numerical parameters
|
||||||
|
$tw.utils.each(result,function(param,index) {
|
||||||
|
if(!isNaN(param.name)) {
|
||||||
|
delete param.name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Fetch the value of a parameter
|
Fetch the value of a parameter
|
||||||
*/
|
*/
|
||||||
|
@ -122,14 +122,14 @@ Widget.prototype.getVariableInfo = function(name,options) {
|
|||||||
if(parentWidget && name in parentWidget.variables) {
|
if(parentWidget && name in parentWidget.variables) {
|
||||||
var variable = parentWidget.variables[name],
|
var variable = parentWidget.variables[name],
|
||||||
originalValue = variable.value,
|
originalValue = variable.value,
|
||||||
value = originalValue,
|
value = originalValue;
|
||||||
params = this.resolveVariableParameters(variable.params,actualParams);
|
// Only substitute parameter and variable references if this variable was defined with the \define pragma
|
||||||
|
if(variable.isMacroDefinition) {
|
||||||
|
var params = this.resolveVariableParameters(variable.params,actualParams);
|
||||||
// Substitute any parameters specified in the definition
|
// Substitute any parameters specified in the definition
|
||||||
$tw.utils.each(params,function(param) {
|
$tw.utils.each(params,function(param) {
|
||||||
value = $tw.utils.replaceString(value,new RegExp("\\$" + $tw.utils.escapeRegExp(param.name) + "\\$","mg"),param.value);
|
value = $tw.utils.replaceString(value,new RegExp("\\$" + $tw.utils.escapeRegExp(param.name) + "\\$","mg"),param.value);
|
||||||
});
|
});
|
||||||
// Only substitute variable references if this variable was defined with the \define pragma
|
|
||||||
if(variable.isMacroDefinition) {
|
|
||||||
value = this.substituteVariableReferences(value,options);
|
value = this.substituteVariableReferences(value,options);
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
title: Transclude/Macro/Simple
|
||||||
|
description: Transcluding a macro
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
\whitespace trim
|
||||||
|
\define mamacro(one:"red",two:"green")
|
||||||
|
It is $one$ and $two$ or <<__one__>> and <<__two__>>.
|
||||||
|
\end
|
||||||
|
|
||||||
|
<$macrocall $name="mamacro"/>
|
||||||
|
|
||||||
|
<$transclude $variable="mamacro"/>
|
||||||
|
|
||||||
|
<$transclude $variable="mamacro" one="orange"/>
|
||||||
|
|
||||||
|
<$transclude $variable="mamacro" 0="pink"/>
|
||||||
|
|
||||||
|
<$transclude $variable="mamacro" one="purple" 1="pink"/>
|
||||||
|
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>It is red and green or red and green.</p><p>It is red and green or red and green.</p><p>It is orange and green or orange and green.</p><p>It is pink and green or pink and green.</p><p>It is purple and pink or purple and pink.</p>
|
@ -175,38 +175,38 @@ describe("WikiText parser tests", function() {
|
|||||||
it("should parse inline macro calls", function() {
|
it("should parse inline macro calls", function() {
|
||||||
expect(parse("<<john>><<paul>><<george>><<ringo>>")).toEqual(
|
expect(parse("<<john>><<paul>><<george>><<ringo>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 35, children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'macrocall', start: 8, params: [ ], name: 'paul', end: 16 }, { type: 'macrocall', start: 16, params: [ ], name: 'george', end: 26 }, { type: 'macrocall', start: 26, params: [ ], name: 'ringo', end: 35 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"transclude","start":0,"end":8,"attributes":{"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"}]},{"type":"transclude","start":8,"end":16,"attributes":{"$variable":{"name":"$variable","type":"string","value":"paul"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"paul"}]},{"type":"transclude","start":16,"end":26,"attributes":{"$variable":{"name":"$variable","type":"string","value":"george"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"george"}]},{"type":"transclude","start":26,"end":35,"attributes":{"$variable":{"name":"$variable","type":"string","value":"ringo"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"ringo"}]}],"start":0,"end":35}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("text <<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual(
|
expect(parse("text <<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual(
|
||||||
|
|
||||||
[{ type: 'element', tag: 'p', start: 0, end: 92, children: [ { type: 'text', text: 'text ', start: 0, end: 5 }, { type: 'macrocall', name: 'john', start: 5, params: [ { type: 'macro-parameter', start: 11, value: 'val1', name: 'one', end: 20 }, { type: 'macro-parameter', start: 20, value: 'val "2"', name: 'two', end: 35 }, { type: 'macro-parameter', start: 35, value: 'val \'3\'', name: 'three', end: 52 }, { type: 'macro-parameter', start: 52, value: 'val 4"5\'', name: 'four', end: 73 }, { type: 'macro-parameter', start: 73, value: 'val 5', name: 'five', end: 89 } ], end: 92 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"text","text":"text ","start":0,"end":5},{"type":"transclude","start":5,"end":92,"attributes":{"$variable":{"name":"$variable","type":"string","value":"john"},"one":{"name":"one","type":"string","value":"val1","start":11,"end":20},"two":{"name":"two","type":"string","value":"val \"2\"","start":20,"end":35},"three":{"name":"three","type":"string","value":"val '3'","start":35,"end":52},"four":{"name":"four","type":"string","value":"val 4\"5'","start":52,"end":73},"five":{"name":"five","type":"string","value":"val 5","start":73,"end":89}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"},{"name":"one","type":"string","value":"val1","start":11,"end":20},{"name":"two","type":"string","value":"val \"2\"","start":20,"end":35},{"name":"three","type":"string","value":"val '3'","start":35,"end":52},{"name":"four","type":"string","value":"val 4\"5'","start":52,"end":73},{"name":"five","type":"string","value":"val 5","start":73,"end":89}]}],"start":0,"end":92}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("ignored << carrots <<john>>")).toEqual(
|
expect(parse("ignored << carrots <<john>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 27, children: [ { type: 'text', text: 'ignored << carrots ', start: 0, end: 19 }, { type: 'macrocall', name: 'john', start: 19, params: [ ], end: 27 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"text","text":"ignored << carrots ","start":0,"end":19},{"type":"transclude","start":19,"end":27,"attributes":{"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"}]}],"start":0,"end":27}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("text <<<john>>")).toEqual(
|
expect(parse("text <<<john>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 14, children: [ { type: 'text', text: 'text ', start: 0, end: 5 }, { type: 'macrocall', name: '<john', start: 5, params: [ ], end: 14 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"text","text":"text ","start":0,"end":5},{"type":"transclude","start":5,"end":14,"attributes":{"$variable":{"name":"$variable","type":"string","value":"<john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"<john"}]}],"start":0,"end":14}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("before\n<<john>>")).toEqual(
|
expect(parse("before\n<<john>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 15, children: [ { type: 'text', text: 'before\n', start: 0, end: 7 }, { type: 'macrocall', start: 7, params: [ ], name: 'john', end: 15 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"text","text":"before\n","start":0,"end":7},{"type":"transclude","start":7,"end":15,"attributes":{"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"}]}],"start":0,"end":15}]
|
||||||
|
|
||||||
);
|
);
|
||||||
// A single space will cause it to be inline
|
// A single space will cause it to be inline
|
||||||
expect(parse("<<john>> ")).toEqual(
|
expect(parse("<<john>> ")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 9, children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'text', text: ' ', start: 8, end: 9 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"transclude","start":0,"end":8,"attributes":{"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"}]},{"type":"text","text":" ","start":8,"end":9}],"start":0,"end":9}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("text <<outie one:'my <<innie>>' >>")).toEqual(
|
expect(parse("text <<outie one:'my <<innie>>' >>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 34, children: [ { type: 'text', text: 'text ', start: 0, end: 5 }, { type: 'macrocall', start: 5, params: [ { type: 'macro-parameter', start: 12, value: 'my <<innie>>', name: 'one', end: 31 } ], name: 'outie', end: 34 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"text","text":"text ","start":0,"end":5},{"type":"transclude","start":5,"end":34,"attributes":{"$variable":{"name":"$variable","type":"string","value":"outie"},"one":{"name":"one","type":"string","value":"my <<innie>>","start":12,"end":31}},"orderedAttributes":[{"name":"$variable","type":"string","value":"outie"},{"name":"one","type":"string","value":"my <<innie>>","start":12,"end":31}]}],"start":0,"end":34}]
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -215,37 +215,37 @@ describe("WikiText parser tests", function() {
|
|||||||
it("should parse block macro calls", function() {
|
it("should parse block macro calls", function() {
|
||||||
expect(parse("<<john>>\n<<paul>>\r\n<<george>>\n<<ringo>>")).toEqual(
|
expect(parse("<<john>>\n<<paul>>\r\n<<george>>\n<<ringo>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, name: 'john', params: [ ], end: 8, isBlock: true }, { type: 'macrocall', start: 9, name: 'paul', params: [ ], end: 17, isBlock: true }, { type: 'macrocall', start: 19, name: 'george', params: [ ], end: 29, isBlock: true }, { type: 'macrocall', start: 30, name: 'ringo', params: [ ], end: 39, isBlock: true } ]
|
[ { type: 'transclude', start: 0, attributes: { $variable: { name: "$variable", type: "string", value: "john" }}, orderedAttributes: [ { name: "$variable", type: "string", value: "john" }], end: 8, isBlock: true }, { type: 'transclude', start: 9, attributes: { $variable: { name: "$variable", type: "string", value: "paul" }}, orderedAttributes: [ { name: "$variable", type: "string", value: "paul" }], end: 17, isBlock: true }, { type: 'transclude', start: 19, attributes: { $variable: { name: "$variable", type: "string", value: "george" }}, orderedAttributes: [ { name: "$variable", type: "string", value: "george" }], end: 29, isBlock: true }, { type: 'transclude', start: 30, attributes: { $variable: { name: "$variable", type: "string", value: "ringo" }}, orderedAttributes: [ { name: "$variable", type: "string", value: "ringo" }], end: 39, isBlock: true } ]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual(
|
expect(parse("<<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, name: 'john', params: [ { type: 'macro-parameter', start: 6, value: 'val1', name: 'one', end: 15 }, { type: 'macro-parameter', start: 15, value: 'val "2"', name: 'two', end: 30 }, { type: 'macro-parameter', start: 30, value: 'val \'3\'', name: 'three', end: 47 }, { type: 'macro-parameter', start: 47, value: 'val 4"5\'', name: 'four', end: 68 }, { type: 'macro-parameter', start: 68, value: 'val 5', name: 'five', end: 84 }], end: 87, isBlock: true } ]
|
[{"type":"transclude","start":0,"end":87,"attributes":{"$variable":{"name":"$variable","type":"string","value":"john"},"one":{"name":"one","type":"string","value":"val1","start":6,"end":15},"two":{"name":"two","type":"string","value":"val \"2\"","start":15,"end":30},"three":{"name":"three","type":"string","value":"val '3'","start":30,"end":47},"four":{"name":"four","type":"string","value":"val 4\"5'","start":47,"end":68},"five":{"name":"five","type":"string","value":"val 5","start":68,"end":84}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"},{"name":"one","type":"string","value":"val1","start":6,"end":15},{"name":"two","type":"string","value":"val \"2\"","start":15,"end":30},{"name":"three","type":"string","value":"val '3'","start":30,"end":47},{"name":"four","type":"string","value":"val 4\"5'","start":47,"end":68},{"name":"five","type":"string","value":"val 5","start":68,"end":84}],"isBlock":true}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<< carrots\n\n<<john>>")).toEqual(
|
expect(parse("<< carrots\n\n<<john>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start : 0, end : 10, children: [ { type: 'text', text: '<< carrots', start : 0, end : 10 } ] }, { type: 'macrocall', start: 12, params: [ ], name: 'john', end: 20, isBlock: true } ]
|
[ { type: 'element', tag: 'p', start : 0, end : 10, children: [ { type: 'text', text: '<< carrots', start : 0, end : 10 } ] }, { type: 'transclude', start: 12, attributes: { $variable: {name: "$variable", type:"string", value: "john"} }, orderedAttributes: [ {name: "$variable", type:"string", value: "john"} ], end: 20, isBlock: true } ]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("before\n\n<<john>>")).toEqual(
|
expect(parse("before\n\n<<john>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start : 0, end : 6, children: [ { type: 'text', text: 'before', start : 0, end : 6 } ] }, { type: 'macrocall', start: 8, name: 'john', params: [ ], end: 16, isBlock: true } ]
|
[ { type: 'element', tag: 'p', start : 0, end : 6, children: [ { type: 'text', text: 'before', start : 0, end : 6 } ] }, { type: 'transclude', start: 8, attributes: { $variable: {name: "$variable", type:"string", value: "john"} }, orderedAttributes: [ {name: "$variable", type:"string", value: "john"} ], end: 16, isBlock: true } ]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<<john>>\nafter")).toEqual(
|
expect(parse("<<john>>\nafter")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, name: 'john', params: [ ], end: 8, isBlock: true }, { type: 'element', tag: 'p', start: 9, end: 14, children: [ { type: 'text', text: 'after', start: 9, end: 14 } ] } ]
|
[ { type: 'transclude', start: 0, attributes: { $variable: {name: "$variable", type:"string", value: "john"} }, orderedAttributes: [ {name: "$variable", type:"string", value: "john"} ], end: 8, isBlock: true }, { type: 'element', tag: 'p', start: 9, end: 14, children: [ { type: 'text', text: 'after', start: 9, end: 14 } ] } ]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<<multiline arg:\"\"\"\n\nwikitext\n\"\"\" >>")).toEqual(
|
expect(parse("<<multiline arg:\"\"\"\n\nwikitext\n\"\"\" >>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 11, value: '\n\nwikitext\n', name: 'arg', end: 33 } ], name: 'multiline', end: 36, isBlock: true }]
|
[{"type":"transclude","start":0,"end":36,"attributes":{"$variable":{"name":"$variable","type":"string","value":"multiline"},"arg":{"name":"arg","type":"string","value":"\n\nwikitext\n","start":11,"end":33}},"orderedAttributes":[{"name":"$variable","type":"string","value":"multiline"},{"name":"arg","type":"string","value":"\n\nwikitext\n","start":11,"end":33}],"isBlock":true}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<<outie one:'my <<innie>>' >>")).toEqual(
|
expect(parse("<<outie one:'my <<innie>>' >>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 7, value: 'my <<innie>>', name: 'one', end: 26 } ], name: 'outie', end: 29, isBlock: true } ]
|
[ { type: 'transclude', start: 0, attributes: { $variable: {name: "$variable", type:"string", value: "outie"}, one: {name: "one", type:"string", value: "my <<innie>>", start: 7, end: 26} }, orderedAttributes: [ {name: "$variable", type:"string", value: "outie"}, {name: "one", type:"string", value: "my <<innie>>", start: 7, end: 26} ], end: 29, isBlock: true } ]
|
||||||
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -253,23 +253,23 @@ describe("WikiText parser tests", function() {
|
|||||||
it("should parse tricky macrocall parameters", function() {
|
it("should parse tricky macrocall parameters", function() {
|
||||||
expect(parse("<<john pa>am>>")).toEqual(
|
expect(parse("<<john pa>am>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'pa>am', end: 12 } ], name: 'john', end: 14, isBlock: true } ]
|
[{"type":"transclude","start":0,"end":14,"attributes":{"0":{"name":"0","type":"string","value":"pa>am","start":6,"end":12},"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"},{"name":"0","type":"string","value":"pa>am","start":6,"end":12}],"isBlock":true}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<<john param> >>")).toEqual(
|
expect(parse("<<john param> >>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'param>', end: 13 } ], name: 'john', end: 16, isBlock: true } ]
|
[{"type":"transclude","start":0,"end":16,"attributes":{"0":{"name":"0","type":"string","value":"param>","start":6,"end":13},"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"},{"name":"0","type":"string","value":"param>","start":6,"end":13}],"isBlock":true}]
|
||||||
|
|
||||||
);
|
);
|
||||||
expect(parse("<<john param>>>")).toEqual(
|
expect(parse("<<john param>>>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'element', tag: 'p', start: 0, end: 15, children: [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'param', end: 12 } ], name: 'john', end: 14 }, { type: 'text', text: '>', start: 14, end: 15 } ] } ]
|
[{"type":"element","tag":"p","children":[{"type":"transclude","start":0,"end":14,"attributes":{"0":{"name":"0","type":"string","value":"param","start":6,"end":12},"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"},{"name":"0","type":"string","value":"param","start":6,"end":12}]},{"type":"text","text":">","start":14,"end":15}],"start":0,"end":15}]
|
||||||
|
|
||||||
);
|
);
|
||||||
// equals signs should be allowed
|
// equals signs should be allowed
|
||||||
expect(parse("<<john var>=4 >>")).toEqual(
|
expect(parse("<<john var>=4 >>")).toEqual(
|
||||||
|
|
||||||
[ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'var>=4', end: 13 } ], name: 'john', end: 16, isBlock: true } ]
|
[{"type":"transclude","start":0,"end":16,"attributes":{"0":{"name":"0","type":"string","value":"var>=4","start":6,"end":13},"$variable":{"name":"$variable","type":"string","value":"john"}},"orderedAttributes":[{"name":"$variable","type":"string","value":"john"},{"name":"0","type":"string","value":"var>=4","start":6,"end":13}],"isBlock":true}]
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user