diff --git a/boot/boot.js b/boot/boot.js index 2ff0398df..5b7edd7a7 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -20,23 +20,16 @@ The module definitions on the browser look like this: In practice, each module is wrapped in a separate script block. \*/ -(function() { + +var _boot = (function($tw) { /*jslint node: true, browser: true */ /*global modules: false, $tw: false */ "use strict"; -/////////////////////////// Setting up $tw - -// Set up $tw global for the server (set up for browser is in bootprefix.js) -if(typeof(window) === "undefined") { - global.$tw = global.$tw || {}; // No `browser` member for the server - exports.$tw = $tw; // Export $tw for when boot.js is required directly in node.js -} - -// Include bootprefix if we're on the server -if(!$tw.browser) { - require("./bootprefix.js"); +// Include bootprefix if we're not given module data +if(!$tw) { + $tw = require("./bootprefix.js").bootprefix(); } $tw.utils = $tw.utils || {}; @@ -318,6 +311,7 @@ name `.` refers to the current directory */ $tw.utils.resolvePath = function(sourcepath,rootpath) { // If the source path starts with ./ or ../ then it is relative to the root + if(sourcepath.substr(0,2) === "./" || sourcepath.substr(0,3) === "../" ) { var src = sourcepath.split("/"), root = rootpath.split("/"); @@ -337,7 +331,14 @@ $tw.utils.resolvePath = function(sourcepath,rootpath) { return root.join("/"); } else { // If it isn't relative, just return the path - return sourcepath; + if(rootpath) { + var root = rootpath.split("/"); + // Remove the filename part of the root + root.splice(root.length - 1, 1); + return root.join("/") + "/" + sourcepath; + } else { + return sourcepath; + } } }; @@ -367,9 +368,7 @@ $tw.utils.registerFileType = function(type,encoding,extension) { Run code globally with specified context variables in scope */ $tw.utils.evalGlobal = function(code,context,filename) { - var contextCopy = $tw.utils.extend({},context,{ - exports: {} - }); + var contextCopy = $tw.utils.extend({},context); // Get the context variables as a pair of arrays of names and values var contextNames = [], contextValues = []; $tw.utils.each(contextCopy,function(value,name) { @@ -394,9 +393,6 @@ 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); - $tw.utils.extend(sandbox,{ - exports: {} - }); vm.runInNewContext(code,sandbox,filename); return sandbox.exports; }; @@ -545,12 +541,14 @@ $tw.utils.Crypto = function() { Execute the module named 'moduleName'. The name can optionally be relative to the module named 'moduleRoot' */ $tw.modules.execute = function(moduleName,moduleRoot) { - var name = moduleRoot ? $tw.utils.resolvePath(moduleName,moduleRoot) : moduleName, - moduleInfo = $tw.modules.titles[name], - tiddler = $tw.wiki.getTiddler(name), + var name = moduleName[0] === "." ? $tw.utils.resolvePath(moduleName,moduleRoot) : moduleName, + moduleInfo = $tw.modules.titles[name] || $tw.modules.titles[name + ".js"] || $tw.modules.titles[moduleName] || $tw.modules.titles[moduleName + ".js"] , + tiddler = $tw.wiki.getTiddler(name) || $tw.wiki.getTiddler(name + ".js") || $tw.wiki.getTiddler(moduleName) || $tw.wiki.getTiddler(moduleName + ".js") , + _exports = {}, sandbox = { - module: moduleInfo, - exports: {}, + module: {}, + //moduleInfo: moduleInfo, + exports: _exports, console: console, setInterval: setInterval, clearInterval: clearInterval, @@ -558,18 +556,45 @@ $tw.modules.execute = function(moduleName,moduleRoot) { clearTimeout: clearTimeout, $tw: $tw, require: function(title) { - return $tw.modules.execute(title,name); + return $tw.modules.execute(title, name); } }; + + Object.defineProperty(sandbox.module, "id", { + value: name, + writable: false, + enumerable: true, + configurable: false + }); + if(!$tw.browser) { $tw.utils.extend(sandbox,{ process: process }); + } else { + /* + CommonJS optional require.main property: + In a browser we offer a fake main module which points back to the boot function + (Theoretically, this may allow TW to eventually load itself as a module in the browser) + */ + Object.defineProperty(sandbox.require, "main", { + value: (typeof(require) !== "undefined") ? require.main : {TiddlyWiki: _boot}, + writable: false, + enumerable: true, + configurable: false + }); } if(!moduleInfo) { + // We could not find the module on this path + // Try to defer to browserify etc, or node + var deferredModule; if($tw.browser) { - return $tw.utils.error("Cannot find module named '" + moduleName + "' required by module '" + moduleRoot + "', resolved to " + name); - + if(window.require) { + try { + return window.require(moduleName); + } catch(e) {} + } + throw "Cannot find module named '" + moduleName + "' required by module '" + moduleRoot + "', resolved to " + name; } else { // If we don't have a module with that name, let node.js try to find it return require(moduleName); @@ -580,10 +605,11 @@ $tw.modules.execute = function(moduleName,moduleRoot) { try { // Check the type of the definition if(typeof moduleInfo.definition === "function") { // Function - moduleInfo.exports = {}; + moduleInfo.exports = _exports; moduleInfo.definition(moduleInfo,moduleInfo.exports,sandbox.require); } else if(typeof moduleInfo.definition === "string") { // String - moduleInfo.exports = $tw.utils.evalSandboxed(moduleInfo.definition,sandbox,tiddler.fields.title); + moduleInfo.exports = _exports; + $tw.utils.evalSandboxed(moduleInfo.definition,sandbox,tiddler.fields.title); } else { // Object moduleInfo.exports = moduleInfo.definition; } @@ -1411,4 +1437,15 @@ if($tw.browser) { $tw.boot.boot(); } -})(); +return $tw; + +}); + +if(typeof(exports) !== "undefined") { + exports.TiddlyWiki = _boot; +} else { + _boot(window.$tw); +} + + + diff --git a/boot/bootprefix.js b/boot/bootprefix.js index 90e30a80c..7de3309cd 100644 --- a/boot/bootprefix.js +++ b/boot/bootprefix.js @@ -12,12 +12,11 @@ See Boot.js for further details of the boot process. \*/ -// Set up $tw global for the browser -if(typeof(window) === "undefined") { - global.$tw = global.$tw || {}; // No `browser` member for the server -} else { - window.$tw = window.$tw || {browser: {}}; -} +var _bootprefix = (function($tw) { + +"use strict"; + +$tw = $tw || {browser: typeof(window) !== "undefined" ? {} : null}; /* Information about each module is kept in an object with these members: @@ -81,3 +80,18 @@ Convenience function for pushing a tiddler onto the preloading array $tw.preloadTiddler = function(fields) { $tw.preloadTiddlers.push(fields); }; + +return $tw + +}); + +if(typeof(exports) === "undefined") { + // Set up $tw global for the browser + window.$tw = _bootprefix(); +} else { + // Export functionality as a module + exports.bootprefix = _bootprefix; +} + + + diff --git a/core/modules/parsers/wikiparser/rules/html.js b/core/modules/parsers/wikiparser/rules/html.js index 25b2132ae..fcf691530 100644 --- a/core/modules/parsers/wikiparser/rules/html.js +++ b/core/modules/parsers/wikiparser/rules/html.js @@ -379,7 +379,7 @@ exports.findNextTag = function(source,pos,options) { // Try to parse the candidate as a tag var tag = this.parseTag(source,match.index,options); // Return success - if(tag) { + if(tag && this.isLegalTag(tag.tag)) { return tag; } // Look for the next match @@ -390,4 +390,17 @@ exports.findNextTag = function(source,pos,options) { return null; }; +exports.isLegalTag = function(tag) { + // If it starts with a $ then we'll let anything go + if(tag.charAt(0) === "$") { + return true; + // If it starts with a dash then it's not legal + } else if(tag.charAt(0) === "-") { + return false; + } else { + // Otherwise it's OK + return true; + } +}; + })(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index b0f9a11a3..45a1744d4 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -875,38 +875,40 @@ exports.search = function(text,options) { // Function to check a given tiddler for the search term var searchTiddler = function(title) { if(!searchTermsRegExps) { - return !options.invert; + return false; } var tiddler = self.getTiddler(title); if(!tiddler) { tiddler = new $tw.Tiddler({title: title, text: "", type: "text/vnd.tiddlywiki"}); } - var contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type]; - if(contentTypeInfo ? contentTypeInfo.encoding === "utf8" : true) { - var match = true; - for(var t=0; t