minify/squish.minify.lua

Mon, 27 Jul 2009 03:26:17 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 27 Jul 2009 03:26:17 +0100
changeset 30
802e22257a9e
parent 27
0718b469099d
permissions
-rw-r--r--

minify: Add debug level, add warnings when specified level not valid, don't override options with defaults

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 = {};
30
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
8 debug = { "whitespace", "locals", "entropy", "comments", "numbers" };
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 default = { "comments", "whitespace", "emptylines", "numbers", "locals" };
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 basic = { "comments", "whitespace", "emptylines" };
30
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
11 full = { "comments", "whitespace", "emptylines", "eols", "strings", "numbers", "locals", "entropy" };
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
30
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
14 if opts.minify_level and not minify_defaults[opts.minify_level] then
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
15 print_err("Unknown minify level: "..opts.minify_level);
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
16 print_err("Available minify levels: none, basic, default, full, debug");
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
17 end
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 for _, opt in ipairs(minify_defaults[opts.minify_level or "default"] or {}) do
30
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
19 if opts["minify_"..opt] == nil then
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
20 opts["minify_"..opt] = true;
802e22257a9e minify: Add debug level, add warnings when specified level not valid, don't override options with defaults
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
21 end
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local option = {
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 ["opt-locals"] = opts.minify_locals;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 ["opt-comments"] = opts.minify_comments;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 ["opt-entropy"] = opts.minify_entropy;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 ["opt-whitespace"] = opts.minify_whitespace;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 ["opt-emptylines"] = opts.minify_emptylines;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 ["opt-eols"] = opts.minify_eols;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 ["opt-strings"] = opts.minify_strings;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 ["opt-numbers"] = opts.minify_numbers;
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 }
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 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
36 print_err("minify: "..msg); os.exit(1);
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 local function load_file(fname)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local INF = io.open(fname, "rb")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 if not INF then die("cannot open \""..fname.."\" for reading") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local dat = INF:read("*a")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 if not dat then die("cannot read from \""..fname.."\"") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 INF:close()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 return dat
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 local function save_file(fname, dat)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 local OUTF = io.open(fname, "wb")
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 if not OUTF then die("cannot open \""..fname.."\" for writing") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 local status = OUTF:write(dat)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 if not status then die("cannot write to \""..fname.."\"") end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 OUTF:close()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
27
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
57 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
58 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
59 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
60 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
61 = 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
62 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
63 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
64 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
65 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
66 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
67 end
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
68 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
69 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
70 = 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
71 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
72 -- 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
73 -- 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
74 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
75 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
76 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
77 end
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
78 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
79 end
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
80
0718b469099d minify: Break into minify_file and minify_string to allow easier re-use
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
81 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
82 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
83 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
84 save_file(destfl, z);
1
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86
7
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
87 if opts.minify ~= false then
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
88 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
89 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
90 print_info("OK!");
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
91 end

mercurial