mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-31 07:32:59 +00:00 
			
		
		
		
	Refactoring plugin implementation
Including introducing the terminology "tiddler bundles"
This commit is contained in:
		
							
								
								
									
										225
									
								
								core/boot.js
									
									
									
									
									
								
							
							
						
						
									
										225
									
								
								core/boot.js
									
									
									
									
									
								
							| @@ -82,9 +82,6 @@ $tw.modules = $tw.modules || {}; | |||||||
| $tw.modules.titles = $tw.modules.titles || {}; // hashmap by module title of {fn:, exports:, moduleType:} | $tw.modules.titles = $tw.modules.titles || {}; // hashmap by module title of {fn:, exports:, moduleType:} | ||||||
| $tw.modules.types = $tw.modules.types || {}; // hashmap by module type of array of exports | $tw.modules.types = $tw.modules.types || {}; // hashmap by module type of array of exports | ||||||
|  |  | ||||||
| // Plugin information |  | ||||||
| $tw.plugins = $tw.plugins || {}; |  | ||||||
|  |  | ||||||
| // Config object | // Config object | ||||||
| $tw.config = $tw.config || {}; | $tw.config = $tw.config || {}; | ||||||
|  |  | ||||||
| @@ -259,7 +256,7 @@ $tw.utils.resolvePath = function(sourcepath,rootpath) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| Returns true if the `actual` version is greater than or equal to the `required` version. Both are in `x.y.` format. | Returns true if the `actual` version is greater than or equal to the `required` version. Both are in `x.y.z` format. | ||||||
| */ | */ | ||||||
| $tw.utils.checkVersions = function(required,actual) { | $tw.utils.checkVersions = function(required,actual) { | ||||||
| 	var targetVersion = required.split("."), | 	var targetVersion = required.split("."), | ||||||
| @@ -364,6 +361,9 @@ $tw.Tiddler = function(/* [fields,] fields */) { | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | $tw.Tiddler.prototype.hasField = function(field) { | ||||||
|  | 	return $tw.utils.hop(this.fields,field); | ||||||
|  | }; | ||||||
| /* | /* | ||||||
| Hashmap of field modules by field name | Hashmap of field modules by field name | ||||||
| */ | */ | ||||||
| @@ -423,25 +423,25 @@ $tw.Wiki.prototype.addTiddlers = function(tiddlers) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| Extract tiddlers stored in plugins so that we can easily access them in getTiddler() | Extract constituent tiddlers from bundle tiddlers so that we can easily access them in getTiddler() | ||||||
| */ | */ | ||||||
| $tw.Wiki.prototype.installPlugins = function() { | $tw.Wiki.prototype.unpackBundleTiddlers = function() { | ||||||
| 	this.plugins = {}; // Hashmap of plugin information by title | 	this.bundles = {}; // Hashmap of plugin information by title | ||||||
| 	this.pluginTiddlers = {}; // Hashmap of constituent tiddlers from plugins by title | 	this.bundledTiddlers = {}; // Hashmap of constituent tiddlers from plugins by title | ||||||
| 	// Collect up all the plugin tiddlers | 	// Collect up all the plugin tiddlers | ||||||
| 	for(var title in this.tiddlers) { | 	for(var title in this.tiddlers) { | ||||||
| 		var tiddler = this.tiddlers[title]; | 		var tiddler = this.tiddlers[title]; | ||||||
| 		if(tiddler.fields.type === "application/json" && "plugin" in tiddler.fields) { | 		if(tiddler.fields.type === "application/json" && tiddler.hasField("bundle")) { | ||||||
| 			// Save the plugin information | 			// Save the bundle information | ||||||
| 			var pluginInfo = this.plugins[title] = JSON.parse(tiddler.fields.text); | 			var bundleInfo = this.bundles[title] = JSON.parse(tiddler.fields.text); | ||||||
| 			// Extract the constituent tiddlers | 			// Extract the constituent tiddlers | ||||||
| 			for(var t in pluginInfo.tiddlers) { | 			for(var t in bundleInfo.tiddlers) { | ||||||
| 				var constituentTiddler = pluginInfo.tiddlers[t], | 				var constituentTiddler = bundleInfo.tiddlers[t], | ||||||
| 					constituentTitle = pluginInfo.title + "/" + t; | 					constituentTitle = bundleInfo.title + "/" + t; | ||||||
| 				// Don't overwrite tiddlers that already exist | 				// Don't overwrite tiddlers that already exist | ||||||
| 				if(!(constituentTitle in this.pluginTiddlers)) { | 				if(!(constituentTitle in this.bundledTiddlers)) { | ||||||
| 					// Save the tiddler object | 					// Save the tiddler object | ||||||
| 					this.pluginTiddlers[constituentTitle] = new $tw.Tiddler(constituentTiddler,{title: constituentTitle}); | 					this.bundledTiddlers[constituentTitle] = new $tw.Tiddler(constituentTiddler,{title: constituentTitle}); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @@ -454,43 +454,51 @@ Register all the module tiddlers that have a module type | |||||||
| $tw.Wiki.prototype.registerModuleTiddlers = function() { | $tw.Wiki.prototype.registerModuleTiddlers = function() { | ||||||
| 	/*jslint evil: true */ | 	/*jslint evil: true */ | ||||||
| 	var title, tiddler; | 	var title, tiddler; | ||||||
| 	// If in the browser, define any modules from plugins | 	// If in the browser, define any modules from bundles | ||||||
| 	if($tw.browser) { | 	if($tw.browser) { | ||||||
| 		for(title in $tw.wiki.pluginTiddlers) { | 		for(title in $tw.wiki.bundledTiddlers) { | ||||||
| 			tiddler = $tw.wiki.getTiddler(title); | 			if($tw.utils.hop($tw.wiki.bundledTiddlers,title)) { | ||||||
| 			if(!(title in $tw.wiki.tiddlers)) { | 				tiddler = $tw.wiki.getTiddler(title); | ||||||
| 				if(tiddler.fields.type === "application/javascript" && "module-type" in tiddler.fields) { | 				if(!$tw.utils.hop($tw.wiki.tiddlers,title)) { | ||||||
| 					// Define the module | 					if(tiddler.fields.type === "application/javascript" && tiddler.hasField("module-type")) { | ||||||
| 					var source = [ | 						// Define the module | ||||||
| 						"(function(module,exports,require) {", | 						var source = [ | ||||||
| 						tiddler.fields.text, | 							"(function(module,exports,require) {", | ||||||
| 						"})" | 							tiddler.fields.text, | ||||||
| 					]; | 							"})" | ||||||
| 					$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],window["eval"](source.join(""))); | 						]; | ||||||
|  | 						$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],window["eval"](source.join(""))); | ||||||
|  | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// Register and execute any modules from plugins | 	// Register and execute any modules from bundles | ||||||
| 	for(title in $tw.wiki.pluginTiddlers) { | 	for(title in $tw.wiki.bundledTiddlers) { | ||||||
| 		tiddler = $tw.wiki.getTiddler(title); | 		if($tw.utils.hop($tw.wiki.bundledTiddlers,title)) { | ||||||
| 		if(!(title in $tw.wiki.tiddlers)) { | 			tiddler = $tw.wiki.getTiddler(title); | ||||||
| 			if(tiddler.fields.type === "application/javascript" && "module-type" in tiddler.fields) { | 			if(!$tw.utils.hop($tw.wiki.tiddlers,title)) { | ||||||
| 				// Execute and register the module | 				if(tiddler.fields.type === "application/javascript" && tiddler.hasField("module-type")) { | ||||||
| 				$tw.modules.registerModuleExports(title,tiddler.fields["module-type"],$tw.modules.execute(title)); | 					// Execute and register the module | ||||||
|  | 					$tw.modules.registerModuleExports(title,tiddler.fields["module-type"],$tw.modules.execute(title)); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// Register and execute any modules in ordinary tiddlers | 	// Register and execute any modules in ordinary tiddlers | ||||||
| 	if($tw.browser) { | 	if($tw.browser) { | ||||||
| 		for(title in $tw.modules.titles) { | 		for(title in $tw.modules.titles) { | ||||||
| 			$tw.modules.registerModuleExports(title,$tw.modules.titles[title].moduleType,$tw.modules.execute(title)); | 			if($tw.utils.hop($tw.modules.titles,title)) { | ||||||
|  | 				$tw.modules.registerModuleExports(title,$tw.modules.titles[title].moduleType,$tw.modules.execute(title)); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		for(title in $tw.wiki.tiddlers) { | 		for(title in $tw.wiki.tiddlers) { | ||||||
| 			tiddler = $tw.wiki.getTiddler(title); | 			if($tw.utils.hop($tw.wiki.tiddlers,title)) { | ||||||
| 			if(tiddler.fields.type === "application/javascript" && tiddler.fields["module-type"] !== undefined) { | 				tiddler = $tw.wiki.getTiddler(title); | ||||||
| 				$tw.modules.registerModuleExports(title,tiddler.fields["module-type"],$tw.modules.execute(title)); | 				if(tiddler.fields.type === "application/javascript" && tiddler.hasField("module-type")) { | ||||||
|  | 					$tw.modules.registerModuleExports(title,tiddler.fields["module-type"],$tw.modules.execute(title)); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -500,8 +508,8 @@ $tw.Wiki.prototype.getTiddler = function(title) { | |||||||
| 	var t = this.tiddlers[title]; | 	var t = this.tiddlers[title]; | ||||||
| 	if(t instanceof $tw.Tiddler) { | 	if(t instanceof $tw.Tiddler) { | ||||||
| 		return t; | 		return t; | ||||||
| 	} else if(title in this.pluginTiddlers) { | 	} else if($tw.utils.hop(this.bundledTiddlers,title)) { | ||||||
| 		return this.pluginTiddlers[title]; | 		return this.bundledTiddlers[title]; | ||||||
| 	} else { | 	} else { | ||||||
| 		return null; | 		return null; | ||||||
| 	} | 	} | ||||||
| @@ -702,22 +710,6 @@ $tw.modules.registerModuleExports("$:/boot/tiddlerdeserializer/dom","tiddlerdese | |||||||
| // Install the tiddler deserializer modules | // Install the tiddler deserializer modules | ||||||
| $tw.modules.applyMethods("tiddlerdeserializer",$tw.Wiki.tiddlerDeserializerModules); | $tw.modules.applyMethods("tiddlerdeserializer",$tw.Wiki.tiddlerDeserializerModules); | ||||||
|  |  | ||||||
| // Load the JavaScript system tiddlers from the DOM |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("libraryModules"))); |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("modules"))); |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("bootKernelPrefix"))); |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("bootKernel"))); |  | ||||||
| // Load the stylesheet tiddlers from the DOM |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("styleArea"))); |  | ||||||
| // Load the main store tiddlers from the DOM |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("storeArea"))); |  | ||||||
| // Load the shadow tiddlers from the DOM |  | ||||||
| $tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById("shadowArea"))); |  | ||||||
| // Load any preloaded tiddlers |  | ||||||
| if($tw.preloadTiddlers) { |  | ||||||
| 	$tw.wiki.addTiddlers($tw.preloadTiddlers); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // End of if($tw.browser) | // End of if($tw.browser) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -728,7 +720,7 @@ if(!$tw.browser) { | |||||||
| /* | /* | ||||||
| Load the tiddlers contained in a particular file (and optionally extract fields from the accompanying .meta file) | Load the tiddlers contained in a particular file (and optionally extract fields from the accompanying .meta file) | ||||||
| */ | */ | ||||||
| $tw.extractTiddlersFromFile = function(filepath,fields) { | $tw.loadTiddlersFromFile = function(filepath,fields) { | ||||||
| 	var ext = path.extname(filepath), | 	var ext = path.extname(filepath), | ||||||
| 		extensionInfo = $tw.config.fileExtensionInfo[ext], | 		extensionInfo = $tw.config.fileExtensionInfo[ext], | ||||||
| 		typeInfo = extensionInfo ? $tw.config.contentTypeInfo[extensionInfo.type] : null, | 		typeInfo = extensionInfo ? $tw.config.contentTypeInfo[extensionInfo.type] : null, | ||||||
| @@ -747,8 +739,7 @@ $tw.extractTiddlersFromFile = function(filepath,fields) { | |||||||
| /* | /* | ||||||
| Load all the tiddlers from a directory | Load all the tiddlers from a directory | ||||||
| */ | */ | ||||||
| $tw.extractTiddlersFromPath = function(filepath,basetitle,excludeRegExp) { | $tw.loadTiddlersFromPath = function(filepath,excludeRegExp) { | ||||||
| 	basetitle = basetitle || "$:/plugins"; |  | ||||||
| 	excludeRegExp = excludeRegExp || /^\.DS_Store$|.meta$/; | 	excludeRegExp = excludeRegExp || /^\.DS_Store$|.meta$/; | ||||||
| 	var tiddlers = [], | 	var tiddlers = [], | ||||||
| 		stat, files, pluginInfo, pluginTiddlers, f, file, titlePrefix, t, filesInfo, p, tidInfo, typeInfo, text; | 		stat, files, pluginInfo, pluginTiddlers, f, file, titlePrefix, t, filesInfo, p, tidInfo, typeInfo, text; | ||||||
| @@ -756,33 +747,8 @@ $tw.extractTiddlersFromPath = function(filepath,basetitle,excludeRegExp) { | |||||||
| 		stat = fs.statSync(filepath); | 		stat = fs.statSync(filepath); | ||||||
| 		if(stat.isDirectory()) { | 		if(stat.isDirectory()) { | ||||||
| 			files = fs.readdirSync(filepath); | 			files = fs.readdirSync(filepath); | ||||||
| 			// Look for a tiddlywiki.plugin file |  | ||||||
| 			if(files.indexOf("tiddlywiki.plugin") !== -1) { |  | ||||||
| 				// Read the plugin information |  | ||||||
| 				pluginInfo = JSON.parse(fs.readFileSync(filepath + "/tiddlywiki.plugin").toString("utf8")); |  | ||||||
| 				// Read the plugin files |  | ||||||
| 				pluginTiddlers = []; |  | ||||||
| 				for(f=0; f<files.length; f++) { |  | ||||||
| 					file = files[f]; |  | ||||||
| 					if(!excludeRegExp.test(file) && file !== "tiddlywiki.plugin" && file !== "tiddlywiki.files") { |  | ||||||
| 						pluginTiddlers.push.apply(pluginTiddlers,$tw.extractTiddlersFromPath(filepath + "/" + file,basetitle + "/" + file,excludeRegExp)); |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				// Save the plugin tiddlers into the plugin |  | ||||||
| 				pluginInfo.tiddlers = pluginInfo.tiddlers || {}; |  | ||||||
| 				titlePrefix = pluginInfo.title + "/"; |  | ||||||
| 				for(t=0; t<pluginTiddlers.length; t++) { |  | ||||||
| 					// Check that the constituent tiddler has the plugin title as a prefix |  | ||||||
| 					if(pluginTiddlers[t].title.indexOf(titlePrefix) === 0 && pluginTiddlers[t].title.length > titlePrefix.length) { |  | ||||||
| 						pluginInfo.tiddlers[pluginTiddlers[t].title.substr(titlePrefix.length)] = pluginTiddlers[t]; |  | ||||||
| 					} else { |  | ||||||
| 						throw "The plugin '" + pluginInfo.title + "' cannot contain a tiddler titled '" + pluginTiddlers[t].title + "'"; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				// Save the plugin tiddler |  | ||||||
| 				tiddlers.push({title: pluginInfo.title, type: "application/json", plugin: "yes", text: JSON.stringify(pluginInfo)}); |  | ||||||
| 			// Look for a tiddlywiki.files file | 			// Look for a tiddlywiki.files file | ||||||
| 			} else if(files.indexOf("tiddlywiki.files") !== -1) { | 			if(files.indexOf("tiddlywiki.files") !== -1) { | ||||||
| 				// If so, process the files it describes | 				// If so, process the files it describes | ||||||
| 				filesInfo = JSON.parse(fs.readFileSync(filepath + "/tiddlywiki.files").toString("utf8")); | 				filesInfo = JSON.parse(fs.readFileSync(filepath + "/tiddlywiki.files").toString("utf8")); | ||||||
| 				for(p=0; p<filesInfo.tiddlers.length; p++) { | 				for(p=0; p<filesInfo.tiddlers.length; p++) { | ||||||
| @@ -797,22 +763,49 @@ $tw.extractTiddlersFromPath = function(filepath,basetitle,excludeRegExp) { | |||||||
| 				for(f=0; f<files.length; f++) { | 				for(f=0; f<files.length; f++) { | ||||||
| 					file = files[f]; | 					file = files[f]; | ||||||
| 					if(!excludeRegExp.test(file)) { | 					if(!excludeRegExp.test(file)) { | ||||||
| 						tiddlers.push.apply(tiddlers,$tw.extractTiddlersFromPath(filepath + "/" + file,basetitle + "/" + file,excludeRegExp)); | 						tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(filepath + "/" + file,excludeRegExp)); | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} else if(stat.isFile()) { | 		} else if(stat.isFile()) { | ||||||
| 			tiddlers.push.apply(tiddlers,$tw.extractTiddlersFromFile(filepath,{title: basetitle})); | 			tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromFile(filepath)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return tiddlers; | 	return tiddlers; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| Load all the tiddlers from a directory | Load the tiddlers from a bundle folder, and package them up into a proper JSON bundle tiddler | ||||||
| */ | */ | ||||||
| $tw.loadTiddlersFromFolder = function(filepath,basetitle,excludeRegExp) { | $tw.loadBundleFolder = function(filepath,excludeRegExp) { | ||||||
| 	$tw.wiki.addTiddlers($tw.extractTiddlersFromPath(filepath,basetitle,excludeRegExp)); | 	// Read the plugin information | ||||||
|  | 	var bundleInfo = JSON.parse(fs.readFileSync(filepath).toString("utf8")); | ||||||
|  | 	// Read the bundle files | ||||||
|  | 	var bundleTiddlers = []; | ||||||
|  | 	for(f=0; f<files.length; f++) { | ||||||
|  | 		file = files[f]; | ||||||
|  | 		if(!excludeRegExp.test(file) && file !== "plugin.bundle" && file !== "tiddlywiki.files") { | ||||||
|  | 			bundleTiddlers.push.apply(bundleTiddlers,$tw.loadTiddlersFromPath(filepath + "/" + file,excludeRegExp)); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// Save the bundle tiddlers into the bundle | ||||||
|  | 	bundleInfo.tiddlers = bundleInfo.tiddlers || {}; | ||||||
|  | 	var titlePrefix = bundleInfo.title + "/"; | ||||||
|  | 	for(t=0; t<bundleTiddlers.length; t++) { | ||||||
|  | 		// Check that the constituent tiddler has the bundle title as a prefix | ||||||
|  | 		if(bundleTiddlers[t].title.indexOf(titlePrefix) === 0 && bundleTiddlers[t].title.length > titlePrefix.length) { | ||||||
|  | 			bundleInfo.tiddlers[bundleTiddlers[t].title.substr(titlePrefix.length)] = bundleTiddlers[t]; | ||||||
|  | 		} else { | ||||||
|  | 			throw "The bundle '" + bundleInfo.title + "' cannot contain a tiddler titled '" + bundleTiddlers[t].title + "'"; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// Save the bundle tiddler | ||||||
|  | 	return { | ||||||
|  | 		title: bundleInfo.title, | ||||||
|  | 		type: "application/json", | ||||||
|  | 		bundle: "yes", | ||||||
|  | 		text: JSON.stringify(bundleInfo) | ||||||
|  | 	}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -854,28 +847,46 @@ $tw.modules.execute = function(moduleName,moduleRoot) { | |||||||
| 	return module.exports; | 	return module.exports; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Load modules from the modules directory |  | ||||||
| $tw.loadTiddlersFromFolder(path.resolve($tw.boot.bootPath,$tw.config.bootModuleSubDir)); |  | ||||||
|  |  | ||||||
| // Load up the shadow tiddlers in the root of the core directory |  | ||||||
| $tw.loadTiddlersFromFolder($tw.boot.bootPath,"$:/core",/^\.DS_Store$|.meta$|^modules$/); |  | ||||||
|  |  | ||||||
| // Load any plugins in the wiki plugins directory |  | ||||||
| $tw.loadTiddlersFromFolder(path.resolve($tw.boot.wikiPath,$tw.config.wikiPluginsSubDir)); |  | ||||||
|  |  | ||||||
| // HACK: to be replaced when we re-establish sync plugins |  | ||||||
| // Load shadow tiddlers from wiki shadows directory |  | ||||||
| $tw.loadTiddlersFromFolder(path.resolve($tw.boot.wikiPath,$tw.config.wikiShadowsSubDir)); |  | ||||||
| // Load tiddlers from wiki tiddlers directory |  | ||||||
| $tw.loadTiddlersFromFolder(path.resolve($tw.boot.wikiPath,$tw.config.wikiTiddlersSubDir)); |  | ||||||
|  |  | ||||||
| // End of if(!$tw.browser)	 | // End of if(!$tw.browser)	 | ||||||
| } | } | ||||||
|  |  | ||||||
| /////////////////////////// Final initialisation | /////////////////////////// Final initialisation | ||||||
|  |  | ||||||
|  | // Load tiddlers | ||||||
|  | var t; | ||||||
|  | if($tw.browser) { | ||||||
|  | 	// In the browser, we load tiddlers from certain elements | ||||||
|  | 	var containerIds = [ | ||||||
|  | 		"libraryModules", | ||||||
|  | 		"modules", | ||||||
|  | 		"bootKernelPrefix", | ||||||
|  | 		"bootKernel", | ||||||
|  | 		"styleArea", | ||||||
|  | 		"storeArea", | ||||||
|  | 		"shadowArea" | ||||||
|  | 	]; | ||||||
|  | 	for(t=0; t<containerIds.length; t++) { | ||||||
|  | 		$tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",document.getElementById(containerIds[t]))); | ||||||
|  | 	} | ||||||
|  | 	// Load any preloaded tiddlers | ||||||
|  | 	if($tw.preloadTiddlers) { | ||||||
|  | 		$tw.wiki.addTiddlers($tw.preloadTiddlers); | ||||||
|  | 	} | ||||||
|  | } else { | ||||||
|  | 	// On the server, we load tiddlers from specified folders | ||||||
|  | 	var folders = [ | ||||||
|  | 		$tw.boot.bootPath, | ||||||
|  | 		path.resolve($tw.boot.wikiPath,$tw.config.wikiPluginsSubDir), | ||||||
|  | 		path.resolve($tw.boot.wikiPath,$tw.config.wikiShadowsSubDir), | ||||||
|  | 		path.resolve($tw.boot.wikiPath,$tw.config.wikiTiddlersSubDir) | ||||||
|  | 	]; | ||||||
|  | 	for(t=0; t<folders.length; t++) { | ||||||
|  | 		$tw.wiki.addTiddlers($tw.loadTiddlersFromPath(folders[t])); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // Install plugins | // Install plugins | ||||||
| $tw.wiki.installPlugins(); | $tw.wiki.unpackBundleTiddlers(); | ||||||
|  |  | ||||||
| // Register typed modules from the tiddlers we've just loaded | // Register typed modules from the tiddlers we've just loaded | ||||||
| $tw.wiki.registerModuleTiddlers(); | $tw.wiki.registerModuleTiddlers(); | ||||||
|   | |||||||
| @@ -16,10 +16,6 @@ exports.hasTag = function(tag) { | |||||||
| 	return this.fields.tags && this.fields.tags.indexOf(tag) !== -1; | 	return this.fields.tags && this.fields.tags.indexOf(tag) !== -1; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| exports.hasField = function(field) { |  | ||||||
| 	return $tw.utils.hop(this.fields,field); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| exports.isShadow = function() { | exports.isShadow = function() { | ||||||
| 	if(!$tw.utils.hop(this,"shadowFlag")) { | 	if(!$tw.utils.hop(this,"shadowFlag")) { | ||||||
| 		this.shadowFlag = this.fields.title.indexOf("$:/") === 0; | 		this.shadowFlag = this.fields.title.indexOf("$:/") === 0; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| title: TemporaryTestPlugin | title: TemporaryTestPlugin | ||||||
| type: application/json | type: application/json | ||||||
| plugin: yes | bundle: yes | ||||||
|  |  | ||||||
| { | { | ||||||
| 	"title": "$:/plugins/tiddlywiki/test", | 	"title": "$:/plugins/tiddlywiki/test", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jeremy Ruston
					Jeremy Ruston