Module: JSMin

Defined in:
lib/lotus/assets/compressors/jsmin.rb

Overview

JSMin

Ruby implementation of Douglas Crockford’s JavaScript minifier, JSMin.

Author

Ryan Grove ([email protected])

Version

1.0.1 (2008-11-10)

Copyright

Copyright © 2008 Ryan Grove. All rights reserved.

Website

github.com/rgrove/jsmin

Example

require 'rubygems'
require 'jsmin'

File.open('example.js', 'r') {|file| puts JSMin.minify(file) }

Defined Under Namespace

Classes: ParseError

Constant Summary collapse

CHR_APOS =
"'".freeze
CHR_ASTERISK =
'*'.freeze
CHR_BACKSLASH =
'\\'.freeze
CHR_CR =
"\r".freeze
CHR_FRONTSLASH =
'/'.freeze
CHR_LF =
"\n".freeze
CHR_QUOTE =
'"'.freeze
CHR_SPACE =
' '.freeze
ORD_LF =
?\n
ORD_SPACE =
?\
ORD_TILDE =
?~

Class Method Summary collapse

Class Method Details

.minify(input) ⇒ Object

Reads JavaScript from input (which can be a String or an IO object) and returns a String containing minified JS.



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/lotus/assets/compressors/jsmin.rb', line 81

def minify(input)
  @js = StringScanner.new(input.is_a?(IO) ? input.read : input.to_s)
  @source = input.is_a?(IO) ? input.inspect : input.to_s[0..100]
  @line = 1

  @a         = "\n"
  @b         = nil
  @lookahead = nil
  @output    = ''

  action_get

  while !@a.nil? do
    case @a
    when CHR_SPACE
      if alphanum?(@b)
        action_output
      else
        action_copy
      end

    when CHR_LF
      if @b == CHR_SPACE
        action_get
      elsif @b =~ /[{\[\(+-]/
        action_output
      else
        if alphanum?(@b)
          action_output
        else
          action_copy
        end
      end

    else
      if @b == CHR_SPACE
        if alphanum?(@a)
          action_output
        else
          action_get
        end
      elsif @b == CHR_LF
        if @a =~ /[}\]\)\\"+-]/
          action_output
        else
          if alphanum?(@a)
            action_output
          else
            action_get
          end
        end
      else
        action_output
      end
    end
  end

  @output
end

.raise(err) ⇒ Object



75
76
77
# File 'lib/lotus/assets/compressors/jsmin.rb', line 75

def raise(err)
  super ParseError.new(err, @source, @line)
end