From aa7b9441fde7ecee8b5d9ea4b568e6fe96aaa0e4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Wed, 1 May 2013 12:02:33 +0100 Subject: [PATCH] Add a linkcatcher widget It intercepts navigation events and saves the target tiddler title into a specified text reference --- core/modules/widgets/linkcatcher.js | 56 +++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 core/modules/widgets/linkcatcher.js diff --git a/core/modules/widgets/linkcatcher.js b/core/modules/widgets/linkcatcher.js new file mode 100644 index 000000000..9e69cbb0b --- /dev/null +++ b/core/modules/widgets/linkcatcher.js @@ -0,0 +1,56 @@ +/*\ +title: $:/core/modules/widget/linkcatcher.js +type: application/javascript +module-type: widget + +Implements the linkcatcher widget. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var LinkCatcherWidget = function(renderer) { + // Save state + this.renderer = renderer; + // Generate child nodes + this.generate(); +}; + +LinkCatcherWidget.prototype.generate = function() { + // Get our attributes + this.to = this.renderer.getAttribute("to"); + // Set the element + this.tag = "div"; + this.attributes = { + "class": "tw-linkcatcher" + }; + this.children = this.renderer.renderTree.createRenderers(this.renderer.renderContext,this.renderer.parseTreeNode.children); + this.events = [ + {name: "tw-navigate", handlerObject: this, handlerMethod: "handleNavigateEvent"} + ]; +}; + +LinkCatcherWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) { + // 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); + } + }); +}; + +// Navigate to a specified tiddler +LinkCatcherWidget.prototype.handleNavigateEvent = function(event) { + if(this.to) { + this.renderer.renderTree.wiki.setTextReference(this.to,event.navigateTo,this.renderer.getContextTiddlerTitle()); + } + event.stopPropagation(); + return false; +}; + +exports.linkcatcher = LinkCatcherWidget; + +})();