add config.loadModule

This commit is contained in:
nightwing 2012-12-06 00:22:42 +04:00
commit ffadbe44bf
3 changed files with 51 additions and 59 deletions

View file

@ -32,6 +32,8 @@ define(function(require, exports, module) {
"no use strict";
var lang = require("./lib/lang");
var oop = require("./lib/oop");
var EventEmitter = require("./lib/event_emitter").EventEmitter;
var global = (function() {
return this;
@ -65,6 +67,9 @@ exports.all = function() {
return lang.copyObject(options);
};
// module loading
oop.implement(exports, EventEmitter);
exports.moduleUrl = function(name, component) {
if (options.$moduleUrls[name])
return options.$moduleUrls[name];
@ -87,6 +92,32 @@ exports.setModuleUrl = function(name, subst) {
return options.$moduleUrls[name] = subst;
};
exports.loadModule = function(moduleName, onLoad) {
var module, moduleType;
if (Array.isArray(moduleName)) {
moduleType = moduleName[0];
moduleName = moduleName[1];
}
try {
module = require(moduleName);
} catch (e) {};
if (module)
return onLoad(module);
var afterLoad = function() {
require([moduleName], function(module) {
exports._emit("load.module", {name: moduleName, module: module});
onLoad(module);
});
};
if (!exports.get("packaged"))
return afterLoad();
net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);
};
// initialization
exports.init = function() {
options.packaged = require.packaged || module.packaged || (global.define && define.packaged);

View file

@ -898,49 +898,27 @@ var EditSession = function(text, mode) {
};
this.$modes = {};
this._loadMode = function(mode, callback) {
this._loadMode = function(name, callback) {
if (!this.$modes["null"])
this.$modes["null"] = this.$modes["ace/mode/text"] = new TextMode();
if (this.$modes[mode])
return callback(this.$modes[mode]);
if (this.$modes[name])
return callback(this.$modes[name]);
var _self = this;
var module;
try {
module = require(mode);
} catch (e) {};
// sometimes require returns empty object (this bug is present in requirejs 2 as well)
if (module && module.Mode)
return done(module);
config.loadModule(["mode", name], function(module) {
if (_self.$modes[name])
return callback(_self.$modes[name]);
if (module && module.Mode) {
_self.$modes[name] = new module.Mode();
_self.$modes[name].$id = name;
callback(_self.$modes[name]);
}
});
// set mode to text until loading is finished
if (!this.$mode)
this.$setModePlaceholder();
fetch(mode, function() {
require([mode], done);
});
function done(module) {
if (_self.$modes[mode])
return callback(_self.$modes[mode]);
_self.$modes[mode] = new module.Mode();
_self.$modes[mode].$id = mode;
_self._emit("loadmode", {
name: mode,
mode: _self.$modes[mode]
});
callback(_self.$modes[mode]);
}
function fetch(name, callback) {
if (!config.get("packaged"))
return callback();
net.loadScript(config.moduleUrl(name, "mode"), callback);
}
};
this.$setModePlaceholder = function() {
@ -982,11 +960,13 @@ var EditSession = function(text, mode) {
if (_self.$modeId !== mode)
return;
_self.setMode(module);
_self.$onChangeMode(module);
});
return;
}
} else
_self.$onChangeMode(module);
}
this.$onChangeMode = function(mode) {
if (this.$mode === mode) return;
this.$mode = mode;
this.$modeId = mode.$id;

View file

@ -1278,10 +1278,7 @@ var VirtualRenderer = function(container, theme) {
};
this._loadTheme = function(name, callback) {
if (!config.get("packaged"))
return callback();
net.loadScript(config.moduleUrl(name, "theme"), callback);
};
/**
@ -1292,28 +1289,12 @@ var VirtualRenderer = function(container, theme) {
**/
this.setTheme = function(theme) {
var _self = this;
this.$themeValue = theme;
_self._dispatchEvent('themeChange',{theme:theme});
if (!theme || typeof theme == "string") {
var moduleName = theme || "ace/theme/textmate";
var module;
try {
module = require(moduleName);
} catch (e) {};
if (module)
return afterLoad(module);
_self._loadTheme(moduleName, function() {
require([moduleName], function(module) {
if (_self.$themeValue !== theme)
return;
afterLoad(module);
});
});
config.loadModule(["theme", moduleName], afterLoad);
} else {
afterLoad(theme);
}