1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-23 18:17:20 +00:00

Refactor wiki.filterTiddlers()

Now we pass a widget instead of the current tiddler title. We can use
widget.getVariable(“currentTiddler”) to get the current tiddler.
This commit is contained in:
Jermolene 2014-04-27 20:03:33 +01:00
parent 61c204366f
commit 385c7e207c
7 changed files with 30 additions and 32 deletions

View File

@ -149,22 +149,22 @@ exports.getFilterOperators = function() {
return this.filterOperators; return this.filterOperators;
}; };
exports.filterTiddlers = function(filterString,currTiddlerTitle,source) { exports.filterTiddlers = function(filterString,widget,source) {
var fn = this.compileFilter(filterString); var fn = this.compileFilter(filterString);
return fn.call(this,source,currTiddlerTitle); return fn.call(this,source,widget);
}; };
/* /*
Compile a filter into a function with the signature fn(source,currTiddlerTitle) where: Compile a filter into a function with the signature fn(source,widget) where:
source: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title) source: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)
currTiddlerTitle: the optional name of the current tiddler widget: an optional widget node for retrieving the current tiddler etc.
*/ */
exports.compileFilter = function(filterString) { exports.compileFilter = function(filterString) {
var filterParseTree; var filterParseTree;
try { try {
filterParseTree = this.parseFilter(filterString); filterParseTree = this.parseFilter(filterString);
} catch(e) { } catch(e) {
return function(source,currTiddlerTitle) { return function(source,widget) {
return ["Filter error: " + e]; return ["Filter error: " + e];
}; };
} }
@ -176,9 +176,10 @@ exports.compileFilter = function(filterString) {
var self = this; var self = this;
$tw.utils.each(filterParseTree,function(operation) { $tw.utils.each(filterParseTree,function(operation) {
// Create a function for the chain of operators in the operation // Create a function for the chain of operators in the operation
var operationSubFunction = function(source,currTiddlerTitle) { var operationSubFunction = function(source,widget) {
var accumulator = source, var accumulator = source,
results = []; results = [],
currTiddlerTitle = widget && widget.getVariable("currentTiddler");
$tw.utils.each(operation.operators,function(operator) { $tw.utils.each(operation.operators,function(operator) {
var operand = operator.operand, var operand = operator.operand,
operatorFunction; operatorFunction;
@ -200,7 +201,7 @@ exports.compileFilter = function(filterString) {
regexp: operator.regexp regexp: operator.regexp
},{ },{
wiki: self, wiki: self,
currTiddlerTitle: currTiddlerTitle widget: widget
}); });
accumulator = self.makeTiddlerIterator(results); accumulator = self.makeTiddlerIterator(results);
}); });
@ -210,25 +211,25 @@ exports.compileFilter = function(filterString) {
operationFunctions.push((function() { operationFunctions.push((function() {
switch(operation.prefix || "") { switch(operation.prefix || "") {
case "": // No prefix means that the operation is unioned into the result case "": // No prefix means that the operation is unioned into the result
return function(results,source,currTiddlerTitle) { return function(results,source,widget) {
$tw.utils.pushTop(results,operationSubFunction(source,currTiddlerTitle)); $tw.utils.pushTop(results,operationSubFunction(source,widget));
}; };
case "-": // The results of this operation are removed from the main result case "-": // The results of this operation are removed from the main result
return function(results,source,currTiddlerTitle) { return function(results,source,widget) {
$tw.utils.removeArrayEntries(results,operationSubFunction(source,currTiddlerTitle)); $tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));
}; };
case "+": // This operation is applied to the main results so far case "+": // This operation is applied to the main results so far
return function(results,source,currTiddlerTitle) { return function(results,source,widget) {
// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved // This replaces all the elements of the array, but keeps the actual array so that references to it are preserved
source = self.makeTiddlerIterator(results); source = self.makeTiddlerIterator(results);
results.splice(0,results.length); results.splice(0,results.length);
$tw.utils.pushTop(results,operationSubFunction(source,currTiddlerTitle)); $tw.utils.pushTop(results,operationSubFunction(source,widget));
}; };
} }
})()); })());
}); });
// Return a function that applies the operations to a source iterator of tiddler titles // Return a function that applies the operations to a source iterator of tiddler titles
return $tw.perf.measure("filter",function filterFunction(source,currTiddlerTitle) { return $tw.perf.measure("filter",function filterFunction(source,widget) {
if(!source) { if(!source) {
source = self.each; source = self.each;
} else if(typeof source === "object") { // Array or hashmap } else if(typeof source === "object") { // Array or hashmap
@ -236,7 +237,7 @@ exports.compileFilter = function(filterString) {
} }
var results = []; var results = [];
$tw.utils.each(operationFunctions,function(operationFunction) { $tw.utils.each(operationFunctions,function(operationFunction) {
operationFunction(results,source,currTiddlerTitle); operationFunction(results,source,widget);
}); });
return results; return results;
}); });

View File

@ -16,8 +16,9 @@ Filter function for [all[current]]
Export our filter function Export our filter function
*/ */
exports.current = function(source,prefix,options) { exports.current = function(source,prefix,options) {
if(options.currTiddlerTitle) { var currTiddlerTitle = options.widget && options.widget.getVariable("currentTiddler");
return [options.currTiddlerTitle]; if(currTiddlerTitle) {
return [currTiddlerTitle];
} else { } else {
return []; return [];
} }

View File

@ -16,16 +16,17 @@ Filter function for [is[current]]
Export our filter function Export our filter function
*/ */
exports.current = function(source,prefix,options) { exports.current = function(source,prefix,options) {
var results = []; var results = [],
currTiddlerTitle = options.widget && options.widget.getVariable("currentTiddler");
if(prefix === "!") { if(prefix === "!") {
source(function(tiddler,title) { source(function(tiddler,title) {
if(title !== options.currTiddlerTitle) { if(title !== currTiddlerTitle) {
results.push(title); results.push(title);
} }
}); });
} else { } else {
source(function(tiddler,title) { source(function(tiddler,title) {
if(title === options.currTiddlerTitle) { if(title === currTiddlerTitle) {
results.push(title); results.push(title);
} }
}); });

View File

@ -18,7 +18,8 @@ Export our filter function
exports.list = function(source,operator,options) { exports.list = function(source,operator,options) {
var results = [], var results = [],
tr = $tw.utils.parseTextReference(operator.operand), tr = $tw.utils.parseTextReference(operator.operand),
list = options.wiki.getTiddlerList(tr.title || options.currTiddlerTitle,tr.field,tr.index); currTiddlerTitle = options.widget && options.widget.getVariable("currentTiddler"),
list = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);
if(operator.prefix === "!") { if(operator.prefix === "!") {
source(function(tiddler,title) { source(function(tiddler,title) {
if(list.indexOf(title) === -1) { if(list.indexOf(title) === -1) {

View File

@ -43,7 +43,7 @@ CountWidget.prototype.execute = function() {
this.filter = this.getAttribute("filter"); this.filter = this.getAttribute("filter");
// Execute the filter // Execute the filter
if(this.filter) { if(this.filter) {
this.currentCount = this.wiki.filterTiddlers(this.filter,this.getVariable("currentTiddler")).length; this.currentCount = this.wiki.filterTiddlers(this.filter,this).length;
} else { } else {
this.currentCount = undefined; this.currentCount = undefined;
} }

View File

@ -60,14 +60,8 @@ EncryptWidget.prototype.execute = function() {
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/ */
EncryptWidget.prototype.refresh = function(changedTiddlers) { EncryptWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes(), // We don't need to worry about refreshing because the encrypt widget isn't for interactive use
affectedTiddlers = this.wiki.filterTiddlers(this.filter,null,changedTiddlers); return false;
if(changedAttributes.filter || affectedTiddlers.length > 0) {
this.refreshSelf();
return true;
} else {
return false;
}
}; };
exports.encrypt = EncryptWidget; exports.encrypt = EncryptWidget;

View File

@ -80,7 +80,7 @@ ListWidget.prototype.execute = function() {
ListWidget.prototype.getTiddlerList = function() { ListWidget.prototype.getTiddlerList = function() {
var defaultFilter = "[!is[system]sort[title]]"; var defaultFilter = "[!is[system]sort[title]]";
return this.wiki.filterTiddlers(this.getAttribute("filter",defaultFilter),this.getVariable("currentTiddler")); return this.wiki.filterTiddlers(this.getAttribute("filter",defaultFilter),this);
}; };
ListWidget.prototype.getEmptyMessage = function() { ListWidget.prototype.getEmptyMessage = function() {