mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-30 05:19:57 +00:00
Update plugin loading mechanism to allow plugins to be unregistered
We still have to explicitly unpack them after registering or unregistering
This commit is contained in:
parent
e875de63a9
commit
6d455d77cd
71
boot/boot.js
71
boot/boot.js
@ -619,7 +619,7 @@ Construct a wiki store object
|
|||||||
*/
|
*/
|
||||||
$tw.Wiki = function() {
|
$tw.Wiki = function() {
|
||||||
this.tiddlers = {};
|
this.tiddlers = {};
|
||||||
this.plugins = {}; // Hashmap of plugin information by title
|
this.plugins = []; // Array of registered plugins, ordered by priority
|
||||||
this.shadowTiddlers = {}; // Hashmap by title of {source:, tiddler:}
|
this.shadowTiddlers = {}; // Hashmap by title of {source:, tiddler:}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -637,19 +637,54 @@ $tw.Wiki.prototype.addTiddlers = function(tiddlers) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Extract constituent tiddlers from plugin tiddlers so that we can easily access them in getTiddler()
|
Register the plugin tiddlers of a particular type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected
|
||||||
*/
|
*/
|
||||||
$tw.Wiki.prototype.unpackPluginTiddlers = function(pluginType) {
|
$tw.Wiki.prototype.registerPluginTiddlers = function(pluginType,titles) {
|
||||||
// Collect up the titles of all the plugin tiddlers
|
|
||||||
var self = this,
|
var self = this,
|
||||||
pluginInfoList = [];
|
registeredTitles = [];
|
||||||
$tw.utils.each(this.tiddlers,function(tiddler,title,object) {
|
// Go through the provided titles, or the entire tiddler list, looking for plugins of this type
|
||||||
if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin") && tiddler.fields["plugin-type"] === pluginType) {
|
var checkTiddler = function(tiddler) {
|
||||||
pluginInfoList.push(tiddler);
|
if(tiddler && tiddler.fields.type === "application/json" && tiddler.hasField("plugin") && tiddler.fields["plugin-type"] === pluginType) {
|
||||||
|
self.plugins.push(tiddler);
|
||||||
|
registeredTitles.push(tiddler.fields.title);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
if(titles) {
|
||||||
|
$tw.utils.each(titles,function(title) {
|
||||||
|
checkTiddler(self.getTiddler(title));
|
||||||
});
|
});
|
||||||
// Sort the titles by the `plugin-priority` field
|
} else {
|
||||||
pluginInfoList.sort(function(a,b) {
|
$tw.utils.each(this.tiddlers,function(tiddler,title) {
|
||||||
|
checkTiddler(tiddler);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return registeredTitles;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Unregister the plugin tiddlers of a particular type, returning an array of the titles affected
|
||||||
|
*/
|
||||||
|
$tw.Wiki.prototype.unregisterPluginTiddlers = function(pluginType) {
|
||||||
|
var self = this,
|
||||||
|
titles = [];
|
||||||
|
// Remove any previous registered plugins of this type
|
||||||
|
for(var t=this.plugins.length-1; t>=0; t--) {
|
||||||
|
var tiddler = this.plugins[t];
|
||||||
|
if(tiddler.fields["plugin-type"] === pluginType) {
|
||||||
|
titles.push(tiddler.fields.title);
|
||||||
|
this.plugins.splice(t,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return titles;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Unpack the currently registered plugins, creating shadow tiddlers for their constituent tiddlers
|
||||||
|
*/
|
||||||
|
$tw.Wiki.prototype.unpackPluginTiddlers = function() {
|
||||||
|
var self = this;
|
||||||
|
// Sort the plugin titles by the `plugin-priority` field
|
||||||
|
this.plugins.sort(function(a,b) {
|
||||||
if("plugin-priority" in a.fields && "plugin-priority" in b.fields) {
|
if("plugin-priority" in a.fields && "plugin-priority" in b.fields) {
|
||||||
return a.fields["plugin-priority"] - b.fields["plugin-priority"];
|
return a.fields["plugin-priority"] - b.fields["plugin-priority"];
|
||||||
} else if("plugin-priority" in a.fields) {
|
} else if("plugin-priority" in a.fields) {
|
||||||
@ -664,10 +699,11 @@ $tw.Wiki.prototype.unpackPluginTiddlers = function(pluginType) {
|
|||||||
return +1;
|
return +1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Now go through the plugins in ascending order
|
// Now go through the plugins in ascending order and assign the shadows
|
||||||
$tw.utils.each(pluginInfoList,function(tiddler) {
|
this.shadowTiddlers = {};
|
||||||
// Save the plugin information
|
$tw.utils.each(this.plugins,function(tiddler) {
|
||||||
var pluginInfo = self.plugins[tiddler.fields.title] = JSON.parse(tiddler.fields.text);
|
// Get the plugin information
|
||||||
|
var pluginInfo = JSON.parse(tiddler.fields.text);
|
||||||
// Extract the constituent tiddlers
|
// Extract the constituent tiddlers
|
||||||
$tw.utils.each(pluginInfo.tiddlers,function(constituentTiddler,constituentTitle) {
|
$tw.utils.each(pluginInfo.tiddlers,function(constituentTiddler,constituentTitle) {
|
||||||
// Save the tiddler object
|
// Save the tiddler object
|
||||||
@ -706,7 +742,7 @@ $tw.Wiki.prototype.defineTiddlerModules = function() {
|
|||||||
/*
|
/*
|
||||||
Register all the module tiddlers that have a module type
|
Register all the module tiddlers that have a module type
|
||||||
*/
|
*/
|
||||||
$tw.Wiki.prototype.definePluginModules = function() {
|
$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);
|
||||||
@ -1206,11 +1242,12 @@ $tw.boot.startup = function() {
|
|||||||
// Load tiddlers
|
// Load tiddlers
|
||||||
$tw.loadTiddlers();
|
$tw.loadTiddlers();
|
||||||
// Unpack plugin tiddlers
|
// Unpack plugin tiddlers
|
||||||
$tw.wiki.unpackPluginTiddlers("plugin");
|
$tw.wiki.registerPluginTiddlers("plugin");
|
||||||
|
$tw.wiki.unpackPluginTiddlers();
|
||||||
// Register typed modules from the tiddlers we've just loaded
|
// Register typed modules from the tiddlers we've just loaded
|
||||||
$tw.wiki.defineTiddlerModules();
|
$tw.wiki.defineTiddlerModules();
|
||||||
// And any modules within plugins
|
// And any modules within plugins
|
||||||
$tw.wiki.definePluginModules();
|
$tw.wiki.defineShadowModules();
|
||||||
// Make sure the crypto state tiddler is up to date
|
// Make sure the crypto state tiddler is up to date
|
||||||
$tw.crypto.updateCryptoStateTiddler();
|
$tw.crypto.updateCryptoStateTiddler();
|
||||||
// Run any startup modules
|
// Run any startup modules
|
||||||
|
Loading…
Reference in New Issue
Block a user