minify/squish.minify.lua

Sat, 25 Jul 2009 21:18:44 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 25 Jul 2009 21:18:44 +0100
changeset 12
fb4ca0cc228e
parent 7
0db12f8037f7
child 27
0718b469099d
permissions
-rw-r--r--

Add very basic Makefile

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
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 function minify(srcfl, destfl)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 local z = load_file(srcfl)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 llex.init(z)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 llex.llex()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local toklist, seminfolist, toklnlist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 = llex.tok, llex.seminfo, llex.tokln
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 if option["opt-locals"] then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 optparser.print = print -- hack
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 lparser.init(toklist, seminfolist, toklnlist)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local globalinfo, localinfo = lparser.parser()
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 optparser.optimize(option, toklist, seminfolist, globalinfo, localinfo)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 optlex.print = print -- hack
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 toklist, seminfolist, toklnlist
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 = optlex.optimize(option, toklist, seminfolist, toklnlist)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 local dat = table.concat(seminfolist)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 -- depending on options selected, embedded EOLs in long strings and
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 -- long comments may not have been translated to \n, tack a warning
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 if string.find(dat, "\r\n", 1, 1) or
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 string.find(dat, "\n\r", 1, 1) then
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 optlex.warn.mixedeol = true
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 -- save optimized source stream to output file
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 save_file(destfl, dat)
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end
2d9fe676e684 Add minify plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
7
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
77 if opts.minify ~= false then
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
78 print_info("Minifying "..out_fn.."...");
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
79 minify(out_fn, out_fn);
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
80 print_info("OK!");
0db12f8037f7 minify: Don't minify if --no-minify option set
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
81 end

mercurial