Sat, 25 Jul 2009 03:11:35 +0100
squish.lua: Use --enable-debug flag to decide whether to enable debug options
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) | |
30 | print("LuaSrcDiet: "..msg); os.exit() | |
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 | ||
51 | function minify(srcfl, destfl) | |
52 | local z = load_file(srcfl) | |
53 | llex.init(z) | |
54 | llex.llex() | |
55 | local toklist, seminfolist, toklnlist | |
56 | = llex.tok, llex.seminfo, llex.tokln | |
57 | if option["opt-locals"] then | |
58 | optparser.print = print -- hack | |
59 | lparser.init(toklist, seminfolist, toklnlist) | |
60 | local globalinfo, localinfo = lparser.parser() | |
61 | optparser.optimize(option, toklist, seminfolist, globalinfo, localinfo) | |
62 | end | |
63 | optlex.print = print -- hack | |
64 | toklist, seminfolist, toklnlist | |
65 | = optlex.optimize(option, toklist, seminfolist, toklnlist) | |
66 | local dat = table.concat(seminfolist) | |
67 | -- depending on options selected, embedded EOLs in long strings and | |
68 | -- long comments may not have been translated to \n, tack a warning | |
69 | if string.find(dat, "\r\n", 1, 1) or | |
70 | string.find(dat, "\n\r", 1, 1) then | |
71 | optlex.warn.mixedeol = true | |
72 | end | |
73 | -- save optimized source stream to output file | |
74 | save_file(destfl, dat) | |
75 | end | |
76 | ||
77 | print_info("Minifying "..out_fn.."..."); | |
78 | minify(out_fn, out_fn); |