mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-23 10:07:19 +00:00
82c8fe7fa8
* Introduce JSON parse utility function with error handling Fixes #6400 * Fix typo
80 lines
2.5 KiB
JavaScript
80 lines
2.5 KiB
JavaScript
/*\
|
|
title: $:/core/modules/pluginswitcher.js
|
|
type: application/javascript
|
|
module-type: global
|
|
|
|
Manages switching plugins for themes and languages.
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
/*
|
|
options:
|
|
wiki: wiki store to be used
|
|
pluginType: type of plugin to be switched
|
|
controllerTitle: title of tiddler used to control switching of this resource
|
|
defaultPlugins: array of default plugins to be used if nominated plugin isn't found
|
|
onSwitch: callback when plugin is switched (single parameter is array of plugin titles)
|
|
*/
|
|
function PluginSwitcher(options) {
|
|
this.wiki = options.wiki;
|
|
this.pluginType = options.pluginType;
|
|
this.controllerTitle = options.controllerTitle;
|
|
this.defaultPlugins = options.defaultPlugins || [];
|
|
this.onSwitch = options.onSwitch;
|
|
// Switch to the current plugin
|
|
this.switchPlugins();
|
|
// Listen for changes to the selected plugin
|
|
var self = this;
|
|
this.wiki.addEventListener("change",function(changes) {
|
|
if($tw.utils.hop(changes,self.controllerTitle)) {
|
|
self.switchPlugins();
|
|
}
|
|
});
|
|
}
|
|
|
|
PluginSwitcher.prototype.switchPlugins = function() {
|
|
// Get the name of the current theme
|
|
var selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);
|
|
// If it doesn't exist, then fallback to one of the default themes
|
|
var index = 0;
|
|
while(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {
|
|
selectedPluginTitle = this.defaultPlugins[index++];
|
|
}
|
|
// Accumulate the titles of the plugins that we need to load
|
|
var plugins = [],
|
|
self = this,
|
|
accumulatePlugin = function(title) {
|
|
var tiddler = self.wiki.getTiddler(title);
|
|
if(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {
|
|
plugins.push(title);
|
|
var pluginInfo = $tw.utils.parseJSONSafe(self.wiki.getTiddlerText(title)),
|
|
dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || "");
|
|
$tw.utils.each(dependents,function(title) {
|
|
accumulatePlugin(title);
|
|
});
|
|
}
|
|
};
|
|
accumulatePlugin(selectedPluginTitle);
|
|
// Read the plugin info for the incoming plugins
|
|
var changes = $tw.wiki.readPluginInfo(plugins);
|
|
// Unregister any existing theme tiddlers
|
|
var unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);
|
|
// Register any new theme tiddlers
|
|
var registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);
|
|
// Unpack the current theme tiddlers
|
|
$tw.wiki.unpackPluginTiddlers();
|
|
// Call the switch handler
|
|
if(this.onSwitch) {
|
|
this.onSwitch(plugins);
|
|
}
|
|
};
|
|
|
|
exports.PluginSwitcher = PluginSwitcher;
|
|
|
|
})();
|