jsmin 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/HISTORY +5 -1
- data/lib/jsmin.rb +71 -55
- metadata +3 -3
data/HISTORY
CHANGED
data/lib/jsmin.rb
CHANGED
@@ -5,19 +5,19 @@
|
|
5
5
|
# as follows:
|
6
6
|
#
|
7
7
|
# Copyright (c) 2002 Douglas Crockford (www.crockford.com)
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
10
10
|
# of this software and associated documentation files (the "Software"), to deal
|
11
11
|
# in the Software without restriction, including without limitation the rights
|
12
12
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
13
13
|
# copies of the Software, and to permit persons to whom the Software is
|
14
14
|
# furnished to do so, subject to the following conditions:
|
15
|
-
#
|
15
|
+
#
|
16
16
|
# The above copyright notice and this permission notice shall be included in all
|
17
17
|
# copies or substantial portions of the Software.
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# The Software shall be used for Good, not Evil.
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
22
22
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
23
23
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
@@ -34,7 +34,7 @@ require 'strscan'
|
|
34
34
|
# Ruby implementation of Douglas Crockford's JavaScript minifier, JSMin.
|
35
35
|
#
|
36
36
|
# Author:: Ryan Grove (mailto:ryan@wonko.com)
|
37
|
-
# Version:: 1.0.
|
37
|
+
# Version:: 1.0.1 (2008-11-10)
|
38
38
|
# Copyright:: Copyright (c) 2008 Ryan Grove. All rights reserved.
|
39
39
|
# Website:: http://github.com/rgrove/jsmin/
|
40
40
|
#
|
@@ -46,11 +46,27 @@ require 'strscan'
|
|
46
46
|
# File.open('example.js', 'r') {|file| puts JSMin.minify(file) }
|
47
47
|
#
|
48
48
|
module JSMin
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
CHR_APOS = "'".freeze
|
50
|
+
CHR_ASTERISK = '*'.freeze
|
51
|
+
CHR_BACKSLASH = '\\'.freeze
|
52
|
+
CHR_CR = "\r".freeze
|
53
|
+
CHR_FRONTSLASH = '/'.freeze
|
54
|
+
CHR_LF = "\n".freeze
|
55
|
+
CHR_QUOTE = '"'.freeze
|
56
|
+
CHR_SPACE = ' '.freeze
|
57
|
+
|
58
|
+
if RUBY_VERSION >= '1.9'
|
59
|
+
ORD_LF = "\n".freeze
|
60
|
+
ORD_SPACE = ' '.freeze
|
61
|
+
ORD_TILDE = '~'.freeze
|
62
|
+
else
|
63
|
+
ORD_LF = "\n"[0].freeze
|
64
|
+
ORD_SPACE = ' '[0].freeze
|
65
|
+
ORD_TILDE = '~'[0].freeze
|
66
|
+
end
|
67
|
+
|
52
68
|
class << self
|
53
|
-
|
69
|
+
|
54
70
|
# Reads JavaScript from +input+ (which can be a String or an IO object) and
|
55
71
|
# returns a String containing minified JS.
|
56
72
|
def minify(input)
|
@@ -60,20 +76,20 @@ module JSMin
|
|
60
76
|
@b = nil
|
61
77
|
@lookahead = nil
|
62
78
|
@output = ''
|
63
|
-
|
79
|
+
|
64
80
|
action_get
|
65
|
-
|
81
|
+
|
66
82
|
while !@a.nil? do
|
67
83
|
case @a
|
68
|
-
when
|
84
|
+
when CHR_SPACE
|
69
85
|
if alphanum?(@b)
|
70
86
|
action_output
|
71
87
|
else
|
72
88
|
action_copy
|
73
89
|
end
|
74
|
-
|
75
|
-
when
|
76
|
-
if @b ==
|
90
|
+
|
91
|
+
when CHR_LF
|
92
|
+
if @b == CHR_SPACE
|
77
93
|
action_get
|
78
94
|
elsif @b =~ /[{\[\(+-]/
|
79
95
|
action_output
|
@@ -84,15 +100,15 @@ module JSMin
|
|
84
100
|
action_copy
|
85
101
|
end
|
86
102
|
end
|
87
|
-
|
103
|
+
|
88
104
|
else
|
89
|
-
if @b ==
|
105
|
+
if @b == CHR_SPACE
|
90
106
|
if alphanum?(@a)
|
91
107
|
action_output
|
92
108
|
else
|
93
109
|
action_get
|
94
110
|
end
|
95
|
-
elsif @b ==
|
111
|
+
elsif @b == CHR_LF
|
96
112
|
if @a =~ /[}\]\)\\"+-]/
|
97
113
|
action_output
|
98
114
|
else
|
@@ -107,124 +123,124 @@ module JSMin
|
|
107
123
|
end
|
108
124
|
end
|
109
125
|
end
|
110
|
-
|
126
|
+
|
111
127
|
@output
|
112
128
|
end
|
113
|
-
|
129
|
+
|
114
130
|
private
|
115
|
-
|
131
|
+
|
116
132
|
# Corresponds to action(1) in jsmin.c.
|
117
133
|
def action_output
|
118
134
|
@output << @a
|
119
135
|
action_copy
|
120
136
|
end
|
121
|
-
|
137
|
+
|
122
138
|
# Corresponds to action(2) in jsmin.c.
|
123
139
|
def action_copy
|
124
140
|
@a = @b
|
125
|
-
|
126
|
-
if @a ==
|
141
|
+
|
142
|
+
if @a == CHR_APOS || @a == CHR_QUOTE
|
127
143
|
loop do
|
128
144
|
@output << @a
|
129
145
|
@a = get
|
130
|
-
|
146
|
+
|
131
147
|
break if @a == @b
|
132
|
-
|
148
|
+
|
133
149
|
if @a[0] <= ORD_LF
|
134
150
|
raise "JSMin parse error: unterminated string literal: #{@a}"
|
135
151
|
end
|
136
|
-
|
137
|
-
if @a ==
|
152
|
+
|
153
|
+
if @a == CHR_BACKSLASH
|
138
154
|
@output << @a
|
139
155
|
@a = get
|
140
|
-
|
156
|
+
|
141
157
|
if @a[0] <= ORD_LF
|
142
158
|
raise "JSMin parse error: unterminated string literal: #{@a}"
|
143
159
|
end
|
144
160
|
end
|
145
161
|
end
|
146
162
|
end
|
147
|
-
|
163
|
+
|
148
164
|
action_get
|
149
165
|
end
|
150
|
-
|
166
|
+
|
151
167
|
# Corresponds to action(3) in jsmin.c.
|
152
168
|
def action_get
|
153
169
|
@b = nextchar
|
154
|
-
|
155
|
-
if @b ==
|
170
|
+
|
171
|
+
if @b == CHR_FRONTSLASH && (@a == CHR_LF || @a =~ /[\(,=:\[!&|?{};]/)
|
156
172
|
@output << @a
|
157
173
|
@output << @b
|
158
|
-
|
174
|
+
|
159
175
|
loop do
|
160
176
|
@a = get
|
161
|
-
|
162
|
-
if @a ==
|
177
|
+
|
178
|
+
if @a == CHR_FRONTSLASH
|
163
179
|
break
|
164
|
-
elsif @a ==
|
180
|
+
elsif @a == CHR_BACKSLASH
|
165
181
|
@output << @a
|
166
182
|
@a = get
|
167
183
|
elsif @a[0] <= ORD_LF
|
168
184
|
raise "JSMin parse error: unterminated regular expression " +
|
169
185
|
"literal: #{@a}"
|
170
186
|
end
|
171
|
-
|
187
|
+
|
172
188
|
@output << @a
|
173
189
|
end
|
174
|
-
|
190
|
+
|
175
191
|
@b = nextchar
|
176
192
|
end
|
177
193
|
end
|
178
|
-
|
194
|
+
|
179
195
|
# Returns true if +c+ is a letter, digit, underscore, dollar sign,
|
180
196
|
# backslash, or non-ASCII character.
|
181
197
|
def alphanum?(c)
|
182
|
-
c.is_a?(String) && !c.empty? && (c[0] >
|
198
|
+
c.is_a?(String) && !c.empty? && (c[0] > ORD_TILDE || c =~ /[0-9a-z_$\\]/i)
|
183
199
|
end
|
184
|
-
|
200
|
+
|
185
201
|
# Returns the next character from the input. If the character is a control
|
186
202
|
# character, it will be translated to a space or linefeed.
|
187
203
|
def get
|
188
204
|
c = @lookahead.nil? ? @js.getch : @lookahead
|
189
205
|
@lookahead = nil
|
190
206
|
|
191
|
-
return c if c.nil? || c ==
|
192
|
-
return "\n" if c ==
|
207
|
+
return c if c.nil? || c == CHR_LF || c[0] >= ORD_SPACE
|
208
|
+
return "\n" if c == CHR_CR
|
193
209
|
return ' '
|
194
210
|
end
|
195
|
-
|
211
|
+
|
196
212
|
# Gets the next character, excluding comments.
|
197
213
|
def nextchar
|
198
214
|
c = get
|
199
|
-
return c unless c ==
|
200
|
-
|
215
|
+
return c unless c == CHR_FRONTSLASH
|
216
|
+
|
201
217
|
case peek
|
202
|
-
when
|
218
|
+
when CHR_FRONTSLASH
|
203
219
|
loop do
|
204
220
|
c = get
|
205
221
|
return c if c[0] <= ORD_LF
|
206
222
|
end
|
207
|
-
|
208
|
-
when
|
223
|
+
|
224
|
+
when CHR_ASTERISK
|
209
225
|
get
|
210
226
|
loop do
|
211
227
|
case get
|
212
|
-
when
|
213
|
-
if peek ==
|
228
|
+
when CHR_ASTERISK
|
229
|
+
if peek == CHR_FRONTSLASH
|
214
230
|
get
|
215
231
|
return ' '
|
216
232
|
end
|
217
|
-
|
233
|
+
|
218
234
|
when nil
|
219
235
|
raise 'JSMin parse error: unterminated comment'
|
220
236
|
end
|
221
237
|
end
|
222
|
-
|
238
|
+
|
223
239
|
else
|
224
240
|
return c
|
225
241
|
end
|
226
242
|
end
|
227
|
-
|
243
|
+
|
228
244
|
# Gets the next character without getting it.
|
229
245
|
def peek
|
230
246
|
@lookahead = get
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsmin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Grove
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-11-10 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -46,7 +46,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
46
46
|
requirements: []
|
47
47
|
|
48
48
|
rubyforge_project: riposte
|
49
|
-
rubygems_version: 1.0
|
49
|
+
rubygems_version: 1.2.0
|
50
50
|
signing_key:
|
51
51
|
specification_version: 2
|
52
52
|
summary: Ruby implementation of Douglas Crockford's JSMin JavaScript minifier.
|