minify/squish.minify.lua

Sun, 26 Jul 2009 14:47:05 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 26 Jul 2009 14:47:05 +0100
changeset 27
0718b469099d
parent 7
0db12f8037f7
child 30
802e22257a9e
permissions
-rw-r--r--

minify: Break into minify_file and minify_string to allow easier re-use

1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local optlex = require "optlex"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local optparser = require "optparser"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local llex = require "llex"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local lparser = require "lparser"
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local minify_defaults = {
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 none = {};
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 default = { "comments", "whitespace", "emptylines", "numbers", "locals" };
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 basic = { "comments", "whitespace", "emptylines" };
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 maximum = { "comments", "whitespace", "emptylines", "eols", "strings", "numbers", "locals", "entropy" };
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 minify_defaults.full = minify_defaults.maximum;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 for _, opt in ipairs(minify_defaults[opts.minify_level or "default"] or {}) do
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 opts["minify_"..opt] = true;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local option = {
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 ["opt-locals"] = opts.minify_locals;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 ["opt-comments"] = opts.minify_comments;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 ["opt-entropy"] = opts.minify_entropy;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 ["opt-whitespace"] = opts.minify_whitespace;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 ["opt-emptylines"] = opts.minify_emptylines;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 ["opt-eols"] = opts.minify_eols;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 ["opt-strings"] = opts.minify_strings;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 ["opt-numbers"] = opts.minify_numbers;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local function die(msg)
6
c51cb63e428f minify: Update error output to use print_err, and os.exit(1)
Matthew Wild <mwild1@gmail.com>
parents: 5
diff changeset
30 print_err("minify: "..msg); os.exit(1);
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 local function load_file(fname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local INF = io.open(fname, "rb")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 if not INF then die("cannot open \""..fname.."\" for reading") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local dat = INF:read("*a")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 if not dat then die("cannot read from \""..fname.."\"") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 INF:close()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 return dat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local function save_file(fname, dat)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 local OUTF = io.open(fname, "wb")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 if not OUTF then die("cannot open \""..fname.."\" for writing") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 local status = OUTF:write(dat)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 if not status then die("cannot write to \""..fname.."\"") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 OUTF:close()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50
27
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
51 function minify_string(dat)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
52 llex.init(dat)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
53 llex.llex()
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
54 local toklist, seminfolist, toklnlist
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
55 = llex.tok, llex.seminfo, llex.tokln
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
56 if option["opt-locals"] then
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
57 optparser.print = print -- hack
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
58 lparser.init(toklist, seminfolist, toklnlist)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
59 local globalinfo, localinfo = lparser.parser()
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
60 optparser.optimize(option, toklist, seminfolist, globalinfo, localinfo)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
61 end
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
62 optlex.print = print -- hack
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
63 toklist, seminfolist, toklnlist
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
64 = optlex.optimize(option, toklist, seminfolist, toklnlist)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
65 local dat = table.concat(seminfolist)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
66 -- depending on options selected, embedded EOLs in long strings and
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
67 -- long comments may not have been translated to \n, tack a warning
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
68 if string.find(dat, "\r\n", 1, 1) or
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
69 string.find(dat, "\n\r", 1, 1) then
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
70 optlex.warn.mixedeol = true
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
71 end
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
72 return dat;
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
73 end
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
74
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
75 function minify_file(srcfl, destfl)
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
76 local z = load_file(srcfl);
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
77 z = minify_string(z);
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
78 save_file(destfl, z);
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80
7
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
81 if opts.minify ~= false then
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
82 print_info("Minifying "..out_fn.."...");
27
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
83 minify_file(out_fn, out_fn);
7
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
84 print_info("OK!");
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
85 end

mercurial