Skip to content

Commit

Permalink
javascript and coffee editor working side by side
Browse files Browse the repository at this point in the history
- requireing worker src inside modes
- passing to index attached to mod
  • Loading branch information
thlorenz committed Apr 23, 2013
1 parent d15c938 commit 32a77b7
Show file tree
Hide file tree
Showing 32 changed files with 15,383 additions and 54 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Expand Up @@ -14,4 +14,4 @@ results
npm-debug.log
node_modules

worker
workersrc
36 changes: 36 additions & 0 deletions build/stringify-workers.js
@@ -0,0 +1,36 @@
'use strict';

var path = require('path')
, uglify = require('uglify-js')
, fs = require('fs')
, workers = require('./workers')
;


function minify(code) {
var compressor = uglify.Compressor()
, ast = uglify.parse(code);

ast.figure_out_scope();
return ast.transform(compressor).print_to_string();
}

module.exports = function () {
// 'php', 'xquery' not supported since they cannot be inlined even when minified before stringify
workers.supported
.forEach(function (worker) {
var filename = worker.toLowerCase() + '.js';
var file = path.join(__dirname, '..', 'workersrc', filename);
var src = fs.readFileSync(file, 'utf-8');

var dst = path.join(__dirname, '..', 'worker', filename);
var stringified = JSON.stringify(minify(src));

// need a String object here so we can attach extra props like src
var code = 'module.exports = new String(\'' + 'ace/mode/' + worker + '_worker\');\n'
+ 'module.exports.src = ' + stringified + ';';

fs.writeFileSync(dst, code, 'utf-8');
});
};

68 changes: 45 additions & 23 deletions build/update.js
Expand Up @@ -2,18 +2,20 @@

/*jshint asi: true */

var path = require('path');
var fs = require('fs');
var workers = require('./workers');
var fixRequires = require('./fix-requires');
var path = require('path');
var fs = require('fs');
var workers = require('./workers');
var stringifyWorkers = require('./stringify-workers');
var fixRequires = require('./fix-requires');

require('shelljs/global');

var braceroot = path.join(__dirname, '..');
var themedir = path.join(braceroot, 'theme');
var modedir = path.join(braceroot, 'mode');
var workerdir = path.join(braceroot, 'worker');
var buildroot = path.join(__dirname, 'ace-build');
var braceroot = path.join(__dirname, '..');
var themedir = path.join(braceroot, 'theme');
var modedir = path.join(braceroot, 'mode');
var workersrcdir = path.join(braceroot, 'workersrc');
var workerdir = path.join(braceroot, 'worker');
var buildroot = path.join(__dirname, 'ace-build');

+function updateCleanAndPutInOrder() {

Expand Down Expand Up @@ -55,13 +57,13 @@ var buildroot = path.join(__dirname, 'ace-build');
}()

+function workers() {
rm('-rf', workerdir);
mkdir(workerdir);
rm('-rf', workersrcdir);
mkdir(workersrcdir);

ls(path.join(buildroot, 'worker-*.js'))
.forEach(function (file) {
var filename = path.basename(file).slice('worker-'.length);
mv(file, path.join(workerdir, filename));
mv(file, path.join(workersrcdir, filename));
});
}()

Expand All @@ -79,19 +81,39 @@ var buildroot = path.join(__dirname, 'ace-build');

fixAllRequires(themedir);
fixAllRequires(modedir);
fixAllRequires(workerdir);
fixAllRequires(workersrcdir);
fixAllRequires(buildroot);
}()

+function generateAcesForEachWorkerCombination () {
var acesrc = fs.readFileSync(path.join(buildroot, 'ace.js'), 'utf-8');
var rx = /this\.\$worker *= *new +Worker\(workerUrl\);/;
var inlines = workers.getInlines();
Object.keys(inlines)
.forEach(function (k) {
var src = acesrc.replace(rx, inlines[k]);
src += '\nmodule.exports = window.ace.acequire("ace/ace");';
var p = path.join(braceroot, k + '.js');
fs.writeFileSync(p, src, 'utf-8');
+function injectWorkersIntoModes() {
ls(path.join(modedir, '*.js'))
.forEach(function (file) {
var src = fs.readFileSync(file, 'utf-8');
var fixed = src;
workers.supported
.forEach(function (lang) {
fixed = fixed
.replace(
'"ace/mode/' + lang + '_worker"'
, 'require("../worker/' + lang + '")'
);
});

fs.writeFileSync(file, fixed, 'utf-8');
});
}()

+function workers() {
var acesrc = fs.readFileSync(path.join(buildroot, 'ace.js'), 'utf-8');
var workerBlob = fs.readFileSync(path.join(__dirname, 'worker-blob.js'), 'utf-8');

var rx = /this\.\$worker *= *new +Worker\(workerUrl\);/;
var src = acesrc.replace(rx, workerBlob);

src += '\nmodule.exports = window.ace.acequire("ace/ace");';
fs.writeFileSync(path.join(braceroot, 'index.js'), src, 'utf-8');

rm('-rf', workerdir);
mkdir(workerdir);
stringifyWorkers();
}();
14 changes: 14 additions & 0 deletions build/worker-blob.js
@@ -0,0 +1,14 @@
var blob;

var workerSrc = mod.src;
try {
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
blob = new BlobBuilder();
blob.append(workerSrc);
blob = blob.getBlob();
} catch(e) {
blob = new Blob([workerSrc]);
}
var blobUrl = (window.URL || window.webkitURL).createObjectURL(blob);

this.$worker = new Worker(blobUrl);
23 changes: 23 additions & 0 deletions build/workers.js
@@ -0,0 +1,23 @@
'use strict';

var workers = module.exports = {
coffee : [ 'coffee' ]
, css : [ 'css', 'html', 'luapage', 'markdown', 'rhtml' ]
, javascript : [ 'coldfusion', 'curly', 'django', 'groovy', 'html', 'java', 'javascript', 'luapage', 'markdown', 'rhtml', 'scala', 'svg', 'typescript' ]
, json : [ 'json' ]
, lua : [ 'lua', 'luapage' ]
, php : [ 'php' ]
, xquery : [ 'xquery' ]
};

module.exports.supported = Object.keys(workers)
.filter(function (w) {
return w !== 'php' && w !== 'xquery';
});

function getWorkers(lang) {
return Object.keys(workers)
.filter(function (k) {
return ~workers[k].indexOf(lang);
});
}
2 changes: 1 addition & 1 deletion example/build.js
Expand Up @@ -4,7 +4,7 @@ var browserify = require('browserify')

browserify()
.require(require.resolve('./javascript-editor'), { entry: true })
// .require(require.resolve('./coffee-editor'), { entry: true })
.require(require.resolve('./coffee-editor'), { entry: true })
// .require(require.resolve('./css-editor'), { entry: true })
.bundle({ debug: true })
.pipe(fs.createWriteStream(__dirname + '/bundle.js'));
2 changes: 1 addition & 1 deletion example/coffee-editor.js
@@ -1,5 +1,5 @@
// initialize ace editor customized for coffee
var ace = require('brace/coffee');
var ace = require('brace');

// initialize coffee mode and monokai theme after editor itself
require('brace/mode/coffee');
Expand Down
4 changes: 2 additions & 2 deletions example/index.html
Expand Up @@ -10,8 +10,8 @@
<h1>Ace Editors provided by brace</h1>
<div id="javascript-editor" class="editor"></div>
<div id="coffee-editor" class="editor"></div>
<div id="css-editor" class="editor"></div>
<!--<div id="lua-editor" class="editor"></div>-->
<!--<div id="css-editor" class="editor"></div>
<div id="lua-editor" class="editor"></div>-->
<script type="text/javascript" src="./bundle.js"></script>
</body>
</html>
2 changes: 1 addition & 1 deletion example/javascript-editor.js
@@ -1,5 +1,5 @@
// initialize ace editor customized for javascript
var ace = require('brace/javascript');
var ace = require('brace');

// initialize javascript mode and monokai theme after editor itself
require('brace/mode/javascript');
Expand Down

0 comments on commit 32a77b7

Please sign in to comment.