move css strings inline to avoid problems with text plugin

This commit is contained in:
nightwing 2012-10-06 14:54:27 +04:00
commit 73f66d9408

View file

@ -244,6 +244,33 @@ function addSuffix(options) {
options.suffix += "-noconflict"; options.suffix += "-noconflict";
} }
} }
function getWriteFilters(options, projectType) {
var filters = [
copy.filter.moduleDefines,
inlineTextModules,
removeUseStrict,
removeLicenceComments
];
if (projectType == "worker")
return filters;
if (options.noconflict)
filters.push(namespace(options.ns));
if (options.compress)
filters.push(copy.filter.uglifyjs);
if (options.exportModule && projectType == "main") {
if (options.noconflict)
filters.push(exportAce(options.ns, options.exportModule, options.ns));
else
filters.push(exportAce(options.ns, options.exportModule));
}
return filters;
}
var buildAce = function(options) { var buildAce = function(options) {
var aceProject = { var aceProject = {
roots: [ACE_HOME + '/lib', ACE_HOME + '/demo'], roots: [ACE_HOME + '/lib', ACE_HOME + '/demo'],
@ -275,24 +302,6 @@ var buildAce = function(options) {
if (!options.requires) if (!options.requires)
options.requires = [options.exportModule]; options.requires = [options.exportModule];
var filters = [
copy.filter.moduleDefines,
filterTextPlugin,
removeUseStrict,
removeLicenceComments
];
if (options.noconflict) {
filters.push(namespace(options.ns));
if (options.exportModule)
var exportFilter = exportAce(options.ns, options.exportModule, options.ns);
} else if (options.exportModule) {
var exportFilter = exportAce(options.ns, options.exportModule);
}
if (options.compress)
filters.push(copy.filter.uglifyjs);
var targetDir = options.targetDir + options.suffix; var targetDir = options.targetDir + options.suffix;
var name = options.name; var name = options.name;
@ -313,7 +322,7 @@ var buildAce = function(options) {
copy({ copy({
source: ace, source: ace,
filter: exportFilter ? filters.concat(exportFilter) : filters, filter: getWriteFilters(options, "main"),
dest: targetDir + '/' + name + ".js" dest: targetDir + '/' + name + ".js"
}); });
@ -327,7 +336,7 @@ var buildAce = function(options) {
project: cloneProject(project), project: cloneProject(project),
require: [ 'ace/mode/' + mode ] require: [ 'ace/mode/' + mode ]
}], }],
filter: filters, filter: getWriteFilters(options, "mode"),
dest: targetDir + "/mode-" + mode + ".js" dest: targetDir + "/mode-" + mode + ".js"
}); });
}); });
@ -337,26 +346,14 @@ var buildAce = function(options) {
project.assumeAllFilesLoaded(); project.assumeAllFilesLoaded();
options.themes.forEach(function(theme) { options.themes.forEach(function(theme) {
console.log("theme " + theme); console.log("theme " + theme);
/*copy({ copy({
source: [{ source: [{
project: cloneProject(project), project: cloneProject(project),
require: ["ace/theme/" + theme] require: ["ace/theme/" + theme]
}], }],
filter: filters, filter: getWriteFilters(options, "theme"),
dest: targetDir + "/theme-" + theme + ".js" dest: targetDir + "/theme-" + theme.replace("_theme", "") + ".js"
});*/ });
// use this instead, to not create separate modules for js and css
var themePath = ACE_HOME + "/lib/ace/theme/" + theme;
var js = fs.readFileSync(themePath + ".js", "utf8");
js = js.replace("define(", "define('ace/theme/" + theme + "', ['require', 'exports', 'module', 'ace/lib/dom'], ");
if (fs.existsSync(themePath + ".css", "utf8")) {
var css = fs.readFileSync(themePath + ".css", "utf8")
js = js.replace(/require\(.ace\/requirejs\/text!.*?\)/, quoteString(css))
}
filters.forEach(function(f) {js = f(js); });
fs.writeFileSync(targetDir + "/theme-" + theme + ".js", js);
}); });
console.log('# ace extensions ---------'); console.log('# ace extensions ---------');
@ -369,7 +366,7 @@ var buildAce = function(options) {
project: cloneProject(project), project: cloneProject(project),
require: [ 'ace/ext/' + ext ] require: [ 'ace/ext/' + ext ]
}], }],
filter: filters, filter: getWriteFilters(options, "ext"),
dest: targetDir + "/ext-" + ext + ".js" dest: targetDir + "/ext-" + ext + ".js"
}); });
}); });
@ -384,19 +381,12 @@ var buildAce = function(options) {
project: cloneProject(project), project: cloneProject(project),
require: [ 'ace/keyboard/' + keybinding ] require: [ 'ace/keyboard/' + keybinding ]
}], }],
filter: filters, filter: getWriteFilters(options, "keybinding"),
dest: targetDir + "/keybinding-" + keybinding + ".js" dest: targetDir + "/keybinding-" + keybinding + ".js"
}); });
}); });
console.log('# ace worker ---------'); console.log('# ace worker ---------');
filters = [
copy.filter.moduleDefines,
filterTextPlugin,
removeUseStrict,
removeLicenceComments
];
options.workers.forEach(function(mode) { options.workers.forEach(function(mode) {
console.log("worker for " + mode + " mode"); console.log("worker for " + mode + " mode");
@ -415,7 +405,7 @@ var buildAce = function(options) {
'ace/mode/' + mode + '_worker' 'ace/mode/' + mode + '_worker'
] ]
}], }],
filter: filters, filter: getWriteFilters(options, "worker"),
dest: worker dest: worker
}); });
copy({ copy({
@ -452,6 +442,45 @@ var buildAce = function(fn) {
} }
}(buildAce); }(buildAce);
var textModules = {}
var detectTextModules = function(input, source) {
if (!source)
throw new Error('Missing filename for text module');
if (typeof input !== 'string')
input = input.toString();
var module = source.isLocation ? source.path : source;
input = input.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
input = '"' + input.replace(/\n/g, '\\n\\\n') + '"';
textModules[module] = input;
return "";
};
detectTextModules.onRead = true;
copy.filter.addDefines = detectTextModules;
function inlineTextModules(text) {
var lastDep = "";
return text.replace(/, *['"]ace\/requirejs\/text!(.*?)['"]|= *require\(['"](?:ace|[.\/]+)\/requirejs\/text!(.*?)['"]\)/g, function(_, dep, call) {
if (dep) {
if (!lastDep) {
lastDep = dep;
return "";
}
} else if (call) {
call = textModules[lastDep];
delete textModules[lastDep];
lastDep = "";
if (call)
return "= " + call;
}
console.log(dep, lastDep, call);
throw "inlining of multiple text modules is not supported";
});
}
// TODO: replace with project.clone once it is fixed in dryice // TODO: replace with project.clone once it is fixed in dryice
function cloneProject(project) { function cloneProject(project) {
var clone = copy.createCommonJsProject({ var clone = copy.createCommonJsProject({
@ -470,6 +499,7 @@ function cloneProject(project) {
return clone; return clone;
} }
function copyFileSync(srcFile, destFile) { function copyFileSync(srcFile, destFile) {
var BUF_LENGTH = 64*1024, var BUF_LENGTH = 64*1024,
buf = new Buffer(BUF_LENGTH), buf = new Buffer(BUF_LENGTH),
@ -496,10 +526,6 @@ function quoteString(str) {
return '"' + str.replace(/\\/, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\\n") + '"'; return '"' + str.replace(/\\/, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\\n") + '"';
} }
function filterTextPlugin(text) {
return text.replace(/(['"])(ace|[.\/]+?)\/requirejs\/text\!/g, "$1");
}
function removeUseStrict(text) { function removeUseStrict(text) {
return text.replace(/['"]use strict['"];/g, ""); return text.replace(/['"]use strict['"];/g, "");
} }