diff --git a/core/modules/macros/view/view.js b/core/modules/macros/view/view.js index cff3edd67..976074da1 100644 --- a/core/modules/macros/view/view.js +++ b/core/modules/macros/view/view.js @@ -48,14 +48,22 @@ exports.executeMacro = function() { } // Figure out which viewer to use // TODO: Tiddler field modules should be able to specify a field type from which the viewer is derived + var Viewer; if(tiddler && this.params.format) { - var viewer = this.wiki.macros.view.fieldviewers[this.params.format]; + Viewer = this.wiki.macros.view.fieldviewers[this.params.format]; } - if(!viewer) { - viewer = this.wiki.macros.view.fieldviewers["text"]; + if(!Viewer) { + Viewer = this.wiki.macros.view.fieldviewers["text"]; } + this.viewer = new Viewer(this,tiddler,field,value); // Call the viewer to generate the content - return viewer(tiddler,field,value,this); + return this.viewer.render(); +}; + +exports.postRenderInDom = function() { + if(this.viewer.postRenderInDom) { + this.viewer.postRenderInDom(); + } }; })(); diff --git a/core/modules/macros/view/viewers/date.js b/core/modules/macros/view/viewers/date.js index c017576d1..66ad821cd 100644 --- a/core/modules/macros/view/viewers/date.js +++ b/core/modules/macros/view/viewers/date.js @@ -12,15 +12,22 @@ A viewer for viewing tiddler fields as a date /*global $tw: false */ "use strict"; -function renderValue(tiddler,field,value,viewMacro) { - var template = viewMacro.params.template || "DD MMM YYYY"; - if(value === undefined) { +var DateViewer = function(viewMacro,tiddler,field,value) { + this.viewMacro = viewMacro; + this.tiddler = tiddler; + this.field = field; + this.value = value; +}; + +DateViewer.prototype.render = function() { + var template = this.viewMacro.params.template || "DD MMM YYYY"; + if(this.value === undefined) { return $tw.Tree.Text(""); } else { - return $tw.Tree.Text($tw.utils.formatDateString(value,template)); + return $tw.Tree.Text($tw.utils.formatDateString(this.value,template)); } -} +}; -exports["date"] = renderValue; +exports["date"] = DateViewer; })(); diff --git a/core/modules/macros/view/viewers/link.js b/core/modules/macros/view/viewers/link.js index 2031680ac..acd7f1e54 100644 --- a/core/modules/macros/view/viewers/link.js +++ b/core/modules/macros/view/viewers/link.js @@ -12,21 +12,28 @@ A viewer for viewing tiddler fields as a link /*global $tw: false */ "use strict"; -function renderValue(tiddler,field,value,viewMacro) { - if(value === undefined) { +var LinkViewer = function(viewMacro,tiddler,field,value) { + this.viewMacro = viewMacro; + this.tiddler = tiddler; + this.field = field; + this.value = value; +}; + +LinkViewer.prototype.render = function() { + if(this.value === undefined) { return $tw.Tree.Text(""); } else { var link = $tw.Tree.Macro("link",{ - srcParams: {to: value}, - content: [$tw.Tree.Text(value)], - isBlock: viewMacro.isBlock, - wiki: viewMacro.wiki + srcParams: {to: this.value}, + content: [$tw.Tree.Text(this.value)], + isBlock: this.viewMacro.isBlock, + wiki: this.viewMacro.wiki }); - link.execute(viewMacro.parents,viewMacro.tiddlerTitle); + link.execute(this.viewMacro.parents,this.viewMacro.tiddlerTitle); return link; } } -exports["link"] = renderValue; +exports["link"] = LinkViewer; })(); diff --git a/core/modules/macros/view/viewers/relativedate.js b/core/modules/macros/view/viewers/relativedate.js index 8c239f7e3..055fad996 100644 --- a/core/modules/macros/view/viewers/relativedate.js +++ b/core/modules/macros/view/viewers/relativedate.js @@ -12,16 +12,62 @@ A viewer for viewing tiddler fields as a relative date /*global $tw: false */ "use strict"; -function renderValue(tiddler,field,value,viewMacro) { - if(value === undefined) { +var RelativeDateViewer = function(viewMacro,tiddler,field,value) { + this.viewMacro = viewMacro; + this.tiddler = tiddler; + this.field = field; + this.value = value; +}; + +RelativeDateViewer.prototype.render = function() { + if(this.value === undefined) { return $tw.Tree.Text(""); } else { - return $tw.Tree.Text( - $tw.utils.getRelativeDate((new Date()) - value).description - ); + this.relativeDate = $tw.utils.getRelativeDate((new Date()) - this.value); + return $tw.Tree.Element(this.viewMacro.isBlock ? "div" : "span",{},[ + $tw.Tree.Text( + this.relativeDate.description + ) + ]); } -} +}; -exports["relativedate"] = renderValue; +/* +Trigger the timer when the relative date is put into the DOM +*/ +RelativeDateViewer.prototype.postRenderInDom = function() { + if(this.relativeDate) { + this.setTimer(); + } +}; + +/* +Trigger the timer for the next update of the relative date +*/ +RelativeDateViewer.prototype.setTimer = function() { + var self = this; + if(this.relativeDate.updatePeriod < 24 * 60 * 60 * 1000) { + window.setTimeout(function() { + // Only call the update function if the dom node is still in the document + if($tw.utils.domContains(document,self.viewMacro.child.domNode)) { + self.update.call(self); + } + },this.relativeDate.updatePeriod); + } +}; + +/* +Update the relative date display, and trigger the timer for the next update +*/ +RelativeDateViewer.prototype.update = function() { + while(this.viewMacro.child.domNode.hasChildNodes()) { + this.viewMacro.child.domNode.removeChild(this.viewMacro.child.domNode.firstChild); + } + this.relativeDate = $tw.utils.getRelativeDate((new Date()) - this.value); + this.viewMacro.child.domNode.appendChild(document.createTextNode(this.relativeDate.description)); + this.setTimer(); +}; + +exports["relativedate"] = RelativeDateViewer; })(); diff --git a/core/modules/macros/view/viewers/text.js b/core/modules/macros/view/viewers/text.js index 64c04cb36..c88fadd7d 100644 --- a/core/modules/macros/view/viewers/text.js +++ b/core/modules/macros/view/viewers/text.js @@ -12,19 +12,26 @@ A viewer for viewing tiddler fields as plain text /*global $tw: false */ "use strict"; -function renderValue(tiddler,field,value,viewMacro) { +var TextViewer = function(viewMacro,tiddler,field,value) { + this.viewMacro = viewMacro; + this.tiddler = tiddler; + this.field = field; + this.value = value; +}; + +TextViewer.prototype.render = function() { // Get the value as a string - if(field !== "text" && tiddler) { - value = tiddler.getFieldString(field); + if(this.field !== "text" && this.tiddler) { + this.value = this.tiddler.getFieldString(this.field); } // Return the text - if(value === undefined || value === null) { + if(this.value === undefined || this.value === null) { return $tw.Tree.Text(""); } else { - return $tw.Tree.Text(value); + return $tw.Tree.Text(this.value); } } -exports["text"] = renderValue; +exports["text"] = TextViewer; })(); diff --git a/core/modules/macros/view/viewers/transclude.js b/core/modules/macros/view/viewers/transclude.js index 26341beba..f81d82ec7 100644 --- a/core/modules/macros/view/viewers/transclude.js +++ b/core/modules/macros/view/viewers/transclude.js @@ -12,20 +12,27 @@ A viewer that transcludes the tiddler whose title is specified in the viewed fie /*global $tw: false */ "use strict"; -function renderValue(tiddler,field,value,viewMacro) { - if(tiddler && viewMacro.params.field && (viewMacro.params.field in tiddler.fields)) { - var children = viewMacro.wiki.parseTiddler(tiddler.fields[viewMacro.params.field]).tree, +var TranscludeViewer = function(viewMacro,tiddler,field,value) { + this.viewMacro = viewMacro; + this.tiddler = tiddler; + this.field = field; + this.value = value; +}; + +TranscludeViewer.prototype.render = function() { + if(this.tiddler && this.viewMacro.params.field && (this.viewMacro.params.field in this.tiddler.fields)) { + var children = this.viewMacro.wiki.parseTiddler(this.tiddler.fields[this.viewMacro.params.field]).tree, childrenClone = [],t; for(t=0; t> macro")]; } else { - children = viewMacro.wiki.parseTiddler(tiddler.fields.title).tree; + children = this.viewMacro.wiki.parseTiddler(this.tiddler.fields.title).tree; } parents = parents.slice(0); - parents.push(tiddler.fields.title); + parents.push(this.tiddler.fields.title); } else { - children = viewMacro.wiki.parseText("text/x-tiddlywiki",value).tree; + children = this.viewMacro.wiki.parseText("text/x-tiddlywiki",value).tree; } // Clone and execute the parsed wikitext for(t=0; t