mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-26 10:00:34 +00:00
115 lines
3.2 KiB
JavaScript
115 lines
3.2 KiB
JavaScript
/*\
|
|
title: $:/core/modules/widgets/importvariables.js
|
|
type: application/javascript
|
|
module-type: widget
|
|
|
|
Import variable definitions from other tiddlers
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
var Widget = require("$:/core/modules/widgets/widget.js").widget;
|
|
|
|
var ImportVariablesWidget = function(parseTreeNode,options) {
|
|
this.initialise(parseTreeNode,options);
|
|
};
|
|
|
|
/*
|
|
Inherit from the base widget class
|
|
*/
|
|
ImportVariablesWidget.prototype = new Widget();
|
|
|
|
/*
|
|
Render this widget into the DOM
|
|
*/
|
|
ImportVariablesWidget.prototype.render = function(parent,nextSibling) {
|
|
this.parentDomNode = parent;
|
|
this.computeAttributes();
|
|
this.execute();
|
|
this.renderChildren(parent,nextSibling);
|
|
};
|
|
|
|
/*
|
|
Compute the internal state of the widget
|
|
*/
|
|
ImportVariablesWidget.prototype.execute = function(tiddlerList) {
|
|
var self = this;
|
|
// Get our parameters
|
|
this.filter = this.getAttribute("filter");
|
|
// Compute the filter
|
|
this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);
|
|
// 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) {
|
|
var parser = self.wiki.parseTiddler(title);
|
|
if(parser) {
|
|
var parseTreeNode = parser.tree[0];
|
|
while(parseTreeNode && parseTreeNode.type === "set") {
|
|
addWidgetNode({
|
|
type: "set",
|
|
attributes: parseTreeNode.attributes,
|
|
params: parseTreeNode.params
|
|
});
|
|
parseTreeNode = parseTreeNode.children[0];
|
|
}
|
|
}
|
|
});
|
|
// Add our own children to the end of the pile
|
|
var parseTreeNodes;
|
|
if(widgetStackStart && widgetStackEnd) {
|
|
parseTreeNodes = [widgetStackStart];
|
|
widgetStackEnd.children = this.parseTreeNode.children;
|
|
} else {
|
|
parseTreeNodes = this.parseTreeNode.children;
|
|
}
|
|
// Construct the child widgets
|
|
this.makeChildWidgets(parseTreeNodes);
|
|
};
|
|
|
|
/*
|
|
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
|
|
*/
|
|
ImportVariablesWidget.prototype.refresh = function(changedTiddlers) {
|
|
// Recompute our attributes and the filter list
|
|
var changedAttributes = this.computeAttributes(),
|
|
tiddlerList = this.wiki.filterTiddlers(this.getAttribute("filter"),this);
|
|
// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed
|
|
function haveListedTiddlersChanged() {
|
|
var changed = false;
|
|
tiddlerList.forEach(function(title) {
|
|
if(changedTiddlers[title]) {
|
|
changed = true;
|
|
}
|
|
});
|
|
return changed;
|
|
}
|
|
if(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {
|
|
// Compute the filter
|
|
this.removeChildDomNodes();
|
|
this.execute(tiddlerList);
|
|
this.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());
|
|
return true;
|
|
} else {
|
|
return this.refreshChildren(changedTiddlers);
|
|
}
|
|
};
|
|
|
|
exports.importvariables = ImportVariablesWidget;
|
|
|
|
})();
|