openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

compress (2760B)


      1 #!/usr/bin/env node
      2 
      3 // Compression helper for CodeMirror
      4 //
      5 // Example:
      6 //
      7 //   bin/compress codemirror runmode javascript xml
      8 //
      9 // Will take lib/codemirror.js, addon/runmode/runmode.js,
     10 // mode/javascript/javascript.js, and mode/xml/xml.js, run them though
     11 // the online minifier at http://marijnhaverbeke.nl/uglifyjs, and spit
     12 // out the result.
     13 //
     14 //   bin/compress codemirror --local /path/to/bin/UglifyJS
     15 //
     16 // Will use a local minifier instead of the online default one.
     17 //
     18 // Script files are specified without .js ending. Prefixing them with
     19 // their full (local) path is optional. So you may say lib/codemirror
     20 // or mode/xml/xml to be more precise. In fact, even the .js suffix
     21 // may be specified, if wanted.
     22 
     23 "use strict";
     24 
     25 var fs = require("fs");
     26 
     27 function help(ok) {
     28   console.log("usage: " + process.argv[1] + " [--local /path/to/uglifyjs] files...");
     29   process.exit(ok ? 0 : 1);
     30 }
     31 
     32 var local = null, args = [], extraArgs = null, files = [], blob = "";
     33 
     34 for (var i = 2; i < process.argv.length; ++i) {
     35   var arg = process.argv[i];
     36   if (arg == "--local" && i + 1 < process.argv.length) {
     37     var parts = process.argv[++i].split(/\s+/);
     38     local = parts[0];
     39     extraArgs = parts.slice(1);
     40     if (!extraArgs.length) extraArgs = ["-c", "-m"];
     41   } else if (arg == "--help") {
     42     help(true);
     43   } else if (arg[0] != "-") {
     44     files.push({name: arg, re: new RegExp("(?:\\/|^)" + arg + (/\.js$/.test(arg) ? "$" : "\\.js$"))});
     45   } else help(false);
     46 }
     47 
     48 function walk(dir) {
     49   fs.readdirSync(dir).forEach(function(fname) {
     50     if (/^[_\.]/.test(fname)) return;
     51     var file = dir + fname;
     52     if (fs.statSync(file).isDirectory()) return walk(file + "/");
     53     if (files.some(function(spec, i) {
     54       var match = spec.re.test(file);
     55       if (match) files.splice(i, 1);
     56       return match;
     57     })) {
     58       if (local) args.push(file);
     59       else blob += fs.readFileSync(file, "utf8");
     60     }
     61   });
     62 }
     63 
     64 walk("lib/");
     65 walk("addon/");
     66 walk("mode/");
     67 
     68 if (!local && !blob) help(false);
     69 
     70 if (files.length) {
     71   console.log("Some specified files were not found: " +
     72               files.map(function(a){return a.name;}).join(", "));
     73   process.exit(1);
     74 }
     75   
     76 if (local) {
     77   require("child_process").spawn(local, args.concat(extraArgs), {stdio: ["ignore", process.stdout, process.stderr]});
     78 } else {
     79   var data = new Buffer("js_code=" + require("querystring").escape(blob), "utf8");
     80   var req = require("http").request({
     81     host: "marijnhaverbeke.nl",
     82     port: 80,
     83     method: "POST",
     84     path: "/uglifyjs",
     85     headers: {"content-type": "application/x-www-form-urlencoded",
     86               "content-length": data.length}
     87   });
     88   req.on("response", function(resp) {
     89     resp.on("data", function (chunk) { process.stdout.write(chunk); });
     90   });
     91   req.end(data);
     92 }