From 0b69b42ade2857747b60ba484fc6f3e5d15b2a6f Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 9 Nov 2011 16:48:35 +0100 Subject: [PATCH] more support for relative module ids --- Makefile.dryice.js | 4 +-- demo/kitchen-sink/demo.js | 58 +++++++++++++++------------------ lib/ace/worker/worker.js | 40 +++++++++++++++++------ lib/ace/worker/worker_client.js | 2 +- 4 files changed, 60 insertions(+), 44 deletions(-) diff --git a/Makefile.dryice.js b/Makefile.dryice.js index cc76fcea..6df37812 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -86,8 +86,6 @@ var copy = require('dryice').copy; var aceHome = __dirname; -console.log('# ace ---------'); - var aceProject = { roots: [ aceHome + '/lib', @@ -165,6 +163,8 @@ copy({ }); if (target == "normal") { + console.log('# ace ---------'); + // Create the compressed and uncompressed output files copy({ source: ace, diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 17ccab75..177d551e 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -134,7 +134,7 @@ modes.forEach(function(m) { modesByName[m.name] = m; }); -var loreIpsum = require("ace/requirejs/text!demo/kitchen-sink/docs/plaintext.txt"); +var loreIpsum = require("ace/requirejs/text!./docs/plaintext.txt"); for (var i = 0; i < 5; i++) { loreIpsum += loreIpsum; } @@ -142,108 +142,104 @@ for (var i = 0; i < 5; i++) { var docs = [ new Doc( "javascript", "JavaScript", - require("ace/requirejs/text!demo/kitchen-sink/docs/javascript.js") + require("ace/requirejs/text!./docs/javascript.js") ), new WrappedDoc("text", "Plain Text", loreIpsum), new Doc( "coffee", "Coffeescript", - require("ace/requirejs/text!demo/kitchen-sink/docs/coffeescript.coffee") + require("ace/requirejs/text!./docs/coffeescript.coffee") ), new Doc( "json", "JSON", - require("ace/requirejs/text!demo/kitchen-sink/docs/json.json") + require("ace/requirejs/text!./docs/json.json") ), new Doc( "css", "CSS", - require("ace/requirejs/text!demo/kitchen-sink/docs/css.css") + require("ace/requirejs/text!./docs/css.css") ), new Doc( "scss", "SCSS", - require("ace/requirejs/text!demo/kitchen-sink/docs/scss.scss") + require("ace/requirejs/text!./docs/scss.scss") ), new Doc( "html", "HTML", - require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") + require("ace/requirejs/text!./docs/html.html") ), new Doc( "xml", "XML", - require("ace/requirejs/text!demo/kitchen-sink/docs/xml.xml") + require("ace/requirejs/text!./docs/xml.xml") ), new Doc( "svg", "SVG", - require("ace/requirejs/text!demo/kitchen-sink/docs/svg.svg") + require("ace/requirejs/text!./docs/svg.svg") ), new Doc( "php", "PHP", - require("ace/requirejs/text!demo/kitchen-sink/docs/php.php") + require("ace/requirejs/text!./docs/php.php") ), new Doc( "coldfusion", "ColdFusion", - require("ace/requirejs/text!demo/kitchen-sink/docs/coldfusion.cfm") + require("ace/requirejs/text!./docs/coldfusion.cfm") ), new Doc( "python", "Python", - require("ace/requirejs/text!demo/kitchen-sink/docs/python.py") + require("ace/requirejs/text!./docs/python.py") ), new Doc( "ruby", "Ruby", - require("ace/requirejs/text!demo/kitchen-sink/docs/ruby.rb") + require("ace/requirejs/text!./docs/ruby.rb") ), new Doc( "perl", "Perl", - require("ace/requirejs/text!demo/kitchen-sink/docs/perl.pl") + require("ace/requirejs/text!./docs/perl.pl") ), new Doc( "ocaml", "OCaml", - require("ace/requirejs/text!demo/kitchen-sink/docs/ocaml.ml") + require("ace/requirejs/text!./docs/ocaml.ml") ), new Doc( "lua", "Lua", - require("ace/requirejs/text!demo/kitchen-sink/docs/lua.lua") + require("ace/requirejs/text!./docs/lua.lua") ), new Doc( "java", "Java", - require("ace/requirejs/text!demo/kitchen-sink/docs/java.java") + require("ace/requirejs/text!./docs/java.java") ), new Doc( "clojure", "Clojure", - require("ace/requirejs/text!demo/kitchen-sink/docs/clojure.clj") + require("ace/requirejs/text!./docs/clojure.clj") ), new Doc( "groovy", "Groovy", - require("ace/requirejs/text!demo/kitchen-sink/docs/groovy.groovy") + require("ace/requirejs/text!./docs/groovy.groovy") ), new Doc( "scala", "Scala", - require("ace/requirejs/text!demo/kitchen-sink/docs/scala.scala") + require("ace/requirejs/text!./docs/scala.scala") ), new Doc( "csharp", "C#", - require("ace/requirejs/text!demo/kitchen-sink/docs/csharp.cs") + require("ace/requirejs/text!./docs/csharp.cs") ), new Doc( "powershell", "Powershell", - require("ace/requirejs/text!demo/kitchen-sink/docs/powershell.ps1") + require("ace/requirejs/text!./docs/powershell.ps1") ), new Doc( "c_cpp", "C/C++", - require("ace/requirejs/text!demo/kitchen-sink/docs/cpp.cpp") - ), - new Doc( - "markdown", "Markdown", - require("ace/requirejs/text!demo/kitchen-sink/docs/markdown.md") + require("ace/requirejs/text!./docs/cpp.cpp") ), new WrappedDoc( "markdown", "Markdown", - require("ace/requirejs/text!demo/kitchen-sink/docs/markdown.md") + require("ace/requirejs/text!./docs/markdown.md") ), new WrappedDoc( "textile", "Textile", - require("ace/requirejs/text!demo/kitchen-sink/docs/textile.textile") + require("ace/requirejs/text!./docs/textile.textile") ), new WrappedDoc( "latex", "LaTeX", - require("ace/requirejs/text!demo/kitchen-sink/docs/latex.tex") + require("ace/requirejs/text!./docs/latex.tex") ) ]; @@ -349,7 +345,7 @@ bindDropdown("mode", function(value) { }); bindDropdown("theme", function(value) { - if (require.packaged) { + if (window.require.packaged) { loadTheme(value, function() { env.editor.setTheme(value); }); diff --git a/lib/ace/worker/worker.js b/lib/ace/worker/worker.js index fb78b3fe..111bcb7b 100644 --- a/lib/ace/worker/worker.js +++ b/lib/ace/worker/worker.js @@ -7,8 +7,29 @@ var window = { console: console }; -var require = function(id) { - console.log("require " + id) +var normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + var moduleName = base + "/" + moduleName; + + while(moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + var moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +var require = function(parentId, id) { + var id = normalizeModule(parentId, id); + var module = require.modules[id]; if (module) { if (!module.initialized) { @@ -23,9 +44,8 @@ var require = function(id) { path = chunks.join("/") + ".js"; require.id = id; -// console.log("require " + path + " " + id) importScripts(path); - return require(id); + return require(parentId, id); }; require.modules = {}; @@ -38,7 +58,7 @@ var define = function(id, deps, factory) { factory = id; id = require.id; } - + if (id.indexOf("text!") === 0) return; @@ -47,7 +67,7 @@ var define = function(id, deps, factory) { var module = { exports: {} }; - var returnExports = factory(require, module.exports, module); + var returnExports = factory(require.bind(null, id), module.exports, module); if (returnExports) module.exports = returnExports; return module; @@ -61,8 +81,8 @@ function initBaseUrls(topLevelNamespaces) { function initSender() { - var EventEmitter = require("ace/lib/event_emitter").EventEmitter; - var oop = require("ace/lib/oop"); + var EventEmitter = require(null, "ace/lib/event_emitter").EventEmitter; + var oop = require(null, "ace/lib/oop"); var Sender = function() {}; @@ -101,9 +121,9 @@ onmessage = function(e) { } else if (msg.init) { initBaseUrls(msg.tlns); - require("ace/lib/fixoldbrowsers"); + require(null, "ace/lib/fixoldbrowsers"); sender = initSender(); - var clazz = require(msg.module)[msg.classname]; + var clazz = require(null, msg.module)[msg.classname]; main = new clazz(sender); } else if (msg.event && sender) { diff --git a/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index 5a481c1d..2fbfd43e 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -44,7 +44,7 @@ var WorkerClient = function(topLevelNamespaces, packagedJs, module, classname) { this.changeListener = this.changeListener.bind(this); - if (require.packaged) { + if (window.require.packaged) { var base = this.$guessBasePath(); var worker = this.$worker = new Worker(base + packagedJs); }