uglify/squish.uglify.lua

Thu, 27 May 2010 03:57:30 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 27 May 2010 03:57:30 +0100
changeset 56
791c9d8b750c
parent 36
bbfbc08d568f
child 62
15c48274ee1f
permissions
-rw-r--r--

uglify: Preserve the uglified module's return value(s)

8
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local llex = require "llex"
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local base_char = 128;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local keywords = { "and", "break", "do", "else", "elseif",
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 "end", "false", "for", "function", "if",
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 "in", "local", "nil", "not", "or", "repeat",
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 "return", "then", "true", "until", "while" }
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 function uglify_file(infile_fn, outfile_fn)
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local infile, err = io.open(infile_fn);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 if not infile then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 print_err("Can't open input file for reading: "..tostring(err));
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 return;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local outfile, err = io.open(outfile_fn..".uglified", "w+");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 if not outfile then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 print_err("Can't open output file for writing: "..tostring(err));
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 return;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local data = infile:read("*a");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 infile:close();
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local shebang, newdata = data:match("^(#.-\n)(.+)$");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local code = newdata or data;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 if shebang then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 outfile:write(shebang)
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 while base_char + #keywords < 255 and code:find("["..string.char(base_char).."-"..string.char(base_char+#keywords-1).."]") do
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 base_char = base_char + 1;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 if base_char == 255 then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 -- Sorry, can't uglify this file :(
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 -- We /could/ use a multi-byte marker, but that would complicate
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 -- things and lower the compression ratio (there are quite a few
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 -- 2-letter keywords)
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 outfile:write(code);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 outfile:close();
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 os.rename(outfile_fn..".uglified", outfile_fn);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 return;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 local keyword_map_to_char = {}
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 for i, keyword in ipairs(keywords) do
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 keyword_map_to_char[keyword] = string.char(base_char + i);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 outfile:write("local base_char,keywords=", tostring(base_char), ",{");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 for _, keyword in ipairs(keywords) do
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 outfile:write('"', keyword, '",');
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 outfile:write[[}; function prettify(code) return code:gsub("["..string.char(base_char).."-"..string.char(base_char+#keywords).."]",
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 function (c) return keywords[c:byte()-base_char]; end) end ]]
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 -- Write loadstring and open string
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local maxequals = 0;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 data:gsub("(=+)", function (equals_string) maxequals = math.max(maxequals, #equals_string); end);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61
56
791c9d8b750c uglify: Preserve the uglified module's return value(s)
Matthew Wild <mwild1@gmail.com>
parents: 36
diff changeset
62 outfile:write [[return assert(loadstring(prettify]]
8
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 outfile:write("[", string.rep("=", maxequals+1), "[");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 -- Write code, substituting tokens as we go
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 llex.init(code, "@"..infile_fn);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 llex.llex()
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 local seminfo = llex.seminfo;
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 for k,v in ipairs(llex.tok) do
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 if v == "TK_KEYWORD" then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 local keyword_char = keyword_map_to_char[seminfo[k]];
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 if keyword_char then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 outfile:write(keyword_char);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 else -- Those who think Lua shouldn't have 'continue, fix this please :)
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 outfile:write(seminfo[k]);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 else
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 outfile:write(seminfo[k]);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 -- Close string/functions
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 outfile:write("]", string.rep("=", maxequals+1), "]");
36
bbfbc08d568f uglify: Restore filename on chunk when loading
Matthew Wild <mwild1@gmail.com>
parents: 8
diff changeset
84 outfile:write(", '@", outfile_fn,"'))()");
8
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 outfile:close();
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 os.rename(outfile_fn..".uglified", outfile_fn);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 if opts.uglify then
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 print_info("Uglifying "..out_fn.."...");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 uglify_file(out_fn, out_fn);
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 print_info("OK!");
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 end
f62f83d9dc43 uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94

mercurial