htmlmin 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -3
- data/lib/htmlmin.rb +11 -19
- data/lib/htmlmin/slot_machines/comment.rb +357 -26
- data/lib/htmlmin/slot_machines/common.rb +62 -47
- data/lib/htmlmin/slot_machines/doctype.rb +48 -15
- data/lib/htmlmin/slot_machines/tag.rb +31 -52
- data/lib/htmlmin/state.rb +25 -0
- data/lib/htmlmin/version.rb +1 -1
- data/test/input/cc_1.txt +1 -0
- data/test/input/cc_2.txt +9 -0
- data/test/input/doctype_3.txt +6 -0
- data/test/input/tag_3.txt +3 -0
- data/test/options/cc_1.rb +8 -0
- data/test/options/cc_2.rb +8 -0
- data/test/options/comment_1.rb +8 -0
- data/test/options/comment_6.rb +8 -0
- data/test/options/comment_7.rb +2 -2
- data/test/options/comment_8.rb +0 -1
- data/test/options/doctype_3.rb +8 -0
- data/test/options/tag_2.rb +8 -0
- data/test/options/tag_3.rb +8 -0
- data/test/output/cc_1.txt +1 -1
- data/test/output/cc_2.txt +3 -0
- data/test/output/comment_6.txt +1 -1
- data/test/output/comment_7.txt +2 -1
- data/test/output/doctype_3.txt +2 -0
- data/test/output/tag_1.txt +1 -1
- data/test/output/tag_3.txt +1 -0
- data/test/output/text_3.txt +1 -1
- metadata +29 -2
data/README.md
CHANGED
@@ -8,7 +8,7 @@ Please report issues on [Github] (https://github.com/aishek/htmlmin/issues).
|
|
8
8
|
|
9
9
|
For feedback, suggestions, etc. write to <aishek@gmail.com>.
|
10
10
|
|
11
|
-
**Important**: this project is in beta and may contain bugs. Current version: 0.0.
|
11
|
+
**Important**: this project is in beta and may contain bugs. Current version: 0.0.4
|
12
12
|
|
13
13
|
# Installation
|
14
14
|
|
@@ -23,6 +23,7 @@ Usage:
|
|
23
23
|
require 'htmlmin'
|
24
24
|
options = {
|
25
25
|
:remove_comments => true,
|
26
|
+
:remove_conditional_comments => true, # only downlevel-hidden conditional comments e.g. <!--[if expression]> HTML <![endif]-->
|
26
27
|
:minify_whitespaces => true,
|
27
28
|
:max_line_len => 32768, # 0 - disable this safety feature
|
28
29
|
}
|
@@ -41,8 +42,8 @@ Usage:
|
|
41
42
|
* ~~Minify whitespaces after tag start and tag stop~~
|
42
43
|
* ~~Minify whitespaces in text~~
|
43
44
|
* ~~Remove comments~~
|
44
|
-
* Do not remove conditional comments
|
45
|
-
* Keep lines not longer that 30k (config option)
|
45
|
+
* ~~Do not remove conditional comments~~
|
46
|
+
* ~~Keep lines not longer that 30k (config option)~~
|
46
47
|
* Do not perform minify in script and style tag's content
|
47
48
|
* Do not perform minify in code, samp, pre tags's content
|
48
49
|
* Replace entities with numeric entities for shorter strings
|
data/lib/htmlmin.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "htmlmin/version"
|
2
2
|
require "htmlmin/buffer"
|
3
|
+
require "htmlmin/state"
|
3
4
|
require "htmlmin/max_line_len"
|
4
5
|
require "htmlmin/slot_machines"
|
5
6
|
|
@@ -13,16 +14,18 @@ module HTMLMin
|
|
13
14
|
END_OF_FILE = ''
|
14
15
|
|
15
16
|
extend HTMLMin::Buffer
|
17
|
+
extend HTMLMin::State
|
16
18
|
extend HTMLMin::MaxLineLen
|
17
19
|
extend HTMLMin::SlotMachines::Common
|
18
20
|
extend HTMLMin::SlotMachines::Comment
|
19
21
|
extend HTMLMin::SlotMachines::Doctype
|
20
22
|
extend HTMLMin::SlotMachines::Tag
|
21
|
-
|
22
|
-
class << self
|
23
|
+
|
24
|
+
class << self
|
23
25
|
|
24
26
|
DEFAULT_OPTIONS = {
|
25
27
|
:remove_comments => true,
|
28
|
+
:preserve_conditional_comments => true,
|
26
29
|
|
27
30
|
:minify_whitespaces => true,
|
28
31
|
|
@@ -30,9 +33,8 @@ module HTMLMin
|
|
30
33
|
|
31
34
|
:debug => false
|
32
35
|
}
|
33
|
-
|
34
|
-
|
35
|
-
def minify(html, options = {})
|
36
|
+
|
37
|
+
def minify(html, options = {})
|
36
38
|
init_settings options
|
37
39
|
|
38
40
|
@result = ''
|
@@ -52,8 +54,9 @@ module HTMLMin
|
|
52
54
|
def init_slot_machine
|
53
55
|
init_max_line_len
|
54
56
|
clear_buffer
|
55
|
-
|
56
|
-
|
57
|
+
|
58
|
+
reset_saved_state
|
59
|
+
@state = :start
|
57
60
|
end
|
58
61
|
|
59
62
|
def run_slot_machine(html)
|
@@ -73,18 +76,7 @@ module HTMLMin
|
|
73
76
|
def debug_log(char)
|
74
77
|
p "char: #{char}, new state: #{@state.to_s}, buffer: '#{@result_buffer.join}', result: '#{@result}'"
|
75
78
|
end
|
76
|
-
|
77
|
-
def save_state
|
78
|
-
@prev_state = @state
|
79
|
-
end
|
80
|
-
|
81
|
-
def restore_state
|
82
|
-
return false if @prev_state.nil?
|
83
|
-
|
84
|
-
@state = @prev_state
|
85
|
-
return true
|
86
|
-
end
|
87
|
-
|
79
|
+
|
88
80
|
end
|
89
81
|
|
90
82
|
|
@@ -8,54 +8,385 @@ module HTMLMin
|
|
8
8
|
|
9
9
|
def comment_begin_1(char)
|
10
10
|
case char
|
11
|
-
when "\s", "\n", "\r", "\t", " "
|
12
|
-
flush_buffer
|
13
|
-
change_state_to_text_prespaced char
|
14
11
|
when '-'
|
12
|
+
unshift_spaces_from_buffer if saved_state_unshiftable?
|
13
|
+
reset_saved_state
|
14
|
+
|
15
15
|
add_to_buffer char
|
16
|
-
change_state_to :
|
16
|
+
change_state_to :comment_or_cc
|
17
17
|
when HTMLMin::Minifier::END_OF_FILE
|
18
18
|
flush_buffer
|
19
19
|
else
|
20
|
+
reset_saved_state
|
21
|
+
|
20
22
|
flush_buffer
|
23
|
+
|
21
24
|
add_to_result char
|
22
25
|
change_state_to :start
|
23
26
|
end
|
24
27
|
end
|
28
|
+
|
29
|
+
def comment_or_cc(char)
|
30
|
+
case char
|
31
|
+
when '['
|
32
|
+
add_to_buffer char
|
33
|
+
change_state_to :cc
|
34
|
+
when '-'
|
35
|
+
add_to_buffer char
|
36
|
+
change_state_to :comment_end_1
|
37
|
+
when HTMLMin::Minifier::END_OF_FILE
|
38
|
+
clear_buffer if @settings[:remove_comments]
|
39
|
+
flush_buffer
|
40
|
+
else
|
41
|
+
add_to_buffer char
|
42
|
+
change_state_to :comment
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def cc(char)
|
47
|
+
case char
|
48
|
+
when ']'
|
49
|
+
add_to_buffer char
|
50
|
+
change_state_to :cc_1
|
51
|
+
when '-'
|
52
|
+
add_to_buffer char
|
53
|
+
change_state_to :comment_end_1
|
54
|
+
when HTMLMin::Minifier::END_OF_FILE
|
55
|
+
clear_buffer if @settings[:remove_comments]
|
56
|
+
flush_buffer
|
57
|
+
else
|
58
|
+
add_to_buffer char
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def cc_1(char)
|
63
|
+
case char
|
64
|
+
when '>'
|
65
|
+
add_to_buffer char
|
66
|
+
change_state_to :cc_begin_ended
|
67
|
+
when '-'
|
68
|
+
add_to_buffer char
|
69
|
+
change_state_to :comment_end_1
|
70
|
+
when HTMLMin::Minifier::END_OF_FILE
|
71
|
+
clear_buffer if @settings[:remove_comments]
|
72
|
+
flush_buffer
|
73
|
+
else
|
74
|
+
add_to_buffer char
|
75
|
+
change_state_to :comment
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# wait for <![endif]-->,
|
80
|
+
# if --> then it just a simple comment
|
81
|
+
def cc_begin_ended(char)
|
82
|
+
case char
|
83
|
+
when '<'
|
84
|
+
add_to_buffer char
|
85
|
+
change_state_to :cc_begin_ended_1
|
86
|
+
when '-'
|
87
|
+
add_to_buffer char
|
88
|
+
change_state_to :cc_begin_ended_simple_1
|
89
|
+
when HTMLMin::Minifier::END_OF_FILE
|
90
|
+
clear_buffer if @settings[:remove_comments]
|
91
|
+
flush_buffer
|
92
|
+
else
|
93
|
+
add_to_buffer char
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def cc_begin_ended_1(char)
|
98
|
+
case char
|
99
|
+
when '<'
|
100
|
+
add_to_buffer char
|
101
|
+
when '!'
|
102
|
+
add_to_buffer char
|
103
|
+
change_state_to :cc_begin_ended_2
|
104
|
+
when '-'
|
105
|
+
add_to_buffer char
|
106
|
+
change_state_to :cc_begin_ended_simple_1
|
107
|
+
when HTMLMin::Minifier::END_OF_FILE
|
108
|
+
clear_buffer if @settings[:remove_comments]
|
109
|
+
flush_buffer
|
110
|
+
else
|
111
|
+
add_to_buffer char
|
112
|
+
end
|
113
|
+
end
|
25
114
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
115
|
+
def cc_begin_ended_2(char)
|
116
|
+
case char
|
117
|
+
when '<'
|
118
|
+
add_to_buffer char
|
119
|
+
change_state_to :cc_begin_ended_1
|
120
|
+
when '['
|
121
|
+
add_to_buffer char
|
122
|
+
change_state_to :cc_begin_ended_3
|
123
|
+
when '-'
|
124
|
+
add_to_buffer char
|
125
|
+
change_state_to :cc_begin_ended_simple_1
|
126
|
+
when HTMLMin::Minifier::END_OF_FILE
|
127
|
+
clear_buffer if @settings[:remove_comments]
|
128
|
+
flush_buffer
|
129
|
+
else
|
130
|
+
add_to_buffer char
|
131
|
+
change_state_to :cc_begin_ended
|
132
|
+
end
|
31
133
|
end
|
32
134
|
|
33
|
-
def
|
34
|
-
|
135
|
+
def cc_begin_ended_3(char)
|
136
|
+
case char
|
137
|
+
when '<'
|
138
|
+
add_to_buffer char
|
139
|
+
change_state_to :cc_begin_ended_1
|
140
|
+
when 'e'
|
141
|
+
add_to_buffer char
|
142
|
+
change_state_to :cc_begin_ended_4
|
143
|
+
when '-'
|
144
|
+
add_to_buffer char
|
145
|
+
change_state_to :cc_begin_ended_simple_1
|
146
|
+
when HTMLMin::Minifier::END_OF_FILE
|
147
|
+
clear_buffer if @settings[:remove_comments]
|
148
|
+
flush_buffer
|
149
|
+
else
|
150
|
+
add_to_buffer char
|
151
|
+
change_state_to :cc_begin_ended
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def cc_begin_ended_4(char)
|
156
|
+
case char
|
157
|
+
when '<'
|
158
|
+
add_to_buffer char
|
159
|
+
change_state_to :cc_begin_ended_1
|
160
|
+
when 'n'
|
161
|
+
add_to_buffer char
|
162
|
+
change_state_to :cc_begin_ended_5
|
163
|
+
when '-'
|
164
|
+
add_to_buffer char
|
165
|
+
change_state_to :cc_begin_ended_simple_1
|
166
|
+
when HTMLMin::Minifier::END_OF_FILE
|
167
|
+
clear_buffer if @settings[:remove_comments]
|
168
|
+
flush_buffer
|
169
|
+
else
|
170
|
+
add_to_buffer char
|
171
|
+
change_state_to :cc_begin_ended
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def cc_begin_ended_5(char)
|
176
|
+
case char
|
177
|
+
when '<'
|
178
|
+
add_to_buffer char
|
179
|
+
change_state_to :cc_begin_ended_1
|
180
|
+
when 'd'
|
181
|
+
add_to_buffer char
|
182
|
+
change_state_to :cc_begin_ended_6
|
183
|
+
when '-'
|
184
|
+
add_to_buffer char
|
185
|
+
change_state_to :cc_begin_ended_simple_1
|
186
|
+
when HTMLMin::Minifier::END_OF_FILE
|
187
|
+
clear_buffer if @settings[:remove_comments]
|
188
|
+
flush_buffer
|
189
|
+
else
|
190
|
+
add_to_buffer char
|
191
|
+
change_state_to :cc_begin_ended
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def cc_begin_ended_6(char)
|
196
|
+
case char
|
197
|
+
when '<'
|
198
|
+
add_to_buffer char
|
199
|
+
change_state_to :cc_begin_ended_1
|
200
|
+
when 'i'
|
201
|
+
add_to_buffer char
|
202
|
+
change_state_to :cc_begin_ended_7
|
203
|
+
when '-'
|
204
|
+
add_to_buffer char
|
205
|
+
change_state_to :cc_begin_ended_simple_1
|
206
|
+
when HTMLMin::Minifier::END_OF_FILE
|
207
|
+
clear_buffer if @settings[:remove_comments]
|
208
|
+
flush_buffer
|
209
|
+
else
|
210
|
+
add_to_buffer char
|
211
|
+
change_state_to :cc_begin_ended
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
def cc_begin_ended_7(char)
|
216
|
+
case char
|
217
|
+
when '<'
|
218
|
+
add_to_buffer char
|
219
|
+
change_state_to :cc_begin_ended_1
|
220
|
+
when 'f'
|
221
|
+
add_to_buffer char
|
222
|
+
change_state_to :cc_begin_ended_8
|
223
|
+
when '-'
|
224
|
+
add_to_buffer char
|
225
|
+
change_state_to :cc_begin_ended_simple_1
|
226
|
+
when HTMLMin::Minifier::END_OF_FILE
|
227
|
+
clear_buffer if @settings[:remove_comments]
|
228
|
+
flush_buffer
|
229
|
+
else
|
230
|
+
add_to_buffer char
|
231
|
+
change_state_to :cc_begin_ended
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def cc_begin_ended_8(char)
|
236
|
+
case char
|
237
|
+
when '<'
|
238
|
+
add_to_buffer char
|
239
|
+
change_state_to :cc_begin_ended_1
|
240
|
+
when ']'
|
241
|
+
add_to_buffer char
|
242
|
+
change_state_to :cc_begin_ended_9
|
243
|
+
when '-'
|
244
|
+
add_to_buffer char
|
245
|
+
change_state_to :cc_begin_ended_simple_1
|
246
|
+
when HTMLMin::Minifier::END_OF_FILE
|
247
|
+
clear_buffer if @settings[:remove_comments]
|
248
|
+
flush_buffer
|
249
|
+
else
|
250
|
+
add_to_buffer char
|
251
|
+
change_state_to :cc_begin_ended
|
252
|
+
end
|
253
|
+
end
|
35
254
|
|
36
|
-
|
37
|
-
|
255
|
+
def cc_begin_ended_9(char)
|
256
|
+
case char
|
257
|
+
when '<'
|
258
|
+
add_to_buffer char
|
259
|
+
change_state_to :cc_begin_ended_1
|
260
|
+
when '-'
|
261
|
+
add_to_buffer char
|
262
|
+
change_state_to :cc_begin_ended_10
|
263
|
+
when HTMLMin::Minifier::END_OF_FILE
|
264
|
+
clear_buffer if @settings[:remove_comments]
|
265
|
+
flush_buffer
|
266
|
+
else
|
267
|
+
add_to_buffer char
|
268
|
+
change_state_to :cc_begin_ended
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def cc_begin_ended_10(char)
|
273
|
+
case char
|
274
|
+
when '<'
|
275
|
+
add_to_buffer char
|
276
|
+
change_state_to :cc_begin_ended_1
|
277
|
+
when '-'
|
278
|
+
add_to_buffer char
|
279
|
+
change_state_to :cc_begin_ended_11
|
280
|
+
when HTMLMin::Minifier::END_OF_FILE
|
281
|
+
clear_buffer if @settings[:remove_comments]
|
282
|
+
flush_buffer
|
283
|
+
else
|
284
|
+
add_to_buffer char
|
285
|
+
change_state_to :cc_begin_ended
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def cc_begin_ended_11(char)
|
290
|
+
case char
|
291
|
+
when '<'
|
292
|
+
add_to_buffer char
|
293
|
+
change_state_to :cc_begin_ended_1
|
294
|
+
when '>'
|
295
|
+
add_to_buffer char
|
296
|
+
clear_buffer if @settings[:remove_conditional_comments]
|
297
|
+
flush_buffer
|
298
|
+
|
299
|
+
change_state_to :entity_ended
|
300
|
+
when HTMLMin::Minifier::END_OF_FILE
|
301
|
+
clear_buffer if @settings[:remove_comments]
|
302
|
+
flush_buffer
|
303
|
+
else
|
304
|
+
add_to_buffer char
|
305
|
+
change_state_to :cc_begin_ended
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
def cc_begin_ended_simple_1(char)
|
310
|
+
case char
|
311
|
+
when '<'
|
312
|
+
add_to_buffer char
|
313
|
+
change_state_to :cc_begin_ended_1
|
314
|
+
when '-'
|
315
|
+
add_to_buffer char
|
316
|
+
change_state_to :cc_begin_ended_simple_2
|
317
|
+
when HTMLMin::Minifier::END_OF_FILE
|
318
|
+
clear_buffer if @settings[:remove_comments]
|
319
|
+
flush_buffer
|
320
|
+
else
|
321
|
+
add_to_buffer char
|
322
|
+
change_state_to :cc_begin_ended
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
def cc_begin_ended_simple_2(char)
|
327
|
+
case char
|
328
|
+
when '<'
|
329
|
+
add_to_buffer char
|
330
|
+
change_state_to :cc_begin_ended_1
|
331
|
+
when '>'
|
332
|
+
add_to_buffer char
|
333
|
+
clear_buffer if @settings[:remove_comments]
|
334
|
+
flush_buffer
|
335
|
+
|
336
|
+
change_state_to :entity_ended
|
337
|
+
when HTMLMin::Minifier::END_OF_FILE
|
338
|
+
clear_buffer if @settings[:remove_comments]
|
339
|
+
flush_buffer
|
340
|
+
else
|
341
|
+
add_to_buffer char
|
342
|
+
change_state_to :cc_begin_ended
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def comment(char)
|
347
|
+
case char
|
348
|
+
when HTMLMin::Minifier::END_OF_FILE
|
349
|
+
clear_buffer if @settings[:remove_comments]
|
350
|
+
flush_buffer
|
351
|
+
when '-'
|
352
|
+
add_to_buffer char
|
353
|
+
change_state_to :comment_end_1
|
354
|
+
else
|
355
|
+
add_to_buffer char
|
356
|
+
end
|
38
357
|
end
|
39
358
|
|
40
359
|
def comment_end_1(char)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
360
|
+
case char
|
361
|
+
when HTMLMin::Minifier::END_OF_FILE
|
362
|
+
clear_buffer if @settings[:remove_comments]
|
363
|
+
flush_buffer
|
364
|
+
when '-'
|
365
|
+
add_to_buffer char
|
366
|
+
change_state_to :comment_end_2
|
367
|
+
else
|
368
|
+
add_to_buffer char
|
369
|
+
change_state_to :comment
|
370
|
+
end
|
45
371
|
end
|
46
372
|
|
47
373
|
def comment_end_2(char)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
374
|
+
case char
|
375
|
+
when HTMLMin::Minifier::END_OF_FILE
|
376
|
+
clear_buffer if @settings[:remove_comments]
|
377
|
+
flush_buffer
|
378
|
+
when '>'
|
379
|
+
add_to_buffer char
|
380
|
+
clear_buffer if @settings[:remove_comments]
|
381
|
+
flush_buffer
|
382
|
+
|
383
|
+
change_state_to :entity_ended
|
384
|
+
else
|
385
|
+
add_to_buffer char
|
386
|
+
change_state_to :comment
|
56
387
|
end
|
57
388
|
end
|
58
|
-
|
389
|
+
|
59
390
|
end
|
60
391
|
|
61
392
|
end
|
@@ -5,67 +5,61 @@ module HTMLMin
|
|
5
5
|
module Common
|
6
6
|
|
7
7
|
private
|
8
|
-
|
9
|
-
def add_to_result(char)
|
10
|
-
@result += char
|
11
|
-
|
12
|
-
check_max_line_len(char) if @settings[:max_line_len] > 0
|
13
|
-
end
|
14
|
-
|
15
|
-
def change_state_to(new_state)
|
16
|
-
@state = new_state
|
17
|
-
end
|
18
|
-
|
8
|
+
|
19
9
|
def tag_or_tagend_or_comment_or_doctype_begin(char)
|
20
10
|
case char
|
21
|
-
when "\s", "\n", "\r", "\t", " "
|
22
|
-
flush_buffer
|
23
|
-
change_state_to_text_prespaced char
|
24
|
-
when "/"
|
25
|
-
add_to_buffer char
|
26
|
-
change_state_to :tag_end
|
27
11
|
when "!"
|
28
12
|
add_to_buffer char
|
29
13
|
change_state_to :comment_or_doctype_begin
|
30
|
-
when "
|
14
|
+
when "/"
|
15
|
+
add_to_buffer char
|
16
|
+
change_state_to :tagend_body_expected
|
17
|
+
when 'a'..'z', 'A'..'Z'
|
31
18
|
add_to_buffer char
|
32
|
-
change_state_to :
|
19
|
+
change_state_to :tag
|
33
20
|
when HTMLMin::Minifier::END_OF_FILE
|
34
21
|
flush_buffer
|
35
22
|
else
|
23
|
+
reset_saved_state
|
24
|
+
|
36
25
|
flush_buffer
|
26
|
+
|
37
27
|
add_to_result char
|
38
28
|
change_state_to :start
|
39
29
|
end
|
40
30
|
end
|
41
|
-
|
31
|
+
|
42
32
|
def comment_or_doctype_begin(char)
|
43
33
|
case char
|
44
|
-
when "\s", "\n", "\r", "\t", " "
|
45
|
-
flush_buffer
|
46
|
-
change_state_to_text_prespaced char
|
47
34
|
when "-"
|
48
|
-
|
49
|
-
|
50
|
-
change_state_to :comment_begin_1
|
51
|
-
else
|
52
|
-
flush_buffer
|
53
|
-
add_to_result char
|
54
|
-
change_state_to :start
|
55
|
-
end
|
35
|
+
add_to_buffer char
|
36
|
+
change_state_to :comment_begin_1
|
56
37
|
when 'D'
|
57
38
|
add_to_buffer char
|
58
39
|
change_state_to :doctype_begin_1
|
59
40
|
when HTMLMin::Minifier::END_OF_FILE
|
60
41
|
flush_buffer
|
61
42
|
else
|
43
|
+
reset_saved_state
|
44
|
+
|
62
45
|
flush_buffer
|
46
|
+
|
63
47
|
add_to_result char
|
64
48
|
change_state_to :start
|
65
49
|
end
|
66
50
|
end
|
67
|
-
|
68
|
-
def
|
51
|
+
|
52
|
+
def add_to_result(char)
|
53
|
+
@result += char
|
54
|
+
|
55
|
+
check_max_line_len(char) if @settings[:max_line_len] > 0
|
56
|
+
end
|
57
|
+
|
58
|
+
def change_state_to(new_state)
|
59
|
+
@state = new_state
|
60
|
+
end
|
61
|
+
|
62
|
+
def spaces(char)
|
69
63
|
case char
|
70
64
|
when "\s", "\n", "\r", "\t", " "
|
71
65
|
if @settings[:minify_whitespaces]
|
@@ -74,28 +68,25 @@ module HTMLMin
|
|
74
68
|
add_to_buffer char
|
75
69
|
end
|
76
70
|
when "<"
|
77
|
-
flush_buffer
|
78
|
-
|
79
|
-
unshift_spaces_from_buffer
|
80
|
-
add_to_buffer char
|
81
|
-
change_state_to :tag_or_tagend_or_comment_or_doctype_begin
|
71
|
+
flush_buffer if saved_state_empty?
|
72
|
+
change_state_to_tag_or_tagend_or_comment_or_doctype_begin char
|
82
73
|
when HTMLMin::Minifier::END_OF_FILE
|
83
|
-
unshift_spaces_from_buffer
|
84
74
|
flush_buffer
|
85
75
|
else
|
76
|
+
reset_saved_state
|
86
77
|
flush_buffer
|
78
|
+
|
87
79
|
add_to_result char
|
88
80
|
change_state_to :start
|
89
81
|
end
|
90
82
|
end
|
91
|
-
|
83
|
+
|
92
84
|
def start(char)
|
93
85
|
case char
|
94
86
|
when "\s", "\n", "\r", "\t"
|
95
|
-
|
87
|
+
change_state_to_spaces char
|
96
88
|
when "<"
|
97
|
-
|
98
|
-
change_state_to :tag_or_tagend_or_comment_or_doctype_begin
|
89
|
+
change_state_to_tag_or_tagend_or_comment_or_doctype_begin char
|
99
90
|
when HTMLMin::Minifier::END_OF_FILE
|
100
91
|
flush_buffer
|
101
92
|
else
|
@@ -103,11 +94,35 @@ module HTMLMin
|
|
103
94
|
change_state_to :start
|
104
95
|
end
|
105
96
|
end
|
106
|
-
|
107
|
-
def
|
108
|
-
|
109
|
-
|
97
|
+
|
98
|
+
def entity_ended(char)
|
99
|
+
return if char == HTMLMin::Minifier::END_OF_FILE
|
100
|
+
|
101
|
+
case char
|
102
|
+
when "\s", "\n", "\r", "\t", " "
|
103
|
+
save_state
|
104
|
+
change_state_to_spaces char
|
105
|
+
when "<"
|
106
|
+
change_state_to_tag_or_tagend_or_comment_or_doctype_begin char
|
107
|
+
else
|
108
|
+
add_to_result char
|
109
|
+
change_state_to :start
|
110
|
+
end
|
110
111
|
end
|
112
|
+
|
113
|
+
def change_state_to_tag_or_tagend_or_comment_or_doctype_begin(char)
|
114
|
+
add_to_buffer char
|
115
|
+
change_state_to :tag_or_tagend_or_comment_or_doctype_begin
|
116
|
+
end
|
117
|
+
|
118
|
+
def change_state_to_spaces(char)
|
119
|
+
if @settings[:minify_whitespaces]
|
120
|
+
add_to_buffer ' '
|
121
|
+
else
|
122
|
+
add_to_result char
|
123
|
+
end
|
124
|
+
change_state_to :spaces
|
125
|
+
end
|
111
126
|
|
112
127
|
end
|
113
128
|
|
@@ -12,46 +12,60 @@ module HTMLMin
|
|
12
12
|
add_to_buffer char
|
13
13
|
change_state_to :doctype_begin_2
|
14
14
|
when "\s", "\n", "\r", "\t", " "
|
15
|
-
|
15
|
+
reset_saved_state
|
16
|
+
|
17
|
+
flush_buffer
|
18
|
+
|
19
|
+
change_state_to_spaces char
|
16
20
|
when HTMLMin::Minifier::END_OF_FILE
|
17
21
|
flush_buffer
|
18
22
|
else
|
23
|
+
reset_saved_state
|
24
|
+
|
19
25
|
flush_buffer
|
20
26
|
|
21
27
|
add_to_result char
|
22
28
|
change_state_to :start
|
23
|
-
end
|
29
|
+
end
|
24
30
|
end
|
25
|
-
|
31
|
+
|
26
32
|
def doctype_begin_2(char)
|
27
33
|
case char
|
28
34
|
when "C"
|
29
35
|
add_to_buffer char
|
30
36
|
change_state_to :doctype_begin_3
|
31
37
|
when "\s", "\n", "\r", "\t", " "
|
38
|
+
reset_saved_state
|
39
|
+
|
32
40
|
flush_buffer
|
33
|
-
|
41
|
+
change_state_to_spaces char
|
34
42
|
when HTMLMin::Minifier::END_OF_FILE
|
35
43
|
flush_buffer
|
36
44
|
else
|
45
|
+
reset_saved_state
|
46
|
+
|
37
47
|
flush_buffer
|
38
48
|
|
39
49
|
add_to_result char
|
40
50
|
change_state_to :start
|
41
51
|
end
|
42
52
|
end
|
43
|
-
|
53
|
+
|
44
54
|
def doctype_begin_3(char)
|
45
55
|
case char
|
46
56
|
when "T"
|
47
57
|
add_to_buffer char
|
48
58
|
change_state_to :doctype_begin_4
|
49
59
|
when "\s", "\n", "\r", "\t", " "
|
60
|
+
reset_saved_state
|
61
|
+
|
50
62
|
flush_buffer
|
51
|
-
|
63
|
+
change_state_to_spaces char
|
52
64
|
when HTMLMin::Minifier::END_OF_FILE
|
53
65
|
flush_buffer
|
54
66
|
else
|
67
|
+
reset_saved_state
|
68
|
+
|
55
69
|
flush_buffer
|
56
70
|
|
57
71
|
add_to_result char
|
@@ -65,11 +79,15 @@ module HTMLMin
|
|
65
79
|
add_to_buffer char
|
66
80
|
change_state_to :doctype_begin_5
|
67
81
|
when "\s", "\n", "\r", "\t", " "
|
82
|
+
reset_saved_state
|
83
|
+
|
68
84
|
flush_buffer
|
69
|
-
|
85
|
+
change_state_to_spaces char
|
70
86
|
when HTMLMin::Minifier::END_OF_FILE
|
71
87
|
flush_buffer
|
72
88
|
else
|
89
|
+
reset_saved_state
|
90
|
+
|
73
91
|
flush_buffer
|
74
92
|
|
75
93
|
add_to_result char
|
@@ -83,11 +101,15 @@ module HTMLMin
|
|
83
101
|
add_to_buffer char
|
84
102
|
change_state_to :doctype_begin_6
|
85
103
|
when "\s", "\n", "\r", "\t", " "
|
104
|
+
reset_saved_state
|
105
|
+
|
86
106
|
flush_buffer
|
87
|
-
|
107
|
+
change_state_to_spaces char
|
88
108
|
when HTMLMin::Minifier::END_OF_FILE
|
89
109
|
flush_buffer
|
90
110
|
else
|
111
|
+
reset_saved_state
|
112
|
+
|
91
113
|
flush_buffer
|
92
114
|
|
93
115
|
add_to_result char
|
@@ -101,31 +123,42 @@ module HTMLMin
|
|
101
123
|
add_to_buffer char
|
102
124
|
change_state_to :doctype_begin_7
|
103
125
|
when "\s", "\n", "\r", "\t", " "
|
126
|
+
reset_saved_state
|
127
|
+
|
104
128
|
flush_buffer
|
105
|
-
|
129
|
+
change_state_to_spaces char
|
106
130
|
when HTMLMin::Minifier::END_OF_FILE
|
107
131
|
flush_buffer
|
108
132
|
else
|
133
|
+
reset_saved_state
|
134
|
+
|
109
135
|
flush_buffer
|
110
136
|
|
111
137
|
add_to_result char
|
112
138
|
change_state_to :start
|
113
139
|
end
|
114
140
|
end
|
115
|
-
|
141
|
+
|
116
142
|
def doctype_begin_7(char)
|
117
143
|
case char
|
118
144
|
when " "
|
145
|
+
unshift_spaces_from_buffer if saved_state_unshiftable?
|
146
|
+
reset_saved_state
|
147
|
+
|
119
148
|
add_to_buffer char
|
120
149
|
change_state_to :doctype
|
121
150
|
when "\s", "\n", "\r", "\t"
|
151
|
+
reset_saved_state
|
152
|
+
|
122
153
|
flush_buffer
|
123
|
-
|
154
|
+
change_state_to_spaces char
|
124
155
|
when HTMLMin::Minifier::END_OF_FILE
|
125
156
|
flush_buffer
|
126
157
|
else
|
158
|
+
reset_saved_state
|
159
|
+
|
127
160
|
flush_buffer
|
128
|
-
|
161
|
+
|
129
162
|
add_to_result char
|
130
163
|
change_state_to :start
|
131
164
|
end
|
@@ -136,18 +169,18 @@ module HTMLMin
|
|
136
169
|
when '>'
|
137
170
|
add_to_buffer char
|
138
171
|
|
139
|
-
unshift_spaces_from_buffer
|
140
172
|
flush_buffer
|
141
173
|
|
142
174
|
add_to_result "\n"
|
143
|
-
change_state_to :
|
175
|
+
change_state_to :entity_ended
|
144
176
|
when HTMLMin::Minifier::END_OF_FILE
|
145
177
|
flush_buffer
|
146
178
|
else
|
179
|
+
|
147
180
|
add_to_buffer char
|
148
181
|
end
|
149
182
|
end
|
150
|
-
|
183
|
+
|
151
184
|
end
|
152
185
|
|
153
186
|
end
|
@@ -6,90 +6,69 @@ module HTMLMin
|
|
6
6
|
|
7
7
|
private
|
8
8
|
|
9
|
-
def
|
9
|
+
def tag(char)
|
10
10
|
case char
|
11
|
-
when
|
12
|
-
add_to_buffer char
|
13
|
-
change_state_to :tag_end_body
|
14
|
-
when HTMLMin::Minifier::END_OF_FILE
|
15
|
-
flush_buffer
|
16
|
-
else
|
17
|
-
flush_buffer
|
18
|
-
change_state_to :start
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def tag_end_body(char)
|
23
|
-
case char
|
24
|
-
when "a".."z", "A".."Z"
|
11
|
+
when 'a'..'z', 'A'..'Z'
|
25
12
|
add_to_buffer char
|
26
13
|
when '>'
|
14
|
+
unshift_spaces_from_buffer if saved_state_unshiftable?
|
15
|
+
|
27
16
|
add_to_buffer char
|
28
|
-
|
29
|
-
unshift_spaces_from_buffer
|
30
17
|
flush_buffer
|
31
|
-
|
32
|
-
change_state_to :
|
18
|
+
|
19
|
+
change_state_to :entity_ended
|
33
20
|
when HTMLMin::Minifier::END_OF_FILE
|
34
21
|
flush_buffer
|
35
22
|
else
|
23
|
+
reset_saved_state
|
24
|
+
|
36
25
|
flush_buffer
|
26
|
+
|
27
|
+
add_to_result char
|
37
28
|
change_state_to :start
|
38
29
|
end
|
39
30
|
end
|
40
31
|
|
41
|
-
def
|
32
|
+
def tagend_body_expected(char)
|
42
33
|
case char
|
43
|
-
when
|
44
|
-
add_to_buffer char
|
45
|
-
change_state_to :tag_end_expected
|
46
|
-
when ">"
|
34
|
+
when 'a'..'z', 'A'..'Z'
|
47
35
|
add_to_buffer char
|
48
|
-
change_state_to :
|
49
|
-
when HTMLMin::Minifier::END_OF_FILE
|
50
|
-
flush_buffer
|
51
|
-
else
|
52
|
-
add_to_buffer char
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def tag_end_expected(char)
|
57
|
-
case char
|
58
|
-
when '>'
|
59
|
-
add_to_buffer char
|
60
|
-
change_state_to :tag_ended
|
36
|
+
change_state_to :tagend_body
|
61
37
|
when HTMLMin::Minifier::END_OF_FILE
|
62
38
|
flush_buffer
|
63
39
|
else
|
40
|
+
reset_saved_state
|
41
|
+
|
64
42
|
flush_buffer
|
43
|
+
|
44
|
+
add_to_result char
|
65
45
|
change_state_to :start
|
66
46
|
end
|
67
47
|
end
|
68
|
-
|
69
|
-
def
|
48
|
+
|
49
|
+
def tagend_body(char)
|
70
50
|
case char
|
71
|
-
when
|
72
|
-
add_to_buffer char
|
73
|
-
when '
|
74
|
-
|
75
|
-
|
76
|
-
unshift_spaces_from_buffer
|
77
|
-
flush_buffer
|
51
|
+
when 'a'..'z', 'A'..'Z'
|
52
|
+
add_to_buffer char
|
53
|
+
when '>'
|
54
|
+
unshift_spaces_from_buffer if saved_state_unshiftable?
|
78
55
|
|
79
56
|
add_to_buffer char
|
80
|
-
|
57
|
+
flush_buffer
|
58
|
+
|
59
|
+
change_state_to :entity_ended
|
81
60
|
when HTMLMin::Minifier::END_OF_FILE
|
82
|
-
unshift_spaces_from_buffer
|
83
61
|
flush_buffer
|
84
62
|
else
|
85
|
-
|
86
|
-
|
87
|
-
|
63
|
+
reset_saved_state
|
64
|
+
|
65
|
+
flush_buffer
|
66
|
+
|
88
67
|
add_to_result char
|
89
68
|
change_state_to :start
|
90
69
|
end
|
91
70
|
end
|
92
|
-
|
71
|
+
|
93
72
|
end
|
94
73
|
|
95
74
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HTMLMin
|
2
|
+
|
3
|
+
module State
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def save_state
|
8
|
+
@prev_state = @state
|
9
|
+
end
|
10
|
+
|
11
|
+
def reset_saved_state
|
12
|
+
@prev_state = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def saved_state_empty?
|
16
|
+
@prev_state.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def saved_state_unshiftable?
|
20
|
+
@prev_state == :entity_ended
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/htmlmin/version.rb
CHANGED
data/test/input/cc_1.txt
CHANGED
data/test/input/cc_2.txt
ADDED
data/test/options/comment_7.rb
CHANGED
data/test/options/comment_8.rb
CHANGED
data/test/output/cc_1.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<html
|
1
|
+
<html> <![if expression]> HTML <![endif]> </html>
|
data/test/output/comment_6.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<p>Fix me</p>
|
1
|
+
<p> Fix me </p>
|
data/test/output/comment_7.txt
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
<!-- this comment should stay here --><!-- this should also -- because this is not comment
|
1
|
+
<!-- this comment should stay here --><!-- this should also -- because this is not comment
|
2
|
+
<!-- and no whitespaces! -->
|
data/test/output/tag_1.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<p><em>nothing at all</em></p>
|
1
|
+
<p><em> nothing at all</em></p>
|
@@ -0,0 +1 @@
|
|
1
|
+
<p> hello </p><p> how <em>are</em> you? </p><p><small><strong> nothing?</strong></small></p>
|
data/test/output/text_3.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<p>please, stay with me</p>
|
1
|
+
<p> please, stay with me </p>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: htmlmin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-26 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: HTMLMin is a HTML-code minification tool implemented in Ruby. It works
|
15
15
|
like a slot machine.
|
@@ -32,8 +32,10 @@ files:
|
|
32
32
|
- lib/htmlmin/slot_machines/common.rb
|
33
33
|
- lib/htmlmin/slot_machines/doctype.rb
|
34
34
|
- lib/htmlmin/slot_machines/tag.rb
|
35
|
+
- lib/htmlmin/state.rb
|
35
36
|
- lib/htmlmin/version.rb
|
36
37
|
- test/input/cc_1.txt
|
38
|
+
- test/input/cc_2.txt
|
37
39
|
- test/input/comment_1.txt
|
38
40
|
- test/input/comment_2.txt
|
39
41
|
- test/input/comment_3.txt
|
@@ -44,22 +46,32 @@ files:
|
|
44
46
|
- test/input/comment_8.txt
|
45
47
|
- test/input/doctype_1.txt
|
46
48
|
- test/input/doctype_2.txt
|
49
|
+
- test/input/doctype_3.txt
|
47
50
|
- test/input/line_length_1.txt
|
48
51
|
- test/input/line_length_2.txt
|
49
52
|
- test/input/line_length_3.txt
|
50
53
|
- test/input/line_length_4.txt
|
51
54
|
- test/input/tag_1.txt
|
52
55
|
- test/input/tag_2.txt
|
56
|
+
- test/input/tag_3.txt
|
53
57
|
- test/input/text_1.txt
|
54
58
|
- test/input/text_2.txt
|
55
59
|
- test/input/text_3.txt
|
60
|
+
- test/options/cc_1.rb
|
61
|
+
- test/options/cc_2.rb
|
62
|
+
- test/options/comment_1.rb
|
63
|
+
- test/options/comment_6.rb
|
56
64
|
- test/options/comment_7.rb
|
57
65
|
- test/options/comment_8.rb
|
66
|
+
- test/options/doctype_3.rb
|
58
67
|
- test/options/line_length_1.rb
|
59
68
|
- test/options/line_length_2.rb
|
60
69
|
- test/options/line_length_3.rb
|
61
70
|
- test/options/line_length_4.rb
|
71
|
+
- test/options/tag_2.rb
|
72
|
+
- test/options/tag_3.rb
|
62
73
|
- test/output/cc_1.txt
|
74
|
+
- test/output/cc_2.txt
|
63
75
|
- test/output/comment_1.txt
|
64
76
|
- test/output/comment_2.txt
|
65
77
|
- test/output/comment_3.txt
|
@@ -70,12 +82,14 @@ files:
|
|
70
82
|
- test/output/comment_8.txt
|
71
83
|
- test/output/doctype_1.txt
|
72
84
|
- test/output/doctype_2.txt
|
85
|
+
- test/output/doctype_3.txt
|
73
86
|
- test/output/line_length_1.txt
|
74
87
|
- test/output/line_length_2.txt
|
75
88
|
- test/output/line_length_3.txt
|
76
89
|
- test/output/line_length_4.txt
|
77
90
|
- test/output/tag_1.txt
|
78
91
|
- test/output/tag_2.txt
|
92
|
+
- test/output/tag_3.txt
|
79
93
|
- test/output/text_1.txt
|
80
94
|
- test/output/text_2.txt
|
81
95
|
- test/output/text_3.txt
|
@@ -107,6 +121,7 @@ specification_version: 3
|
|
107
121
|
summary: HTMLMin is a HTML-code minification tool
|
108
122
|
test_files:
|
109
123
|
- test/input/cc_1.txt
|
124
|
+
- test/input/cc_2.txt
|
110
125
|
- test/input/comment_1.txt
|
111
126
|
- test/input/comment_2.txt
|
112
127
|
- test/input/comment_3.txt
|
@@ -117,22 +132,32 @@ test_files:
|
|
117
132
|
- test/input/comment_8.txt
|
118
133
|
- test/input/doctype_1.txt
|
119
134
|
- test/input/doctype_2.txt
|
135
|
+
- test/input/doctype_3.txt
|
120
136
|
- test/input/line_length_1.txt
|
121
137
|
- test/input/line_length_2.txt
|
122
138
|
- test/input/line_length_3.txt
|
123
139
|
- test/input/line_length_4.txt
|
124
140
|
- test/input/tag_1.txt
|
125
141
|
- test/input/tag_2.txt
|
142
|
+
- test/input/tag_3.txt
|
126
143
|
- test/input/text_1.txt
|
127
144
|
- test/input/text_2.txt
|
128
145
|
- test/input/text_3.txt
|
146
|
+
- test/options/cc_1.rb
|
147
|
+
- test/options/cc_2.rb
|
148
|
+
- test/options/comment_1.rb
|
149
|
+
- test/options/comment_6.rb
|
129
150
|
- test/options/comment_7.rb
|
130
151
|
- test/options/comment_8.rb
|
152
|
+
- test/options/doctype_3.rb
|
131
153
|
- test/options/line_length_1.rb
|
132
154
|
- test/options/line_length_2.rb
|
133
155
|
- test/options/line_length_3.rb
|
134
156
|
- test/options/line_length_4.rb
|
157
|
+
- test/options/tag_2.rb
|
158
|
+
- test/options/tag_3.rb
|
135
159
|
- test/output/cc_1.txt
|
160
|
+
- test/output/cc_2.txt
|
136
161
|
- test/output/comment_1.txt
|
137
162
|
- test/output/comment_2.txt
|
138
163
|
- test/output/comment_3.txt
|
@@ -143,12 +168,14 @@ test_files:
|
|
143
168
|
- test/output/comment_8.txt
|
144
169
|
- test/output/doctype_1.txt
|
145
170
|
- test/output/doctype_2.txt
|
171
|
+
- test/output/doctype_3.txt
|
146
172
|
- test/output/line_length_1.txt
|
147
173
|
- test/output/line_length_2.txt
|
148
174
|
- test/output/line_length_3.txt
|
149
175
|
- test/output/line_length_4.txt
|
150
176
|
- test/output/tag_1.txt
|
151
177
|
- test/output/tag_2.txt
|
178
|
+
- test/output/tag_3.txt
|
152
179
|
- test/output/text_1.txt
|
153
180
|
- test/output/text_2.txt
|
154
181
|
- test/output/text_3.txt
|