Sun, 26 Jul 2009 14:50:05 +0100
Allow user or squishy file to specify custom shebang
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 | |
f62f83d9dc43
uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 | outfile:write [[assert(loadstring(prettify]] |
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), "]"); |
f62f83d9dc43
uglify: New specialised Lua 'compression' filter
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | outfile:write("))()"); |
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 |