mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-31 15:42:59 +00:00 
			
		
		
		
	Split "transclude" widget into a separate "tiddler" and "transclude" widget
Belatedly realised that the design would be clearer without these two separate concepts being conflated into a single widget. As a result of this change, any other widget or template that generates transclude widgets has needed adjustment.
This commit is contained in:
		| @@ -42,34 +42,40 @@ exports.parse = function() { | |||||||
| 		template = $tw.utils.trim(this.match[3]), | 		template = $tw.utils.trim(this.match[3]), | ||||||
| 		style = this.match[4], | 		style = this.match[4], | ||||||
| 		classes = this.match[5]; | 		classes = this.match[5]; | ||||||
| 	// Return the transclude widget | 	// Prepare the transclude widget | ||||||
| 	var node = { | 	var transcludeNode = { | ||||||
| 			type: "element", | 			type: "element", | ||||||
| 			tag: "$transclude", | 			tag: "$transclude", | ||||||
| 			attributes: { | 			attributes: { | ||||||
| 			target: {type: "string", value: targetTitle} | 				title: {type: "string", value: template || targetTitle} | ||||||
| 			}, | 			}, | ||||||
| 			isBlock: true | 			isBlock: true | ||||||
| 		}; | 		}; | ||||||
|  | 	var tiddlerNode = { | ||||||
|  | 		type: "element", | ||||||
|  | 		tag: "$tiddler", | ||||||
|  | 		attributes: { | ||||||
|  | 			title: {type: "string", value: targetTitle} | ||||||
|  | 		}, | ||||||
|  | 		isBlock: true, | ||||||
|  | 		children: [transcludeNode] | ||||||
|  | 	}; | ||||||
| 	if(targetField) { | 	if(targetField) { | ||||||
| 		node.attributes.field = {type: "string", value: targetField}; | 		transcludeNode.attributes.field = {type: "string", value: targetField}; | ||||||
| 	} | 	} | ||||||
| 	if(targetIndex) { | 	if(targetIndex) { | ||||||
| 		node.attributes.index = {type: "string", value: targetIndex}; | 		transcludeNode.attributes.index = {type: "string", value: targetIndex}; | ||||||
| 	} | 	} | ||||||
| 	if(tooltip) { | 	if(tooltip) { | ||||||
| 		node.attributes.tooltip = {type: "string", value: tooltip}; | 		transcludeNode.attributes.tooltip = {type: "string", value: tooltip}; | ||||||
| 	} |  | ||||||
| 	if(template) { |  | ||||||
| 		node.attributes.template = {type: "string", value: template}; |  | ||||||
| 	} | 	} | ||||||
| 	if(style) { | 	if(style) { | ||||||
| 		node.attributes.style = {type: "string", value: style}; | 		transcludeNode.attributes.style = {type: "string", value: style}; | ||||||
| 	} | 	} | ||||||
| 	if(classes) { | 	if(classes) { | ||||||
| 		node.attributes["class"] = {type: "string", value: classes.split(".").join(" ")}; | 		transcludeNode.attributes["class"] = {type: "string", value: classes.split(".").join(" ")}; | ||||||
| 	} | 	} | ||||||
| 	return [node]; | 	return [tiddlerNode]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| })(); | })(); | ||||||
|   | |||||||
| @@ -42,33 +42,38 @@ exports.parse = function() { | |||||||
| 		template = $tw.utils.trim(this.match[3]), | 		template = $tw.utils.trim(this.match[3]), | ||||||
| 		style = this.match[4], | 		style = this.match[4], | ||||||
| 		classes = this.match[5]; | 		classes = this.match[5]; | ||||||
| 	// Return the transclude widget | 	// Prepare the transclude widget | ||||||
| 	var node = { | 	var transcludeNode = { | ||||||
| 			type: "element", | 			type: "element", | ||||||
| 			tag: "$transclude", | 			tag: "$transclude", | ||||||
| 			attributes: { | 			attributes: { | ||||||
| 			target: {type: "string", value: targetTitle} | 				title: {type: "string", value: template || targetTitle} | ||||||
| 			} | 			} | ||||||
| 		}; | 		}; | ||||||
|  | 	var tiddlerNode = { | ||||||
|  | 		type: "element", | ||||||
|  | 		tag: "$tiddler", | ||||||
|  | 		attributes: { | ||||||
|  | 			title: {type: "string", value: targetTitle} | ||||||
|  | 		}, | ||||||
|  | 		children: [transcludeNode] | ||||||
|  | 	}; | ||||||
| 	if(targetField) { | 	if(targetField) { | ||||||
| 		node.attributes.field = {type: "string", value: targetField}; | 		transcludeNode.attributes.field = {type: "string", value: targetField}; | ||||||
| 	} | 	} | ||||||
| 	if(targetIndex) { | 	if(targetIndex) { | ||||||
| 		node.attributes.index = {type: "string", value: targetIndex}; | 		transcludeNode.attributes.index = {type: "string", value: targetIndex}; | ||||||
| 	} | 	} | ||||||
| 	if(tooltip) { | 	if(tooltip) { | ||||||
| 		node.attributes.tooltip = {type: "string", value: tooltip}; | 		transcludeNode.attributes.tooltip = {type: "string", value: tooltip}; | ||||||
| 	} |  | ||||||
| 	if(template) { |  | ||||||
| 		node.attributes.template = {type: "string", value: template}; |  | ||||||
| 	} | 	} | ||||||
| 	if(style) { | 	if(style) { | ||||||
| 		node.attributes.style = {type: "string", value: style}; | 		transcludeNode.attributes.style = {type: "string", value: style}; | ||||||
| 	} | 	} | ||||||
| 	if(classes) { | 	if(classes) { | ||||||
| 		node.attributes["class"] = {type: "string", value: classes.split(".").join(" ")}; | 		transcludeNode.attributes["class"] = {type: "string", value: classes.split(".").join(" ")}; | ||||||
| 	} | 	} | ||||||
| 	return [node]; | 	return [tiddlerNode]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| })(); | })(); | ||||||
|   | |||||||
| @@ -61,7 +61,7 @@ GridWidget.prototype.generateTable = function() { | |||||||
| 						type: "element", | 						type: "element", | ||||||
| 						tag: "$transclude", | 						tag: "$transclude", | ||||||
| 						attributes: { | 						attributes: { | ||||||
| 							target: {type: "string", value: this.getTableCellTitle(col,row)} | 							title: {type: "string", value: this.getTableCellTitle(col,row)} | ||||||
| 						} | 						} | ||||||
| 					}] | 					}] | ||||||
| 				}; | 				}; | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ InfoWidget.types.currentfielddescription = function(options) { | |||||||
| 		tag: "$transclude", | 		tag: "$transclude", | ||||||
| 		isBlock: false, | 		isBlock: false, | ||||||
| 		attributes: { | 		attributes: { | ||||||
| 			target: {type: "string", value: descriptionTitle} | 			title: {type: "string", value: descriptionTitle} | ||||||
| 		} | 		} | ||||||
| 	}]; | 	}]; | ||||||
| }; | }; | ||||||
| @@ -71,7 +71,7 @@ InfoWidget.types.modules = function(options) { | |||||||
| 			tag: "$transclude", | 			tag: "$transclude", | ||||||
| 			isBlock: false, | 			isBlock: false, | ||||||
| 			attributes: { | 			attributes: { | ||||||
| 				target: {type: "string", value: MODULE_TYPE_DESCRIPTION_PREFIX + moduleType} | 				title: {type: "string", value: MODULE_TYPE_DESCRIPTION_PREFIX + moduleType} | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| 		// List each module | 		// List each module | ||||||
|   | |||||||
| @@ -197,23 +197,37 @@ ListWidget.prototype.createListElementTransclusion = function(title) { | |||||||
| 			}]; | 			}]; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// Create the transclude widget | 	// Create the element widgets | ||||||
| 	var widget = { | 	if(this.renderer.hasAttribute("hackTemplate")) { | ||||||
|  | 		return { | ||||||
| 			type: "element", | 			type: "element", | ||||||
| 			tag: "$transclude", | 			tag: "$transclude", | ||||||
| 			isBlock: this.renderer.parseTreeNode.isBlock, | 			isBlock: this.renderer.parseTreeNode.isBlock, | ||||||
| 		attributes: {}, | 			attributes: { | ||||||
|  | 				title: {type: "string", value: title} | ||||||
|  | 			} | ||||||
|  | 		}; | ||||||
|  | 	} else { | ||||||
|  | 		if(!templateTree) { | ||||||
|  | 			templateTree = [{ | ||||||
|  | 				type: "element", | ||||||
|  | 				tag: "$transclude", | ||||||
|  | 				attributes: { | ||||||
|  | 					title: {type: "string", value: template} | ||||||
|  | 				}, | ||||||
|  | 				children: templateTree | ||||||
|  | 			}]; | ||||||
|  | 		} | ||||||
|  | 		return { | ||||||
|  | 			type: "element", | ||||||
|  | 			tag: "$tiddler", | ||||||
|  | 			isBlock: this.renderer.parseTreeNode.isBlock, | ||||||
|  | 			attributes: { | ||||||
|  | 				title: {type: "string", value: title} | ||||||
|  | 			}, | ||||||
| 			children: templateTree | 			children: templateTree | ||||||
| 		}; | 		}; | ||||||
| 	// Set the target if needed |  | ||||||
| 	if(!this.renderer.hasAttribute("hackTemplate")) { |  | ||||||
| 		widget.attributes.target = {type: "string", value: title}; |  | ||||||
| 		widget.attributes.template = {type: "string", value: template}; |  | ||||||
| 	} else { |  | ||||||
| 		widget.attributes.template = {type: "string", value: title}; |  | ||||||
| 		widget.children = undefined; |  | ||||||
| 	} | 	} | ||||||
| 	return widget; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -245,10 +259,13 @@ ListWidget.prototype.findListElementByTitle = function(startIndex,title) { | |||||||
| 	var testNode = this.macro ? function(node) { | 	var testNode = this.macro ? function(node) { | ||||||
| 		// We're looking for a macro list element | 		// We're looking for a macro list element | ||||||
| 		return node.widget.children[0].parseTreeNode.params[0].value === title; | 		return node.widget.children[0].parseTreeNode.params[0].value === title; | ||||||
|  | 	} : (this.renderer.hasAttribute("hackTemplate") ? function(node) { | ||||||
|  | 			// We're looking for a transclusion list element | ||||||
|  | 			return node.widget.children[0].attributes.title === title; | ||||||
| 		} : function(node) { | 		} : function(node) { | ||||||
| 			// We're looking for a transclusion list element | 			// We're looking for a transclusion list element | ||||||
| 		return node.widget.children[0].attributes.target === title; | 			return node.widget.children[0].attributes.title === title; | ||||||
| 	}; | 		}); | ||||||
| 	// Search for the list element | 	// Search for the list element | ||||||
| 	while(startIndex < this.children.length) { | 	while(startIndex < this.children.length) { | ||||||
| 		if(testNode(this.children[startIndex])) { | 		if(testNode(this.children[startIndex])) { | ||||||
|   | |||||||
							
								
								
									
										82
									
								
								core/modules/widgets/tiddler.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								core/modules/widgets/tiddler.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | /*\ | ||||||
|  | title: $:/core/modules/widgets/tiddler.js | ||||||
|  | type: application/javascript | ||||||
|  | module-type: widget | ||||||
|  |  | ||||||
|  | The tiddler widget sets the current tiddler to a specified title. | ||||||
|  |  | ||||||
|  | Attributes: | ||||||
|  | 	title: the title of the current tiddler | ||||||
|  | 	class: CSS classes | ||||||
|  |  | ||||||
|  |  | ||||||
|  | \*/ | ||||||
|  | (function(){ | ||||||
|  |  | ||||||
|  | /*jslint node: true, browser: true */ | ||||||
|  | /*global $tw: false */ | ||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | var TiddlerWidget = function(renderer) { | ||||||
|  | 	// Save state | ||||||
|  | 	this.renderer = renderer; | ||||||
|  | 	// Generate child nodes | ||||||
|  | 	this.generate(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | TiddlerWidget.prototype.generate = function() { | ||||||
|  | 	var self = this; | ||||||
|  | 	this.tiddlerTitle = this.renderer.getAttribute("title",""); | ||||||
|  | 	// Set up the attributes for the wrapper element | ||||||
|  | 	var classes = ["tw-tiddler"]; | ||||||
|  | 	if(this.renderer.hasAttribute("class")) { | ||||||
|  | 		$tw.utils.pushTop(classes,this.renderer.getAttribute("class").split(" ")); | ||||||
|  | 	} | ||||||
|  | 	if(!this.renderer.renderTree.wiki.tiddlerExists(this.tiddlerTitle) && !this.renderer.renderTree.wiki.isShadowTiddler(this.tiddlerTitle)) { | ||||||
|  | 		$tw.utils.pushTop(classes,"tw-tiddler-missing"); | ||||||
|  | 	} | ||||||
|  | 	// Save the context for this renderer node | ||||||
|  | 	this.renderer.context = { | ||||||
|  | 		tiddlerTitle: this.tiddlerTitle | ||||||
|  | 	}; | ||||||
|  | 	// Initialise events | ||||||
|  | 	this.events = []; | ||||||
|  | 	// Trap and update tag modification events | ||||||
|  | 	this.events.push({name: "tw-remove-tag", handlerFunction: function(event) { | ||||||
|  | 		event.currentTag = self.tiddlerTitle; | ||||||
|  | 		return true; | ||||||
|  | 	}}); | ||||||
|  | 	// Set the element | ||||||
|  | 	this.tag = this.renderer.parseTreeNode.isBlock ? "div" : "span"; | ||||||
|  | 	this.attributes = {}; | ||||||
|  | 	if(classes.length > 0) { | ||||||
|  | 		this.attributes["class"] = classes.join(" "); | ||||||
|  | 	} | ||||||
|  | 	this.children = this.renderer.renderTree.createRenderers(this.renderer,this.renderer.parseTreeNode.children); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | TiddlerWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) { | ||||||
|  | 	// Set the class for missing tiddlers | ||||||
|  | 	if(this.tiddlerTitle && changedTiddlers[this.tiddlerTitle]) { | ||||||
|  | 		$tw.utils.toggleClass(this.renderer.domNode,"tw-tiddler-missing",!this.renderer.renderTree.wiki.tiddlerExists(this.tiddlerTitle)); | ||||||
|  | 	} | ||||||
|  | 	// Check if any of our attributes have changed, or if a tiddler we're interested in has changed | ||||||
|  | 	if(changedAttributes.title) { | ||||||
|  | 		// Regenerate and rerender the widget and replace the existing DOM node | ||||||
|  | 		this.generate(); | ||||||
|  | 		var oldDomNode = this.renderer.domNode, | ||||||
|  | 			newDomNode = this.renderer.renderInDom(); | ||||||
|  | 		oldDomNode.parentNode.replaceChild(newDomNode,oldDomNode); | ||||||
|  | 	} else { | ||||||
|  | 		// We don't need to refresh ourselves, so just refresh any child nodes | ||||||
|  | 		$tw.utils.each(this.children,function(node) { | ||||||
|  | 			if(node.refreshInDom) { | ||||||
|  | 				node.refreshInDom(changedTiddlers); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | exports.tiddler = TiddlerWidget; | ||||||
|  |  | ||||||
|  | })(); | ||||||
| @@ -6,38 +6,7 @@ module-type: widget | |||||||
| The transclude widget includes another tiddler into the tiddler being rendered. | The transclude widget includes another tiddler into the tiddler being rendered. | ||||||
|  |  | ||||||
| Attributes: | Attributes: | ||||||
| 	target: the title of the tiddler to transclude | 	title: the title of the tiddler to transclude | ||||||
| 	template: the title of the tiddler to use as a template for the transcluded tiddler |  | ||||||
|  |  | ||||||
| The simplest case is to just supply a target tiddler: |  | ||||||
|  |  | ||||||
| {{{ |  | ||||||
| <$transclude target="Foo"/> |  | ||||||
| }}} |  | ||||||
|  |  | ||||||
| This will render the tiddler Foo within the current tiddler. If the tiddler Foo includes |  | ||||||
| the view widget (or other widget that reference the fields of the current tiddler), then the |  | ||||||
| fields of the tiddler Foo will be accessed. |  | ||||||
|  |  | ||||||
| If you want to transclude the tiddler as a template, so that the fields referenced by the view |  | ||||||
| widget are those of the tiddler doing the transcluding, then you can instead specify the tiddler |  | ||||||
| as a template: |  | ||||||
|  |  | ||||||
| {{{ |  | ||||||
| <$transclude template="Foo"/> |  | ||||||
| }}} |  | ||||||
|  |  | ||||||
| The effect is the same as the previous example: the text of the tiddler Foo is rendered. The |  | ||||||
| difference is that the view widget will access the fields of the tiddler doing the transcluding. |  | ||||||
|  |  | ||||||
| The `target` and `template` attributes may be combined: |  | ||||||
|  |  | ||||||
| {{{ |  | ||||||
| <$transclude template="Bar" target="Foo"/> |  | ||||||
| }}} |  | ||||||
|  |  | ||||||
| Here, the text of the tiddler `Bar` will be transcluded, with the widgets within it accessing the fields |  | ||||||
| of the tiddler `Foo`. |  | ||||||
|  |  | ||||||
| \*/ | \*/ | ||||||
| (function(){ | (function(){ | ||||||
| @@ -55,65 +24,49 @@ var TranscludeWidget = function(renderer) { | |||||||
|  |  | ||||||
| TranscludeWidget.prototype.generate = function() { | TranscludeWidget.prototype.generate = function() { | ||||||
| 	var self = this, | 	var self = this, | ||||||
| 		tr, templateParseTree, templateTiddler; | 		templateParseTree; | ||||||
| 	// Get the render target details | 	// Get the render target details | ||||||
| 	this.targetTitle = this.renderer.getAttribute("target",this.renderer.tiddlerTitle); | 	this.transcludeTitle = this.renderer.getAttribute("title",this.renderer.tiddlerTitle); | ||||||
| 	this.targetField = this.renderer.getAttribute("field"); | 	this.transcludeField = this.renderer.getAttribute("field"); | ||||||
| 	this.targetIndex = this.renderer.getAttribute("index"); | 	this.transcludeIndex = this.renderer.getAttribute("index"); | ||||||
| 	// Get the render tree for the template |  | ||||||
| 	this.templateTitle = undefined; |  | ||||||
| 	if(this.renderer.parseTreeNode.children && this.renderer.parseTreeNode.children.length > 0) { |  | ||||||
| 		// Use the child nodes as the template if we've got them |  | ||||||
| 		templateParseTree = this.renderer.parseTreeNode.children; |  | ||||||
| 	} else { |  | ||||||
| 		this.templateTitle = this.renderer.getAttribute("template",this.targetTitle); |  | ||||||
| 	// Check for recursion | 	// Check for recursion | ||||||
| 	if(this.renderer.renderTree.checkContextRecursion(this.renderer.parentRenderer,{ | 	if(this.renderer.renderTree.checkContextRecursion(this.renderer.parentRenderer,{ | ||||||
| 				tiddlerTitle: this.targetTitle, | 			transcludeTitle: this.transcludeTitle, | ||||||
| 				templateTitle: this.templateTitle | 			transcludeField: this.transcludeField, | ||||||
|  | 			transcludeIndex: this.transcludeIndex | ||||||
| 		})) { | 		})) { | ||||||
| 		templateParseTree = [{type: "text", text: "Tiddler recursion error in transclude widget"}];	 | 		templateParseTree = [{type: "text", text: "Tiddler recursion error in transclude widget"}];	 | ||||||
| 	} else { | 	} else { | ||||||
| 		var parser; | 		var parser; | ||||||
| 			if(this.targetField === "text" || (!this.targetField && !this.targetIndex)) { | 		if(this.transcludeField === "text" || (!this.transcludeField && !this.transcludeIndex)) { | ||||||
| 				parser = this.renderer.renderTree.wiki.parseTiddler(this.templateTitle,{parseAsInline: !this.renderer.parseTreeNode.isBlock}); | 			parser = this.renderer.renderTree.wiki.parseTiddler(this.transcludeTitle,{parseAsInline: !this.renderer.parseTreeNode.isBlock}); | ||||||
| 		} else { | 		} else { | ||||||
| 			var tiddler,text; | 			var tiddler,text; | ||||||
| 				if(this.targetField) { | 			if(this.transcludeField) { | ||||||
| 					tiddler = this.renderer.renderTree.wiki.getTiddler(this.targetTitle); | 				tiddler = this.renderer.renderTree.wiki.getTiddler(this.transcludeTitle); | ||||||
| 					text = tiddler ? tiddler.fields[this.targetField] : ""; | 				text = tiddler ? tiddler.fields[this.transcludeField] : ""; | ||||||
| 				if(text === undefined) { | 				if(text === undefined) { | ||||||
| 					text = ""; | 					text = ""; | ||||||
| 				} | 				} | ||||||
| 				parser = this.renderer.renderTree.wiki.parseText("text/vnd.tiddlywiki",text,{parseAsInline: !this.renderer.parseTreeNode.isBlock}); | 				parser = this.renderer.renderTree.wiki.parseText("text/vnd.tiddlywiki",text,{parseAsInline: !this.renderer.parseTreeNode.isBlock}); | ||||||
| 				} else if(this.targetIndex) { | 			} else if(this.transcludeIndex) { | ||||||
| 					text = this.renderer.renderTree.wiki.extractTiddlerDataItem(this.targetTitle,this.targetIndex,""); | 				text = this.renderer.renderTree.wiki.extractTiddlerDataItem(this.transcludeTitle,this.transcludeIndex,""); | ||||||
| 				parser = this.renderer.renderTree.wiki.parseText("text/vnd.tiddlywiki",text,{parseAsInline: !this.renderer.parseTreeNode.isBlock}); | 				parser = this.renderer.renderTree.wiki.parseText("text/vnd.tiddlywiki",text,{parseAsInline: !this.renderer.parseTreeNode.isBlock}); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		templateParseTree = parser ? parser.tree : []; | 		templateParseTree = parser ? parser.tree : []; | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 	// Set up the attributes for the wrapper element | 	// Set up the attributes for the wrapper element | ||||||
| 	var classes = ["tw-transclude"]; | 	var classes = ["tw-transclude"]; | ||||||
| 	if(this.renderer.hasAttribute("class")) { | 	if(this.renderer.hasAttribute("class")) { | ||||||
| 		$tw.utils.pushTop(classes,this.renderer.getAttribute("class").split(" ")); | 		$tw.utils.pushTop(classes,this.renderer.getAttribute("class").split(" ")); | ||||||
| 	} | 	} | ||||||
| 	if(!this.renderer.renderTree.wiki.tiddlerExists(this.targetTitle) && !this.renderer.renderTree.wiki.isShadowTiddler(this.targetTitle)) { |  | ||||||
| 		$tw.utils.pushTop(classes,"tw-tiddler-missing"); |  | ||||||
| 	} |  | ||||||
| 	// Save the context for this renderer node | 	// Save the context for this renderer node | ||||||
| 	this.renderer.context = { | 	this.renderer.context = { | ||||||
| 		tiddlerTitle: this.targetTitle, | 		transcludeTitle: this.transcludeTitle, | ||||||
| 		templateTitle: this.templateTitle | 		transcludeField: this.transcludeField, | ||||||
|  | 		transcludeIndex: this.transcludeIndex | ||||||
| 	}; | 	}; | ||||||
| 	// Initialise events |  | ||||||
| 	this.events = []; |  | ||||||
| 	// Trap and update tag modification events |  | ||||||
| 	this.events.push({name: "tw-remove-tag", handlerFunction: function(event) { |  | ||||||
| 		event.currentTag = self.targetTitle; |  | ||||||
| 		return true; |  | ||||||
| 	}}); |  | ||||||
| 	// Set the element | 	// Set the element | ||||||
| 	this.tag = this.renderer.parseTreeNode.isBlock ? "div" : "span"; | 	this.tag = this.renderer.parseTreeNode.isBlock ? "div" : "span"; | ||||||
| 	this.attributes = {}; | 	this.attributes = {}; | ||||||
| @@ -130,12 +83,8 @@ TranscludeWidget.prototype.generate = function() { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| TranscludeWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) { | TranscludeWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) { | ||||||
| 	// Set the class for missing tiddlers |  | ||||||
| 	if(this.targetTitle && changedTiddlers[this.targetTitle]) { |  | ||||||
| 		$tw.utils.toggleClass(this.renderer.domNode,"tw-tiddler-missing",!this.renderer.renderTree.wiki.tiddlerExists(this.targetTitle)); |  | ||||||
| 	} |  | ||||||
| 	// Check if any of our attributes have changed, or if a tiddler we're interested in has changed | 	// Check if any of our attributes have changed, or if a tiddler we're interested in has changed | ||||||
| 	if(changedAttributes.target || changedAttributes.template || (this.templateTitle && changedTiddlers[this.templateTitle])) { | 	if(changedAttributes.transcludeField || changedAttributes.transcludeIndex || (this.transcludeTitle && changedTiddlers[this.transcludeTitle])) { | ||||||
| 		// Regenerate and rerender the widget and replace the existing DOM node | 		// Regenerate and rerender the widget and replace the existing DOM node | ||||||
| 		this.generate(); | 		this.generate(); | ||||||
| 		var oldDomNode = this.renderer.domNode, | 		var oldDomNode = this.renderer.domNode, | ||||||
|   | |||||||
| @@ -9,10 +9,10 @@ modifier: JeremyRuston | |||||||
| <$edit field="draft.title"/> | <$edit field="draft.title"/> | ||||||
| @@ | @@ | ||||||
|  |  | ||||||
| <$transclude template="$:/core/ui/TagsEditor"/> | <$transclude title="$:/core/ui/TagsEditor"/> | ||||||
|  |  | ||||||
| <$reveal state="$:/ShowEditPreview" type="match" text="yes"> | <$reveal state="$:/ShowEditPreview" type="match" text="yes"> | ||||||
| <$transclude template="$:/core/ui/EditorHint"/> <$button type="set" set="$:/ShowEditPreview" setTo="no">hide preview</$button> | <$transclude title="$:/core/ui/EditorHint"/> <$button type="set" set="$:/ShowEditPreview" setTo="no">hide preview</$button> | ||||||
| <div class="tw-tiddler-preview"> | <div class="tw-tiddler-preview"> | ||||||
| <div class="tw-tiddler-preview-preview"> | <div class="tw-tiddler-preview-preview"> | ||||||
| <$view field="text" format="wikified"/> | <$view field="text" format="wikified"/> | ||||||
| @@ -23,8 +23,8 @@ modifier: JeremyRuston | |||||||
| </div> | </div> | ||||||
| </$reveal> | </$reveal> | ||||||
| <$reveal state="$:/ShowEditPreview" type="nomatch" text="yes"> | <$reveal state="$:/ShowEditPreview" type="nomatch" text="yes"> | ||||||
| <$transclude template="$:/core/ui/EditorHint"/> <$button type="set" set="$:/ShowEditPreview" setTo="yes">show preview</$button> | <$transclude title="$:/core/ui/EditorHint"/> <$button type="set" set="$:/ShowEditPreview" setTo="yes">show preview</$button> | ||||||
| <$edit field="text"/> | <$edit field="text"/> | ||||||
| </$reveal> | </$reveal> | ||||||
|  |  | ||||||
| <$transclude template="$:/core/ui/FieldEditor"/> | <$transclude title="$:/core/ui/FieldEditor"/> | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ title: $:/core/ui/MoreSideBar | |||||||
| </$reveal> | </$reveal> | ||||||
| <$reveal type="match" state="$:/state/moreSideBarTabSet" text="tagsTab" qualifyTiddlerTitles="yes"> | <$reveal type="match" state="$:/state/moreSideBarTabSet" text="tagsTab" qualifyTiddlerTitles="yes"> | ||||||
| <$list filter="[tags[]sort[title]]" itemClass="tw-menu-list-item"> | <$list filter="[tags[]sort[title]]" itemClass="tw-menu-list-item"> | ||||||
| <$transclude template="$:/core/ui/TagTemplate"/> <small class="tw-menu-list-count"><$count filter="[is[current]tagging[]]"/></small> | <$transclude title="$:/core/ui/TagTemplate"/> <small class="tw-menu-list-count"><$count filter="[is[current]tagging[]]"/></small> | ||||||
| </$list> | </$list> | ||||||
| </$reveal> | </$reveal> | ||||||
| <$reveal type="match" state="$:/state/moreSideBarTabSet" text="missingTab" qualifyTiddlerTitles="yes"> | <$reveal type="match" state="$:/state/moreSideBarTabSet" text="missingTab" qualifyTiddlerTitles="yes"> | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| title: $:/core/ui/TagTemplate | title: $:/core/ui/TagTemplate | ||||||
|  |  | ||||||
| <$button popup="$:/state/tagpopup" qualifyTiddlerTitles="yes" class="btn-invisible"><$setstyle name="background-color" value={{!!color}} class="tw-tag-label"><$transclude target={{!!icon}}/> <$view field="title" format="text" /></$setstyle></$button> | <$button popup="$:/state/tagpopup" qualifyTiddlerTitles="yes" class="btn-invisible"><$setstyle name="background-color" value={{!!color}} class="tw-tag-label"><$transclude title={{!!icon}}/> <$view field="title" format="text" /></$setstyle></$button> | ||||||
| <$reveal state="$:/state/tagpopup" type="popup" position="below" qualifyTiddlerTitles="yes" ><div class="tw-drop-down"> | <$reveal state="$:/state/tagpopup" type="popup" position="below" qualifyTiddlerTitles="yes" ><div class="tw-drop-down"> | ||||||
| <$view field="title" format="link" /> | <$view field="title" format="link" /> | ||||||
| ---- | ---- | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ title: $:/core/ui/TiddlerInfo | |||||||
| <$list filter="[is[current]listed[]!is[system]]" itemClass="tw-menu-list-item" emptyMessage="This tiddler is not listed by any others"/> | <$list filter="[is[current]listed[]!is[system]]" itemClass="tw-menu-list-item" emptyMessage="This tiddler is not listed by any others"/> | ||||||
| </$reveal> | </$reveal> | ||||||
| <$reveal type="match" state="$:/state/tiddlerDropDownTabSet" text="fieldsTab" qualifyTiddlerTitles="yes"> | <$reveal type="match" state="$:/state/tiddlerDropDownTabSet" text="fieldsTab" qualifyTiddlerTitles="yes"> | ||||||
| <$transclude template="$:/core/ui/TiddlerFields"/> | <$transclude title="$:/core/ui/TiddlerFields"/> | ||||||
| </$reveal> | </$reveal> | ||||||
| </div> | </div> | ||||||
| </div> | </div> | ||||||
| @@ -3,10 +3,10 @@ tags: $:/tags/ViewTemplate | |||||||
|  |  | ||||||
| <div class="tw-tiddler-title"><div class="title"><$setstyle name="fill" value={{!!color}}><span class="tw-tiddler-controls"><$button popup="$:/state/tiddlerInfo" qualifyTiddlerTitles="yes" class="btn-invisible">{{$:/core/images/info-button}}</$button><$button message="tw-edit-tiddler" class="btn-invisible">{{$:/core/images/edit-button}}</$button><$button message="tw-close-tiddler" class="btn-invisible">{{$:/core/images/close-button}}</$button> | <div class="tw-tiddler-title"><div class="title"><$setstyle name="fill" value={{!!color}}><span class="tw-tiddler-controls"><$button popup="$:/state/tiddlerInfo" qualifyTiddlerTitles="yes" class="btn-invisible">{{$:/core/images/info-button}}</$button><$button message="tw-edit-tiddler" class="btn-invisible">{{$:/core/images/edit-button}}</$button><$button message="tw-close-tiddler" class="btn-invisible">{{$:/core/images/close-button}}</$button> | ||||||
|  |  | ||||||
| </span><$transclude target={{!!icon}}/> <$view field="title"/></$setstyle></div> | </span><$transclude title={{!!icon}}/> <$view field="title"/></$setstyle></div> | ||||||
|  |  | ||||||
| <$reveal type="nomatch" text="" default="" state="$:/state/tiddlerInfo" qualifyTiddlerTitles="yes" class="tw-tiddler-info" animate="yes"> | <$reveal type="nomatch" text="" default="" state="$:/state/tiddlerInfo" qualifyTiddlerTitles="yes" class="tw-tiddler-info" animate="yes"> | ||||||
|  |  | ||||||
| <$transclude template="$:/core/ui/TiddlerInfo"/> | <$transclude title="$:/core/ui/TiddlerInfo"/> | ||||||
|  |  | ||||||
| </$reveal></div> | </$reveal></div> | ||||||
| @@ -1,3 +1,3 @@ | |||||||
| title: $:/state/moreSideBarTabSet-tiddlerTitle:$:/core/ui/MoreSideBar;templateTitle:$:/core/ui/MoreSideBar;-tiddlerTitle:$:/core/ui/SideBar;templateTitle:$:/core/ui/SideBar;-tiddlerTitle:$:/core/ui/PageTemplate;- | title: $:/state/moreSideBarTabSet--tiddlerTitle:$:/core/ui/MoreSideBar;--tiddlerTitle:$:/core/ui/SideBar;-tiddlerTitle:$:/core/ui/PageTemplate;- | ||||||
|  |  | ||||||
| tagsTab | tagsTab | ||||||
| @@ -1,3 +1,3 @@ | |||||||
| title: $:/state/sideBarTabSet-tiddlerTitle:$:/core/ui/SideBar;templateTitle:$:/core/ui/SideBar;-tiddlerTitle:$:/core/ui/PageTemplate;- | title: $:/state/sideBarTabSet--tiddlerTitle:$:/core/ui/SideBar;-tiddlerTitle:$:/core/ui/PageTemplate;- | ||||||
|  |  | ||||||
| openTab | openTab | ||||||
| @@ -1,6 +1,9 @@ | |||||||
| title: Docs | created: 201308241418 | ||||||
| modified: 201308201324 | creator: JeremyRuston | ||||||
|  | modified: 201308241531 | ||||||
|  | modifier: JeremyRuston | ||||||
| tags: docs introduction | tags: docs introduction | ||||||
|  | title: Docs | ||||||
|  |  | ||||||
| This is the main documentation hub for TiddlyWiki. See also the DeveloperDocs. | This is the main documentation hub for TiddlyWiki. See also the DeveloperDocs. | ||||||
|  |  | ||||||
| @@ -38,19 +41,19 @@ The machinery tying those concepts together includes: | |||||||
|  |  | ||||||
| These are the individual rules that make up WikiText: | These are the individual rules that make up WikiText: | ||||||
|  |  | ||||||
| {{{ [tag[wikitextrule]sort[title]] }}} | <$list filter="[tag[wikitextrule]sort[title]]" type="ul"/> | ||||||
|  |  | ||||||
| ! Widgets | ! Widgets | ||||||
|  |  | ||||||
| Widgets give WikiText dynamic functionality: | Widgets give WikiText dynamic functionality: | ||||||
|  |  | ||||||
| {{{ [tag[widget]sort[title]] }}} | <$list filter="[tag[widget]sort[title]]" type="ul"/> | ||||||
|  |  | ||||||
| ! Commands | ! Commands | ||||||
|  |  | ||||||
| When run under node.js, TiddlyWiki supports a [[command line interface|TiddlyWiki5 Node Edition]] with the following built-in commands: | {{command}} | ||||||
|  |  | ||||||
| {{{ [tag[command]sort[title]] }}} | <$list filter="[tag[command]sort[title]]" type="ul"/> | ||||||
|  |  | ||||||
| ! Miscellaneous | ! Miscellaneous | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,8 @@ | |||||||
| color: #8bbec7 | color: #8bbec7 | ||||||
| modified: 201306131057 | created: 201308241531 | ||||||
|  | creator: JeremyRuston | ||||||
|  | modified: 201308241531 | ||||||
|  | modifier: JeremyRuston | ||||||
| title: command | title: command | ||||||
|  |  | ||||||
|  | When run under node.js, TiddlyWiki supports a [[command line interface|TiddlyWiki5 Node Edition]] with these built-in commands. | ||||||
| @@ -1,6 +1,9 @@ | |||||||
|  | created: 201308241419 | ||||||
|  | creator: JeremyRuston | ||||||
|  | modified: 201308241419 | ||||||
|  | modifier: JeremyRuston | ||||||
|  | tags: widget docs | ||||||
| title: ListWidget | title: ListWidget | ||||||
| modified: 201308201324 |  | ||||||
| tags: widget |  | ||||||
|  |  | ||||||
| \define demoMacro(title) | \define demoMacro(title) | ||||||
| This is the tiddler called [[Blah-$title$]] | This is the tiddler called [[Blah-$title$]] | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								editions/tw5.com/tiddlers/widgets/TiddlerWidget.tid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								editions/tw5.com/tiddlers/widgets/TiddlerWidget.tid
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | created: 201308241543 | ||||||
|  | creator: JeremyRuston | ||||||
|  | modified: 201308241543 | ||||||
|  | modifier: JeremyRuston | ||||||
|  | tags: docs widget | ||||||
|  | title: TiddlerWidget | ||||||
|  |  | ||||||
|  | ! Introduction | ||||||
|  |  | ||||||
|  | The TiddlerWidget sets the ContextTiddler that applies for processing its content. | ||||||
|  |  | ||||||
|  | ! Content and Attributes | ||||||
|  |  | ||||||
|  | |!Attribute |!Description | | ||||||
|  | |title |The title of the tiddler to become the new ContextTiddler | | ||||||
|  | |class |CSS classes to added to the generated elements | | ||||||
							
								
								
									
										23
									
								
								editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | created: 201308241425 | ||||||
|  | creator: JeremyRuston | ||||||
|  | modified: 201308241530 | ||||||
|  | modifier: JeremyRuston | ||||||
|  | tags: widget docs | ||||||
|  | title: TranscludeWidget | ||||||
|  |  | ||||||
|  | ! Introduction | ||||||
|  |  | ||||||
|  | The TranscludeWidget dynamically imports content from another tiddler. | ||||||
|  |  | ||||||
|  | ! Attributes | ||||||
|  |  | ||||||
|  | |!Attribute |!Description | | ||||||
|  | |title |The title of the tiddler to transclude (defaults to the current tiddler) | | ||||||
|  | |field |The field name of the current tiddler (defaults to "text"; if present takes precedence over the index attribute) | | ||||||
|  | |index |The index of a property in a [[DataTiddler|DataTiddlers]] | | ||||||
|  | |class |CSS classes to added to the generated elements | | ||||||
|  | |style |CSS styles to be added to the generated elements | | ||||||
|  | |tooltip |Tooltip to be added to the generated elements | | ||||||
|  |  | ||||||
|  | The TranscludeWidget ignores any contained content. | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Jeremy Ruston
					Jeremy Ruston