mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-26 19:47:20 +00:00
Starting to make the members of $tw.Wiki be private
We want to avoid plugins from directly accessing the tiddlers hashmap. Later we’ll do pluginTiddlers, pluginInfo and shadowTiddlers.
This commit is contained in:
parent
499730c458
commit
721e333a20
76
boot/boot.js
76
boot/boot.js
@ -674,7 +674,7 @@ Apply a callback to each module of a particular type
|
|||||||
*/
|
*/
|
||||||
$tw.modules.forEachModuleOfType = function(moduleType,callback) {
|
$tw.modules.forEachModuleOfType = function(moduleType,callback) {
|
||||||
var modules = $tw.modules.types[moduleType];
|
var modules = $tw.modules.types[moduleType];
|
||||||
$tw.utils.each(modules,function(element,title,object) {
|
$tw.utils.each(modules,function(element,title) {
|
||||||
callback(title,$tw.modules.execute(title));
|
callback(title,$tw.modules.execute(title));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -795,21 +795,64 @@ $tw.modules.define("$:/boot/tiddlerfields/list","tiddlerfield",{
|
|||||||
Construct a wiki store object
|
Construct a wiki store object
|
||||||
*/
|
*/
|
||||||
$tw.Wiki = function() {
|
$tw.Wiki = function() {
|
||||||
this.tiddlers = {};
|
var self = this,
|
||||||
|
tiddlers = {}; // Hashmap of tiddlers
|
||||||
this.pluginTiddlers = []; // Array of tiddlers containing registered plugins, ordered by priority
|
this.pluginTiddlers = []; // Array of tiddlers containing registered plugins, ordered by priority
|
||||||
this.pluginInfo = {}; // Hashmap of parsed plugin content
|
this.pluginInfo = {}; // Hashmap of parsed plugin content
|
||||||
this.shadowTiddlers = {}; // Hashmap by title of {source:, tiddler:}
|
this.shadowTiddlers = {}; // Hashmap by title of {source:, tiddler:}
|
||||||
};
|
// Methods that need access to the private members
|
||||||
|
this.addTiddler = function(tiddler) {
|
||||||
$tw.Wiki.prototype.addTiddler = function(tiddler) {
|
|
||||||
if(!(tiddler instanceof $tw.Tiddler)) {
|
if(!(tiddler instanceof $tw.Tiddler)) {
|
||||||
tiddler = new $tw.Tiddler(tiddler);
|
tiddler = new $tw.Tiddler(tiddler);
|
||||||
}
|
}
|
||||||
if(tiddler.fields.title) {
|
// Get the title
|
||||||
this.tiddlers[tiddler.fields.title] = tiddler;
|
var title = tiddler.fields.title;
|
||||||
|
// Save the tiddler
|
||||||
|
if(title) {
|
||||||
|
tiddlers[title] = tiddler;
|
||||||
|
this.clearCache(title);
|
||||||
|
this.clearGlobalCache();
|
||||||
|
this.enqueueTiddlerEvent(title);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
this.getTiddler = function(title) {
|
||||||
|
var t = tiddlers[title];
|
||||||
|
if(t instanceof $tw.Tiddler) {
|
||||||
|
return t;
|
||||||
|
} else if(title !== undefined && $tw.utils.hop(self.shadowTiddlers,title)) {
|
||||||
|
return self.shadowTiddlers[title].tiddler;
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.getAllTitles = function() {
|
||||||
|
var results = {};
|
||||||
|
for(var title in tiddlers) {
|
||||||
|
results[title] = true;
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
};
|
||||||
|
this.each = function(callback) {
|
||||||
|
for(var title in tiddlers) {
|
||||||
|
callback(tiddlers[title],title);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.tiddlerExists = function(title) {
|
||||||
|
return !!$tw.utils.hop(tiddlers,title);
|
||||||
|
};
|
||||||
|
this.deleteTiddler = function(title) {
|
||||||
|
delete tiddlers[title];
|
||||||
|
this.clearCache(title);
|
||||||
|
this.clearGlobalCache();
|
||||||
|
this.enqueueTiddlerEvent(title,true);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Dummy methods that will be filled in after boot
|
||||||
|
$tw.Wiki.prototype.clearCache =
|
||||||
|
$tw.Wiki.prototype.clearGlobalCache =
|
||||||
|
$tw.Wiki.prototype.enqueueTiddlerEvent = function() {};
|
||||||
|
|
||||||
$tw.Wiki.prototype.addTiddlers = function(tiddlers) {
|
$tw.Wiki.prototype.addTiddlers = function(tiddlers) {
|
||||||
for(var t=0; t<tiddlers.length; t++) {
|
for(var t=0; t<tiddlers.length; t++) {
|
||||||
this.addTiddler(tiddlers[t]);
|
this.addTiddler(tiddlers[t]);
|
||||||
@ -821,7 +864,7 @@ Read plugin info for all plugins
|
|||||||
*/
|
*/
|
||||||
$tw.Wiki.prototype.readPluginInfo = function() {
|
$tw.Wiki.prototype.readPluginInfo = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
$tw.utils.each(this.tiddlers,function(tiddler,title) {
|
this.each(function(tiddler,title) {
|
||||||
if(tiddler && tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type")) {
|
if(tiddler && tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type")) {
|
||||||
self.pluginInfo[tiddler.fields.title] = JSON.parse(tiddler.fields.text);
|
self.pluginInfo[tiddler.fields.title] = JSON.parse(tiddler.fields.text);
|
||||||
}
|
}
|
||||||
@ -846,7 +889,7 @@ $tw.Wiki.prototype.registerPluginTiddlers = function(pluginType,titles) {
|
|||||||
checkTiddler(self.getTiddler(title));
|
checkTiddler(self.getTiddler(title));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
$tw.utils.each(this.tiddlers,function(tiddler,title) {
|
this.each(function(tiddler,title) {
|
||||||
checkTiddler(tiddler);
|
checkTiddler(tiddler);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -911,7 +954,7 @@ $tw.Wiki.prototype.unpackPluginTiddlers = function() {
|
|||||||
Define all modules stored in ordinary tiddlers
|
Define all modules stored in ordinary tiddlers
|
||||||
*/
|
*/
|
||||||
$tw.Wiki.prototype.defineTiddlerModules = function() {
|
$tw.Wiki.prototype.defineTiddlerModules = function() {
|
||||||
$tw.utils.each(this.tiddlers,function(tiddler,title,object) {
|
this.each(function(tiddler,title) {
|
||||||
if(tiddler.hasField("module-type")) {
|
if(tiddler.hasField("module-type")) {
|
||||||
switch (tiddler.fields.type) {
|
switch (tiddler.fields.type) {
|
||||||
case "application/javascript":
|
case "application/javascript":
|
||||||
@ -938,7 +981,7 @@ $tw.Wiki.prototype.defineShadowModules = function() {
|
|||||||
var self = this;
|
var self = this;
|
||||||
$tw.utils.each(this.shadowTiddlers,function(element,title) {
|
$tw.utils.each(this.shadowTiddlers,function(element,title) {
|
||||||
var tiddler = self.getTiddler(title);
|
var tiddler = self.getTiddler(title);
|
||||||
if(!$tw.utils.hop(self.tiddlers,title)) { // Don't define the module if it is overidden by an ordinary tiddler
|
if(!self.tiddlerExists(title)) { // Don't define the module if it is overidden by an ordinary tiddler
|
||||||
if(tiddler.hasField("module-type")) {
|
if(tiddler.hasField("module-type")) {
|
||||||
// Define the module
|
// Define the module
|
||||||
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],tiddler.fields.text);
|
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],tiddler.fields.text);
|
||||||
@ -947,17 +990,6 @@ $tw.Wiki.prototype.defineShadowModules = function() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
$tw.Wiki.prototype.getTiddler = function(title) {
|
|
||||||
var t = this.tiddlers[title];
|
|
||||||
if(t instanceof $tw.Tiddler) {
|
|
||||||
return t;
|
|
||||||
} else if(title !== undefined && $tw.utils.hop(this.shadowTiddlers,title)) {
|
|
||||||
return this.shadowTiddlers[title].tiddler;
|
|
||||||
} else {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Extracts tiddlers from a typed block of text, specifying default field values
|
Extracts tiddlers from a typed block of text, specifying default field values
|
||||||
*/
|
*/
|
||||||
|
@ -151,7 +151,7 @@ exports.getFilterOperators = function() {
|
|||||||
|
|
||||||
exports.filterTiddlers = function(filterString,currTiddlerTitle,tiddlerList) {
|
exports.filterTiddlers = function(filterString,currTiddlerTitle,tiddlerList) {
|
||||||
var fn = this.compileFilter(filterString);
|
var fn = this.compileFilter(filterString);
|
||||||
return fn.call(this,tiddlerList || this.tiddlers,currTiddlerTitle);
|
return fn.call(this,tiddlerList,currTiddlerTitle);
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.compileFilter = function(filterString) {
|
exports.compileFilter = function(filterString) {
|
||||||
@ -219,7 +219,7 @@ exports.compileFilter = function(filterString) {
|
|||||||
});
|
});
|
||||||
// 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 array/hashmap of tiddler titles
|
||||||
return function(source,currTiddlerTitle) {
|
return function(source,currTiddlerTitle) {
|
||||||
source = source || self.tiddlers;
|
source = source || self.getAllTitles();
|
||||||
var results = [];
|
var results = [];
|
||||||
$tw.utils.each(operationFunctions,function(operationFunction) {
|
$tw.utils.each(operationFunctions,function(operationFunction) {
|
||||||
operationFunction(results,source,currTiddlerTitle);
|
operationFunction(results,source,currTiddlerTitle);
|
||||||
|
@ -155,17 +155,6 @@ exports.getChangeCount = function(title) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.deleteTiddler = function(title) {
|
|
||||||
delete this.tiddlers[title];
|
|
||||||
this.clearCache(title);
|
|
||||||
this.clearGlobalCache();
|
|
||||||
this.enqueueTiddlerEvent(title,true);
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.tiddlerExists = function(title) {
|
|
||||||
return !!$tw.utils.hop(this.tiddlers,title);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Generate an unused title from the specified base
|
Generate an unused title from the specified base
|
||||||
*/
|
*/
|
||||||
@ -206,22 +195,6 @@ exports.isImageTiddler = function(title) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.addTiddler = function(tiddler) {
|
|
||||||
// Check if we're passed a fields hashmap instead of a tiddler
|
|
||||||
if(!(tiddler instanceof $tw.Tiddler)) {
|
|
||||||
tiddler = new $tw.Tiddler(tiddler);
|
|
||||||
}
|
|
||||||
// Get the title
|
|
||||||
var title = tiddler.fields.title;
|
|
||||||
// Save the tiddler
|
|
||||||
if(title) {
|
|
||||||
this.tiddlers[title] = tiddler;
|
|
||||||
this.clearCache(title);
|
|
||||||
this.clearGlobalCache();
|
|
||||||
this.enqueueTiddlerEvent(title);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Like addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported
|
Like addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported
|
||||||
*/
|
*/
|
||||||
@ -277,15 +250,13 @@ exports.getTiddlers = function(options) {
|
|||||||
var self = this,
|
var self = this,
|
||||||
sortField = options.sortField || "title",
|
sortField = options.sortField || "title",
|
||||||
tiddlers = [], t, titles = [];
|
tiddlers = [], t, titles = [];
|
||||||
for(t in this.tiddlers) {
|
this.each(function(tiddler,title) {
|
||||||
if($tw.utils.hop(this.tiddlers,t)) {
|
if(options.includeSystem || !self.isSystemTiddler(title)) {
|
||||||
if(options.includeSystem || !this.isSystemTiddler(t)) {
|
if(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {
|
||||||
if(!options.excludeTag || !this.tiddlers[t].hasTag(options.excludeTag)) {
|
tiddlers.push(tiddler);
|
||||||
tiddlers.push(this.tiddlers[t]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
tiddlers.sort(function(a,b) {
|
tiddlers.sort(function(a,b) {
|
||||||
var aa = a.fields[sortField].toLowerCase() || "",
|
var aa = a.fields[sortField].toLowerCase() || "",
|
||||||
bb = b.fields[sortField].toLowerCase() || "";
|
bb = b.fields[sortField].toLowerCase() || "";
|
||||||
@ -363,7 +334,7 @@ exports.forEachTiddler = function(/* [options,]callback */) {
|
|||||||
titles = this.getTiddlers(options),
|
titles = this.getTiddlers(options),
|
||||||
t, tiddler;
|
t, tiddler;
|
||||||
for(t=0; t<titles.length; t++) {
|
for(t=0; t<titles.length; t++) {
|
||||||
tiddler = this.tiddlers[titles[t]];
|
tiddler = this.getTiddler(titles[t]);
|
||||||
if(tiddler) {
|
if(tiddler) {
|
||||||
callback.call(this,tiddler.fields.title,tiddler);
|
callback.call(this,tiddler.fields.title,tiddler);
|
||||||
}
|
}
|
||||||
@ -450,26 +421,6 @@ exports.getOrphanTitles = function() {
|
|||||||
return orphans; // Todo
|
return orphans; // Todo
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.getSystemTitles = function() {
|
|
||||||
var titles = [];
|
|
||||||
for(var title in this.tiddlers) {
|
|
||||||
if(this.isSystemTiddler(title)) {
|
|
||||||
titles.push(title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
titles.sort();
|
|
||||||
return titles;
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.getShadowTitles = function() {
|
|
||||||
var titles = [];
|
|
||||||
for(var title in this.shadowTiddlers) {
|
|
||||||
titles.push(title);
|
|
||||||
}
|
|
||||||
titles.sort();
|
|
||||||
return titles;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Retrieves a list of the tiddler titles that are tagged with a given tag
|
Retrieves a list of the tiddler titles that are tagged with a given tag
|
||||||
*/
|
*/
|
||||||
@ -488,7 +439,7 @@ exports.getTagMap = function() {
|
|||||||
var self = this;
|
var self = this;
|
||||||
return this.getGlobalCache("tagmap",function() {
|
return this.getGlobalCache("tagmap",function() {
|
||||||
var tags = {},
|
var tags = {},
|
||||||
storeTags = function(tagArray) {
|
storeTags = function(tagArray,title) {
|
||||||
if(tagArray) {
|
if(tagArray) {
|
||||||
for(var index=0; index<tagArray.length; index++) {
|
for(var index=0; index<tagArray.length; index++) {
|
||||||
var tag = tagArray[index];
|
var tag = tagArray[index];
|
||||||
@ -503,15 +454,14 @@ exports.getTagMap = function() {
|
|||||||
title, tiddler;
|
title, tiddler;
|
||||||
// Collect up all the tags
|
// Collect up all the tags
|
||||||
for(title in self.shadowTiddlers) {
|
for(title in self.shadowTiddlers) {
|
||||||
if(!$tw.utils.hop(self.tiddlers,title)) {
|
if(!self.tiddlerExists(title)) {
|
||||||
tiddler = self.shadowTiddlers[title].tiddler;
|
tiddler = self.shadowTiddlers[title].tiddler;
|
||||||
storeTags(tiddler.fields.tags);
|
storeTags(tiddler.fields.tags,title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(title in self.tiddlers) {
|
self.each(function(tiddler,title) {
|
||||||
tiddler = self.tiddlers[title];
|
storeTags(tiddler.fields.tags,title);
|
||||||
storeTags(tiddler.fields.tags);
|
});
|
||||||
}
|
|
||||||
return tags;
|
return tags;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -522,12 +472,11 @@ Lookup a given tiddler and return a list of all the tiddlers that include it in
|
|||||||
exports.findListingsOfTiddler = function(targetTitle) {
|
exports.findListingsOfTiddler = function(targetTitle) {
|
||||||
// Get the list associated with the tag
|
// Get the list associated with the tag
|
||||||
var titles = [];
|
var titles = [];
|
||||||
for(var title in this.tiddlers) {
|
this.each(function(tiddler,title) {
|
||||||
var tiddler = this.tiddlers[title];
|
|
||||||
if($tw.utils.isArray(tiddler.fields.list) && tiddler.fields.list.indexOf(targetTitle) !== -1) {
|
if($tw.utils.isArray(tiddler.fields.list) && tiddler.fields.list.indexOf(targetTitle) !== -1) {
|
||||||
titles.push(title);
|
titles.push(title);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
return titles;
|
return titles;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -998,12 +947,19 @@ exports.search = function(text,options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var source = options.titles || this.tiddlers;
|
if(options.titles) {
|
||||||
for(t in source) {
|
for(var title in options.titles) {
|
||||||
if(!!searchTiddler(t) === !options.invert) {
|
if(!!searchTiddler(title) === !options.invert) {
|
||||||
results.push(t);
|
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
|
// Remove any of the results we have to exclude
|
||||||
if(options.exclude) {
|
if(options.exclude) {
|
||||||
|
Loading…
Reference in New Issue
Block a user