Permalink
Browse files

Add local compression helper

  • Loading branch information...
marijnh committed Oct 23, 2012
1 parent 031221f commit 9101e20c07e4187f2aada629e223dbbe7f660fb7
Showing with 88 additions and 0 deletions.
  1. +88 −0 bin/compress
View
@@ -0,0 +1,88 @@
+#!/usr/bin/env node
+
+// Compression helper for CodeMirror
+//
+// Example:
+//
+// bin/compress codemirror runmode javascript xml
+//
+// Will take lib/codemirror.js, lib/util/runmode.js,
+// mode/javascript/javascript.js, and mode/xml/xml.js, run them though
+// the online minifier at http://marijnhaverbeke.nl/uglifyjs, and spit
+// out the result.
+//
+// bin/compress codemirror --local /path/to/bin/UglifyJS
+//
+// Will use a local minifier instead of the online default one.
+//
+// Script files are specified without .js ending. Prefixing them with
+// their full (local) path is optional. So you may say lib/codemirror
+// or mode/xml/xml to be more precise. In fact, even the .js suffix
+// may be speficied, if wanted.
+
+"use strict";
+
+var fs = require("fs");
+
+function help(ok) {
+ console.log("usage: " + process.argv[1] + " [--local /path/to/uglifyjs] files...");
+ process.exit(ok ? 0 : 1);
+}
+
+var local = null, args = null, files = [], blob = "";
+
+for (var i = 2; i < process.argv.length; ++i) {
+ var arg = process.argv[i];
+ if (arg == "--local" && i + 1 < process.argv.length) {
+ var parts = process.argv[++i].split(/\s+/);
+ local = parts[0];
+ args = parts.slice(1);
+ } else if (arg == "--help") {
+ help(true);
+ } else if (arg[0] != "-") {
+ files.push({name: arg, re: new RegExp("(?:\\/|^)" + arg + (/\.js$/.test(arg) ? "$" : "\\.js$"))});
+ } else help(false);
+}
+
+function walk(dir) {
+ fs.readdirSync(dir).forEach(function(fname) {
+ if (/^[_\.]/.test(fname)) return;
+ var file = dir + fname;
+ if (fs.statSync(file).isDirectory()) return walk(file + "/");
+ if (files.some(function(spec, i) {
+ var match = spec.re.test(file);
+ if (match) files.splice(i, 1);
+ return match;
+ })) {
+ if (local) args.push(file);
+ else blob += fs.readFileSync(file, "utf8");
+ }
+ });
+}
+
+walk("lib/");
+walk("mode/");
+
+if (files.length) {
+ console.log("Some speficied files were not found: " +
+ files.map(function(a){return a.name;}).join(", "));
+ process.exit(1);
+}
+
+if (local) {
+ require("child_process").spawn(local, args, {stdio: ["ignore", process.stdout, process.stderr]});
+} else {
+ var data = new Buffer("js_code=" + require("querystring").escape(blob), "utf8");
+ var req = require("http").request({
+ host: "marijnhaverbeke.nl",
+ port: 80,
+ method: "POST",
+ path: "/uglifyjs",
+ headers: {"content-type": "application/x-www-form-urlencoded",
+ "content-length": data.length}
+ });
+ req.on("response", function(resp) {
+ resp.on("data", function (chunk) { process.stdout.write(chunk); });
+ });
+ req.end(data);
+}

0 comments on commit 9101e20

Please sign in to comment.