mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-02-21 05:20:01 +00:00
Changed importVariable to store its own variables (#4108)
* Changed importVariable to store its ownvariables Before, importVariables was creating a setWidget for every single variable it would find in its tiddlers, and it would create a long-ass call tree. Now, instead, it just accumulates the variables in itself. * Can't use Object.assign Learned the hardway while working on tw5-relink that Object.assign doesn't exist in IE11. Using $tw.utils.extend instead. * Retaining setWidget transclusion flexibility * One more test to verify mixing sets and macros
This commit is contained in:
parent
151eed5c81
commit
aa817f66d2
@ -37,49 +37,45 @@ ImportVariablesWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
Compute the internal state of the widget
|
Compute the internal state of the widget
|
||||||
*/
|
*/
|
||||||
ImportVariablesWidget.prototype.execute = function(tiddlerList) {
|
ImportVariablesWidget.prototype.execute = function(tiddlerList) {
|
||||||
var self = this;
|
var widgetPointer = this;
|
||||||
// Get our parameters
|
// Get our parameters
|
||||||
this.filter = this.getAttribute("filter");
|
this.filter = this.getAttribute("filter");
|
||||||
// Compute the filter
|
// Compute the filter
|
||||||
this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);
|
this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);
|
||||||
// Accumulate the <$set> widgets from each tiddler
|
// Accumulate the <$set> widgets from each tiddler
|
||||||
var widgetStackStart,widgetStackEnd;
|
|
||||||
function addWidgetNode(widgetNode) {
|
|
||||||
if(widgetNode) {
|
|
||||||
if(!widgetStackStart && !widgetStackEnd) {
|
|
||||||
widgetStackStart = widgetNode;
|
|
||||||
widgetStackEnd = widgetNode;
|
|
||||||
} else {
|
|
||||||
widgetStackEnd.children = [widgetNode];
|
|
||||||
widgetStackEnd = widgetNode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$tw.utils.each(this.tiddlerList,function(title) {
|
$tw.utils.each(this.tiddlerList,function(title) {
|
||||||
var parser = self.wiki.parseTiddler(title);
|
var parser = widgetPointer.wiki.parseTiddler(title);
|
||||||
if(parser) {
|
if(parser) {
|
||||||
var parseTreeNode = parser.tree[0];
|
var parseTreeNode = parser.tree[0];
|
||||||
while(parseTreeNode && parseTreeNode.type === "set") {
|
while(parseTreeNode && parseTreeNode.type === "set") {
|
||||||
addWidgetNode({
|
var node = {
|
||||||
type: "set",
|
type: "set",
|
||||||
attributes: parseTreeNode.attributes,
|
attributes: parseTreeNode.attributes,
|
||||||
params: parseTreeNode.params,
|
params: parseTreeNode.params,
|
||||||
isMacroDefinition: parseTreeNode.isMacroDefinition
|
isMacroDefinition: parseTreeNode.isMacroDefinition
|
||||||
});
|
};
|
||||||
|
if (parseTreeNode.isMacroDefinition) {
|
||||||
|
// Macro definitions can be folded into
|
||||||
|
// current widget instead of adding
|
||||||
|
// another link to the chain.
|
||||||
|
var widget = widgetPointer.makeChildWidget(node);
|
||||||
|
widget.computeAttributes();
|
||||||
|
widget.execute();
|
||||||
|
$tw.utils.extend(widgetPointer.variables,widget.variables);
|
||||||
|
} else {
|
||||||
|
widgetPointer.makeChildWidgets([node]);
|
||||||
|
widgetPointer = widgetPointer.children[0];
|
||||||
|
}
|
||||||
parseTreeNode = parseTreeNode.children && parseTreeNode.children[0];
|
parseTreeNode = parseTreeNode.children && parseTreeNode.children[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Add our own children to the end of the pile
|
|
||||||
var parseTreeNodes;
|
if (widgetPointer != this) {
|
||||||
if(widgetStackStart && widgetStackEnd) {
|
widgetPointer.parseTreeNode.children = this.parseTreeNode.children;
|
||||||
parseTreeNodes = [widgetStackStart];
|
|
||||||
widgetStackEnd.children = this.parseTreeNode.children;
|
|
||||||
} else {
|
} else {
|
||||||
parseTreeNodes = this.parseTreeNode.children;
|
widgetPointer.makeChildWidgets();
|
||||||
}
|
}
|
||||||
// Construct the child widgets
|
|
||||||
this.makeChildWidgets(parseTreeNodes);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -465,6 +465,58 @@ describe("Widget module", function() {
|
|||||||
expect(wrapper.innerHTML).toBe("<p>nothing</p>");
|
expect(wrapper.innerHTML).toBe("<p>nothing</p>");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**This test confirms that imported set variables properly refresh
|
||||||
|
* if they use transclusion for their value. This relates to PR #4108.
|
||||||
|
*/
|
||||||
|
it("should refresh imported <$set> widgets", function() {
|
||||||
|
var wiki = new $tw.Wiki();
|
||||||
|
// Add some tiddlers
|
||||||
|
wiki.addTiddlers([
|
||||||
|
{title: "Raw", text: "Initial value"},
|
||||||
|
{title: "Macro", text: "<$set name='test' value={{Raw}}>\n\ndummy text</$set>"},
|
||||||
|
{title: "Caller", text: text}
|
||||||
|
]);
|
||||||
|
var text = "\\import Macro\n<<test>>";
|
||||||
|
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||||
|
// Render the widget node to the DOM
|
||||||
|
var wrapper = renderWidgetNode(widgetNode);
|
||||||
|
// Test the rendering
|
||||||
|
expect(wrapper.innerHTML).toBe("<p>Initial value</p>");
|
||||||
|
wiki.addTiddler({title: "Raw", text: "New value"});
|
||||||
|
// Refresh
|
||||||
|
refreshWidgetNode(widgetNode,wrapper,["Raw"]);
|
||||||
|
expect(wrapper.innerHTML).toBe("<p>New value</p>");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should can mix setWidgets and macros when importing", function() {
|
||||||
|
var wiki = new $tw.Wiki();
|
||||||
|
// Add some tiddlers
|
||||||
|
wiki.addTiddlers([
|
||||||
|
{title: "A", text: "\\define A() Aval"},
|
||||||
|
{title: "B", text: "<$set name='B' value='Bval'>\n\ndummy text</$set>"},
|
||||||
|
{title: "C", text: "\\define C() Cval"}
|
||||||
|
]);
|
||||||
|
var text = "\\import A B C\n<<A>> <<B>> <<C>>";
|
||||||
|
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||||
|
// Render the widget node to the DOM
|
||||||
|
var wrapper = renderWidgetNode(widgetNode);
|
||||||
|
// Test the rendering
|
||||||
|
expect(wrapper.innerHTML).toBe("<p>Aval Bval Cval</p>");
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Special case. <$importvariables> has different handling if
|
||||||
|
* it doesn't end up importing any variables. Make sure it
|
||||||
|
* doesn't forget its childrenNodes.
|
||||||
|
*/
|
||||||
|
it("should work when import widget imports nothing", function() {
|
||||||
|
var wiki = new $tw.Wiki();
|
||||||
|
var text = "\\import [prefix[XXX]]\nDon't forget me.";
|
||||||
|
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||||
|
// Render the widget node to the DOM
|
||||||
|
var wrapper = renderWidgetNode(widgetNode);
|
||||||
|
// Test the rendering
|
||||||
|
expect(wrapper.innerHTML).toBe("<p>Don't forget me.</p>");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user