h5-min 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,6 +10,7 @@ begin
10
10
  gem.email = "runrun@runpaint.org"
11
11
  gem.homepage = "http://github.com/runpaint/h5-min"
12
12
  gem.authors = ["Run Paint Run Run"]
13
+ gem.add_dependency "htmlentities", ">= 4.1.0"
13
14
  gem.add_development_dependency "rspec", ">= 1.2.9"
14
15
  gem.add_development_dependency "yard", ">= 0"
15
16
  gem.executables << 'h5-min'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
data/bin/h5-min CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
  require_relative '../lib/h5-min'
3
- print HTML5::Minifier.minify ARGF.read
3
+ print HTML5.minify ARGF.read
@@ -0,0 +1,4 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <p><a href=foo&amp;bar>a</a>
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p><a href=foo&amp;bar>a</a>
@@ -0,0 +1,4 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <p><a href=a"b>a</a>
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p><a href=a&quot;b>a</a>
data/fixtures/dl.html ADDED
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <dl>
5
+ <dt>Term</dt>
6
+ <dd>Desc</dd>
7
+ <dt>Term</dt>
8
+ <dt>Term</dt>
9
+ <dd>Desc</dt>
10
+ </dl>
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><dl><dt>Term<dd>Desc<dt>Term<dt>Term<dd>Desc</dl>
@@ -0,0 +1,4 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <p>&fork; &SOFTcy;
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p>⋔ Ь
@@ -0,0 +1,3 @@
1
+ <!DOCTYPE html><meta charset=utf-8><title>Untitled</title>
2
+ <p>1 &amp; 2
3
+ &gt; ?
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p>1 &amp; 2 &gt; ?
data/fixtures/ie.html.min CHANGED
@@ -1,3 +1,3 @@
1
- <!DOCTYPE html><meta charset=utf-8><title>Untitled</title><!--[if lt IE 9]>
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><!--[if lt IE 9]>
2
2
  <script src=//html5shiv.googlecode.com/svn/trunk/html5.js></script>
3
3
  <![endif]--><h1>I.E!?!</h1>
@@ -0,0 +1,8 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <ul>
5
+ <li> <i>one</i><li>
6
+ <i> two
7
+ </i>
8
+
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><ul><li><i>one</i><li><i>two</i></ul>
@@ -0,0 +1,4 @@
1
+ <!DOCTYPE html>
2
+ <meta Charset=utf-8>
3
+ <title>Untitled</title>
4
+ <p><dfn TITLE='a b'>d</dfn></p>
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p><dfn title="a b">d</dfn>
@@ -0,0 +1,5 @@
1
+ <!DOCTYPE html>
2
+ <Meta charset=utf-8>
3
+ <title>Untitled</Title>
4
+ <p>p
5
+ <P>p
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p>p<p>p
@@ -0,0 +1,7 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <pre>
5
+ &lt; - &gt;
6
+ &amp;
7
+ </pre>
@@ -0,0 +1,4 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><pre>
2
+ &lt; - &gt;
3
+ &amp;
4
+ </pre>
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><meta charset=utf-8><title>Untitled</title><pre>
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><pre>
2
2
  This
3
3
  is
4
4
  pre-formatted .
@@ -1 +1 @@
1
- <!DOCTYPE html><title>Untitled</title><meta charset=utf-8><link rel=license href=//creativecommons.org/licenses/by-sa/3.0/><h1>Title</h1><p>Test</p>
1
+ <!doctype html><title>Untitled</title><meta charset=utf-8><link href=//creativecommons.org/licenses/by-sa/3.0/ rel=license><h1>Title</h1><p>Test
@@ -0,0 +1,4 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <p><a title=t href=/ class=c stylE=s HREFLANG="az-Latn-x-latn" >a</a></p>
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p><a class=c href=/ hreflang=az-Latn-x-latn style=s title=t>a</a>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <table class=c>
5
+ <thead class=h>
6
+ <tr>
7
+ <th>H</th>
8
+ <th>H</th>
9
+ </tr>
10
+ </thead>
11
+ <tbody class=b>
12
+ <tr>
13
+ <td>D</td>
14
+ <td>D</td>
15
+ </tr>
16
+ <tr>
17
+ <td>D</td>
18
+ <td>D</td>
19
+ </tr>
20
+ </tbody>
21
+ </table>
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><table class=c><thead class=h><tr><th>H<th>H<tbody class=b><tr><td>D<td>D<tr><td>D<td>D</table>
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <section>
5
+ <p>
6
+ A <code>b</code> <i>c</i> d <dfn>e <code> f
7
+ </code>
8
+
9
+ .
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><section><p>A <code>b</code> <i>c</i> d <dfn>e <code>f</code> .</dfn></section>
@@ -0,0 +1,4 @@
1
+ <!DOCTYPE html>
2
+ <meta charset=utf-8>
3
+ <title>Untitled</title>
4
+ <p>This is a<code>string </code>.
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset=utf-8><title>Untitled</title><p>This is a<code>string</code>.
@@ -0,0 +1,134 @@
1
+ # coding: utf-8
2
+ module HTML5
3
+ module OptionalTags
4
+ # Optional tags as per
5
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
6
+ OPTIONAL = [
7
+ # An html element's start tag may be omitted if the first thing inside
8
+ # the html element is not a comment.
9
+ %r{<html>},
10
+ # An html element's end tag may be omitted if the html element is not
11
+ # immediately followed by a comment.
12
+ %r{</html>},
13
+ # A head element's start tag may be omitted if the element is empty, or
14
+ # if the first thing inside the head element is an element.
15
+ %r{<head>},
16
+ # A head element's end tag may be omitted if the head element is not
17
+ # immediately followed by a space character or a comment.
18
+ %r{</head>},
19
+ # A body element's start tag may be omitted if the element is empty, or
20
+ # if the first thing inside the body element is not a space character or
21
+ # a comment, except if the first thing inside the body element is a
22
+ # script or style element.
23
+ %r{<body>\s?(?!<(script|style))},
24
+ # A body element's end tag may be omitted if the body element is not
25
+ # immediately followed by a comment.
26
+ %r{</body>},
27
+ # A li element's end tag may be omitted if the li element is immediately
28
+ # followed by another li element or if there is no more content in the
29
+ # parent element.
30
+ %r{</li>\s?(?=(<li|</[uo]l))},
31
+ # A dt element's end tag may be omitted if the dt element is immediately
32
+ # followed by another dt element or a dd element.
33
+ %r{</dt>\s?(?=<d[td])},
34
+ # A dd element's end tag may be omitted if the dd element is immediately
35
+ # followed by another dd element or a dt element, or if there is no more
36
+ # content in the parent element.
37
+ %r{</dd>\s?(?=(<d[dt]|</dl))},
38
+ # A p element's end tag may be omitted if the p element is immediately
39
+ # followed by an address, article, aside, blockquote, dir, div, dl,
40
+ # fieldset, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr,
41
+ # menu, nav, ol, p, pre, section, table, or ul, element, or if there is
42
+ # no more content in the parent element and the parent element is not an
43
+ # a element.
44
+ %r{</p>\s?(?=(<(address|article|aside|blockquote|dir|div|dl|fieldset|footer|
45
+ form|h\d|header|hgroup|hr|menu|nav|ol|p|pre|section|table|ul)|</))}x,
46
+ %r{</p>\s?\Z},
47
+ # An rt element's end tag may be omitted if the rt element is
48
+ # immediately followed by an rt or rp element, or if there is no more
49
+ # content in the parent element.
50
+ %r{</rt>\s?(?=(<r[tp]|</))},
51
+ # An rp element's end tag may be omitted if the rp element is
52
+ # immediately followed by an rt or rp element, or if there is no more
53
+ # content in the parent element.
54
+ %r{</rp>\s?(?=(<r[tp]|</))},
55
+ # An optgroup element's end tag may be omitted if the optgroup element
56
+ # is immediately followed by another optgroup element, or if there is no
57
+ # more content in the parent element.
58
+ %r{</optgroup>\s?(?=(<optgroup|</))},
59
+ # An option element's end tag may be omitted if the option element is
60
+ # immediately followed by another option element, or if it is
61
+ # immediately followed by an optgroup element, or if there is no more
62
+ # content in the parent element.
63
+ %r{</option>\s?(?=(<(option|optgroup)|</))},
64
+ # A colgroup element's start tag may be omitted if the first thing
65
+ # inside the colgroup element is a col element, and if the element is
66
+ # not immediately preceded by another colgroup element whose end tag has
67
+ # been omitted. (It can't be omitted if the element is empty.)
68
+ %r{<colgroup>\s?(?=<col)}, # FIXME: Incomplete
69
+ # A colgroup element's end tag may be omitted if the colgroup element is
70
+ # not immediately followed by a space character or a comment.
71
+ %r{</colgroup>},
72
+ # A thead element's end tag may be omitted if the thead element is
73
+ # immediately followed by a tbody or tfoot element.
74
+ %r{</thead>\s?(?=<t(body|foot))},
75
+ # A tbody element's start tag may be omitted if the first thing inside
76
+ # the tbody element is a tr element, and if the element is not
77
+ # immediately preceded by a tbody, thead, or tfoot element whose end tag
78
+ # has been omitted. (It can't be omitted if the element is empty.)
79
+ %r{(?<=</t(head|body|foot)>)\s?<tbody>\s?(?=<tr)}x, # TODO: Look again
80
+ # A tbody element's end tag may be omitted if the tbody element is
81
+ # immediately followed by a tbody or tfoot element, or if there is no
82
+ # more content in the parent element.
83
+ %r{</tbody>\s?(?=(<t(body|foot)|</))},
84
+ # A tfoot element's end tag may be omitted if the tfoot element is
85
+ # immediately followed by a tbody element, or if there is no more
86
+ # content in the parent element.
87
+ %r{</tfoot>\s?(?=(<tbody|</))},
88
+ # A tr element's end tag may be omitted if the tr element is immediately
89
+ # followed by another tr element, or if there is no more content in the
90
+ # parent element.
91
+ %r{</tr>\s?(?=(<tr|</))},
92
+ %r{</tr>\s?(?=(<t(body|foot|head)))}, # We may have already removed the
93
+ # parent's end tag
94
+ # A td element's end tag may be omitted if the td element is immediately
95
+ # followed by a td or th element, or if there is no more content in the
96
+ # parent element.
97
+ %r{</td>\s?(?=(<t[dhr]|</))},
98
+ # A th element's end tag may be omitted if the th element is immediately
99
+ # followed by a td or th element, or if there is no more content in the
100
+ # parent element.
101
+ %r{</th>\s?(?=(<t[dhr]|</))},
102
+ %r{</th>\s?(?=((<t(body|foot))|</))},
103
+
104
+ #However, a start tag must never be omitted if it has any attributes.
105
+
106
+ # The following are void elements
107
+ # (http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#void-elements)
108
+ # Therefore, their end tag must always be omitted
109
+ %r{</area},
110
+ %r{</base>},
111
+ %r{</br>},
112
+ %r{</col>},
113
+ %r{</command>},
114
+ %r{</embed>},
115
+ %r{</hr>},
116
+ %r{</img>},
117
+ %r{</input>},
118
+ %r{</keygen>},
119
+ %r{</link>},
120
+ %r{</meta>},
121
+ %r{</param>},
122
+ %r{</source>},
123
+ %r{</track>},
124
+ %r{</wbr>},
125
+ ]
126
+
127
+ def self.remove html
128
+ OPTIONAL.each do |regex|
129
+ html.gsub!(/#{regex}/i, '')
130
+ end
131
+ html
132
+ end
133
+ end
134
+ end
data/lib/h5-min.rb CHANGED
@@ -1,88 +1,126 @@
1
1
  require 'nokogiri'
2
- require 'cgi'
2
+ require 'htmlentities'
3
+ require_relative 'h5-min/optional'
3
4
 
4
5
  module HTML5
5
- class Minifier < Nokogiri::XML::SAX::Document
6
- attr_accessor :in_pre, :buf
6
+ # Elements in which whitespace is significant, so can't be normalised
7
+ PRE_TAGS = [:pre, :style, :script, :textarea]
8
+
9
+ # Elements representing flow content
10
+ FLOW_ELEMENTS = %w{a abbr address area article aside audio b bdo blockquote br
11
+ button canvas cite code command datalist del details dfn div
12
+ dl em embed fieldset figure footer form h1 h2 h3 h4 h5 h6 header
13
+ hgroup hr i iframe img input ins kbd keygen label link
14
+ map mark math menu meta meter nav noscript object ol output
15
+ p pre progress q ruby samp script section select small span
16
+ strong style sub sup svg table textarea time ul var video wbr
17
+ }.map(&:to_sym)
7
18
 
8
- # Elements which are implied: both their start and end tags can be omitted
9
- OMIT_TAGS = [:html, :body, :head]
19
+ @minifier ||= Class.new(Nokogiri::XML::SAX::Document) do
10
20
 
11
- # Elements whose end tags are implied, thus can be omitted
12
- OMIT_END_TAGS = [:link, :meta, :img, :br]
13
-
14
- # Elements in which whitespace is significant, so can't be normalised
15
- PRE_TAGS = [:pre]
16
-
17
- def self.minify html
18
- minifier = new
19
- Nokogiri::HTML::SAX::Parser.new(minifier).parse(html)
20
- minifier.buf.strip
21
- end
21
+ attr_accessor :in_pre, :buf, :text_node, :entities
22
22
 
23
23
  def initialize
24
24
  @in_pre = false
25
- @buf = ''
25
+ @buf, @text_node = '', ''
26
+ @stack = []
27
+ @entities = HTMLEntities.new :expanded
26
28
  end
27
29
 
28
30
  # HTML5 documents begin with the doctype
29
31
  def start_document
30
- buf << "<!DOCTYPE html>"
32
+ buf << "<!doctype html>"
31
33
  end
32
34
 
33
35
  def start_element name, attrs = []
34
- return if OMIT_TAGS.include?(name.to_sym)
35
- attrs = Hash[*attrs]
36
- return if name == 'meta' && attrs.key?('http-equiv')
37
- # Will fail for empty attributes
38
- attrs = attrs.map do |name, value|
39
- name + '=' + format_attribute_value(value)
40
- end
41
- self.in_pre = true if PRE_TAGS.include?(name.to_sym)
42
- buf.rstrip! unless in_pre
43
- buf << "<#{name}" + (attrs.empty? ? '' : ' ' + attrs.join(' ')) + ">"
36
+ name = normalise_name name
37
+ dump_text_node
38
+ @stack.push name
39
+ self.in_pre = true if PRE_TAGS.include?(name)
40
+ buf << "<#{name}" + format_attributes(attrs) + ">"
44
41
  end
45
42
 
46
43
  def end_element name
47
- return if [OMIT_TAGS, OMIT_END_TAGS].any?{|tags| tags.include?(name.to_sym)}
48
- self.in_pre = false if PRE_TAGS.include?(name.to_sym)
44
+ name = normalise_name name
45
+ dump_text_node
46
+ @stack.pop
47
+ buf.rstrip! unless in_pre
48
+ self.in_pre = PRE_TAGS.include?(name)
49
49
  buf << "</#{name}>"
50
50
  end
51
51
 
52
- def comment(string)
52
+ def comment string
53
53
  # I.E "conditional comments" should be retained as-is
54
54
  if string =~ /\[if\s+lt\s+IE\s+\d+\]/i
55
55
  buf << "<!--#{string}-->"
56
56
  end
57
57
  end
58
58
 
59
- def cdata_block(string)
59
+ def cdata_block string
60
60
  buf << string
61
61
  end
62
62
 
63
- def characters(chars)
64
- chars = CGI.escape_html chars
65
- if in_pre
66
- buf << chars
67
- else
68
- buf << chars.gsub(/[\n\t]/, '').squeeze(' ')
69
- end
63
+ def characters chars
64
+ text_node << chars
70
65
  end
71
66
 
72
67
  private
73
- def format_attribute_value(value)
74
- value = value.gsub(/"/, '&quot;')
68
+ def format_attribute_value value
69
+ value = format_entities value
75
70
  value_needs_quoting?(value) ? %Q{"#{value}"} : value
76
71
  end
77
72
 
78
- def value_needs_quoting?(value)
79
- # must not contain any literal space characters
80
- return true if value =~ /[[:space:]]/
81
- # must not contain any """, "'", ">", "=", characters
82
- return true if value =~ /["'><=`]/
83
- # must not be the empty string
84
- return true if value == ''
85
- false
73
+ def normalise_name name
74
+ name.downcase.to_sym
75
+ end
76
+
77
+ def format_attributes attrs
78
+ return '' if attrs.empty?
79
+ Hash[*attrs].map do |name, value|
80
+ [normalise_name(name), format_attribute_value(value)]
81
+ end.sort_by do |name, value|
82
+ name
83
+ end.map do |name, value|
84
+ "#{name}=#{value}"
85
+ end.join(' ').insert(0, ' ')
86
86
  end
87
+
88
+ # Can the given value be legally unquoted as per
89
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#attributes-0
90
+ # ?
91
+ def value_needs_quoting? value
92
+ # must not contain any " ", """, "'", ">", or "=", characters
93
+ value =~ /[[:space:]"'><=`]/ or value.empty?
94
+ end
95
+
96
+ def format_entities html
97
+ entities.encode(entities.decode(html), :basic)
98
+ end
99
+
100
+ def format_text_node
101
+ text = format_entities text_node
102
+ return text if in_pre
103
+ text.gsub!(/[\n\t]/,'')
104
+ # Don't strip inter-element white space for flow elements
105
+ unless buf =~ %r{</\w+>\s*\Z} and in_flow_element?
106
+ text.lstrip!
107
+ end
108
+ text.squeeze(' ')
109
+ end
110
+
111
+ def in_flow_element?
112
+ not (FLOW_ELEMENTS & @stack).empty?
113
+ end
114
+
115
+ def dump_text_node
116
+ buf << format_text_node
117
+ text_node.clear
118
+ end
119
+ end
120
+
121
+ def self.minify html
122
+ minifier = @minifier.new
123
+ Nokogiri::HTML::SAX::Parser.new(minifier).parse(html)
124
+ OptionalTags.remove minifier.buf.strip
87
125
  end
88
126
  end
data/spec/h5-min_spec.rb CHANGED
@@ -2,22 +2,33 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  def minify(source)
4
4
  source = 'fixtures/' + source
5
- [HTML5::Minifier.minify(File.read source), File.read(source + '.min').chomp]
5
+ [HTML5.minify(File.read source), File.read(source + '.min').chomp]
6
6
  end
7
7
 
8
- describe HTML5::Minifier do
9
- it "can minify a skeleton HTML document" do
10
- source, target = minify('skeleton.html')
11
- source.to_s.should == target
12
- end
13
-
14
- it "doesn't collpase whitespace inside <pre> tags" do
15
- source, target = minify('pre.html')
16
- source.to_s.should == target
17
- end
8
+ SPECS = {
9
+ skeleton: "can minify a skeleton HTML document",
10
+ pre: "doesn't collpase whitespace inside <pre> tags",
11
+ whitespace_p: "collpases whitespace inside <p> tags",
12
+ whitespace_complex: "collpases complex whitespace inside <p> tags",
13
+ lists: "collpases whitespace inside lists",
14
+ ie: "doesn't remove I.E conditional comments",
15
+ table: "removes optional elements in tables",
16
+ dl: "removes optional elements in definition lists",
17
+ normalise_tag_name: "normalises case of element names",
18
+ normalise_attribute_name: "normalises case of attribute names",
19
+ entities_no_expand: "doesn't decode unsafe HTML entities",
20
+ pre_entities: "doesn't decode unsafe HTML entities in preformatted elements",
21
+ attribute_value_ampersand: "doesn't decode ampersand entity in attribute values",
22
+ attribute_value_quot: "encodes quotation marks in attribute values",
23
+ entities_expand: "decodes safe HTML entities",
24
+ sort_attributes: "sorts attribute names alphabetically",
25
+ }
18
26
 
19
- it "doesn't remove I.E conditional comments" do
20
- source, target = minify('ie.html')
21
- source.to_s.should == target
27
+ describe HTML5, '.minify' do
28
+ SPECS.each do |fix, desc|
29
+ it desc do
30
+ source, target = minify("#{fix.to_s.tr(?_, ?-)}.html")
31
+ source.to_s.should == target
32
+ end
22
33
  end
23
34
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 0
8
7
  - 1
9
- version: 0.0.1
8
+ - 0
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Run Paint Run Run
@@ -14,13 +14,28 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-06 00:00:00 +01:00
17
+ date: 2010-07-09 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rspec
21
+ name: htmlentities
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 4
30
+ - 1
31
+ - 0
32
+ version: 4.1.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
24
39
  none: false
25
40
  requirements:
26
41
  - - ">="
@@ -31,11 +46,11 @@ dependencies:
31
46
  - 9
32
47
  version: 1.2.9
33
48
  type: :development
34
- version_requirements: *id001
49
+ version_requirements: *id002
35
50
  - !ruby/object:Gem::Dependency
36
51
  name: yard
37
52
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
53
+ requirement: &id003 !ruby/object:Gem::Requirement
39
54
  none: false
40
55
  requirements:
41
56
  - - ">="
@@ -44,7 +59,7 @@ dependencies:
44
59
  - 0
45
60
  version: "0"
46
61
  type: :development
47
- version_requirements: *id002
62
+ version_requirements: *id003
48
63
  description: Trivial command-line minifier for HTML5 markup
49
64
  email: runrun@runpaint.org
50
65
  executables:
@@ -63,13 +78,40 @@ files:
63
78
  - Rakefile
64
79
  - VERSION
65
80
  - bin/h5-min
81
+ - fixtures/attribute-value-ampersand.html
82
+ - fixtures/attribute-value-ampersand.html.min
83
+ - fixtures/attribute-value-quot.html
84
+ - fixtures/attribute-value-quot.html.min
85
+ - fixtures/dl.html
86
+ - fixtures/dl.html.min
87
+ - fixtures/entities-expand.html
88
+ - fixtures/entities-expand.html.min
89
+ - fixtures/entities-no-expand.html
90
+ - fixtures/entities-no-expand.html.min
66
91
  - fixtures/ie.html
67
92
  - fixtures/ie.html.min
93
+ - fixtures/lists.html
94
+ - fixtures/lists.html.min
95
+ - fixtures/normalise-attribute-name.html
96
+ - fixtures/normalise-attribute-name.html.min
97
+ - fixtures/normalise-tag-name.html
98
+ - fixtures/normalise-tag-name.html.min
99
+ - fixtures/pre-entities.html
100
+ - fixtures/pre-entities.html.min
68
101
  - fixtures/pre.html
69
102
  - fixtures/pre.html.min
70
103
  - fixtures/skeleton.html
71
104
  - fixtures/skeleton.html.min
105
+ - fixtures/sort-attributes.html
106
+ - fixtures/sort-attributes.html.min
107
+ - fixtures/table.html
108
+ - fixtures/table.html.min
109
+ - fixtures/whitespace-complex.html
110
+ - fixtures/whitespace-complex.html.min
111
+ - fixtures/whitespace-p.html
112
+ - fixtures/whitespace-p.html.min
72
113
  - lib/h5-min.rb
114
+ - lib/h5-min/optional.rb
73
115
  - spec/h5-min_spec.rb
74
116
  - spec/spec.opts
75
117
  - spec/spec_helper.rb