mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-31 15:42:59 +00:00 
			
		
		
		
	 9e3618bdcf
			
		
	
	9e3618bdcf
	
	
	
		
			
			The change is to avoid confusion with the HTML 'title' attribute. The name 'tiddler' better emphasises the purpose of the attribute, too.
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| /*\
 | |
| title: $:/core/modules/new_widgets/transclude.js
 | |
| type: application/javascript
 | |
| module-type: new_widget
 | |
| 
 | |
| Transclude widget
 | |
| 
 | |
| \*/
 | |
| (function(){
 | |
| 
 | |
| /*jslint node: true, browser: true */
 | |
| /*global $tw: false */
 | |
| "use strict";
 | |
| 
 | |
| var Widget = require("$:/core/modules/new_widgets/widget.js").widget;
 | |
| 
 | |
| var TranscludeWidget = function(parseTreeNode,options) {
 | |
| 	this.initialise(parseTreeNode,options);
 | |
| };
 | |
| 
 | |
| /*
 | |
| Inherit from the base widget class
 | |
| */
 | |
| TranscludeWidget.prototype = new Widget();
 | |
| 
 | |
| /*
 | |
| Render this widget into the DOM
 | |
| */
 | |
| TranscludeWidget.prototype.render = function(parent,nextSibling) {
 | |
| 	this.parentDomNode = parent;
 | |
| 	this.computeAttributes();
 | |
| 	this.execute();
 | |
| 	this.renderChildren(parent,nextSibling);
 | |
| };
 | |
| 
 | |
| /*
 | |
| Compute the internal state of the widget
 | |
| */
 | |
| TranscludeWidget.prototype.execute = function() {
 | |
| 	// Get our parameters
 | |
| 	this.transcludeTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler"));
 | |
| 	this.transcludeField = this.getAttribute("field");
 | |
| 	this.transcludeIndex = this.getAttribute("index");
 | |
| 	// Check for recursion
 | |
| 	var recursionMarker = this.makeRecursionMarker();;
 | |
| 	if(this.parentWidget && this.parentWidget.hasVariable("transclusion",recursionMarker)) {
 | |
| 		this.makeChildWidgets([{type: "text", text: "Tiddler recursion error in transclude widget"}]);
 | |
| 		return;
 | |
| 	}
 | |
| 	// Set context variables for recursion detection
 | |
| 	this.setVariable("transclusion",recursionMarker);
 | |
| 	// Parse the text reference
 | |
| 	var parser = this.wiki.new_parseTextReference(
 | |
| 						this.transcludeTitle,
 | |
| 						this.transcludeField,
 | |
| 						this.transcludeIndex,
 | |
| 						{parseAsInline: !this.parseTreeNode.isBlock}),
 | |
| 		parseTreeNodes = parser ? parser.tree : [];
 | |
| 	// Construct the child widgets
 | |
| 	this.makeChildWidgets(parseTreeNodes);
 | |
| };
 | |
| 
 | |
| /*
 | |
| Compose a string comprising the title, field and/or index to identify this transclusion for recursion detection
 | |
| */
 | |
| TranscludeWidget.prototype.makeRecursionMarker = function() {
 | |
| 	var output = [];
 | |
| 	output.push("{");
 | |
| 	output.push(this.getVariable("currentTiddler",{defaultValue: ""}));
 | |
| 	output.push("|");
 | |
| 	output.push(this.transcludeTitle || "");
 | |
| 	output.push("|");
 | |
| 	output.push(this.transcludeField || "");
 | |
| 	output.push("|");
 | |
| 	output.push(this.transcludeIndex || "");
 | |
| 	output.push("}");
 | |
| 	return output.join("");
 | |
| };
 | |
| 
 | |
| /*
 | |
| Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
 | |
| */
 | |
| TranscludeWidget.prototype.refresh = function(changedTiddlers) {
 | |
| 	var changedAttributes = this.computeAttributes();
 | |
| 	if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {
 | |
| 		this.refreshSelf();
 | |
| 		return true;
 | |
| 	} else {
 | |
| 		return this.refreshChildren(changedTiddlers);		
 | |
| 	}
 | |
| };
 | |
| 
 | |
| exports.transclude = TranscludeWidget;
 | |
| 
 | |
| })();
 |