/ js / minify.rb
minify.rb
 1  #!/usr/bin/env ruby
 2  # encoding: utf-8
 3  
 4  require 'json'
 5  require 'net/http'
 6  
 7  if !ARGV[0]
 8    puts 'usage: minify.rb filename'
 9    exit!
10  end
11  
12  def minify_js
13    api_url = 'http://closure-compiler.appspot.com/compile'
14    filename = ARGV[0]
15    
16    out_dir = File.expand_path(File.dirname(__FILE__))
17    out_file = out_dir + '/' + filename.split('-')[0] + '.js'
18    
19    puts 'Compiling...'
20    
21    resp = Net::HTTP.post_form(URI(api_url), {
22      output_format: 'json',
23      output_info: [ 'compiled_code', 'warnings', 'errors', 'statistics' ],
24      compilation_level: 'SIMPLE_OPTIMIZATIONS',
25      language: 'ECMASCRIPT5',
26      js_code: File.open(filename, 'r:UTF-8') { |f| f.read }
27    })
28    
29    if resp.kind_of?(Net::HTTPSuccess)
30      data = JSON.parse(resp.body, symbolize_names: true)
31      
32      if data[:serverErrors]
33        puts 'Server errors:'
34        data[:serverErrors].each do |err|
35          puts "  #{err[:error]} (#{err[:code]})"
36        end
37        exit!
38      end
39      
40      if data[:errors]
41        puts 'Errors:'
42        data[:errors].each do |err|
43          puts "  #{err[:error]} (#{err[:lineno]}, #{err[:charno]})"
44        end
45        exit!
46      end
47      
48      if data[:warnings]
49        puts 'Warnings:'
50        data[:warnings].each do |err|
51          puts "  #{err[:warning]} (#{err[:lineno]}, #{err[:charno]})"
52        end
53      end
54      
55      if data[:statistics]
56        puts 'Statistics:'
57        data[:statistics].each do |k, v|
58          puts "  #{k}: #{v}"
59        end
60      end
61      
62      puts 'Writing...'
63      File.open(out_file, 'wb') do |f|
64        f.write(data[:compiledCode])
65      end
66      
67    else
68      puts "Bad status code: #{resp}"
69    end
70    
71    puts 'Done'
72  end
73  
74  minify_js