html_press 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Readme.md CHANGED
@@ -1,23 +1,14 @@
1
1
  #html_press
2
2
 
3
- ## Alternatives
4
-
5
- ###Ruby
6
-
7
- - https://github.com/completelynovel/html_compressor
8
- - https://github.com/MadRabbit/frontcompiler
9
-
10
- ###Other
11
-
12
- - http://code.google.com/p/htmlcompressor/
13
- - smarty `strip` tag
14
- - W3 total cache (WP plugin from smashingmagazine contains html minifier)
3
+ ## how it works
4
+
5
+ Remove all whitespace junk. Leave only HTML
15
6
 
16
- ## TODO
17
-
18
- - bin
19
- - Support other minifiers (Closure, YUI compressor)
20
- - htmlTydi
7
+ ```
8
+ 1. ┌――――――――――――――――――╖ 2. ┌――――――――――――――――――╖
9
+ ●――――――――――――――├―╢ <html> ws junk ║ ●――――――――├―――――――――╢ <html> ║
10
+ └――――――――――――――――――╜ └――――――――――――――――――╜
11
+ ```
21
12
 
22
13
  ## Usage
23
14
 
@@ -35,11 +26,23 @@ _plugins/strip_tag.rb
35
26
  ```ruby
36
27
  module Jekyll
37
28
  class StripTag < Liquid::Block
29
+ @total_economy = 0
30
+ class << self
31
+ attr_accessor :total_economy
32
+ end
33
+
38
34
  begin
39
35
  require 'html_press'
40
36
  def render(context)
41
37
  text = super
42
- HtmlPress.compress text
38
+ before = text.bytesize
39
+ text = HtmlPress.compress text
40
+ after = text.bytesize
41
+
42
+ self.class.total_economy += before - after
43
+ economy = (self.class.total_economy.to_f / 1024).round(2)
44
+ p 'totally saved: ' + economy.to_s + ' Kb'
45
+ text
43
46
  end
44
47
  rescue LoadError => e
45
48
  p "Unable to load 'html_press'"
@@ -62,5 +65,27 @@ Run
62
65
 
63
66
  ```
64
67
  bundle install
65
- bundle exec jelyll
68
+ bundle exec jekyll
66
69
  ```
70
+
71
+ ## Alternatives
72
+
73
+ ###Ruby
74
+
75
+ - https://github.com/completelynovel/html_compressor
76
+ - https://github.com/MadRabbit/frontcompiler
77
+
78
+ ###Other
79
+
80
+ - http://code.google.com/p/htmlcompressor/
81
+ - smarty `strip` tag
82
+ - W3 total cache (WP plugin from smashingmagazine contains html minifier)
83
+
84
+ ## TODO
85
+
86
+ - options
87
+ - bin
88
+ - Support other minifiers (Closure, YUI compressor)
89
+ - htmlTydi
90
+ - add examples of usage with Sinatra and Rails
91
+
@@ -138,6 +138,11 @@ module HtmlPress
138
138
  attr k, "'", tag
139
139
  end
140
140
 
141
+ if attributes_compressed == " /"
142
+ attributes_compressed = "/"
143
+ elsif attributes_compressed == " "
144
+ attributes_compressed = ""
145
+ end
141
146
  return m.gsub(attributes, attributes_compressed)
142
147
  end
143
148
 
@@ -147,37 +152,70 @@ module HtmlPress
147
152
  def attr(attribute, delimiter, tag)
148
153
  re = "([a-z\\-_:]+)(=" + delimiter + "[^" + delimiter + "]*" + delimiter + ")?"
149
154
  re = Regexp.new re
150
- value = attribute.gsub(re, "\\2")
151
-
152
- if tag == "script"
153
- name = attribute.gsub(re, "\\1")
155
+ value_original = attribute.gsub(re, "\\2")
156
+ value = value_original.downcase
157
+ name_original = attribute.gsub(re, "\\1")
158
+ name = name_original.downcase
159
+ tag_name = tag.downcase
160
+
161
+ case tag_name
162
+ when "script"
154
163
  if name == "type" || name == "language"
155
164
  return ""
165
+ elsif name == "async" || name == "defer"
166
+ return name_original
167
+ end
168
+ when "form"
169
+ if name == "method" && (value == "=\"get\"" || value == "='get'")
170
+ return ""
171
+ end
172
+ when /link|style/
173
+ if name == "type"
174
+ return ""
175
+ end
176
+ when /input|textarea|button|select|option|optgroup/
177
+ if name == "disabled"
178
+ return name_original
179
+ end
180
+ if (tag_name == "input" || tag_name == "textarea") && name == "readonly"
181
+ return name_original
182
+ end
183
+ if tag_name == "option" && name == "selected"
184
+ return name_original
185
+ end
186
+ if tag_name == "input"
187
+ if name == "type" && (value == "=\"text\"" || value == "='text'")
188
+ return ""
189
+ end
190
+ if name == "checked"
191
+ return name_original
192
+ end
193
+ # if name == "value" && (value == "=\"\"" || value == "=''")
194
+ # return ''
195
+ # end
156
196
  end
157
197
  end
158
198
 
159
199
  if value.size != 0
160
200
 
161
- name = attribute.gsub(re, "\\1")
162
-
163
201
  re = "^=" + delimiter + "|" + delimiter + "$"
164
202
  re = Regexp.new re
165
- value.gsub!(re, "")
203
+ value_original.gsub!(re, "")
166
204
 
167
205
  if name == "style"
168
- value = HtmlPress.css_compressor value
206
+ value_original = HtmlPress.css_compressor value_original
169
207
  end
170
208
 
171
209
  if name == "class"
172
- value.gsub!(/\s+/, " ")
173
- value.gsub!(/^\s+|\s+$/, "")
210
+ value_original.gsub!(/\s+/, " ")
211
+ value_original.gsub!(/^\s+|\s+$/, "")
174
212
  end
175
213
 
176
214
  # if name == "onclick"
177
215
  # value = HtmlPress.js_compressor value
178
216
  # end
179
217
 
180
- attribute = name + "=" + delimiter + value + delimiter
218
+ attribute = name_original + "=" + delimiter + value_original + delimiter
181
219
  end
182
220
 
183
221
  attribute
@@ -1,3 +1,3 @@
1
1
  module HtmlPress
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -62,15 +62,6 @@ describe HtmlPress do
62
62
  HtmlPress.compress(text).should eql text
63
63
  end
64
64
 
65
- it "should remove unnecessary whitespaces between attributes" do
66
- HtmlPress.compress("<p class=\"a\" id=\"b\"></p>").should eql "<p class=\"a\" id=\"b\"></p>"
67
- end
68
-
69
- it "should leave whitespaces everywhere else" do
70
- text = "<a onclick=\"alert(' ')\" unknown_attr=' a a'>a</a>"
71
- HtmlPress.compress(text).should eql text
72
- end
73
-
74
65
  it "should work with special utf-8 symbols" do
75
66
  HtmlPress.compress("✪<p></p> <p></p>").should eql "✪<p></p><p></p>"
76
67
  end
@@ -98,12 +89,25 @@ describe HtmlPress do
98
89
  HtmlPress.compress(text).should eql text2
99
90
  end
100
91
 
101
- it "should remove unnecessary whitespaces in html attributes (class)" do
92
+ it "should remove unnecessary whitespaces inside tag" do
93
+ HtmlPress.compress("<p class=\"a\" id=\"b\"></p>").should eql "<p class=\"a\" id=\"b\"></p>"
94
+ HtmlPress.compress("<p class=\"a\" ></p>").should eql "<p class=\"a\"></p>"
95
+ HtmlPress.compress("<img src=\"\" />").should eql "<img src=\"\"/>"
96
+ HtmlPress.compress("<br />").should eql "<br/>"
97
+ end
98
+
99
+ it "should work with 'badly' formatted attributes" do
100
+ HtmlPress.compress("<p class='a' id='b'></p>").should eql "<p class='a' id='b'></p>"
101
+ # HtmlPress.compress("<p class = 'a'></p>").should eql "<p class='a'></p>"
102
+ # HtmlPress.compress("<p class = a></p>").should eql "<p class=a></p>"
103
+ end
104
+
105
+ it "should optimize attributes" do
102
106
  HtmlPress.compress("<p class=\"a b\"></p>").should eql "<p class=\"a b\"></p>"
103
- HtmlPress.compress("<p class='a b'></p>").should eql "<p class='a b'></p>"
107
+ # http(s):// to //
104
108
  end
105
109
 
106
- it "should remove unnecessary whitespaces in html attributes (style)" do
110
+ it "should compress css in style attributes" do
107
111
  HtmlPress.compress("<p style=\"display: none;\"></p>").should eql "<p style=\"display:none;\"></p>"
108
112
  end
109
113
 
@@ -118,16 +122,79 @@ describe HtmlPress do
118
122
  HtmlPress.compress(text)
119
123
  text.should eql text1
120
124
  end
121
-
122
- it "should not modify input value" do
125
+
126
+ it "should leave whitespaces inside other attributes" do
127
+ text = "<a onclick=\"alert(' ')\" unknown_attr=' a a'>a</a>"
128
+ HtmlPress.compress(text).should eql text
129
+ end
130
+
131
+ it "should report javascript errors" do
123
132
  script_with_error = "<script>function(){</script>"
124
133
  l = Lg.new
125
134
  l.warns.size.should eql 0
126
135
  HtmlPress.compress(script_with_error, {:logger => l}).should eql script_with_error
127
136
  l.warns.size.should eql 1
128
137
  end
129
- # it "should remove unnecessary attributes" do
130
- # HtmlPress.compress("<script type=\"text/javascript\">var a;</script>").should eql "<script>var a;</script>"
138
+
139
+ # it "should report css errors" do
140
+ # script_with_error = "<style>.clas{margin:</style>"
141
+ # l = Lg.new
142
+ # l.warns.size.should eql 0
143
+ # HtmlPress.compress(script_with_error, {:logger => l}).should eql script_with_error
144
+ # l.warns.size.should eql 1
145
+ # end
146
+
147
+ it "should remove values of boolean attributes" do
148
+ HtmlPress.compress("<option selected=\"selected\">a</option>").should eql "<option selected>a</option>"
149
+ HtmlPress.compress("<input type=\"checkbox\" checked=\"checked\"/>").should eql "<input type=\"checkbox\" checked/>"
150
+ HtmlPress.compress("<input type=\"radio\" checked=\"checked\"/>").should eql "<input type=\"radio\" checked/>"
151
+ # disabled (input, textarea, button, select, option, optgroup)
152
+ HtmlPress.compress("<input disabled=\"disabled\"/>").should eql "<input disabled/>"
153
+ # readonly (input type=text/password, textarea)
154
+ HtmlPress.compress("<input readonly=\"readonly\"/>").should eql "<input readonly/>"
155
+ # HtmlPress.compress("<script src=\"example.com\" async=\"async\"></script>").should eql "<script src=\"example.com\" async></script>"
156
+ # HtmlPress.compress("<script src=\"example.com\" defer=\"defer\"></script>").should eql "<script src=\"example.com\" async></script>"
157
+ # HtmlPress.compress("<select multiple=\"multiple\"/>").should eql "<select multiple/>"
158
+ # ismap isMap (img, input type=image)
159
+ # declare (object; never used)
160
+ # noresize noResize (frame)
161
+ # nowrap noWrap (td, th; deprecated)
162
+ # noshade noShade (hr; deprecated)
163
+ # compact (ul, ol, dl, menu, dir; deprecated)
164
+ end
165
+
166
+ it "should remove attributes with default values" do
167
+ # HtmlPress.compress("<script type=\"text/javascript\" language=\"JavaScript\">var a;</script>").should eql "<script>var a;</script>"
168
+ # HtmlPress.compress("<style type=\"text/stylesheet\"></style>").should eql "<style></style>"
169
+ HtmlPress.compress("<link type=\"text/stylesheet\"/>").should eql "<link/>"
170
+ HtmlPress.compress("<form method=\"get\"></form>").should eql "<form></form>"
171
+ HtmlPress.compress("<input type=\"text\"/>").should eql "<input/>"
172
+ # input value "" ?
173
+ end
174
+
175
+ # it "should compress javascript in event attributes" do
176
+ # # javascript: - remove
177
+ # # onfocus
178
+ # # onblur
179
+ # # onselect
180
+ # # onchange
181
+ # # onclick
182
+ # # ondblclick
183
+ # # onmousedown
184
+ # # onmouseup
185
+ # # onmouseover
186
+ # # onmousemove
187
+ # # onmouseout
188
+ # # onkeypress
189
+ # # onkeydown
190
+ # # onkeyup
191
+ # end
192
+ #
193
+ # it "should remove unnecessary quotes for attributes values" do
194
+ # end
195
+ #
196
+ # it "should convert html entities to utf-8 symbols" do
197
+ # # except <>&
131
198
  # end
132
199
 
133
200
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html_press
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-04 00:00:00.000000000Z
12
+ date: 2012-02-05 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &25089276 !ruby/object:Gem::Requirement
16
+ requirement: &26078568 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *25089276
24
+ version_requirements: *26078568
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &25978872 !ruby/object:Gem::Requirement
27
+ requirement: &26078208 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *25978872
35
+ version_requirements: *26078208
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rainpress
38
- requirement: &26094612 !ruby/object:Gem::Requirement
38
+ requirement: &26077776 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *26094612
46
+ version_requirements: *26077776
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: uglifier
49
- requirement: &26094228 !ruby/object:Gem::Requirement
49
+ requirement: &26077452 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *26094228
57
+ version_requirements: *26077452
58
58
  description: Ruby gem for compressing html
59
59
  email:
60
60
  - stereobooster@gmail.com