1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-23 10:07:19 +00:00

Extend transclude widget to optionally set variables

Partially fixes #5199
This commit is contained in:
jeremy@jermolene.com 2021-03-19 15:37:59 +00:00
parent 427eb6d085
commit 80ee5adb14
3 changed files with 44 additions and 5 deletions

View File

@ -75,8 +75,17 @@ TranscludeWidget.prototype.execute = function() {
]}]; ]}];
} }
} }
// Assign any variables set via attributes starting with $
var variables = Object.create(null);
$tw.utils.each(this.attributes,function(attribute,name) {
if(name.charAt(0) === "$") {
variables[name.substr(1)] = attribute;
}
});
// Construct the child widgets // Construct the child widgets
this.makeChildWidgets(parseTreeNodes); this.makeChildWidgets(parseTreeNodes,{
variables: variables
});
}; };
/* /*

View File

@ -333,9 +333,22 @@ Widget.prototype.assignAttributes = function(domNode,options) {
/* /*
Make child widgets correspondng to specified parseTreeNodes Make child widgets correspondng to specified parseTreeNodes
*/ */
Widget.prototype.makeChildWidgets = function(parseTreeNodes) { Widget.prototype.makeChildWidgets = function(parseTreeNodes,options) {
options = options || {};
this.children = []; this.children = [];
var self = this; var self = this;
// Create set variable widgets for each variable
$tw.utils.each(options.variables,function(value,name) {
var setVariableWidget = {
type: "set",
attributes: {
name: {type: "string", value: name},
value: {type: "string", value: value}
},
children: parseTreeNodes
};
parseTreeNodes = [setVariableWidget];
});
$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) { $tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {
self.children.push(self.makeChildWidget(childNode)); self.children.push(self.makeChildWidget(childNode));
}); });
@ -343,16 +356,32 @@ Widget.prototype.makeChildWidgets = function(parseTreeNodes) {
/* /*
Construct the widget object for a parse tree node Construct the widget object for a parse tree node
options include:
variables: optional hashmap of variables to wrap around the widget
*/ */
Widget.prototype.makeChildWidget = function(parseTreeNode) { Widget.prototype.makeChildWidget = function(parseTreeNode,options) {
options = options || {};
var WidgetClass = this.widgetClasses[parseTreeNode.type]; var WidgetClass = this.widgetClasses[parseTreeNode.type];
if(!WidgetClass) { if(!WidgetClass) {
WidgetClass = this.widgetClasses.text; WidgetClass = this.widgetClasses.text;
parseTreeNode = {type: "text", text: "Undefined widget '" + parseTreeNode.type + "'"}; parseTreeNode = {type: "text", text: "Undefined widget '" + parseTreeNode.type + "'"};
} }
// Create set variable widgets for each variable
$tw.utils.each(options.variables,function(value,name) {
var setVariableWidget = {
type: "set",
attributes: {
name: {type: "string", value: name},
value: {type: "string", value: value}
},
children: [
parseTreeNode
]
};
parseTreeNode = setVariableWidget;
});
return new WidgetClass(parseTreeNode,{ return new WidgetClass(parseTreeNode,{
wiki: this.wiki, wiki: this.wiki,
variables: {},
parentWidget: this, parentWidget: this,
document: this.document document: this.document
}); });

View File

@ -1,5 +1,5 @@
created: 20130824142500000 created: 20130824142500000
modified: 20140717175900970 modified: 20210319150601867
tags: Widgets tags: Widgets
title: TranscludeWidget title: TranscludeWidget
type: text/vnd.tiddlywiki type: text/vnd.tiddlywiki
@ -17,6 +17,7 @@ The TranscludeWidget dynamically imports content from another tiddler.
|index |The index of a property in a [[DataTiddler|DataTiddlers]] | |index |The index of a property in a [[DataTiddler|DataTiddlers]] |
|subtiddler |Optional SubTiddler title when the target tiddler is a [[plugin|Plugins]] (see below) | |subtiddler |Optional SubTiddler title when the target tiddler is a [[plugin|Plugins]] (see below) |
|mode |Override the default parsing mode for the transcluded text to "block" or "inline" | |mode |Override the default parsing mode for the transcluded text to "block" or "inline" |
|//(attributes starting with $)// |<<.from-version "5.1.24">> The $ is removed from each attribute name to specify a variable name that is assigned the specified value for the scope of the transclusion |
The TranscludeWidget treats any contained content as a fallback if the target of the transclusion is not defined (ie a missing tiddler or a missing field). The TranscludeWidget treats any contained content as a fallback if the target of the transclusion is not defined (ie a missing tiddler or a missing field).