93 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| #!/usr/bin/env node
 | |
| 
 | |
| // Compression helper for CodeMirror
 | |
| //
 | |
| // Example:
 | |
| //
 | |
| //   bin/compress codemirror runmode javascript xml
 | |
| //
 | |
| // Will take lib/codemirror.js, addon/runmode/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 = [], extraArgs = 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];
 | |
|     extraArgs = parts.slice(1);
 | |
|     if (!extraArgs.length) extraArgs = ["-c", "-m"];
 | |
|   } 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("addon/");
 | |
| walk("mode/");
 | |
| 
 | |
| if (!local && !blob) help(false);
 | |
| 
 | |
| 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.concat(extraArgs), {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);
 | |
| }
 |