mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-06 10:06:19 +00:00
f307f00e32
There are two big changes here: Replace the previous "ts-wrapper" mechanism, which we had been using to redefine custom widgets inside their definitions to prevent recursive calls. Now we've got the genesis widget we can instead control recursion through a new "$remappable" attribute that allows the custom widget mechanism to be skipped. We also extend the slot widget to allow a depth to be specified; it then reaches up by the indicated number of transclusion widgets to find the one from which it should retrieve the slot value.
83 lines
2.1 KiB
JavaScript
83 lines
2.1 KiB
JavaScript
/*\
|
|
title: $:/core/modules/widgets/slot.js
|
|
type: application/javascript
|
|
module-type: widget
|
|
|
|
Widget for definition of slots within transcluded content. The values provided by the translusion are passed to the slot.
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
var Widget = require("$:/core/modules/widgets/widget.js").widget,
|
|
TranscludeWidget = require("$:/core/modules/widgets/transclude.js").transclude;
|
|
|
|
var SlotWidget = function(parseTreeNode,options) {
|
|
// Initialise
|
|
this.initialise(parseTreeNode,options);
|
|
};
|
|
|
|
/*
|
|
Inherit from the base widget class
|
|
*/
|
|
SlotWidget.prototype = Object.create(Widget.prototype);
|
|
|
|
/*
|
|
Render this widget into the DOM
|
|
*/
|
|
SlotWidget.prototype.render = function(parent,nextSibling) {
|
|
// Call the constructor
|
|
Widget.call(this);
|
|
this.parentDomNode = parent;
|
|
this.computeAttributes();
|
|
this.execute();
|
|
this.renderChildren(parent,nextSibling);
|
|
};
|
|
|
|
/*
|
|
Compute the internal state of the widget
|
|
*/
|
|
SlotWidget.prototype.execute = function() {
|
|
var self = this;
|
|
this.slotName = this.getAttribute("$name");
|
|
this.slotDepth = parseInt(this.getAttribute("$depth","1"),10) || 1;
|
|
// Find the parent transclusions
|
|
var pointer = this.parentWidget,
|
|
depth = this.slotDepth;
|
|
while(pointer) {
|
|
if(pointer instanceof TranscludeWidget) {
|
|
depth--;
|
|
if(depth === 0) {
|
|
break;
|
|
}
|
|
}
|
|
pointer = pointer.parentWidget;
|
|
}
|
|
var parseTreeNodes = [{type: "text", attributes: {text: {type: "string", value: "Missing slot reference!"}}}];
|
|
if(pointer instanceof TranscludeWidget) {
|
|
// Get the parse tree nodes comprising the slot contents
|
|
parseTreeNodes = pointer.getTransclusionSlotValue(this.slotName,this.parseTreeNode.children);
|
|
}
|
|
// Construct the child widgets
|
|
this.makeChildWidgets(parseTreeNodes);
|
|
};
|
|
|
|
/*
|
|
Refresh the widget by ensuring our attributes are up to date
|
|
*/
|
|
SlotWidget.prototype.refresh = function(changedTiddlers) {
|
|
var changedAttributes = this.computeAttributes();
|
|
if(changedAttributes["$name"] || changedAttributes["$depth"]) {
|
|
this.refreshSelf();
|
|
return true;
|
|
}
|
|
return this.refreshChildren(changedTiddlers);
|
|
};
|
|
|
|
exports.slot = SlotWidget;
|
|
|
|
})();
|