Sun, 26 Jul 2009 14:47:05 +0100
minify: Break into minify_file and minify_string to allow easier re-use
1 | 1 | local optlex = require "optlex" |
2 | local optparser = require "optparser" | |
3 | local llex = require "llex" | |
4 | local lparser = require "lparser" | |
5 | ||
6 | local minify_defaults = { | |
7 | none = {}; | |
8 | default = { "comments", "whitespace", "emptylines", "numbers", "locals" }; | |
9 | basic = { "comments", "whitespace", "emptylines" }; | |
10 | maximum = { "comments", "whitespace", "emptylines", "eols", "strings", "numbers", "locals", "entropy" }; | |
11 | } | |
12 | minify_defaults.full = minify_defaults.maximum; | |
13 | ||
14 | for _, opt in ipairs(minify_defaults[opts.minify_level or "default"] or {}) do | |
15 | opts["minify_"..opt] = true; | |
16 | end | |
17 | ||
18 | local option = { | |
19 | ["opt-locals"] = opts.minify_locals; | |
20 | ["opt-comments"] = opts.minify_comments; | |
21 | ["opt-entropy"] = opts.minify_entropy; | |
22 | ["opt-whitespace"] = opts.minify_whitespace; | |
23 | ["opt-emptylines"] = opts.minify_emptylines; | |
24 | ["opt-eols"] = opts.minify_eols; | |
25 | ["opt-strings"] = opts.minify_strings; | |
26 | ["opt-numbers"] = opts.minify_numbers; | |
27 | } | |
28 | ||
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 | 31 | end |
32 | ||
33 | local function load_file(fname) | |
34 | local INF = io.open(fname, "rb") | |
35 | if not INF then die("cannot open \""..fname.."\" for reading") end | |
36 | local dat = INF:read("*a") | |
37 | if not dat then die("cannot read from \""..fname.."\"") end | |
38 | INF:close() | |
39 | return dat | |
40 | end | |
41 | ||
42 | local function save_file(fname, dat) | |
43 | local OUTF = io.open(fname, "wb") | |
44 | if not OUTF then die("cannot open \""..fname.."\" for writing") end | |
45 | local status = OUTF:write(dat) | |
46 | if not status then die("cannot write to \""..fname.."\"") end | |
47 | OUTF:close() | |
48 | end | |
49 | ||
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 | 79 | end |
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 |