1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-10-02 08:50:46 +00:00

Refactored macro event handling

Updated the slider macro to use the new mechanism to start with
This commit is contained in:
Jeremy Ruston 2012-02-02 17:48:09 +00:00
parent 449f322a86
commit f576c86b41
5 changed files with 57 additions and 18 deletions

View File

@ -108,23 +108,9 @@ var App = function() {
navigators.registerNavigator("StoryNavigator",new StoryNavigator(navigators));
// Use the story navigator for all links
navigators.install("a","StoryNavigator");
// Install an event handler for sliders
document.addEventListener("click",function(e) {
var el = e.target,
matchesSelector = el.matchesSelector || el.mozMatchesSelector ||
el.webkitMatchesSelector || el.oMatchesSelector || el.msMatchesSelector;
if(matchesSelector && matchesSelector.call(el,".tw-slider-label")) {
var currState = el.nextSibling.style.display;
el.nextSibling.style.display = currState === "block" ? "none" : "block";
e.preventDefault();
return false;
} else {
return true;
}
},false);
// Open the PageTemplate
var div = document.createElement("div");
div.innerHTML = this.store.renderTiddler("text/html","PageTemplate");
this.store.renderTiddlerInNode(div,"PageTemplate");
document.body.appendChild(div);
// Set up a timer to change the value of a tiddler
var me = this;

View File

@ -382,6 +382,48 @@ WikiStore.prototype.renderTiddler = function(targetType,title,templateTitle,opti
return null;
};
/*
Renders a tiddler and inserts the HTML into a DOM node, and then attaches the event handlers needed by macros
*/
WikiStore.prototype.renderTiddlerInNode = function(node,title,templateTitle,options) {
node.innerHTML = this.renderTiddler("text/html",title,templateTitle,options);
this.attachEventHandlers(node,title,templateTitle);
};
/*
Recursively attach macro event handlers for a node and its children
*/
WikiStore.prototype.attachEventHandlers = function(node,renderTiddler,renderTemplate) {
var me = this,
dispatchMacroEvent = function(event) {
var renderer = me.compileTiddler(renderTemplate ? renderTemplate : renderTiddler,"text/html"),
macroName = node.getAttribute("data-tw-macro"),
macro = me.macros[macroName],
step = node.getAttribute("data-tw-render-step");
macro.events[event.type](event,node,renderTiddler,me,renderer.renderSteps[step].params(renderTiddler,renderer,me,utils));
};
if(node.getAttribute) {
var macroName = node.getAttribute("data-tw-macro");
if(typeof macroName === "string") {
var macro = this.macros[macroName];
if(macro.events) {
for(var e in macro.events) {
node.addEventListener(e,dispatchMacroEvent,false);
}
}
}
if(node.hasAttribute("data-tw-render-tiddler")) {
renderTiddler = node.getAttribute("data-tw-render-tiddler");
renderTemplate = node.getAttribute("data-tw-render-template");
}
}
if(node.hasChildNodes) {
for(var t=0; t<node.childNodes.length; t++) {
this.attachEventHandlers(node.childNodes[t],renderTiddler,renderTemplate);
}
}
};
WikiStore.prototype.installMacro = function(macro) {
this.macros[macro.name] = macro;
};
@ -437,7 +479,7 @@ WikiStore.prototype.refreshDomNode = function(node,changes,renderer,tiddler) {
if(renderTiddler !== null) {
// Rerender the content of the node if the tiddler being rendered has changed
if(changes.hasOwnProperty(renderTiddler) || (renderTemplate && changes.hasOwnProperty(renderTemplate))) {
node.innerHTML = this.renderTiddler("text/html",renderTiddler,renderTemplate,{noWrap: true});
this.renderTiddlerInNode(node,renderTiddler,renderTemplate,{noWrap: true});
} else {
// If it hasn't changed, just refresh the child nodes
if(typeof renderTemplate !== "string") {

View File

@ -18,6 +18,14 @@ exports.macro = {
label: {byPos: 2, type: "text", optional: false},
tooltip: {byPos: 3, type: "text", optional: true}
},
events: {
click: function(event,node,tiddler,store,params) {
var el = node.firstChild.firstChild.nextSibling;
el.style.display = el.style.display === "block" ? "none" : "block";
event.preventDefault();
return false;
}
},
render: function(type,tiddler,store,params) {
if(type === "text/html") {
return utils.stitchSlider(type,

View File

@ -67,7 +67,7 @@ exports.macro = {
if(tiddlerNode === null) {
// If not, render the tiddler
var tmpNode = document.createElement("div");
tmpNode.innerHTML = store.renderTiddler(type,targetTiddlers[t],params.template);
store.renderTiddlerInNode(tmpNode,targetTiddlers[t],params.template);
tiddlerNode = tmpNode.firstChild;
node.insertBefore(tiddlerNode,currNode);
} else {

View File

@ -95,6 +95,10 @@ a.tw-tiddlylink-missing {
font-style: italic;
}
a.tw-slider-label::after {
content: "\00a0\27a4";
}
.label {
text-transform: uppercase;
font-weight: bold;
@ -207,7 +211,6 @@ a.tw-tiddlylink-missing {
text-shadow: rgba(255, 255, 255, 0.746094) 0px 1px 1px;
text-transform: none;
vertical-align: baseline;
width: 131px;
word-spacing: 0px;
}