mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-29 03:20:27 +00:00
Merge branch 'saner-filters'
This commit is contained in:
commit
426281539a
71
boot/boot.js
71
boot/boot.js
@ -32,8 +32,8 @@ if(!$tw) {
|
||||
$tw = require("./bootprefix.js").bootprefix();
|
||||
}
|
||||
|
||||
$tw.utils = $tw.utils || {};
|
||||
$tw.boot = $tw.boot || {};
|
||||
$tw.utils = $tw.utils || Object.create(null);
|
||||
$tw.boot = $tw.boot || Object.create(null);
|
||||
|
||||
/////////////////////////// Standard node.js libraries
|
||||
|
||||
@ -73,13 +73,11 @@ Iterate through all the own properties of an object or array. Callback is invoke
|
||||
$tw.utils.each = function(object,callback) {
|
||||
var f;
|
||||
if(object) {
|
||||
if($tw.utils.isArray(object)) {
|
||||
for(f=0; f<object.length; f++) {
|
||||
callback(object[f],f,object);
|
||||
}
|
||||
if(Object.prototype.toString.call(object) == "[object Array]") {
|
||||
object.forEach(callback);
|
||||
} else {
|
||||
for(f in object) {
|
||||
if($tw.utils.hop(object,f)) {
|
||||
if(Object.prototype.hasOwnProperty.call(object,f)) {
|
||||
callback(object[f],f,object);
|
||||
}
|
||||
}
|
||||
@ -282,7 +280,7 @@ $tw.utils.parseStringArray = function(value) {
|
||||
|
||||
// Parse a block of name:value fields. The `fields` object is used as the basis for the return value
|
||||
$tw.utils.parseFields = function(text,fields) {
|
||||
fields = fields || {};
|
||||
fields = fields || Object.create(null);
|
||||
text.split(/\r?\n/mg).forEach(function(line) {
|
||||
if(line.charAt(0) !== "#") {
|
||||
var p = line.indexOf(":");
|
||||
@ -387,7 +385,7 @@ $tw.utils.registerFileType = function(type,encoding,extension,flags) {
|
||||
Run code globally with specified context variables in scope
|
||||
*/
|
||||
$tw.utils.evalGlobal = function(code,context,filename) {
|
||||
var contextCopy = $tw.utils.extend({},context);
|
||||
var contextCopy = $tw.utils.extend(Object.create(null),context);
|
||||
// Get the context variables as a pair of arrays of names and values
|
||||
var contextNames = [], contextValues = [];
|
||||
$tw.utils.each(contextCopy,function(value,name) {
|
||||
@ -399,7 +397,7 @@ $tw.utils.evalGlobal = function(code,context,filename) {
|
||||
// Compile the code into a function
|
||||
var fn;
|
||||
if($tw.browser) {
|
||||
fn = window["eval"](code);
|
||||
fn = window["eval"](code + "\n\n//# sourceURL=" + filename);
|
||||
} else {
|
||||
fn = vm.runInThisContext(code,filename);
|
||||
}
|
||||
@ -411,7 +409,7 @@ $tw.utils.evalGlobal = function(code,context,filename) {
|
||||
Run code in a sandbox with only the specified context variables in scope
|
||||
*/
|
||||
$tw.utils.evalSandboxed = $tw.browser ? $tw.utils.evalGlobal : function(code,context,filename) {
|
||||
var sandbox = $tw.utils.extend({},context);
|
||||
var sandbox = $tw.utils.extend(Object.create(null),context);
|
||||
vm.runInNewContext(code,sandbox,filename);
|
||||
return sandbox.exports;
|
||||
};
|
||||
@ -684,7 +682,7 @@ Get all the modules of a particular type in a hashmap by their `name` field
|
||||
*/
|
||||
$tw.modules.getModulesByTypeAsHashmap = function(moduleType,nameField) {
|
||||
nameField = nameField || "name";
|
||||
var results = {};
|
||||
var results = Object.create(null);
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,module) {
|
||||
results[module[nameField]] = module;
|
||||
});
|
||||
@ -696,7 +694,7 @@ Apply the exports of the modules of a particular type to a target object
|
||||
*/
|
||||
$tw.modules.applyMethods = function(moduleType,targetObject) {
|
||||
if(!targetObject) {
|
||||
targetObject = {};
|
||||
targetObject = Object.create(null);
|
||||
}
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,module) {
|
||||
$tw.utils.each(module,function(element,title,object) {
|
||||
@ -710,7 +708,7 @@ $tw.modules.applyMethods = function(moduleType,targetObject) {
|
||||
Return an array of classes created from the modules of a specified type. Each module should export the properties to be added to those of the optional base class
|
||||
*/
|
||||
$tw.modules.createClassesFromModules = function(moduleType,subType,baseClass) {
|
||||
var classes = {};
|
||||
var classes = Object.create(null);
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,moduleExports) {
|
||||
if(!subType || moduleExports.types[subType]) {
|
||||
var newClass = function() {};
|
||||
@ -732,7 +730,7 @@ Construct a tiddler object from a hashmap of tiddler fields. If multiple hasmaps
|
||||
taking precedence to the right
|
||||
*/
|
||||
$tw.Tiddler = function(/* [fields,] fields */) {
|
||||
this.fields = {};
|
||||
this.fields = Object.create(null);
|
||||
for(var c=0; c<arguments.length; c++) {
|
||||
var arg = arguments[c],
|
||||
src = (arg instanceof $tw.Tiddler) ? arg.fields : arg;
|
||||
@ -805,10 +803,10 @@ shadowTiddlers: Array of shadow tiddlers to be added
|
||||
$tw.Wiki = function(options) {
|
||||
options = options || {};
|
||||
var self = this,
|
||||
tiddlers = {}, // Hashmap of tiddlers
|
||||
tiddlers = Object.create(null), // Hashmap of tiddlers
|
||||
pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority
|
||||
pluginInfo = {}, // Hashmap of parsed plugin content
|
||||
shadowTiddlers = options.shadowTiddlers || {}; // Hashmap by title of {source:, tiddler:}
|
||||
pluginInfo = Object.create(null), // Hashmap of parsed plugin content
|
||||
shadowTiddlers = options.shadowTiddlers || Object.create(null); // Hashmap by title of {source:, tiddler:}
|
||||
|
||||
// Add a tiddler to the store
|
||||
this.addTiddler = function(tiddler) {
|
||||
@ -840,20 +838,16 @@ $tw.Wiki = function(options) {
|
||||
var t = tiddlers[title];
|
||||
if(t instanceof $tw.Tiddler) {
|
||||
return t;
|
||||
} else if(title !== undefined && $tw.utils.hop(shadowTiddlers,title)) {
|
||||
} else if(title !== undefined && Object.prototype.hasOwnProperty.call(shadowTiddlers,title)) {
|
||||
return shadowTiddlers[title].tiddler;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
|
||||
// Get a hashmap of all tiddler titles
|
||||
this.getAllTitles = function() {
|
||||
var results = {};
|
||||
for(var title in tiddlers) {
|
||||
results[title] = true;
|
||||
}
|
||||
return results;
|
||||
// Get an array of all tiddler titles
|
||||
this.allTitles = function() {
|
||||
return Object.keys(tiddlers);
|
||||
};
|
||||
|
||||
// Iterate through all tiddler titles
|
||||
@ -863,6 +857,11 @@ $tw.Wiki = function(options) {
|
||||
}
|
||||
};
|
||||
|
||||
// Get an array of all shadow tiddler titles
|
||||
this.allShadowTitles = function() {
|
||||
return Object.keys(shadowTiddlers);
|
||||
};
|
||||
|
||||
// Iterate through all shadow tiddler titles
|
||||
this.eachShadow = function(callback) {
|
||||
for(var title in shadowTiddlers) {
|
||||
@ -961,7 +960,7 @@ $tw.Wiki = function(options) {
|
||||
}
|
||||
});
|
||||
// Now go through the plugins in ascending order and assign the shadows
|
||||
shadowTiddlers = {};
|
||||
shadowTiddlers = Object.create(null);
|
||||
$tw.utils.each(pluginTiddlers,function(tiddler) {
|
||||
// Extract the constituent tiddlers
|
||||
if($tw.utils.hop(pluginInfo,tiddler.fields.title)) {
|
||||
@ -1034,9 +1033,9 @@ $tw.Wiki.prototype.defineShadowModules = function() {
|
||||
Extracts tiddlers from a typed block of text, specifying default field values
|
||||
*/
|
||||
$tw.Wiki.prototype.deserializeTiddlers = function(type,text,srcFields) {
|
||||
srcFields = srcFields || {};
|
||||
srcFields = srcFields || Object.create(null);
|
||||
var deserializer = $tw.Wiki.tiddlerDeserializerModules[type],
|
||||
fields = {};
|
||||
fields = Object.create(null);
|
||||
if(!deserializer && $tw.config.fileExtensionInfo[type]) {
|
||||
// If we didn't find the serializer, try converting it from an extension to a content type
|
||||
type = $tw.config.fileExtensionInfo[type].type;
|
||||
@ -1099,7 +1098,7 @@ $tw.modules.define("$:/boot/tiddlerdeserializer/tids","tiddlerdeserializer",{
|
||||
if(line.charAt(0) !== "#") {
|
||||
var colonPos= line.indexOf(": ");
|
||||
if(colonPos !== -1) {
|
||||
var tiddler = $tw.utils.extend({},fields);
|
||||
var tiddler = $tw.utils.extend(Object.create(null),fields);
|
||||
tiddler.title = (tiddler.title || "") + line.substr(0,colonPos);
|
||||
if(titles.indexOf(tiddler.title) !== -1) {
|
||||
console.log("Warning: .multids file contains multiple definitions for " + tiddler.title);
|
||||
@ -1370,7 +1369,7 @@ $tw.loadPluginFolder = function(filepath,excludeRegExp) {
|
||||
}
|
||||
}
|
||||
// Save the plugin tiddlers into the plugin info
|
||||
pluginInfo.tiddlers = pluginInfo.tiddlers || {};
|
||||
pluginInfo.tiddlers = pluginInfo.tiddlers || Object.create(null);
|
||||
for(t=0; t<pluginTiddlers.length; t++) {
|
||||
if(pluginTiddlers[t].title) {
|
||||
pluginInfo.tiddlers[pluginTiddlers[t].title] = pluginTiddlers[t];
|
||||
@ -1547,7 +1546,7 @@ $tw.boot.startup = function(options) {
|
||||
// Initialise some more $tw properties
|
||||
$tw.utils.deepDefaults($tw,{
|
||||
modules: { // Information about each module
|
||||
titles: {}, // hashmap by module title of {fn:, exports:, moduleType:}
|
||||
titles: Object.create(null), // hashmap by module title of {fn:, exports:, moduleType:}
|
||||
types: {} // hashmap by module type of hashmap of exports
|
||||
},
|
||||
config: { // Configuration overridables
|
||||
@ -1561,13 +1560,13 @@ $tw.boot.startup = function(options) {
|
||||
wikiLanguagesSubDir: "./languages",
|
||||
wikiTiddlersSubDir: "./tiddlers",
|
||||
jsModuleHeaderRegExpString: "^\\/\\*\\\\(?:\\r?\\n)((?:^[^\\r\\n]*(?:\\r?\\n))+?)(^\\\\\\*\\/$(?:\\r?\\n)?)",
|
||||
fileExtensionInfo: {}, // Map file extension to {type:}
|
||||
contentTypeInfo: {} // Map type to {encoding:,extension:}
|
||||
fileExtensionInfo: Object.create(null), // Map file extension to {type:}
|
||||
contentTypeInfo: Object.create(null) // Map type to {encoding:,extension:}
|
||||
}
|
||||
});
|
||||
if(!options.readBrowserTiddlers) {
|
||||
// For writable tiddler files, a hashmap of title to {filepath:,type:,hasMetaFile:}
|
||||
$tw.boot.files = {};
|
||||
$tw.boot.files = Object.create(null);
|
||||
// System paths and filenames
|
||||
$tw.boot.bootPath = path.dirname(module.filename);
|
||||
$tw.boot.corePath = path.resolve($tw.boot.bootPath,"../core");
|
||||
@ -1614,7 +1613,7 @@ $tw.boot.startup = function(options) {
|
||||
// Install built in tiddler fields modules
|
||||
$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield");
|
||||
// Install the tiddler deserializer modules
|
||||
$tw.Wiki.tiddlerDeserializerModules = {};
|
||||
$tw.Wiki.tiddlerDeserializerModules = Object.create(null);
|
||||
$tw.modules.applyMethods("tiddlerdeserializer",$tw.Wiki.tiddlerDeserializerModules);
|
||||
// Load tiddlers
|
||||
if(options.readBrowserTiddlers) {
|
||||
|
@ -3,7 +3,7 @@ title: $:/core/modules/filters.js
|
||||
type: application/javascript
|
||||
module-type: wikimethod
|
||||
|
||||
Adds tiddler filtering to the $tw.Wiki object.
|
||||
Adds tiddler filtering methods to the $tw.Wiki object.
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
@ -149,11 +149,16 @@ exports.getFilterOperators = function() {
|
||||
return this.filterOperators;
|
||||
};
|
||||
|
||||
exports.filterTiddlers = function(filterString,currTiddlerTitle,tiddlerList) {
|
||||
exports.filterTiddlers = function(filterString,currTiddlerTitle,source) {
|
||||
var fn = this.compileFilter(filterString);
|
||||
return fn.call(this,tiddlerList,currTiddlerTitle);
|
||||
return fn.call(this,source,currTiddlerTitle);
|
||||
};
|
||||
|
||||
/*
|
||||
Compile a filter into a function with the signature fn(source,currTiddlerTitle) where:
|
||||
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
|
||||
*/
|
||||
exports.compileFilter = function(filterString) {
|
||||
var filterParseTree;
|
||||
try {
|
||||
@ -175,10 +180,15 @@ exports.compileFilter = function(filterString) {
|
||||
var accumulator = source,
|
||||
results = [];
|
||||
$tw.utils.each(operation.operators,function(operator) {
|
||||
var operatorFunction = filterOperators[operator.operator] || filterOperators.field || function(source,operator,operations) {
|
||||
return ["Filter Error: unknown operator '" + operator.operator + "'"];
|
||||
},
|
||||
operand = operator.operand;
|
||||
var operand = operator.operand,
|
||||
operatorFunction;
|
||||
if(!operator.operator) {
|
||||
operatorFunction = filterOperators.title;
|
||||
} else if(!filterOperators[operator.operator]) {
|
||||
operatorFunction = filterOperators.field;
|
||||
} else {
|
||||
operatorFunction = filterOperators[operator.operator];
|
||||
}
|
||||
if(operator.indirect) {
|
||||
operand = self.getTextReference(operator.operand,"",currTiddlerTitle);
|
||||
}
|
||||
@ -192,7 +202,7 @@ exports.compileFilter = function(filterString) {
|
||||
wiki: self,
|
||||
currTiddlerTitle: currTiddlerTitle
|
||||
});
|
||||
accumulator = results;
|
||||
accumulator = self.makeTiddlerIterator(results);
|
||||
});
|
||||
return results;
|
||||
};
|
||||
@ -210,16 +220,20 @@ exports.compileFilter = function(filterString) {
|
||||
case "+": // This operation is applied to the main results so far
|
||||
return function(results,source,currTiddlerTitle) {
|
||||
// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved
|
||||
source = results.slice(0);
|
||||
source = self.makeTiddlerIterator(results);
|
||||
results.splice(0,results.length);
|
||||
$tw.utils.pushTop(results,operationSubFunction(source,currTiddlerTitle));
|
||||
};
|
||||
}
|
||||
})());
|
||||
});
|
||||
// Return a function that applies the operations to a source array/hashmap 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) {
|
||||
source = source || self.getAllTitles();
|
||||
if(!source) {
|
||||
source = self.each;
|
||||
} else if(typeof source === "object") { // Array or hashmap
|
||||
source = self.makeTiddlerIterator(source);
|
||||
}
|
||||
var results = [];
|
||||
$tw.utils.each(operationFunctions,function(operationFunction) {
|
||||
operationFunction(results,source,currTiddlerTitle);
|
||||
|
45
core/modules/filters/all.js
Normal file
45
core/modules/filters/all.js
Normal file
@ -0,0 +1,45 @@
|
||||
/*\
|
||||
title: $:/core/modules/filters/all.js
|
||||
type: application/javascript
|
||||
module-type: filteroperator
|
||||
|
||||
Filter operator for selecting tiddlers
|
||||
|
||||
[all[tiddlers+shadows]]
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
var allFilterOperators;
|
||||
|
||||
function getAllFilterOperators() {
|
||||
if(!allFilterOperators) {
|
||||
allFilterOperators = {};
|
||||
$tw.modules.applyMethods("allfilteroperator",allFilterOperators);
|
||||
}
|
||||
return allFilterOperators;
|
||||
}
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
*/
|
||||
exports.all = function(source,operator,options) {
|
||||
// Get our suboperators
|
||||
var allFilterOperators = getAllFilterOperators();
|
||||
// Cycle through the suboperators accumulating their results
|
||||
var results = [],
|
||||
subops = operator.operand.split("+");
|
||||
for(var t=0; t<subops.length; t++) {
|
||||
var subop = allFilterOperators[subops[t]];
|
||||
if(subop) {
|
||||
$tw.utils.pushTop(results,subop(source,operator.prefix,options));
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
})();
|
26
core/modules/filters/all/current.js
Normal file
26
core/modules/filters/all/current.js
Normal file
@ -0,0 +1,26 @@
|
||||
/*\
|
||||
title: $:/core/modules/filters/all/current.js
|
||||
type: application/javascript
|
||||
module-type: allfilteroperator
|
||||
|
||||
Filter function for [all[current]]
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
*/
|
||||
exports.current = function(source,prefix,options) {
|
||||
if(options.currTiddlerTitle) {
|
||||
return [options.currTiddlerTitle];
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
22
core/modules/filters/all/missing.js
Normal file
22
core/modules/filters/all/missing.js
Normal file
@ -0,0 +1,22 @@
|
||||
/*\
|
||||
title: $:/core/modules/filters/all/missing.js
|
||||
type: application/javascript
|
||||
module-type: allfilteroperator
|
||||
|
||||
Filter function for [all[missing]]
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
*/
|
||||
exports.missing = function(source,prefix,options) {
|
||||
return options.wiki.getMissingTitles();
|
||||
};
|
||||
|
||||
})();
|
22
core/modules/filters/all/orphans.js
Normal file
22
core/modules/filters/all/orphans.js
Normal file
@ -0,0 +1,22 @@
|
||||
/*\
|
||||
title: $:/core/modules/filters/all/orphans.js
|
||||
type: application/javascript
|
||||
module-type: allfilteroperator
|
||||
|
||||
Filter function for [all[orphans]]
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
*/
|
||||
exports.orphans = function(source,prefix,options) {
|
||||
return options.wiki.getOrphanTitles();
|
||||
};
|
||||
|
||||
})();
|
22
core/modules/filters/all/shadows.js
Normal file
22
core/modules/filters/all/shadows.js
Normal file
@ -0,0 +1,22 @@
|
||||
/*\
|
||||
title: $:/core/modules/filters/all/shadows.js
|
||||
type: application/javascript
|
||||
module-type: allfilteroperator
|
||||
|
||||
Filter function for [all[shadows]]
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
*/
|
||||
exports.shadows = function(source,prefix,options) {
|
||||
return options.wiki.allShadowTitles();
|
||||
};
|
||||
|
||||
})();
|
22
core/modules/filters/all/tiddlers.js
Normal file
22
core/modules/filters/all/tiddlers.js
Normal file
@ -0,0 +1,22 @@
|
||||
/*\
|
||||
title: $:/core/modules/filters/all/tiddlers.js
|
||||
type: application/javascript
|
||||
module-type: allfilteroperator
|
||||
|
||||
Filter function for [all[tiddlers]]
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
*/
|
||||
exports.tiddlers = function(source,prefix,options) {
|
||||
return options.wiki.allTitles();
|
||||
};
|
||||
|
||||
})();
|
@ -17,20 +17,9 @@ Export our filter function
|
||||
*/
|
||||
exports.backlinks = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
source(function(tiddler,title) {
|
||||
$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -16,18 +16,9 @@ Filter operator that selects one tiddler for each unique value of the specified
|
||||
Export our filter function
|
||||
*/
|
||||
exports.each = function(source,operator,options) {
|
||||
// Convert the source to an array if necessary
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
var copy = [];
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
copy.push(title);
|
||||
});
|
||||
source = copy;
|
||||
}
|
||||
// Collect up the first tiddler with each unique value of the specified field
|
||||
var results = [],values = {};
|
||||
$tw.utils.each(source,function(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
var results = [],
|
||||
values = {};
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
var value = tiddler.getFieldString(operator.operand);
|
||||
if(!$tw.utils.hop(values,value)) {
|
||||
|
@ -16,23 +16,14 @@ Filter operator that selects one tiddler for each unique day covered by the spec
|
||||
Export our filter function
|
||||
*/
|
||||
exports.eachday = function(source,operator,options) {
|
||||
var results = [],
|
||||
values = [];
|
||||
// Function to convert a date/time to a date integer
|
||||
var toDate = function(value) {
|
||||
value = (new Date(value)).setHours(0,0,0,0);
|
||||
return value+0;
|
||||
};
|
||||
// Convert the source to an array if necessary
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
var copy = [];
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
copy.push(title);
|
||||
});
|
||||
source = copy;
|
||||
}
|
||||
// Collect up the first tiddler with each unique day value of the specified field
|
||||
var results = [],values = [];
|
||||
$tw.utils.each(source,function(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && tiddler.fields[operator.operand]) {
|
||||
var value = toDate(tiddler.fields[operator.operand]);
|
||||
if(values.indexOf(value) === -1) {
|
||||
|
@ -17,36 +17,47 @@ Export our filter function
|
||||
*/
|
||||
exports.field = function(source,operator,options) {
|
||||
var results = [],
|
||||
fieldname = (operator.suffix || operator.operator).toLowerCase(),
|
||||
isTitle = fieldname === "title";
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title),
|
||||
text = tiddler ? tiddler.getFieldString(fieldname) : (isTitle ? title : null),
|
||||
match;
|
||||
if(text !== null) {
|
||||
if(operator.regexp) {
|
||||
match = !!operator.regexp.exec(text);
|
||||
} else {
|
||||
match = text === operator.operand;
|
||||
}
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
fieldname = (operator.suffix || operator.operator || "title").toLowerCase();
|
||||
if(operator.prefix === "!") {
|
||||
if(operator.regexp) {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
var text = tiddler.getFieldString(fieldname);
|
||||
if(text !== null && !operator.regexp.exec(text)) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
var text = tiddler.getFieldString(fieldname);
|
||||
if(text !== null && text !== operator.operand) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
if(operator.regexp) {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
var text = tiddler.getFieldString(fieldname);
|
||||
if(text !== null && !!operator.regexp.exec(text)) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
var text = tiddler.getFieldString(fieldname);
|
||||
if(text !== null && text === operator.operand) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -16,28 +16,14 @@ Filter operator for returning the names of the fields on the selected tiddlers
|
||||
Export our filter function
|
||||
*/
|
||||
exports.fields = function(source,operator,options) {
|
||||
var self = this,
|
||||
results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
// Return the fields on the specified tiddler
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
for(var fieldName in tiddler.fields) {
|
||||
$tw.utils.pushTop(results,fieldName);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -17,27 +17,17 @@ Export our filter function
|
||||
*/
|
||||
exports.has = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
if(tiddler) {
|
||||
var match = $tw.utils.hop(tiddler.fields,operator.operand) && tiddler.fields[operator.operand] !== "";
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
if(operator.prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand) || tiddler.fields[operator.operand] === "")) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && tiddler.fields[operator.operand] !== "") {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
|
@ -16,26 +16,13 @@ Filter operator for returning the indexes of a data tiddler
|
||||
Export our filter function
|
||||
*/
|
||||
exports.indexes = function(source,operator,options) {
|
||||
var self = this,
|
||||
results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
// Return the fields on the specified tiddler
|
||||
var data = options.wiki.getTiddlerData(title,{});
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
var data = options.wiki.getTiddlerData(title);
|
||||
if(data) {
|
||||
$tw.utils.pushTop(results,Object.keys(data));
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
results.sort();
|
||||
return results;
|
||||
};
|
||||
|
@ -17,31 +17,18 @@ Export our filter function
|
||||
*/
|
||||
exports.current = function(source,prefix,options) {
|
||||
var results = [];
|
||||
// Function to check a tiddler
|
||||
function checkTiddler(title) {
|
||||
if(title !== options.currTiddlerTitle) {
|
||||
results.push(title);
|
||||
}
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
if(prefix === "!") {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
if(source.indexOf(options.currTiddlerTitle) !== -1) {
|
||||
results.push(options.currTiddlerTitle);
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(title !== options.currTiddlerTitle) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if(prefix === "!") {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
results.push(options.currTiddlerTitle);
|
||||
}
|
||||
source(function(tiddler,title) {
|
||||
if(title === options.currTiddlerTitle) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -17,24 +17,17 @@ Export our filter function
|
||||
*/
|
||||
exports.image = function(source,prefix,options) {
|
||||
var results = [];
|
||||
// Function to check a tiddler
|
||||
function checkTiddler(title) {
|
||||
var match = options.wiki.isImageTiddler(title);
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(!options.wiki.isImageTiddler(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(options.wiki.isImageTiddler(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
|
@ -16,31 +16,19 @@ Filter function for [is[missing]]
|
||||
Export our filter function
|
||||
*/
|
||||
exports.missing = function(source,prefix,options) {
|
||||
var results = [],
|
||||
missingTitles;
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
missingTitles = options.wiki.getMissingTitles();
|
||||
$tw.utils.each(source,function(title) {
|
||||
var match = missingTitles.indexOf(title) !== -1;
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
var results = [];
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(options.wiki.tiddlerExists(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if(prefix !== "!") {
|
||||
missingTitles = options.wiki.getMissingTitles();
|
||||
$tw.utils.each(missingTitles,function(title) {
|
||||
source(function(tiddler,title) {
|
||||
if(!options.wiki.tiddlerExists(title)) {
|
||||
results.push(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -18,24 +18,15 @@ Export our filter function
|
||||
exports.orphan = function(source,prefix,options) {
|
||||
var results = [],
|
||||
orphanTitles = options.wiki.getOrphanTitles();
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
var match = orphanTitles.indexOf(title) !== -1;
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(orphanTitles.indexOf(title) === -1) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
var match = orphanTitles.indexOf(title) !== -1;
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
source(function(tiddler,title) {
|
||||
if(orphanTitles.indexOf(title) !== -1) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
|
@ -17,31 +17,18 @@ Export our filter function
|
||||
*/
|
||||
exports.shadow = function(source,prefix,options) {
|
||||
var results = [];
|
||||
// Function to check a tiddler
|
||||
function checkTiddler(title) {
|
||||
var match = options.wiki.isShadowTiddler(title);
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(!options.wiki.isShadowTiddler(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if(prefix !== "!") {
|
||||
options.wiki.eachShadow(function(tiddler,title) {
|
||||
source(function(tiddler,title) {
|
||||
if(options.wiki.isShadowTiddler(title)) {
|
||||
results.push(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -17,24 +17,17 @@ Export our filter function
|
||||
*/
|
||||
exports.system = function(source,prefix,options) {
|
||||
var results = [];
|
||||
// Function to check a tiddler
|
||||
function checkTiddler(title) {
|
||||
var match = options.wiki.isSystemTiddler(title);
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(!options.wiki.isSystemTiddler(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(options.wiki.isSystemTiddler(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
|
@ -17,24 +17,17 @@ Export our filter function
|
||||
*/
|
||||
exports.tiddler = function(source,prefix,options) {
|
||||
var results = [];
|
||||
// Function to check a tiddler
|
||||
function checkTiddler(title) {
|
||||
var match = options.wiki.tiddlerExists(title);
|
||||
if(prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(!options.wiki.tiddlerExists(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(options.wiki.tiddlerExists(title)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
|
@ -17,20 +17,16 @@ Export our filter function
|
||||
*/
|
||||
exports.limit = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Convert to an array if necessary
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
var copy = [];
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
copy.push(title);
|
||||
});
|
||||
source = copy;
|
||||
}
|
||||
// Convert to an array
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
// Slice the array if necessary
|
||||
var limit = Math.min(source.length,parseInt(operator.operand,10));
|
||||
var limit = Math.min(results.length,parseInt(operator.operand,10));
|
||||
if(operator.prefix === "!") {
|
||||
results = source.slice(source.length - limit);
|
||||
results = results.slice(-limit);
|
||||
} else {
|
||||
results = source.slice(0,limit);
|
||||
results = results.slice(0,limit);
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -17,20 +17,9 @@ Export our filter function
|
||||
*/
|
||||
exports.links = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
source(function(tiddler,title) {
|
||||
$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -19,28 +19,14 @@ exports.list = function(source,operator,options) {
|
||||
var results = [],
|
||||
tr = $tw.utils.parseTextReference(operator.operand),
|
||||
list = options.wiki.getTiddlerList(tr.title || options.currTiddlerTitle,tr.field,tr.index);
|
||||
function checkTiddler(title) {
|
||||
var match = list.indexOf(title) !== -1;
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(operator.prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(list.indexOf(title) === -1) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if(operator.prefix !== "!") {
|
||||
results = list;
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
results = list;
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -17,20 +17,9 @@ Export our filter function
|
||||
*/
|
||||
exports.listed = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
source(function(tiddler,title) {
|
||||
$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title));
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -17,10 +17,7 @@ Reverse list
|
||||
*/
|
||||
exports.reverse = function(source,operator,options) {
|
||||
var results = [];
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
source = Object.keys(source).sort();
|
||||
}
|
||||
$tw.utils.each(source,function(title) {
|
||||
source(function(tiddler,title) {
|
||||
results.unshift(title);
|
||||
});
|
||||
return results;
|
||||
@ -30,33 +27,36 @@ exports.reverse = function(source,operator,options) {
|
||||
First entry/entries in list
|
||||
*/
|
||||
exports.first = function(source,operator,options) {
|
||||
var count = parseInt(operator.operand) || 1;
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
source = Object.keys(source).sort();
|
||||
}
|
||||
return source.slice(0,Math.min(count,source.length));
|
||||
var count = parseInt(operator.operand) || 1,
|
||||
results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results.slice(0,count);
|
||||
};
|
||||
|
||||
/*
|
||||
Last entry/entries in list
|
||||
*/
|
||||
exports.last = function(source,operator,options) {
|
||||
var count = parseInt(operator.operand) || 1;
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
source = Object.keys(source).sort();
|
||||
}
|
||||
return source.slice(-count);
|
||||
var count = parseInt(operator.operand) || 1,
|
||||
results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results.slice(-count);
|
||||
};
|
||||
|
||||
/*
|
||||
All but the first entry/entries of the list
|
||||
*/
|
||||
exports.rest = function(source,operator,options) {
|
||||
var count = parseInt(operator.operand) || 1;
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
source = Object.keys(source).sort();
|
||||
}
|
||||
return source.slice(count);
|
||||
var count = parseInt(operator.operand) || 1,
|
||||
results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results.slice(count);
|
||||
};
|
||||
exports.butfirst = exports.rest;
|
||||
exports.bf = exports.rest;
|
||||
@ -65,11 +65,12 @@ exports.bf = exports.rest;
|
||||
All but the last entry/entries of the list
|
||||
*/
|
||||
exports.butlast = function(source,operator,options) {
|
||||
var count = parseInt(operator.operand) || 1;
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
source = Object.keys(source).sort();
|
||||
}
|
||||
return source.slice(0,-count);
|
||||
var count = parseInt(operator.operand) || 1,
|
||||
results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results.slice(0,-count);
|
||||
};
|
||||
exports.bl = exports.butlast;
|
||||
|
||||
@ -77,11 +78,12 @@ exports.bl = exports.butlast;
|
||||
The nth member of the list
|
||||
*/
|
||||
exports.nth = function(source,operator,options) {
|
||||
var count = parseInt(operator.operand) || 1;
|
||||
if(!$tw.utils.isArray(source)) {
|
||||
source = Object.keys(source).sort();
|
||||
}
|
||||
return source.slice(count-1,count);
|
||||
var count = parseInt(operator.operand) || 1,
|
||||
results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results.slice(count - 1,count);
|
||||
};
|
||||
|
||||
})();
|
||||
|
@ -16,22 +16,12 @@ Filter operator for returning the titles of the modules of a given type in this
|
||||
Export our filter function
|
||||
*/
|
||||
exports.modules = function(source,operator,options) {
|
||||
var results = [],
|
||||
pushModules = function(type) {
|
||||
$tw.utils.each($tw.modules.types[type],function(moduleInfo,moduleName) {
|
||||
results.push(moduleName);
|
||||
});
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
pushModules(title);
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {
|
||||
results.push(moduleName);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
pushModules(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
results.sort();
|
||||
return results;
|
||||
};
|
||||
|
@ -18,25 +18,14 @@ Export our filter function
|
||||
exports.next = function(source,operator,options) {
|
||||
var results = [],
|
||||
list = options.wiki.getTiddlerList(operator.operand);
|
||||
|
||||
function checkTiddler(title) {
|
||||
source(function(tiddler,title) {
|
||||
var match = list.indexOf(title);
|
||||
// increment match and then test if result is in range
|
||||
match++;
|
||||
if(match > 0 && match < list.length) {
|
||||
results.push(list[match]);
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -16,30 +16,15 @@ Filter operator for returning the titles of the shadow tiddlers within a plugin
|
||||
Export our filter function
|
||||
*/
|
||||
exports.plugintiddlers = function(source,operator,options) {
|
||||
var results = [],
|
||||
pushShadows;
|
||||
switch(operator.operand) {
|
||||
default:
|
||||
pushShadows = function(title) {
|
||||
var pluginInfo = options.wiki.getPluginInfo(title);
|
||||
if(pluginInfo) {
|
||||
$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
};
|
||||
break;
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
pushShadows(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
pushShadows(title);
|
||||
});
|
||||
}
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
var pluginInfo = options.wiki.getPluginInfo(title);
|
||||
if(pluginInfo) {
|
||||
$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
results.sort();
|
||||
return results;
|
||||
};
|
||||
|
@ -17,24 +17,17 @@ Export our filter function
|
||||
*/
|
||||
exports.prefix = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var match = title.substr(0,operator.operand.length).toLowerCase() === operator.operand.toLowerCase();
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(operator.prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(title.substr(0,operator.operand.length).toLowerCase() !== operator.operand.toLowerCase()) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(title.substr(0,operator.operand.length).toLowerCase() === operator.operand.toLowerCase()) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
|
@ -18,25 +18,14 @@ Export our filter function
|
||||
exports.previous = function(source,operator,options) {
|
||||
var results = [],
|
||||
list = options.wiki.getTiddlerList(operator.operand);
|
||||
|
||||
function checkTiddler(title) {
|
||||
source(function(tiddler,title) {
|
||||
var match = list.indexOf(title);
|
||||
// decrement match and then test if result is in range
|
||||
// increment match and then test if result is in range
|
||||
match--;
|
||||
if( match >= 0 ) {
|
||||
if(match >= 0) {
|
||||
results.push(list[match]);
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -17,23 +17,11 @@ Export our filter function
|
||||
*/
|
||||
exports.removeprefix = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var match = title.substr(0,operator.operand.length).toLowerCase() === operator.operand.toLowerCase();
|
||||
if(match) {
|
||||
source(function(tiddler,title) {
|
||||
if(title.substr(0,operator.operand.length).toLowerCase() === operator.operand.toLowerCase()) {
|
||||
results.push(title.substr(operator.operand.length));
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -17,34 +17,18 @@ Export our filter function
|
||||
*/
|
||||
exports.sameday = function(source,operator,options) {
|
||||
var results = [],
|
||||
isSameDay = function(dateField,dateString) {
|
||||
var date1 = (new Date(dateField)).setHours(0,0,0,0),
|
||||
date2 = (new Date($tw.utils.parseDate(dateString))).setHours(0,0,0,0);
|
||||
return date1 === date2;
|
||||
targetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);
|
||||
// Function to convert a date/time to a date integer
|
||||
var isSameDay = function(dateField) {
|
||||
return (new Date(dateField)).setHours(0,0,0,0) === targetDate;
|
||||
};
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
if(tiddler) {
|
||||
var match = isSameDay(tiddler.fields.modified,operator.operand);
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && tiddler.fields.modified) {
|
||||
if(isSameDay(tiddler.fields.modified)) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -18,7 +18,7 @@ Export our filter function
|
||||
exports.search = function(source,operator,options) {
|
||||
var invert = operator.prefix === "!";
|
||||
return options.wiki.search(operator.operand,{
|
||||
titles: source,
|
||||
source: source,
|
||||
invert: invert
|
||||
});
|
||||
};
|
||||
|
@ -16,23 +16,13 @@ Filter operator for returning the source plugins for shadow tiddlers
|
||||
Export our filter function
|
||||
*/
|
||||
exports.shadowsource = function(source,operator,options) {
|
||||
var results = [],
|
||||
pushShadowSource = function(title) {
|
||||
var source = options.wiki.getShadowSource(title);
|
||||
if(source) {
|
||||
$tw.utils.pushTop(results,source);
|
||||
}
|
||||
};
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
pushShadowSource(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
pushShadowSource(title);
|
||||
});
|
||||
}
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
var source = options.wiki.getShadowSource(title);
|
||||
if(source) {
|
||||
$tw.utils.pushTop(results,source);
|
||||
}
|
||||
});
|
||||
results.sort();
|
||||
return results;
|
||||
};
|
||||
|
@ -40,15 +40,10 @@ exports.nsortcs = function(source,operator,options) {
|
||||
};
|
||||
|
||||
var prepare_results = function (source) {
|
||||
var results;
|
||||
if($tw.utils.isArray(source)) {
|
||||
results = source;
|
||||
} else {
|
||||
results = [];
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results;
|
||||
}
|
||||
|
||||
|
@ -17,31 +17,18 @@ Export our filter function
|
||||
*/
|
||||
exports.tag = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
if(tiddler) {
|
||||
var match = tiddler.hasTag(operator.operand);
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
if(operator.prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && !tiddler.hasTag(operator.operand)) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && tiddler.hasTag(operator.operand)) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Sort the results if we are matching a tag
|
||||
if(operator.prefix !== "!") {
|
||||
results = options.wiki.sortByList(results,operator.operand);
|
||||
}
|
||||
return results;
|
||||
|
@ -17,20 +17,9 @@ Export our filter function
|
||||
*/
|
||||
exports.tagging = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
source(function(tiddler,title) {
|
||||
$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -17,23 +17,11 @@ Export our filter function
|
||||
*/
|
||||
exports.tags = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && tiddler.fields.tags) {
|
||||
$tw.utils.pushTop(results,tiddler.fields.tags);
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
@ -17,35 +17,14 @@ Export our filter function
|
||||
*/
|
||||
exports.title = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title);
|
||||
if(tiddler) {
|
||||
var match = tiddler.fields[operator.operator] === operator.operand;
|
||||
if(operator.prefix === "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
if(operator.prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && tiddler.fields.title !== operator.operand) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
});
|
||||
} else {
|
||||
// If we're filtering a hashmap we change the behaviour to pass through missing tiddlers
|
||||
if(operator.prefix !== "!") {
|
||||
results.push(operator.operand);
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
if(title !== operator.operand) {
|
||||
checkTiddler(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
results.push(operator.operand);
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
@ -17,25 +17,19 @@ Export our filter function
|
||||
*/
|
||||
exports.untagged = function(source,operator,options) {
|
||||
var results = [];
|
||||
// Function to check an individual title
|
||||
function checkTiddler(title) {
|
||||
var tiddler = options.wiki.getTiddler(title),
|
||||
match = tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0;
|
||||
if(operator.prefix !== "!") {
|
||||
match = !match;
|
||||
}
|
||||
if(match) {
|
||||
$tw.utils.pushTop(results,title);
|
||||
}
|
||||
}
|
||||
// Iterate through the source tiddlers
|
||||
if($tw.utils.isArray(source)) {
|
||||
$tw.utils.each(source,function(title) {
|
||||
checkTiddler(title);
|
||||
if(operator.prefix === "!") {
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {
|
||||
$tw.utils.pushTop(results,title);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$tw.utils.each(source,function(element,title) {
|
||||
checkTiddler(title);
|
||||
source(function(tiddler,title) {
|
||||
if(tiddler) {
|
||||
if(!tiddler.hasField("tags") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {
|
||||
$tw.utils.pushTop(results,title);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return results;
|
||||
|
@ -13,7 +13,7 @@ This is the main application logic for both the client and server
|
||||
"use strict";
|
||||
|
||||
// Set to `true` to enable performance instrumentation
|
||||
var PERFORMANCE_INSTRUMENTATION = false;
|
||||
var PERFORMANCE_INSTRUMENTATION = true;
|
||||
|
||||
var widget = require("$:/core/modules/widgets/widget.js");
|
||||
|
||||
|
@ -268,7 +268,12 @@ Synchronise a set of changes to the server
|
||||
Syncer.prototype.syncToServer = function(changes) {
|
||||
var self = this,
|
||||
now = new Date(),
|
||||
filteredChanges = this.filterFn.call(this.wiki,changes);
|
||||
filteredChanges = this.filterFn.call(this.wiki,function(callback) {
|
||||
$tw.utils.each(changes,function(change,title) {
|
||||
var tiddler = self.wiki.getTiddler(title);
|
||||
callback(tiddler,title);
|
||||
});
|
||||
});
|
||||
$tw.utils.each(changes,function(change,title,object) {
|
||||
// Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list
|
||||
if((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) {
|
||||
|
@ -35,21 +35,34 @@ exports.count = function(object) {
|
||||
|
||||
/*
|
||||
Push entries onto an array, removing them first if they already exist in the array
|
||||
array: array to modify
|
||||
array: array to modify (assumed to be free of duplicates)
|
||||
value: a single value to push or an array of values to push
|
||||
*/
|
||||
exports.pushTop = function(array,value) {
|
||||
var t,p;
|
||||
if($tw.utils.isArray(value)) {
|
||||
// Remove any array entries that are duplicated in the new values
|
||||
for(t=0; t<value.length; t++) {
|
||||
p = array.indexOf(value[t]);
|
||||
if(p !== -1) {
|
||||
array.splice(p,1);
|
||||
if(value.length !== 0) {
|
||||
if(array.length !== 0) {
|
||||
if(value.length < array.length) {
|
||||
for(t=0; t<value.length; t++) {
|
||||
p = array.indexOf(value[t]);
|
||||
if(p !== -1) {
|
||||
array.splice(p,1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(t=array.length-1; t>=0; t--) {
|
||||
p = value.indexOf(array[t]);
|
||||
if(p !== -1) {
|
||||
array.splice(t,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Push the values on top of the main array
|
||||
array.push.apply(array,value);
|
||||
}
|
||||
// Push the values on top of the main array
|
||||
array.push.apply(array,value);
|
||||
} else {
|
||||
p = array.indexOf(value);
|
||||
if(p !== -1) {
|
||||
|
@ -56,17 +56,18 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) {
|
||||
// Create our element
|
||||
var domNode = this.document.createElement("a");
|
||||
// Assign classes
|
||||
$tw.utils.addClass(domNode,"tw-tiddlylink");
|
||||
var classes = ["tw-tiddlylink"];
|
||||
if(this.isShadow) {
|
||||
$tw.utils.addClass(domNode,"tw-tiddlylink-shadow");
|
||||
classes.push("tw-tiddlylink-shadow");
|
||||
}
|
||||
if(this.isMissing && !this.isShadow) {
|
||||
$tw.utils.addClass(domNode,"tw-tiddlylink-missing");
|
||||
classes.push("tw-tiddlylink-missing");
|
||||
} else {
|
||||
if(!this.isMissing) {
|
||||
$tw.utils.addClass(domNode,"tw-tiddlylink-resolves");
|
||||
classes.push("tw-tiddlylink-resolves");
|
||||
}
|
||||
}
|
||||
domNode.setAttribute("class",classes.join(" "));
|
||||
// Set an href
|
||||
var wikiLinkTemplateMacro = this.getVariable("tw-wikilink-template"),
|
||||
wikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : "#$uri_encoded$",
|
||||
@ -74,7 +75,8 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) {
|
||||
wikiLinkText = wikiLinkText.replace("$uri_doubleencoded$",encodeURIComponent(encodeURIComponent(this.to)));
|
||||
domNode.setAttribute("href",wikiLinkText);
|
||||
// Set the tooltip
|
||||
var tooltipWikiText = this.tooltip || this.getVariable("tw-wikilink-tooltip",{defaultValue: "<$transclude field='tooltip'><$transclude field='title'/></$transclude>"});
|
||||
// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to "<$transclude field='tooltip'><$transclude field='title'/></$transclude>"
|
||||
var tooltipWikiText = this.tooltip || this.getVariable("tw-wikilink-tooltip");
|
||||
if(tooltipWikiText) {
|
||||
var tooltipText = this.wiki.renderText("text/plain","text/vnd.tiddlywiki",tooltipWikiText,{
|
||||
parseAsInline: true,
|
||||
|
@ -57,7 +57,7 @@ exports.setTextReference = function(textRef,value,currTiddlerTitle) {
|
||||
title = tr.title || currTiddlerTitle;
|
||||
// Check if it is a reference to a tiddler field
|
||||
if(tr.index) {
|
||||
var data = this.getTiddlerData(title,{});
|
||||
var data = this.getTiddlerData(title,Object.create(null));
|
||||
data[tr.index] = value;
|
||||
this.setTiddlerData(title,data,this.getModificationFields());
|
||||
} else {
|
||||
@ -79,7 +79,7 @@ exports.deleteTextReference = function(textRef,currTiddlerTitle) {
|
||||
title = tr.title || currTiddlerTitle;
|
||||
tiddler = this.getTiddler(title);
|
||||
if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {
|
||||
fields = {};
|
||||
fields = Object.create(null);
|
||||
fields[tr.field] = undefined;
|
||||
this.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));
|
||||
}
|
||||
@ -122,11 +122,11 @@ This method should be called after the changes it describes have been made to th
|
||||
*/
|
||||
exports.enqueueTiddlerEvent = function(title,isDeleted) {
|
||||
// Record the touch in the list of changed tiddlers
|
||||
this.changedTiddlers = this.changedTiddlers || {};
|
||||
this.changedTiddlers[title] = this.changedTiddlers[title] || {};
|
||||
this.changedTiddlers = this.changedTiddlers || Object.create(null);
|
||||
this.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);
|
||||
this.changedTiddlers[title][isDeleted ? "deleted" : "modified"] = true;
|
||||
// Increment the change count
|
||||
this.changeCount = this.changeCount || {};
|
||||
this.changeCount = this.changeCount || Object.create(null);
|
||||
if($tw.utils.hop(this.changeCount,title)) {
|
||||
this.changeCount[title]++;
|
||||
} else {
|
||||
@ -138,7 +138,7 @@ exports.enqueueTiddlerEvent = function(title,isDeleted) {
|
||||
var self = this;
|
||||
$tw.utils.nextTick(function() {
|
||||
var changes = self.changedTiddlers;
|
||||
self.changedTiddlers = {};
|
||||
self.changedTiddlers = Object.create(null);
|
||||
self.eventsTriggered = false;
|
||||
self.dispatchEvent("change",changes);
|
||||
});
|
||||
@ -147,7 +147,7 @@ exports.enqueueTiddlerEvent = function(title,isDeleted) {
|
||||
};
|
||||
|
||||
exports.getChangeCount = function(title) {
|
||||
this.changeCount = this.changeCount || {};
|
||||
this.changeCount = this.changeCount || Object.create(null);
|
||||
if($tw.utils.hop(this.changeCount,title)) {
|
||||
return this.changeCount[title];
|
||||
} else {
|
||||
@ -223,7 +223,7 @@ exports.getCreationFields = function() {
|
||||
Return a hashmap of the fields that should be set when a tiddler is modified
|
||||
*/
|
||||
exports.getModificationFields = function() {
|
||||
var fields = {},
|
||||
var fields = Object.create(null),
|
||||
modifier = this.getTiddlerText(USER_NAME_TITLE);
|
||||
fields.modified = new Date();
|
||||
if(modifier) {
|
||||
@ -239,7 +239,7 @@ excludeTag: tag to exclude
|
||||
includeSystem: whether to include system tiddlers (defaults to false)
|
||||
*/
|
||||
exports.getTiddlers = function(options) {
|
||||
options = options || {};
|
||||
options = options || Object.create(null);
|
||||
var self = this,
|
||||
sortField = options.sortField || "title",
|
||||
tiddlers = [], t, titles = [];
|
||||
@ -274,6 +274,23 @@ exports.countTiddlers = function(excludeTag) {
|
||||
return $tw.utils.count(tiddlers);
|
||||
};
|
||||
|
||||
/*
|
||||
Returns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)
|
||||
*/
|
||||
exports.makeTiddlerIterator = function(titles) {
|
||||
var self = this;
|
||||
if(!$tw.utils.isArray(titles)) {
|
||||
titles = Object.keys(titles);
|
||||
} else {
|
||||
titles = titles.slice(0);
|
||||
}
|
||||
return function(callback) {
|
||||
titles.forEach(function(title) {
|
||||
callback(self.getTiddler(title),title);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
Sort an array of tiddler titles by a specified field
|
||||
titles: array of titles (sorted in place)
|
||||
@ -431,7 +448,7 @@ Get a hashmap by tag of arrays of tiddler titles
|
||||
exports.getTagMap = function() {
|
||||
var self = this;
|
||||
return this.getGlobalCache("tagmap",function() {
|
||||
var tags = {},
|
||||
var tags = Object.create(null),
|
||||
storeTags = function(tagArray,title) {
|
||||
if(tagArray) {
|
||||
for(var index=0; index<tagArray.length; index++) {
|
||||
@ -532,7 +549,7 @@ Retrieve a tiddler as a JSON string of the fields
|
||||
exports.getTiddlerAsJson = function(title) {
|
||||
var tiddler = this.getTiddler(title);
|
||||
if(tiddler) {
|
||||
var fields = {};
|
||||
var fields = Object.create(null);
|
||||
$tw.utils.each(tiddler.fields,function(value,name) {
|
||||
fields[name] = tiddler.getFieldString(name);
|
||||
});
|
||||
@ -574,7 +591,7 @@ exports.getTiddlerData = function(title,defaultData) {
|
||||
Extract an indexed field from within a data tiddler
|
||||
*/
|
||||
exports.extractTiddlerDataItem = function(title,index,defaultText) {
|
||||
var data = this.getTiddlerData(title,{}),
|
||||
var data = this.getTiddlerData(title,Object.create(null)),
|
||||
text;
|
||||
if(data && $tw.utils.hop(data,index)) {
|
||||
text = data[index];
|
||||
@ -623,7 +640,7 @@ exports.getTiddlerList = function(title,field,index) {
|
||||
|
||||
// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs
|
||||
exports.getGlobalCache = function(cacheName,initializer) {
|
||||
this.globalCache = this.globalCache || {};
|
||||
this.globalCache = this.globalCache || Object.create(null);
|
||||
if($tw.utils.hop(this.globalCache,cacheName)) {
|
||||
return this.globalCache[cacheName];
|
||||
} else {
|
||||
@ -633,7 +650,7 @@ exports.getGlobalCache = function(cacheName,initializer) {
|
||||
};
|
||||
|
||||
exports.clearGlobalCache = function() {
|
||||
this.globalCache = {};
|
||||
this.globalCache = Object.create(null);
|
||||
}
|
||||
|
||||
// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it
|
||||
@ -642,13 +659,13 @@ exports.getCacheForTiddler = function(title,cacheName,initializer) {
|
||||
// Temporarily disable caching so that tweakParseTreeNode() works
|
||||
return initializer();
|
||||
|
||||
this.caches = this.caches || {};
|
||||
this.caches = this.caches || Object.create(null);
|
||||
var caches = this.caches[title];
|
||||
if(caches && caches[cacheName]) {
|
||||
return caches[cacheName];
|
||||
} else {
|
||||
if(!caches) {
|
||||
caches = {};
|
||||
caches = Object.create(null);
|
||||
this.caches[title] = caches;
|
||||
}
|
||||
caches[cacheName] = initializer();
|
||||
@ -658,7 +675,7 @@ return initializer();
|
||||
|
||||
// Clear all caches associated with a particular tiddler
|
||||
exports.clearCache = function(title) {
|
||||
this.caches = this.caches || {};
|
||||
this.caches = this.caches || Object.create(null);
|
||||
if($tw.utils.hop(this.caches,title)) {
|
||||
delete this.caches[title];
|
||||
}
|
||||
@ -877,7 +894,7 @@ Return an array of tiddler titles that match a search string
|
||||
text: The text string to search for
|
||||
options: see below
|
||||
Options available:
|
||||
titles: Hashmap or array of tiddler titles to limit search
|
||||
source: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)
|
||||
exclude: An array of tiddler titles to exclude from the search
|
||||
invert: If true returns tiddlers that do not contain the specified string
|
||||
caseSensitive: If true forces a case sensitive search
|
||||
@ -932,28 +949,13 @@ exports.search = function(text,options) {
|
||||
return true;
|
||||
};
|
||||
// Loop through all the tiddlers doing the search
|
||||
var results = [];
|
||||
if($tw.utils.isArray(options.titles)) {
|
||||
for(t=0; t<options.titles.length; t++) {
|
||||
if(!!searchTiddler(options.titles[t]) === !options.invert) {
|
||||
results.push(options.titles[t]);
|
||||
}
|
||||
var results = [],
|
||||
source = options.source || this.each;
|
||||
source(function(tiddler,title) {
|
||||
if(!!searchTiddler(title) === !options.invert) {
|
||||
results.push(title);
|
||||
}
|
||||
} else {
|
||||
if(options.titles) {
|
||||
for(var title in options.titles) {
|
||||
if(!!searchTiddler(title) === !options.invert) {
|
||||
results.push(title);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.each(function(tiddler,title) {
|
||||
if(!!searchTiddler(title) === !options.invert) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
// Remove any of the results we have to exclude
|
||||
if(options.exclude) {
|
||||
for(t=0; t<options.exclude.length; t++) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/AdvancedSearch
|
||||
|
||||
<div class="tw-advanced-search">
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/AdvancedSearch]] [!is[shadow]!has[draft.of]tag[$:/tags/AdvancedSearch]] +[tag[$:/tags/AdvancedSearch]]" "$:/core/ui/AdvancedSearch/System">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/AdvancedSearch]!has[draft.of]]" "$:/core/ui/AdvancedSearch/System">>
|
||||
</div>
|
||||
|
@ -12,7 +12,7 @@ caption: {{$:/language/Search/Filter/Caption}}
|
||||
<div class="tw-block-dropdown-wrapper">
|
||||
<$reveal state=<<qualify "$:/state/filterDropdown">> type="nomatch" text="" default="">
|
||||
<div class="tw-block-dropdown tw-edit-type-dropdown">
|
||||
<$list filter="[is[shadow]tag[$:/tags/Filter]] [!is[shadow]tag[$:/tags/Filter]] +[sort[description]]"><$link to={{!!filter}}><$transclude field="description"/></$link>
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/Filter]]"><$link to={{!!filter}}><$transclude field="description"/></$link>
|
||||
</$list>
|
||||
</div>
|
||||
</$reveal>
|
||||
|
@ -17,7 +17,7 @@ caption: {{$:/language/Search/Shadows/Caption}}
|
||||
|
||||
<<lingo Advanced/Matches>>
|
||||
|
||||
<$list filter="[is[shadow]search{$:/temp/advancedsearch}sort[title]limit[250]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
|
||||
</div>
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/ControlPanel
|
||||
|
||||
<div class="tw-control-panel">
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/ControlPanel]] [!is[shadow]!has[draft.of]tag[$:/tags/ControlPanel]] +[tag[$:/tags/ControlPanel]]" "$:/core/ui/ControlPanel/Basics">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/ControlPanel]!has[draft.of]]" "$:/core/ui/ControlPanel/Basics">>
|
||||
</div>
|
||||
|
@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Advanced/Caption}}
|
||||
{{$:/language/ControlPanel/Advanced/Hint}}
|
||||
|
||||
<div class="tw-control-panel">
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/ControlPanel/Advanced]] [!is[shadow]!has[draft.of]tag[$:/tags/ControlPanel/Advanced]] +[tag[$:/tags/ControlPanel/Advanced]]" "$:/core/ui/ControlPanel/Advanced/TiddlerFields">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]" "$:/core/ui/ControlPanel/Advanced/TiddlerFields">>
|
||||
</div>
|
||||
|
@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Appearance/Caption}}
|
||||
{{$:/language/ControlPanel/Appearance/Hint}}
|
||||
|
||||
<div class="tw-control-panel">
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/ControlPanel/Appearance]] [!is[shadow]!has[draft.of]tag[$:/tags/ControlPanel/Appearance]] +[tag[$:/tags/ControlPanel/Appearance]]" "$:/core/ui/ControlPanel/Appearance/Theme">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]" "$:/core/ui/ControlPanel/Appearance/Theme">>
|
||||
</div>
|
||||
|
@ -13,5 +13,5 @@ caption: {{$:/language/ControlPanel/Basics/Caption}}
|
||||
|<<lingo Tiddlers/Prompt>> |''<$count filter="[!is[system]]"/>'' |
|
||||
|<<lingo Tags/Prompt>> |''<$count filter="[tags[]]"/>'' |
|
||||
|<<lingo SystemTiddlers/Prompt>> |''<$count filter="[is[system]]"/>'' |
|
||||
|<<lingo ShadowTiddlers/Prompt>> |''<$count filter="[is[shadow]]"/>'' |
|
||||
|<<lingo ShadowTiddlers/Prompt>> |''<$count filter="[all[shadows]]"/>'' |
|
||||
|<<lingo OverriddenShadowTiddlers/Prompt>> |''<$count filter="[is[tiddler]is[shadow]]"/>'' |
|
||||
|
@ -6,7 +6,7 @@ tw-tiddler-frame tw-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerCl
|
||||
<div class=<<frame-classes>>>
|
||||
<$set name="storyTiddler" value=<<currentTiddler>>>
|
||||
<$keyboard key="ctrl+enter" message="tw-save-tiddler">
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/EditTemplate]] [!is[shadow]!has[draft.of]tag[$:/tags/EditTemplate]] +[tag[$:/tags/EditTemplate]]" variable="listItem">
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/EditTemplate]!has[draft.of]]" variable="listItem">
|
||||
<$transclude tiddler=<<listItem>>/>
|
||||
</$list>
|
||||
</$keyboard>
|
||||
|
@ -1,4 +1,4 @@
|
||||
title: $:/core/ui/EditTemplate/controls
|
||||
tags: $:/tags/EditTemplate
|
||||
|
||||
<span class="tw-tiddler-controls titlebar"> <$list filter="[is[shadow]!has[draft.of]tag[$:/tags/EditToolbar]] [!is[shadow]!has[draft.of]tag[$:/tags/EditToolbar]] +[tag[$:/tags/EditToolbar]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list> </span>
|
||||
<span class="tw-tiddler-controls titlebar"> <$list filter="[all[tiddlers+shadows]tag[$:/tags/EditToolbar]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list> </span>
|
||||
|
@ -2,14 +2,36 @@ title: $:/core/ui/EditTemplate/fields
|
||||
tags: $:/tags/EditTemplate
|
||||
|
||||
\define lingo-base() $:/language/EditTemplate/
|
||||
<$fieldmangler><div class="tw-edit-fields">
|
||||
<table class="tw-edit-fields"><tbody><$list filter="[is[current]fields[]] -title -tags -text -creator -created -modified -modifier -type -[[draft.title]] -[[draft.of]]" variable="currentField"><tr class="tw-edit-field"><td class="tw-edit-field-name"><<currentField>>:</td><td class="tw-edit-field-value"><$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/></td><td class="tw-edit-field-remove"><$button message="tw-remove-field" param=<<currentField>> class="btn-invisible">{{$:/core/images/delete-button}}</$button></td>
|
||||
<$fieldmangler>
|
||||
<div class="tw-edit-fields">
|
||||
<table class="tw-edit-fields">
|
||||
<tbody>
|
||||
<$list filter="[all[current]fields[]] -title -tags -text -creator -created -modified -modifier -type -[[draft.title]] -[[draft.of]]" variable="currentField">
|
||||
<tr class="tw-edit-field">
|
||||
<td class="tw-edit-field-name">
|
||||
<$text text=<<currentField>>/>:</td>
|
||||
<td class="tw-edit-field-value">
|
||||
<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/>
|
||||
</td>
|
||||
<td class="tw-edit-field-remove">
|
||||
<$button message="tw-remove-field" param=<<currentField>> class="btn-invisible">{{$:/core/images/delete-button}}</$button>
|
||||
</td>
|
||||
</tr>
|
||||
</$list>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="tw-edit-field-add"><em class="tw-edit"><<lingo Fields/Add/Prompt>></em> <span class="tw-edit-field-add-name"><$edit-text tiddler="$:/temp/NewFieldName" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} class="tw-edit-texteditor"/></span> <span class="tw-edit-field-add-button"><$button message="tw-add-field" param={{$:/temp/NewFieldName}} set="$:/temp/NewFieldName" setTo="" class=""><<lingo Fields/Add/Button>></$button></span></div>
|
||||
<div class="tw-edit-field-add">
|
||||
<em class="tw-edit">
|
||||
<<lingo Fields/Add/Prompt>>
|
||||
</em> <span class="tw-edit-field-add-name">
|
||||
<$edit-text tiddler="$:/temp/NewFieldName" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} class="tw-edit-texteditor"/>
|
||||
</span> <span class="tw-edit-field-add-button">
|
||||
<$button message="tw-add-field" param={{$:/temp/NewFieldName}} set="$:/temp/NewFieldName" setTo="" class="">
|
||||
<<lingo Fields/Add/Button>>
|
||||
</$button>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</$fieldmangler>
|
||||
|
@ -7,7 +7,7 @@ background-color:$(backgroundColor)$;
|
||||
\end
|
||||
<div class="tw-edit-tags">
|
||||
<$fieldmangler>
|
||||
<$list filter="[is[current]tags[]sort[title]]" storyview="pop" template="$:/core/ui/TagEditTemplate"/>
|
||||
<$list filter="[all[current]tags[]sort[title]]" storyview="pop" template="$:/core/ui/TagEditTemplate"/>
|
||||
|
||||
<div class="tw-edit-add-tag">
|
||||
<span class="tw-add-tag-name">
|
||||
|
@ -8,7 +8,7 @@ tags: $:/tags/EditTemplate
|
||||
<$reveal state=<<qualify "$:/state/typeDropdown">> type="nomatch" text="" default="">
|
||||
<div class="tw-block-dropdown tw-edit-type-dropdown">
|
||||
<$linkcatcher to="!!type">
|
||||
<$list filter="[is[shadow]prefix[$:/language/Docs/Types/]] [!is[shadow]prefix[$:/language/Docs/Types/]] +[sort[description]]"><$link to={{!!name}}><$view field="description"/> (<$view field="name"/>)</$link>
|
||||
<$list filter="[all[tiddlers+shadows]prefix[$:/language/Docs/Types/]] +[sort[description]]"><$link to={{!!name}}><$view field="description"/> (<$view field="name"/>)</$link>
|
||||
</$list>
|
||||
</$linkcatcher>
|
||||
</div>
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/core/Filters/Missing
|
||||
tags: $:/tags/Filter
|
||||
filter: [is[missing]sort[title]]
|
||||
filter: [all[missing]sort[title]]
|
||||
description: {{$:/language/Filters/Missing}}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/core/Filters/Orphans
|
||||
tags: $:/tags/Filter
|
||||
filter: [is[orphan]sort[title]]
|
||||
filter: [all[orphans]sort[title]]
|
||||
description: {{$:/language/Filters/Orphans}}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/core/Filters/OverriddenShadowTiddlers
|
||||
tags: $:/tags/Filter
|
||||
filter: [is[tiddler]is[shadow]]
|
||||
filter: [is[shadow]]
|
||||
description: {{$:/language/Filters/OverriddenShadowTiddlers}}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/core/Filters/ShadowTiddlers
|
||||
tags: $:/tags/Filter
|
||||
filter: [is[shadow]sort[title]]
|
||||
filter: [all[shadows]sort[title]]
|
||||
description: {{$:/language/Filters/ShadowTiddlers}}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: $:/core/Filters/SystemTags
|
||||
tags: $:/tags/Filter
|
||||
filter: [tags[]is[system]] [is[shadow]tags[]is[system]] +[sort[title]]
|
||||
filter: [all[tiddlers+shadows]tags[]is[system]sort[title]]
|
||||
description: {{$:/language/Filters/SystemTags}}
|
||||
|
||||
|
@ -8,7 +8,7 @@ title: $:/core/ui/MissingTemplate
|
||||
<div class="tw-drop-down">
|
||||
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
||||
<hr>
|
||||
<$list filter="[is[current]backlinks[]sort[title]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[current]backlinks[]sort[title]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
</div>
|
||||
</$reveal>
|
||||
</div>
|
||||
|
@ -2,4 +2,4 @@ title: $:/core/ui/MoreSideBar/Missing
|
||||
tags: $:/tags/MoreSideBar
|
||||
caption: {{$:/language/SideBar/Missing/Caption}}
|
||||
|
||||
<$list filter="[is[missing]sort[title]]" template="$:/core/ui/MissingTemplate"/>
|
||||
<$list filter="[all[missing]sort[title]]" template="$:/core/ui/MissingTemplate"/>
|
||||
|
@ -2,4 +2,4 @@ title: $:/core/ui/MoreSideBar/Orphans
|
||||
tags: $:/tags/MoreSideBar
|
||||
caption: {{$:/language/SideBar/Orphans/Caption}}
|
||||
|
||||
<$list filter="[is[orphan]sort[title]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[orphans]sort[title]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
|
@ -2,4 +2,4 @@ title: $:/core/ui/MoreSideBar/Shadows
|
||||
tags: $:/tags/MoreSideBar
|
||||
caption: {{$:/language/SideBar/Shadows/Caption}}
|
||||
|
||||
<$list filter="[is[shadow]sort[title]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[shadows]sort[title]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
|
@ -7,7 +7,7 @@ caption: {{$:/language/SideBar/Tags/Caption}}
|
||||
|
||||
<$list filter="[tags[]!is[system]sort[title]]">
|
||||
|
||||
<$transclude tiddler="$:/core/ui/TagTemplate"/> <small class="tw-menu-list-count"><$count filter="[is[current]tagging[]]"/></small>
|
||||
<$transclude tiddler="$:/core/ui/TagTemplate"/> <small class="tw-menu-list-count"><$count filter="[all[current]tagging[]]"/></small>
|
||||
|
||||
</$list>
|
||||
|
||||
|
@ -47,6 +47,6 @@ background-image: -ms-linear-gradient($gradient$);
|
||||
<$macrocall $name="makedatauri" type={{$title$!!type}} text={{$title$}}/>
|
||||
\end
|
||||
|
||||
<$list filter="[is[shadow]tag[$:/tags/stylesheet]] [!is[shadow]tag[$:/tags/stylesheet]]">
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/stylesheet]]">
|
||||
<$transclude/>
|
||||
</$list>
|
||||
|
@ -4,7 +4,7 @@ title: $:/core/ui/PageTemplate
|
||||
|
||||
<$dropzone>
|
||||
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/PageTemplate]] [!is[shadow]!has[draft.of]tag[$:/tags/PageTemplate]] +[tag[$:/tags/PageTemplate]]" variable="listItem">
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/PageTemplate]!has[draft.of]]" variable="listItem">
|
||||
|
||||
<$transclude tiddler=<<listItem>>/>
|
||||
|
||||
|
@ -3,6 +3,6 @@ tags: $:/tags/PageTemplate
|
||||
|
||||
<div class="tw-alerts">
|
||||
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/Alert]] [!is[shadow]!has[draft.of]tag[$:/tags/Alert]] +[sort[modified]]" template="$:/core/ui/AlertTemplate" storyview="pop"/>
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/Alert]!has[draft.of]]" template="$:/core/ui/AlertTemplate" storyview="pop"/>
|
||||
|
||||
</div>
|
||||
|
@ -12,7 +12,7 @@ tags: $:/tags/PageTemplate
|
||||
|
||||
<div class="tw-page-controls">
|
||||
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/PageControls]] [!is[shadow]!has[draft.of]tag[$:/tags/PageControls]] +[tag[$:/tags/PageControls]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
|
||||
</div>
|
||||
|
||||
|
@ -2,5 +2,5 @@ title: $:/core/ui/PageTemplate/topleftbar
|
||||
tags: $:/tags/PageTemplate
|
||||
|
||||
<span class="tw-topbar tw-topbar-left">
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/TopLeftBar]] [!is[shadow]!has[draft.of]tag[$:/tags/TopLeftBar]] +[tag[$:/tags/TopLeftBar]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
</span>
|
||||
|
@ -2,5 +2,5 @@ title: $:/core/ui/PageTemplate/toprightbar
|
||||
tags: $:/tags/PageTemplate
|
||||
|
||||
<span class="tw-topbar tw-topbar-right">
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/TopRightBar]] [!is[shadow]!has[draft.of]tag[$:/tags/TopRightBar]] +[tag[$:/tags/TopRightBar]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/TopRightBar]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
</span>
|
||||
|
@ -3,5 +3,5 @@ tags: $:/tags/SideBar
|
||||
caption: {{$:/language/SideBar/More/Caption}}
|
||||
|
||||
<div class="tw-more-sidebar">
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/MoreSideBar]] [!is[shadow]!has[draft.of]tag[$:/tags/MoreSideBar]] +[tag[$:/tags/MoreSideBar]]" "$:/core/ui/MoreSideBar/Tags" "$:/state/tab/moresidebar">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/MoreSideBar]!has[draft.of]]" "$:/core/ui/MoreSideBar/Tags" "$:/state/tab/moresidebar">>
|
||||
</div>
|
||||
|
@ -26,7 +26,7 @@ title: $:/core/ui/SideBarLists
|
||||
|
||||
<$reveal state="$:/temp/search" type="match" text="">
|
||||
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/SideBar]] [!is[shadow]!has[draft.of]tag[$:/tags/SideBar]] +[tag[$:/tags/SideBar]]" "$:/core/ui/SideBar/Open" "$:/state/tab/sidebar">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/SideBar]!has[draft.of]]" "$:/core/ui/SideBar/Open" "$:/state/tab/sidebar">>
|
||||
|
||||
</$reveal>
|
||||
</div>
|
||||
|
@ -11,6 +11,6 @@ background-color:$(backgroundColor)$;
|
||||
</$set>
|
||||
<$reveal state=<<qualify "$:/state/tagpopup">> type="popup" position="below" animate="yes"><div class="tw-drop-down"><$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
||||
<hr>
|
||||
<$list filter="[is[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
</div>
|
||||
</$reveal>
|
@ -7,7 +7,7 @@ title: $:/TagManager
|
||||
<$reveal state=<<qualify "$:/state/iconDropdown/$title$">> type="nomatch" text="" default="">
|
||||
<$linkcatcher to="$title$!!icon">
|
||||
<div class="tw-block-dropdown tw-edit-type-dropdown">
|
||||
<$list filter="[is[shadow]is[image]] [!is[shadow]is[image]] [is[shadow]tag[$:/tags/Image]] [!is[shadow]tag[$:/tags/Image]] +[sort[title]]">
|
||||
<$list filter="[all[tiddlers+shadows]is[image]] [all[tiddlers+shadows]tag[$:/tags/Image]] +[sort[title]]">
|
||||
<$link to={{!!title}}>
|
||||
<$view field="title"/>
|
||||
</$link>
|
||||
@ -28,7 +28,7 @@ title: $:/TagManager
|
||||
<$list filter="[tags[]!is[system]sort[title]]">
|
||||
<tr>
|
||||
<td><$transclude tiddler="$:/core/ui/TagTemplate"/></td>
|
||||
<td><$count filter="[is[current]tagging[]]"/></td>
|
||||
<td><$count filter="[all[current]tagging[]]"/></td>
|
||||
<td><$edit-text field="color" tag="input" type="color"/></td>
|
||||
<td><$macrocall $name="iconEditor" title={{!!title}}/></td>
|
||||
</tr>
|
||||
|
@ -11,7 +11,7 @@ background-color:$(backgroundColor)$;
|
||||
</$set>
|
||||
<$reveal state=<<qualify "$:/state/tagpopup">> type="popup" position="below" animate="yes"><div class="tw-drop-down"><$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
||||
<hr>
|
||||
<$list filter="[is[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
|
||||
</div>
|
||||
</$reveal>
|
||||
</span>
|
||||
|
@ -2,7 +2,7 @@ title: $:/core/ui/TiddlerFieldTemplate
|
||||
|
||||
<tr class="tw-view-field">
|
||||
<td class="tw-view-field-name">
|
||||
<<listItem>>
|
||||
<$text text=<<listItem>>/>
|
||||
</td>
|
||||
<td class="tw-view-field-value">
|
||||
<$view field=<<listItem>>/>
|
||||
|
@ -2,6 +2,6 @@ title: $:/core/ui/TiddlerFields
|
||||
|
||||
<table class="tw-view-field-table">
|
||||
<tbody>
|
||||
<$list filter="[is[current]fields[]sort[title]] -text" template="$:/core/ui/TiddlerFieldTemplate" variable="listItem"/>
|
||||
<$list filter="[all[current]fields[]sort[title]] -text" template="$:/core/ui/TiddlerFieldTemplate" variable="listItem"/>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@ -1,3 +1,3 @@
|
||||
title: $:/core/ui/TiddlerInfo
|
||||
|
||||
<<tabs "[is[shadow]!has[draft.of]tag[$:/tags/TiddlerInfo]] [!is[shadow]!has[draft.of]tag[$:/tags/TiddlerInfo]] +[tag[$:/tags/TiddlerInfo]]" "$:/core/ui/TiddlerInfo/References">>
|
||||
<<tabs "[all[tiddlers+shadows]tag[$:/tags/TiddlerInfo]!has[draft.of]]" "$:/core/ui/TiddlerInfo/References">>
|
||||
|
@ -2,7 +2,7 @@ title: $:/core/ui/TiddlerInfo/Advanced
|
||||
tags: $:/tags/TiddlerInfo
|
||||
caption: {{$:/language/TiddlerInfo/Advanced/Caption}}
|
||||
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/TiddlerInfo/Advanced]] [!is[shadow]!has[draft.of]tag[$:/tags/TiddlerInfo/Advanced]] +[tag[$:/tags/TiddlerInfo/Advanced]]" variable="listItem">
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]" variable="listItem">
|
||||
<$transclude tiddler=<<listItem>>/>
|
||||
|
||||
</$list>
|
||||
|
@ -2,13 +2,13 @@ title: $:/core/ui/TiddlerInfo/Advanced/PluginInfo
|
||||
tags: $:/tags/TiddlerInfo/Advanced
|
||||
|
||||
\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/
|
||||
<$list filter="[is[current]has[plugin-type]]">
|
||||
<$list filter="[all[current]has[plugin-type]]">
|
||||
|
||||
! <<lingo Heading>>
|
||||
|
||||
<<lingo Hint>>
|
||||
<ul>
|
||||
<$list filter="[is[current]plugintiddlers[]sort[title]]" emptyMessage=<<lingo Empty/Hint>>>
|
||||
<$list filter="[all[current]plugintiddlers[]sort[title]]" emptyMessage=<<lingo Empty/Hint>>>
|
||||
<li>
|
||||
<$link to={{!!title}}>
|
||||
<$view field="title"/>
|
||||
|
@ -6,17 +6,17 @@ tags: $:/tags/TiddlerInfo/Advanced
|
||||
|
||||
! <<lingo Heading>>
|
||||
|
||||
<$list filter="[is[current]!is[shadow]]">
|
||||
<$list filter="[all[current]!is[shadow]]">
|
||||
|
||||
<<lingo NotShadow/Hint>>
|
||||
|
||||
</$list>
|
||||
|
||||
<$list filter="[is[current]is[shadow]]">
|
||||
<$list filter="[all[current]is[shadow]]">
|
||||
|
||||
<<lingo Shadow/Hint>>
|
||||
|
||||
<$list filter="[is[current]shadowsource[]]">
|
||||
<$list filter="[all[current]shadowsource[]]">
|
||||
|
||||
<$set name="pluginTiddler" value=<<currentTiddler>>>
|
||||
<<lingo Shadow/Source>>
|
||||
@ -24,7 +24,7 @@ tags: $:/tags/TiddlerInfo/Advanced
|
||||
|
||||
</$list>
|
||||
|
||||
<$list filter="[is[current]is[shadow]is[tiddler]]">
|
||||
<$list filter="[all[current]is[shadow]is[tiddler]]">
|
||||
|
||||
<<lingo OverriddenShadow/Hint>>
|
||||
|
||||
|
@ -3,4 +3,4 @@ tags: $:/tags/TiddlerInfo
|
||||
caption: {{$:/language/TiddlerInfo/Listed/Caption}}
|
||||
|
||||
\define lingo-base() $:/language/TiddlerInfo/
|
||||
<$list filter="[is[current]listed[]!is[system]]" emptyMessage=<<lingo Listed/Empty>> template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[current]listed[]!is[system]]" emptyMessage=<<lingo Listed/Empty>> template="$:/core/ui/ListItemTemplate"/>
|
||||
|
@ -3,5 +3,5 @@ tags: $:/tags/TiddlerInfo
|
||||
caption: {{$:/language/TiddlerInfo/References/Caption}}
|
||||
|
||||
\define lingo-base() $:/language/TiddlerInfo/
|
||||
<$list filter="[is[current]backlinks[]sort[title]]" emptyMessage=<<lingo References/Empty>> template="$:/core/ui/ListItemTemplate">
|
||||
<$list filter="[all[current]backlinks[]sort[title]]" emptyMessage=<<lingo References/Empty>> template="$:/core/ui/ListItemTemplate">
|
||||
</$list>
|
||||
|
@ -3,4 +3,4 @@ tags: $:/tags/TiddlerInfo
|
||||
caption: {{$:/language/TiddlerInfo/Tagging/Caption}}
|
||||
|
||||
\define lingo-base() $:/language/TiddlerInfo/
|
||||
<$list filter="[is[current]tagging[]]" emptyMessage=<<lingo Tagging/Empty>> template="$:/core/ui/ListItemTemplate"/>
|
||||
<$list filter="[all[current]tagging[]]" emptyMessage=<<lingo Tagging/Empty>> template="$:/core/ui/ListItemTemplate"/>
|
||||
|
@ -3,6 +3,6 @@ title: $:/core/ui/ViewTemplate
|
||||
\define frame-classes()
|
||||
tw-tiddler-frame tw-tiddler-view-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$
|
||||
\end
|
||||
<$set name="storyTiddler" value=<<currentTiddler>>><$set name="tiddlerInfoState" value=<<qualify "$:/state/tiddlerInfo">>><$tiddler tiddler=<<currentTiddler>>><div class=<<frame-classes>>><$list filter="[is[shadow]!has[draft.of]tag[$:/tags/ViewTemplate]] [!is[shadow]!has[draft.of]tag[$:/tags/ViewTemplate]] +[tag[$:/tags/ViewTemplate]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
<$set name="storyTiddler" value=<<currentTiddler>>><$set name="tiddlerInfoState" value=<<qualify "$:/state/tiddlerInfo">>><$tiddler tiddler=<<currentTiddler>>><div class=<<frame-classes>>><$list filter="[all[tiddlers+shadows]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
</div>
|
||||
</$tiddler></$set></$set>
|
||||
|
@ -2,7 +2,7 @@ title: $:/core/ui/ViewTemplate/classic
|
||||
tags: $:/tags/ViewTemplate $:/tags/EditTemplate
|
||||
|
||||
\define lingo-base() $:/language/ClassicWarning/
|
||||
<$list filter="[is[current]type[text/x-tiddlywiki]]">
|
||||
<$list filter="[all[current]type[text/x-tiddlywiki]]">
|
||||
<div class="tw-message-box">
|
||||
|
||||
<<lingo Hint>>
|
||||
|
@ -1,4 +1,4 @@
|
||||
title: $:/core/ui/ViewTemplate/tags
|
||||
tags: $:/tags/ViewTemplate
|
||||
|
||||
<div class="tw-tags-wrapper"><$list filter="[is[current]tags[]sort[title]]" template="$:/core/ui/TagTemplate" storyview="pop"/></div>
|
||||
<div class="tw-tags-wrapper"><$list filter="[all[current]tags[]sort[title]]" template="$:/core/ui/TagTemplate" storyview="pop"/></div>
|
||||
|
@ -7,19 +7,19 @@ fill:$(foregroundColor)$;
|
||||
<div class="tw-tiddler-title">
|
||||
<div class="titlebar">
|
||||
<span class="tw-tiddler-controls">
|
||||
<$list filter="[is[shadow]!has[draft.of]tag[$:/tags/ViewToolbar]] [!is[shadow]!has[draft.of]tag[$:/tags/ViewToolbar]] +[tag[$:/tags/ViewToolbar]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
<$list filter="[all[tiddlers+shadows]tag[$:/tags/ViewToolbar]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list>
|
||||
</span>
|
||||
<$set name="foregroundColor" value={{!!color}}>
|
||||
<span style=<<title-styles>>>
|
||||
<$transclude tiddler={{!!icon}}/>
|
||||
</span>
|
||||
</$set>
|
||||
<$list filter="[is[current]removeprefix[$:/]]">
|
||||
<$list filter="[all[current]removeprefix[$:/]]">
|
||||
<span class="title" title={{$:/language/SystemTiddler/Tooltip}}>
|
||||
<span class="tw-system-title-prefix">$:/</span><$text text=<<currentTiddler>>/>
|
||||
</span>
|
||||
</$list>
|
||||
<$list filter="[is[current]!prefix[$:/]]">
|
||||
<$list filter="[all[current]!prefix[$:/]]">
|
||||
<span class="title">
|
||||
<$view field="title"/>
|
||||
</span>
|
||||
|
@ -9,7 +9,7 @@ title: $:/snippets/modules
|
||||
|
||||
<$macrocall $name="describeModuleType" type=<<currentTiddler>>/>
|
||||
|
||||
<ul><$list filter="[is[current]modules[]]"><li><$link><<currentTiddler>></$link>
|
||||
<ul><$list filter="[all[current]modules[]]"><li><$link><<currentTiddler>></$link>
|
||||
</li>
|
||||
</$list>
|
||||
</ul>
|
||||
|
@ -8,12 +8,12 @@ title: $:/snippets/paletteeditor
|
||||
|
||||
<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name="currentTiddler" $output="text/plain"/></$link>
|
||||
|
||||
<$list filter="[is[current]is[shadow]is[tiddler]]" variable="listItem">
|
||||
<$list filter="[all[current]is[shadow]is[tiddler]]" variable="listItem">
|
||||
<<lingo Prompt/Modified>>
|
||||
<$button message="tw-delete-tiddler" param={{$:/palette}}><<lingo Reset/Caption>></$button>
|
||||
</$list>
|
||||
|
||||
<$list filter="[is[current]is[shadow]!is[tiddler]]" variable="listItem">
|
||||
<$list filter="[all[current]is[shadow]!is[tiddler]]" variable="listItem">
|
||||
<<lingo Clone/Prompt>>
|
||||
</$list>
|
||||
|
||||
@ -21,7 +21,7 @@ title: $:/snippets/paletteeditor
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<$list filter="[is[current]indexes[]]" variable="colourName">
|
||||
<$list filter="[all[current]indexes[]]" variable="colourName">
|
||||
<tr>
|
||||
<td>
|
||||
''<$macrocall $name="describePaletteColour" colour=<<colourName>>/>''<br/>
|
||||
|
@ -4,7 +4,7 @@ title: $:/snippets/paletteswitcher
|
||||
<<lingo Prompt>> <$view tiddler={{$:/palette}} field="name"/>
|
||||
|
||||
<$linkcatcher to="$:/palette">
|
||||
<div class="tw-chooser"><$list filter="[is[shadow]tag[$:/tags/Palette]] [!is[shadow]tag[$:/tags/Palette]] +[sort[description]]"><div class="tw-chooser-item"><$link to={{!!title}}><div><$reveal state="$:/palette" type="match" text={{!!title}}>•</$reveal><$reveal state="$:/palette" type="nomatch" text={{!!title}}> </$reveal> ''<$view field="name" format="text"/>'' - <$view field="description" format="text"/></div><$transclude tiddler="$:/snippets/currpalettepreview"/></$link></div>
|
||||
<div class="tw-chooser"><$list filter="[all[tiddlers+shadows]tag[$:/tags/Palette]sort[description]]"><div class="tw-chooser-item"><$link to={{!!title}}><div><$reveal state="$:/palette" type="match" text={{!!title}}>•</$reveal><$reveal state="$:/palette" type="nomatch" text={{!!title}}> </$reveal> ''<$view field="name" format="text"/>'' - <$view field="description" format="text"/></div><$transclude tiddler="$:/snippets/currpalettepreview"/></$link></div>
|
||||
</$list>
|
||||
</div>
|
||||
</$linkcatcher>
|
@ -144,7 +144,7 @@ describe("Filter tests", function() {
|
||||
expect(wiki.filterTiddlers("[!tag[one]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one");
|
||||
expect(wiki.filterTiddlers("[prefix[Tidd]tag[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[!is[shadow]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three");
|
||||
expect(wiki.filterTiddlers("[is[shadow]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerFive");
|
||||
expect(wiki.filterTiddlers("[all[shadows]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerFive");
|
||||
});
|
||||
|
||||
it("should handle the tags operator", function() {
|
||||
@ -156,7 +156,7 @@ describe("Filter tests", function() {
|
||||
expect(wiki.filterTiddlers("[[one]tagging[]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[[one]tagging[]]").join(",")).toBe("Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[[two]tagging[]sort[title]]").join(",")).toBe("$:/TiddlerFive,$:/TiddlerTwo,Tiddler Three");
|
||||
expect(wiki.filterTiddlers("[is[current]tagging[]sort[title]]","one").join(",")).toBe("Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[all[current]tagging[]sort[title]]","one").join(",")).toBe("Tiddler Three,TiddlerOne");
|
||||
});
|
||||
|
||||
it("should handle the untagged operator", function() {
|
||||
@ -166,12 +166,12 @@ describe("Filter tests", function() {
|
||||
|
||||
it("should handle the links operator", function() {
|
||||
expect(wiki.filterTiddlers("[!is[shadow]links[]sort[title]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerSix,TiddlerTwo,TiddlerZero");
|
||||
expect(wiki.filterTiddlers("[is[shadow]links[]sort[title]]").join(",")).toBe("TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[all[shadows]links[]sort[title]]").join(",")).toBe("TiddlerOne");
|
||||
});
|
||||
|
||||
it("should handle the backlinks operator", function() {
|
||||
expect(wiki.filterTiddlers("[!is[shadow]backlinks[]sort[title]]").join(",")).toBe("a fourth tiddler,one");
|
||||
expect(wiki.filterTiddlers("[is[shadow]backlinks[]sort[title]]").join(",")).toBe("Tiddler Three");
|
||||
expect(wiki.filterTiddlers("[all[shadows]backlinks[]sort[title]]").join(",")).toBe("Tiddler Three");
|
||||
});
|
||||
|
||||
it("should handle the has operator", function() {
|
||||
@ -187,7 +187,7 @@ describe("Filter tests", function() {
|
||||
|
||||
it("should handle the list operator", function() {
|
||||
expect(wiki.filterTiddlers("[list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[tag[one]list[TiddlerSeventh]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[tag[one]list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne");
|
||||
});
|
||||
|
||||
it("should handle the next operator", function() {
|
||||
@ -232,12 +232,12 @@ describe("Filter tests", function() {
|
||||
});
|
||||
|
||||
it("should handle the '[is[shadow]]' operator", function() {
|
||||
expect(wiki.filterTiddlers("[is[shadow]sort[title]]").join(",")).toBe("$:/TiddlerFive,Tiddler8,TiddlerSeventh,TiddlerSix");
|
||||
expect(wiki.filterTiddlers("[all[shadows]sort[title]]").join(",")).toBe("$:/TiddlerFive,Tiddler8,TiddlerSeventh,TiddlerSix");
|
||||
expect(wiki.filterTiddlers("[!is[shadow]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne");
|
||||
});
|
||||
|
||||
it("should handle the '[is[missing]]' operator", function() {
|
||||
expect(wiki.filterTiddlers("[is[missing]]").join(",")).toBe("TiddlerZero,TiddlerTwo");
|
||||
expect(wiki.filterTiddlers("[all[missing]]").join(",")).toBe("TiddlerZero,TiddlerTwo");
|
||||
expect(wiki.filterTiddlers("[!is[missing]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne");
|
||||
expect(wiki.filterTiddlers("[[TiddlerOne]is[missing]]").join(",")).toBe("");
|
||||
expect(wiki.filterTiddlers("[[TiddlerZero]is[missing]]").join(",")).toBe("TiddlerZero");
|
||||
|
@ -6,13 +6,33 @@ type: text/vnd.tiddlywiki
|
||||
|
||||
//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.0.8-beta...v5.0.9-beta]]//
|
||||
|
||||
!! Highlights
|
||||
|
||||
* Improved layout, including a ''hamburger'' icon for dismissing the sidebar
|
||||
* New ''Filter'' tab in [[$:/AdvancedSearch]]
|
||||
* Initial implementation of CecilyView
|
||||
* Overhaul of inconsistencies in TiddlerFilters (see [[Changes to filters in 5.0.9-beta]])
|
||||
*
|
||||
|
||||
!! Documentation Improvements
|
||||
|
||||
*
|
||||
* Demo of [[Making curved text with SVG]]
|
||||
* [[Community]] links are now broken up into individual tiddlers
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/a19432541e776bfb63b1b985a60f472e9f1d4352]] overview diagram of [[TiddlyWiki Architecture]]
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/7b57561160173667031b5bc15a4f7553d8514c1c]] documentation from buggyj: [[Developing plugins using Node.js and GitHub]]
|
||||
|
||||
!! Usability Improvements
|
||||
|
||||
*
|
||||
* Made the dropdown arrow icon [[skinnier|https://github.com/Jermolene/TiddlyWiki5/commit/ec90ac99cf2767b6ff20902d8b01aa1c36778147]]
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bca1d552803c1839e7385765314f81c5307632b8]] validation of legal characters for fieldnames
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/45a362c2859ed401a0af5ca3bbbc976710bf4acf]] a dropdown for tags in edit mode
|
||||
* Added blacklisting of unsage HTML [[elements|https://github.com/Jermolene/TiddlyWiki5/commit/ba6edd42c125cb19d955a1cb3f54a2d367cb79dc]] and [[attributes|https://github.com/Jermolene/TiddlyWiki5/commit/ba6edd42c125cb19d955a1cb3f54a2d367cb79dc]]
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/baa8cf3dd098bab0a7a8c78b24747c69bd40889f]] a warning indicator to tiddlers in TiddlyWikiClassic format
|
||||
* [[Add|https://github.com/Jermolene/TiddlyWiki5/commit/42c67cfeb732fccb10b8ab574c84090dc2471352]] tiddler info ''Advanced'' panel with information about plugins and shadow tiddlers
|
||||
* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/96457d801159958b897f98e22aa9af53b97f0e35]] layout of [[$:/ControlPanel]] ''Plugins'' tab
|
||||
* [[Enhance|https://github.com/Jermolene/TiddlyWiki5/commit/f48701544eda4f79af86b1ad44340e7182bcf024]] viewing of system tiddlers by fading down the `$:/` prefix
|
||||
* [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/dd3ee2a603cba35770a8f109e070f271d72861f8]] [[$:/TagManager]] to allow icons to be assigned to tags
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/87c4839fed789b80e0942014c05175e36aacc157]] support for `list-before` and `list-after` fields for controlling tag ordering (see TiddlerTags for details)
|
||||
|
||||
!! Scalability Improvements
|
||||
|
||||
@ -20,8 +40,28 @@ type: text/vnd.tiddlywiki
|
||||
|
||||
!! Hackability Improvements
|
||||
|
||||
*
|
||||
* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/bdbbf94326f70db0f8ef196270ab9e92bfde10fb]] [[Transclusion in WikiText]] syntax to allow translusion of a template without affecting the current tiddler
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8a7d0f53d380e9ca93ee34d8ad05090d511e95c4]] `sourceURL` handling to `eval()` so that tiddler modules can be [[properly debugged|https://chromedevtools.googlecode.com/svn-history/r421/trunk/tutorials/b
|
||||
reapoints/index.html#regular]] in Chrome
|
||||
* New ScrollableWidget giving better control over scrollable regions
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/d3c0296a87198296cff26aa7ce7bb8274cdcc3f7]] new CSS class `tw-site-title` for the site title
|
||||
* [[Disable|https://github.com/Jermolene/TiddlyWiki5/commit/e397e4d15951c1395c7752a7563f002ca459206e]] the TiddlyWeb sync adaptor unless the wiki is loaded over HTTP
|
||||
* Added a [[high resolution timer mechanism|https://github.com/Jermolene/TiddlyWiki5/commit/dcce4879347e4829d75f10248477731b18b829ef]] and a [[performance measurement mechanism|https://github.com/Jermolene/TiddlyWiki5/commit/d402d3c5a619b6b1642ab03c74ff03a864846a0b]]
|
||||
* Added a [[basic CSV parser|https://github.com/Jermolene/TiddlyWiki5/commit/5a085f792722c74d259464386138c731b2f014cc]]
|
||||
* Several measures to enforce the TiddlyWiki programming model:
|
||||
** [[Refactor|https://github.com/Jermolene/TiddlyWiki5/commit/9de17aa206b21df5c4e29e61bba5d6b49aca6c71]] wiki store object to make members be private
|
||||
** Freeze tiddler object and [[fields|https://github.com/Jermolene/TiddlyWiki5/commit/279626a3e3fbd75d60fc3be49b68a99d8ba0a95d]] tiddler fields to enforce their immutability
|
||||
* [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/f649b5b037bfd2e7c48d1ba65ffa37064456523d]] the ButtonWidget to be able to set text references
|
||||
* [[Add|https://github.com/Jermolene/TiddlyWiki5/commit/afa677b9a0b1dff1239dc1ea08edd210b9736af9]] a class to tiddler frames in view mode
|
||||
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/50cf9678cb469e443e220b063e2355c844e417e7]] support for [[WidgetMessage: tw-home]]
|
||||
* [[Hidden|https://github.com/Jermolene/TiddlyWiki5/commit/2608a323ebf3d8a8e925eda6d3a10ebb8f41d383]] system tags from the sidebar ''Tags' tab
|
||||
* [[Allow|https://github.com/Jermolene/TiddlyWiki5/commit/98872bbe7c62faa4aa209fa421c2989aeef3aaf2]] pasting and import of HTML content
|
||||
* [[Add|https://github.com/Jermolene/TiddlyWiki5/commit/a5a2c718b1d5671652d01e3567dba1c6795b7521]] support for a tooltip on the LinkWidget
|
||||
|
||||
!! Bug Fixes
|
||||
|
||||
*
|
||||
* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/aa631518152cda5643805c143bf0000bca8d767f]] problem with occasional freezes of the sync mechanism - thanks to buggyj
|
||||
* Fixed problem with [[tiddlers|https://github.com/Jermolene/TiddlyWiki5/commit/1e960ffcac566c742c44b18d6f0e809d4457b249]] or [[fields|https://github.com/Jermolene/TiddlyWiki5/commit/ea46f85a8a5ad29e8602cbb13667c853903681a6]] called `__proto__`
|
||||
* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/aec618793f41b937676a5a165764dc19d9bbb2b2]] with refreshing the D3 plugin
|
||||
|
||||
|
||||
|
@ -8,4 +8,4 @@ ShadowTiddlers can be overridden with an ordinary tiddler of the same name. If t
|
||||
|
||||
The current shadow tiddlers are:
|
||||
|
||||
<$list filter="[is[shadow]sort[title]]"/>
|
||||
<$list filter="[all[shadows]sort[title]]"/>
|
||||
|
@ -22,4 +22,4 @@ System tags are used to give special behaviour to tiddlers:
|
||||
|
||||
These are the system tags in use in this wiki:
|
||||
|
||||
{{{ [is[shadow]tags[]prefix[$:/]] [!is[shadow]tags[]prefix[$:/]] +[sort[title]] }}}
|
||||
{{{ [all[tiddlers+shadows]tags[]prefix[$:/]] +[sort[title]] }}}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user