htmlmin 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in htmlmin.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Introduction
2
+
3
+ HTMLMIN (HTML minimizer) is a HTML minimizer written in Ruby wich acts like a slot machine.
4
+
5
+ This document describes installation, usage, available minifications and development roadmap of HTMLMIN.
6
+
7
+ Please report issues on [Github] (https://github.com/aishek/htmlmin/issues).
8
+
9
+ For feedback, suggestions, etc. write to <aishek@gmail.com>.
10
+
11
+ **Important**: this project is in beta and may contain bugs. Current version: 0.0.1
12
+
13
+ # Installation
14
+
15
+ To install:
16
+
17
+ * run `gem install htmlmin`
18
+
19
+ # Usage
20
+
21
+ Usage:
22
+
23
+ require 'htmlmin'
24
+ options = {
25
+ :remove_comments => true,
26
+ :minify_whitespaces => true
27
+ }
28
+ minified_html = HTMLMin.minify(html, options)
29
+
30
+ # Minification
31
+
32
+ * Insert newline after DOCTYPE declaration
33
+ * Removal of whitespace
34
+ * Removal of comments
35
+
36
+ # Development roadmap
37
+
38
+ * ~~Minify whitespaces between tags~~
39
+ * ~~Insert newline after DOCTYPE declaration~~
40
+ * ~~Minify whitespaces after tag start and tag stop~~
41
+ * ~~Minify whitespaces in text~~
42
+ * ~~Remove comments~~
43
+ * Do not remove conditional comments
44
+ * Keep lines not longer that 30k (config option)
45
+ * Do not perform minify in script and style tag's content
46
+ * Do not perform minify in code, samp, pre tags's content
47
+ * Replace entities with numeric entities for shorter strings
48
+ * Replace entities with characters for shorter strings
49
+ * Minify shorttag close symbol
50
+ * Minify shorttag close whitespace
51
+ * Replace http:// with // in href and src attributes
52
+ * Minify whitespaces between tag attributes
53
+ * Minify quotes in one-word attributes
54
+ * Remove empty attributes
55
+ * Minify whitespaces in class attribute's content
56
+ * Replace css-classes in class attribute's content
57
+
58
+ # Author
59
+
60
+ Idea & implementation&nbsp;— Alexandr Borisov (<aishek@gmail.com>)
61
+
62
+ # Licence
63
+
64
+ HTMLMIN is licensed under [MIT](https://github.com/afelix/csso/blob/master/MIT-LICENSE.txt)
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
data/htmlmin.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "htmlmin/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "htmlmin"
7
+ s.version = Htmlmin::VERSION
8
+ s.authors = ["Alexandr Borisov"]
9
+ s.email = ["aishek@gmail.com"]
10
+ s.platform = Gem::Platform::RUBY
11
+ s.homepage = "http://github.com/aishek/htmlmin"
12
+ s.summary = %q{HTMLMin is a HTML-code minification tool}
13
+ s.description = %q{HTMLMin is a HTML-code minification tool implemented in Ruby. It works like a slot machine.}
14
+ s.license = 'MIT'
15
+
16
+ s.rubyforge_project = "htmlmin"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+ end
@@ -0,0 +1,30 @@
1
+ module HTMLMin
2
+
3
+ module Buffer
4
+
5
+ private
6
+
7
+ def add_to_buffer(char)
8
+ @result_buffer.push(char)
9
+ end
10
+
11
+ def space_in_buffer?
12
+ @result_buffer.length > 0 && @result_buffer[@result_buffer.length - 1] == ' '
13
+ end
14
+
15
+ def flush_buffer
16
+ @result += @result_buffer.join('')
17
+ clear_buffer
18
+ end
19
+
20
+ def unshift_spaces_from_buffer
21
+ @result_buffer = @result_buffer.drop_while {|char| char == ' '} if @settings[:minify_whitespaces]
22
+ end
23
+
24
+ def clear_buffer
25
+ @result_buffer = []
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,53 @@
1
+ module HTMLMin
2
+
3
+ module SlotMachines
4
+
5
+ module Comment
6
+
7
+ private
8
+
9
+ def comment_begin_1(char)
10
+ case char
11
+ when "\s", "\n", "\r", "\t", " "
12
+ flush_buffer
13
+ change_state_to_text_prespaced char
14
+ when '-'
15
+ add_to_buffer char
16
+ change_state_to :comment_start_end
17
+ else
18
+ flush_buffer
19
+ add_to_result char
20
+ change_state_to :start
21
+ end
22
+ end
23
+
24
+ def comment_start_end(char)
25
+ add_to_buffer char
26
+ change_state_to :comment
27
+ end
28
+
29
+ def comment(char)
30
+ add_to_buffer char
31
+ change_state_to :comment_end_1 if char == '-'
32
+ end
33
+
34
+ def comment_end_1(char)
35
+ add_to_buffer char
36
+ change_state_to (char == '-' ? :comment_end_2 : :comment)
37
+ end
38
+
39
+ def comment_end_2(char)
40
+ if char == '>'
41
+ clear_buffer
42
+ change_state_to :start unless restore_state
43
+ else
44
+ add_to_buffer char
45
+ change_state_to :comment
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,102 @@
1
+ module HTMLMin
2
+
3
+ module SlotMachines
4
+
5
+ module Common
6
+
7
+ private
8
+
9
+ def add_to_result(char)
10
+ @result += char
11
+ end
12
+
13
+ def change_state_to(new_state)
14
+ @state = new_state
15
+ end
16
+
17
+ def tag_or_tagend_or_comment_or_doctype_begin(char)
18
+ case char
19
+ when "\s", "\n", "\r", "\t", " "
20
+ flush_buffer
21
+ change_state_to_text_prespaced char
22
+ when "/"
23
+ add_to_buffer char
24
+ change_state_to :tag_end
25
+ when "!"
26
+ add_to_buffer char
27
+ change_state_to :comment_or_doctype_begin
28
+ when "a".."z", "A".."Z"
29
+ add_to_buffer char
30
+ change_state_to :tag_begin
31
+ else
32
+ flush_buffer
33
+ add_to_result char
34
+ change_state_to :start
35
+ end
36
+ end
37
+
38
+ def comment_or_doctype_begin(char)
39
+ case char
40
+ when "\s", "\n", "\r", "\t", " "
41
+ flush_buffer
42
+ change_state_to_text_prespaced char
43
+ when "-"
44
+ if @settings[:remove_comments]
45
+ add_to_buffer char
46
+ change_state_to :comment_begin_1
47
+ else
48
+ flush_buffer
49
+ add_to_result char
50
+ change_state_to :start
51
+ end
52
+ when 'D'
53
+ add_to_buffer char
54
+ change_state_to :doctype_begin_1
55
+ else
56
+ flush_buffer
57
+ add_to_result char
58
+ change_state_to :start
59
+ end
60
+ end
61
+
62
+ def text_prespaced(char)
63
+ case char
64
+ when "\s", "\n", "\r", "\t", " "
65
+ if @settings[:minify_whitespaces]
66
+ add_to_buffer " " unless space_in_buffer?
67
+ else
68
+ add_to_buffer char
69
+ end
70
+ when "<"
71
+ add_to_buffer char
72
+ change_state_to :tag_or_tagend_or_comment_or_doctype_begin
73
+ else
74
+ flush_buffer
75
+ add_to_result char
76
+ change_state_to :start
77
+ end
78
+ end
79
+
80
+ def start(char)
81
+ case char
82
+ when "\s", "\n", "\r", "\t"
83
+ change_state_to_text_prespaced char
84
+ when "<"
85
+ add_to_buffer char
86
+ change_state_to :tag_or_tagend_or_comment_or_doctype_begin
87
+ else
88
+ add_to_result char
89
+ change_state_to :start
90
+ end
91
+ end
92
+
93
+ def change_state_to_text_prespaced(char)
94
+ add_to_buffer (@settings[:minify_whitespaces] ? ' ' : char)
95
+ change_state_to :text_prespaced
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+
102
+ end
@@ -0,0 +1,135 @@
1
+ module HTMLMin
2
+
3
+ module SlotMachines
4
+
5
+ module Doctype
6
+
7
+ private
8
+
9
+ def doctype_begin_1(char)
10
+ case char
11
+ when "O"
12
+ add_to_buffer char
13
+ change_state_to :doctype_begin_2
14
+ when "\s", "\n", "\r", "\t", " "
15
+ change_state_to_text_prespaced char
16
+ else
17
+ flush_buffer
18
+
19
+ add_to_result char
20
+ change_state_to :start
21
+ end
22
+ end
23
+
24
+ def doctype_begin_2(char)
25
+ case char
26
+ when "C"
27
+ add_to_buffer char
28
+ change_state_to :doctype_begin_3
29
+ when "\s", "\n", "\r", "\t", " "
30
+ flush_buffer
31
+ change_state_to_text_prespaced char
32
+ else
33
+ flush_buffer
34
+
35
+ add_to_result char
36
+ change_state_to :start
37
+ end
38
+ end
39
+
40
+ def doctype_begin_3(char)
41
+ case char
42
+ when "T"
43
+ add_to_buffer char
44
+ change_state_to :doctype_begin_4
45
+ when "\s", "\n", "\r", "\t", " "
46
+ flush_buffer
47
+ change_state_to_text_prespaced char
48
+ else
49
+ flush_buffer
50
+
51
+ add_to_result char
52
+ change_state_to :start
53
+ end
54
+ end
55
+
56
+ def doctype_begin_4(char)
57
+ case char
58
+ when "Y"
59
+ add_to_buffer char
60
+ change_state_to :doctype_begin_5
61
+ when "\s", "\n", "\r", "\t", " "
62
+ flush_buffer
63
+ change_state_to_text_prespaced char
64
+ else
65
+ flush_buffer
66
+
67
+ add_to_result char
68
+ change_state_to :start
69
+ end
70
+ end
71
+
72
+ def doctype_begin_5(char)
73
+ case char
74
+ when "P"
75
+ add_to_buffer char
76
+ change_state_to :doctype_begin_6
77
+ when "\s", "\n", "\r", "\t", " "
78
+ flush_buffer
79
+ change_state_to_text_prespaced char
80
+ else
81
+ flush_buffer
82
+
83
+ add_to_result char
84
+ change_state_to :start
85
+ end
86
+ end
87
+
88
+ def doctype_begin_6(char)
89
+ case char
90
+ when "E"
91
+ add_to_buffer char
92
+ change_state_to :doctype_begin_7
93
+ when "\s", "\n", "\r", "\t", " "
94
+ flush_buffer
95
+ change_state_to_text_prespaced char
96
+ else
97
+ flush_buffer
98
+
99
+ add_to_result char
100
+ change_state_to :start
101
+ end
102
+ end
103
+
104
+ def doctype_begin_7(char)
105
+ case char
106
+ when " "
107
+ add_to_buffer char
108
+ change_state_to :doctype
109
+ when "\s", "\n", "\r", "\t"
110
+ flush_buffer
111
+ change_state_to_text_prespaced char
112
+ else
113
+ flush_buffer
114
+
115
+ add_to_result char
116
+ change_state_to :start
117
+ end
118
+ end
119
+
120
+ def doctype(char)
121
+ add_to_buffer char
122
+ if char == '>'
123
+ unshift_spaces_from_buffer
124
+ flush_buffer
125
+
126
+ add_to_result "\n"
127
+ change_state_to :start
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+ end
134
+
135
+ end
@@ -0,0 +1,83 @@
1
+ module HTMLMin
2
+
3
+ module SlotMachines
4
+
5
+ module Tag
6
+
7
+ private
8
+
9
+ def tag_end(char)
10
+ case char
11
+ when "a".."z", "A".."Z"
12
+ add_to_buffer char
13
+ change_state_to :tag_end_body
14
+ else
15
+ flush_buffer
16
+ change_state_to :start
17
+ end
18
+ end
19
+
20
+ def tag_end_body(char)
21
+ case char
22
+ when "a".."z", "A".."Z"
23
+ add_to_buffer char
24
+ when '>'
25
+ add_to_buffer char
26
+
27
+ unshift_spaces_from_buffer
28
+ flush_buffer
29
+
30
+ change_state_to :tag_ended
31
+ else
32
+ flush_buffer
33
+ change_state_to :start
34
+ end
35
+ end
36
+
37
+ def tag_begin(char)
38
+ add_to_buffer char
39
+ case char
40
+ when "/"
41
+ change_state_to :tag_end_expected
42
+ when ">"
43
+ change_state_to :tag_ended
44
+ end
45
+ end
46
+
47
+ def tag_end_expected(char)
48
+ case char
49
+ when '>'
50
+ add_to_buffer char
51
+ change_state_to :tag_ended
52
+ else
53
+ flush_buffer
54
+ change_state_to :start
55
+ end
56
+ end
57
+
58
+ def tag_ended(char)
59
+ case char
60
+ when "\s", "\n", "\r", "\t", " "
61
+ add_to_result char unless @settings[:minify_whitespaces]
62
+ when '<'
63
+ save_state
64
+
65
+ unshift_spaces_from_buffer
66
+ flush_buffer
67
+
68
+ add_to_buffer char
69
+ change_state_to :tag_or_tagend_or_comment_or_doctype_begin
70
+ else
71
+ unshift_spaces_from_buffer
72
+ flush_buffer
73
+
74
+ add_to_result char
75
+ change_state_to :start
76
+ end
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,4 @@
1
+ require 'htmlmin/slot_machines/common'
2
+ require 'htmlmin/slot_machines/comment'
3
+ require 'htmlmin/slot_machines/doctype'
4
+ require 'htmlmin/slot_machines/tag'
@@ -0,0 +1,3 @@
1
+ module Htmlmin
2
+ VERSION = "0.0.1"
3
+ end
data/lib/htmlmin.rb ADDED
@@ -0,0 +1,85 @@
1
+ require "htmlmin/version"
2
+ require "htmlmin/buffer"
3
+ require "htmlmin/slot_machines"
4
+
5
+ module HTMLMin
6
+
7
+ def self.minify(html, options = {})
8
+ HTMLMin::Minifier.minify(html, options)
9
+ end
10
+
11
+ class Minifier
12
+ extend HTMLMin::Buffer
13
+ extend HTMLMin::SlotMachines::Common
14
+ extend HTMLMin::SlotMachines::Comment
15
+ extend HTMLMin::SlotMachines::Doctype
16
+ extend HTMLMin::SlotMachines::Tag
17
+
18
+ class << self
19
+
20
+ DEFAULT_OPTIONS = {
21
+ :remove_comments => true,
22
+
23
+ :minify_whitespaces => true,
24
+
25
+ :debug => false
26
+ }
27
+
28
+ def minify(html, options = {})
29
+ init_settings options
30
+
31
+ @result = ''
32
+ init_slot_machine
33
+ run_slot_machine html
34
+
35
+ @result
36
+ end
37
+
38
+
39
+ private
40
+
41
+ def init_settings(options)
42
+ @settings = DEFAULT_OPTIONS.merge options
43
+ end
44
+
45
+ def init_slot_machine
46
+ clear_buffer
47
+ @state = :text_prespaced
48
+ @prev_state = nil
49
+ end
50
+
51
+ def run_slot_machine(html)
52
+ pos = 0
53
+ input = html.strip
54
+ while (pos < input.length) do
55
+ char = input[pos]
56
+
57
+ self.send @state, char
58
+ debug_log if @settings[:debug]
59
+
60
+ pos += 1
61
+ end
62
+ self.send @state, ''
63
+ end
64
+
65
+ def debug_log
66
+ p "char: #{char}, state: #{@state.to_s}, buffer: #{@result_buffer.join('')}"
67
+ end
68
+
69
+ def save_state
70
+ @prev_state = @state
71
+ end
72
+
73
+ def restore_state
74
+ return false if @prev_state.nil?
75
+
76
+ @state = @prev_state
77
+ return true
78
+ end
79
+
80
+ end
81
+
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,8 @@
1
+ <html>
2
+ <!--[if lte IE 7]>
3
+ <p>Internet Explorer 7 or older</p>
4
+ <![endif]-->
5
+ <!--[if gte IE 8]>
6
+ <p>Internet Explorer 8 or later</p>
7
+ <![endif]-->
8
+ </html>
@@ -0,0 +1 @@
1
+ <!---->
@@ -0,0 +1 @@
1
+ <!--<!--<!---->
@@ -0,0 +1 @@
1
+ <!--<!---->-->
@@ -0,0 +1 @@
1
+ <!-- just a comment -->
@@ -0,0 +1,11 @@
1
+
2
+
3
+
4
+
5
+
6
+ <!--asda
7
+
8
+ asd
9
+ a
10
+ sdas-- > >-- > --!
11
+ <p>test</p>
@@ -0,0 +1,7 @@
1
+ <!-- tag start -->
2
+ <p>
3
+ <!-- text begin -->
4
+ Fix me
5
+ <!-- <p>Fix me</p> - it's a paragraph -->
6
+ </p>
7
+ <!-- tag end -->
@@ -0,0 +1 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -0,0 +1,6 @@
1
+
2
+ <!-- hello before doctype -->
3
+
4
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
@@ -0,0 +1,7 @@
1
+
2
+ <p>
3
+ <em>
4
+
5
+ nothing at all</em>
6
+
7
+ </p>
@@ -0,0 +1,6 @@
1
+ <div>
2
+ <span>
3
+ <i>
4
+ </i>
5
+ </span>
6
+ </div>
@@ -0,0 +1,5 @@
1
+
2
+
3
+ text
4
+
5
+
@@ -0,0 +1 @@
1
+ hello there. how are you?
@@ -0,0 +1,4 @@
1
+ <p> please, stay
2
+ with me
3
+
4
+ </p>
@@ -0,0 +1 @@
1
+ <html></html>
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1 @@
1
+ <p>Fix me</p>
@@ -0,0 +1 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -0,0 +1,2 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
@@ -0,0 +1 @@
1
+ <p><em>nothing at all</em></p>
@@ -0,0 +1 @@
1
+ <div><span><i></i></span></div>
@@ -0,0 +1 @@
1
+ text
@@ -0,0 +1 @@
1
+ hello there. how are you?
@@ -0,0 +1 @@
1
+ <p>please, stay with me</p>
@@ -0,0 +1,51 @@
1
+ require 'test/unit'
2
+ require 'htmlmin'
3
+
4
+ class HTMLMinTest < Test::Unit::TestCase
5
+
6
+ class << self
7
+
8
+ INPUT_DIR = "test/input"
9
+ OUTPUT_DIR = "test/output"
10
+ EXTENSION = "txt"
11
+
12
+ def create_test_methods_from_data
13
+ files = input_files
14
+ files.each do |filename|
15
+ basename = File.basename(filename, File.extname(filename))
16
+ unless output_exists?(basename)
17
+ p "Output for '#{basename}' test not exists. Please, create '#{OUTPUT_DIR}/#{basename}.#{EXTENSION}' file!"
18
+ next
19
+ end
20
+
21
+ method_name = create_method_name basename
22
+ self.send :define_method, method_name do
23
+ input = File.read "#{INPUT_DIR}/#{basename}.#{EXTENSION}"
24
+ output = File.read "#{OUTPUT_DIR}/#{basename}.#{EXTENSION}"
25
+ minified = HTMLMin.minify(input)
26
+
27
+ assert_equal output, minified, "Minified '#{basename}' not equals to output!"
28
+ end
29
+ end
30
+ end
31
+
32
+
33
+ private
34
+
35
+ def output_exists?(basename)
36
+ File.exists? "#{OUTPUT_DIR}/#{basename}.txt"
37
+ end
38
+
39
+ def input_files
40
+ Dir.glob("#{INPUT_DIR}/#{ENV['input'] || '*'}.#{EXTENSION}")
41
+ end
42
+
43
+ def create_method_name(basename)
44
+ "test_#{basename}"
45
+ end
46
+
47
+ end
48
+
49
+ create_test_methods_from_data
50
+
51
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: htmlmin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alexandr Borisov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-21 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: HTMLMin is a HTML-code minification tool implemented in Ruby. It works
15
+ like a slot machine.
16
+ email:
17
+ - aishek@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - README.md
25
+ - Rakefile
26
+ - htmlmin.gemspec
27
+ - lib/htmlmin.rb
28
+ - lib/htmlmin/buffer.rb
29
+ - lib/htmlmin/slot_machines.rb
30
+ - lib/htmlmin/slot_machines/comment.rb
31
+ - lib/htmlmin/slot_machines/common.rb
32
+ - lib/htmlmin/slot_machines/doctype.rb
33
+ - lib/htmlmin/slot_machines/tag.rb
34
+ - lib/htmlmin/version.rb
35
+ - test/input/cc_1.txt
36
+ - test/input/comment_1.txt
37
+ - test/input/comment_2.txt
38
+ - test/input/comment_3.txt
39
+ - test/input/comment_4.txt
40
+ - test/input/comment_5.txt
41
+ - test/input/comment_6.txt
42
+ - test/input/doctype_1.txt
43
+ - test/input/doctype_2.txt
44
+ - test/input/tag_1.txt
45
+ - test/input/tag_2.txt
46
+ - test/input/text_1.txt
47
+ - test/input/text_2.txt
48
+ - test/input/text_3.txt
49
+ - test/output/cc_1.txt
50
+ - test/output/comment_1.txt
51
+ - test/output/comment_2.txt
52
+ - test/output/comment_3.txt
53
+ - test/output/comment_4.txt
54
+ - test/output/comment_5.txt
55
+ - test/output/comment_6.txt
56
+ - test/output/doctype_1.txt
57
+ - test/output/doctype_2.txt
58
+ - test/output/tag_1.txt
59
+ - test/output/tag_2.txt
60
+ - test/output/text_1.txt
61
+ - test/output/text_2.txt
62
+ - test/output/text_3.txt
63
+ - test/test_htmlmin.rb
64
+ homepage: http://github.com/aishek/htmlmin
65
+ licenses:
66
+ - MIT
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project: htmlmin
85
+ rubygems_version: 1.8.8
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: HTMLMin is a HTML-code minification tool
89
+ test_files:
90
+ - test/input/cc_1.txt
91
+ - test/input/comment_1.txt
92
+ - test/input/comment_2.txt
93
+ - test/input/comment_3.txt
94
+ - test/input/comment_4.txt
95
+ - test/input/comment_5.txt
96
+ - test/input/comment_6.txt
97
+ - test/input/doctype_1.txt
98
+ - test/input/doctype_2.txt
99
+ - test/input/tag_1.txt
100
+ - test/input/tag_2.txt
101
+ - test/input/text_1.txt
102
+ - test/input/text_2.txt
103
+ - test/input/text_3.txt
104
+ - test/output/cc_1.txt
105
+ - test/output/comment_1.txt
106
+ - test/output/comment_2.txt
107
+ - test/output/comment_3.txt
108
+ - test/output/comment_4.txt
109
+ - test/output/comment_5.txt
110
+ - test/output/comment_6.txt
111
+ - test/output/doctype_1.txt
112
+ - test/output/doctype_2.txt
113
+ - test/output/tag_1.txt
114
+ - test/output/tag_2.txt
115
+ - test/output/text_1.txt
116
+ - test/output/text_2.txt
117
+ - test/output/text_3.txt
118
+ - test/test_htmlmin.rb