mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-11-01 08:03:00 +00:00
Added protection against wikitext recursion
Now attempts to view a tiddler recursively fail gracefully
This commit is contained in:
@@ -55,7 +55,7 @@ exports.macro = {
|
||||
"class": classes
|
||||
},macroNode.cloneChildren())];
|
||||
for(var t=0; t<content.length; t++) {
|
||||
content[t].execute(tiddler);
|
||||
content[t].execute(macroNode.parents,tiddler);
|
||||
}
|
||||
return content;
|
||||
}
|
||||
|
||||
@@ -46,8 +46,11 @@ exports.macro = {
|
||||
templateText = "<<view title link>>",
|
||||
template = macroNode.params.template ? store.getTiddler(macroNode.params.template) : null,
|
||||
content = [],
|
||||
t;
|
||||
t,
|
||||
parents = macroNode.parents;
|
||||
if(template) {
|
||||
parents = parents.slice(0);
|
||||
parents.push(template.title);
|
||||
templateType = template.type;
|
||||
templateText = template.text;
|
||||
}
|
||||
@@ -64,7 +67,7 @@ exports.macro = {
|
||||
cloneTemplate.push(templateTree[c].clone());
|
||||
}
|
||||
var listNode = Renderer.ElementNode("li",null,cloneTemplate);
|
||||
listNode.execute(store.getTiddler(tiddlers[t]));
|
||||
listNode.execute(parents,store.getTiddler(tiddlers[t]));
|
||||
content.push(listNode);
|
||||
}
|
||||
return [Renderer.ElementNode("ul",null,content)];
|
||||
|
||||
@@ -54,7 +54,7 @@ exports.macro = {
|
||||
dependencies.addDependency(macroNode.params.template,true);
|
||||
}
|
||||
var m = Renderer.MacroNode("tiddler",paramFn,null,dependencies,store);
|
||||
m.execute(tiddler);
|
||||
m.execute(macroNode.parents,tiddler);
|
||||
content.push(m);
|
||||
}
|
||||
return content;
|
||||
@@ -89,7 +89,7 @@ exports.macro = {
|
||||
dependencies.addDependency(template,true);
|
||||
}
|
||||
var m = Renderer.MacroNode("tiddler",paramFn,null,dependencies,store);
|
||||
m.execute(store.getTiddler(targetTiddlers[t]));
|
||||
m.execute(macroNode.parents,store.getTiddler(targetTiddlers[t]));
|
||||
m.renderInDom(macroNode.domNode,macroNode.domNode.childNodes[t]);
|
||||
macroNode.content.splice(t,0,m);
|
||||
} else {
|
||||
|
||||
@@ -58,33 +58,39 @@ exports.macro = {
|
||||
renderTemplate = macroNode.params.template,
|
||||
content,
|
||||
contentClone = [],
|
||||
t;
|
||||
t,
|
||||
parents = macroNode.parents.slice(0);
|
||||
if(typeof renderTitle !== "string") {
|
||||
renderTitle = tiddler.title;
|
||||
}
|
||||
if(typeof renderTemplate !== "string") {
|
||||
renderTemplate = renderTitle;
|
||||
}
|
||||
if("with" in macroNode.params) {
|
||||
// Parameterised transclusion
|
||||
var targetTiddler = store.getTiddler(renderTemplate),
|
||||
text = targetTiddler.text;
|
||||
var withTokens = [macroNode.params["with"]];
|
||||
for(t=0; t<withTokens.length; t++) {
|
||||
var placeholderRegExp = new RegExp("\\$"+(t+1),"mg");
|
||||
text = text.replace(placeholderRegExp,withTokens[t]);
|
||||
if(parents.indexOf(renderTemplate) === -1) {
|
||||
if("with" in macroNode.params) {
|
||||
// Parameterised transclusion
|
||||
var targetTiddler = store.getTiddler(renderTemplate),
|
||||
text = targetTiddler.text;
|
||||
var withTokens = [macroNode.params["with"]];
|
||||
for(t=0; t<withTokens.length; t++) {
|
||||
var placeholderRegExp = new RegExp("\\$"+(t+1),"mg");
|
||||
text = text.replace(placeholderRegExp,withTokens[t]);
|
||||
}
|
||||
content = store.parseText(targetTiddler.type,text).tree;
|
||||
} else {
|
||||
// There's no parameterisation, so we can just render the target tiddler directly
|
||||
var parseTree = store.parseTiddler(renderTemplate);
|
||||
content = parseTree ? parseTree.tree : [];
|
||||
}
|
||||
content = store.parseText(targetTiddler.type,text).tree;
|
||||
} else {
|
||||
// There's no parameterisation, so we can just render the target tiddler directly
|
||||
var parseTree = store.parseTiddler(renderTemplate);
|
||||
content = parseTree ? parseTree.tree : [];
|
||||
content = [Renderer.TextNode("{{** Tiddler recursion error in <<tiddler>> macro **}}")];
|
||||
}
|
||||
parents.push(renderTemplate);
|
||||
for(t=0; t<content.length; t++) {
|
||||
contentClone.push(content[t].clone());
|
||||
}
|
||||
for(t=0; t<contentClone.length; t++) {
|
||||
contentClone[t].execute(store.getTiddler(renderTitle));
|
||||
contentClone[t].execute(parents,store.getTiddler(renderTitle));
|
||||
}
|
||||
return contentClone;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@ exports.macro = {
|
||||
var v = tiddler[macroNode.params.field],
|
||||
content,
|
||||
t,
|
||||
contentClone = [];
|
||||
contentClone = [],
|
||||
parents = macroNode.parents;
|
||||
if(v !== undefined) {
|
||||
switch(macroNode.params.format) {
|
||||
case "link":
|
||||
@@ -37,11 +38,17 @@ exports.macro = {
|
||||
[Renderer.TextNode(v)],
|
||||
dependencies,
|
||||
store);
|
||||
link.execute(tiddler);
|
||||
link.execute(parents,tiddler);
|
||||
return [link];
|
||||
case "wikified":
|
||||
if(macroNode.params.field === "text") {
|
||||
content = store.parseTiddler(tiddler.title).tree;
|
||||
if(parents.indexOf(tiddler.title) === -1) {
|
||||
content = store.parseTiddler(tiddler.title).tree;
|
||||
} else {
|
||||
content = [Renderer.TextNode("{{** Tiddler recursion error in <<view>> macro **}}")];
|
||||
}
|
||||
parents = parents.slice(0);
|
||||
parents.push(tiddler.title);
|
||||
} else {
|
||||
content = store.parseText("text/x-tiddlywiki",v).tree;
|
||||
}
|
||||
@@ -49,7 +56,7 @@ exports.macro = {
|
||||
contentClone.push(content[t].clone());
|
||||
}
|
||||
for(t=0; t<contentClone.length; t++) {
|
||||
contentClone[t].execute(tiddler);
|
||||
contentClone[t].execute(parents,tiddler);
|
||||
}
|
||||
return contentClone;
|
||||
case "date":
|
||||
|
||||
Reference in New Issue
Block a user