html2haml 1.0.1 → 2.0.0.beta.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.
- checksums.yaml +7 -0
- data/.travis.yml +2 -3
- data/.yardopts +1 -0
- data/Changelog.markdown +20 -0
- data/README.md +32 -4
- data/Rakefile +1 -1
- data/html2haml.gemspec +7 -5
- data/lib/html2haml/exec.rb +14 -21
- data/lib/html2haml/html.rb +206 -138
- data/lib/html2haml/html/erb.rb +14 -14
- data/lib/html2haml/version.rb +1 -1
- data/test/erb_test.rb +11 -12
- data/test/html2haml_test.rb +60 -19
- data/test/test_helper.rb +1 -1
- metadata +104 -117
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d8e73acdd5aa2e60c2475d9fd27bfd5745b77518
|
4
|
+
data.tar.gz: 368387da16cf45f3bd9149e5cd9f8a5b9fe9e1ec
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 92c049a3f1c46df05f913af77bd2d6e9a2439e2c3d32ab28db9d351a4c22b95da168d5ad1ce29bf7b1333bd0c3d5e044266d78dbf9a950f7b3a45637e33b2724
|
7
|
+
data.tar.gz: c5314e4c81f28df2be455ab26b4c58ca1de9ed88c8e7ff4e2eeee0a3b8210160db86df8c5ed6ff6adad4257b54366a4bcc6fb3e72527f900af2ff8106de6cf08
|
data/.travis.yml
CHANGED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown
|
data/Changelog.markdown
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# HTML2Haml Changelog
|
2
2
|
|
3
|
+
## 2.0.0
|
4
|
+
|
5
|
+
* Switch to Nokogiri for XML parsing.
|
6
|
+
(thanks to [Stefan Natchev](https://github.com/snatchev) and [Norman
|
7
|
+
Clarke](https://github.com/norman))
|
8
|
+
|
9
|
+
* Add Ruby 2.0 support.
|
10
|
+
(thanks to [Yasuharu Ozaki](https://github.com/yasuoza))
|
11
|
+
|
12
|
+
* Add option to use Ruby 1.9-style attributes when possible.
|
13
|
+
(thanks to [Yoshinori Kawasaki](https://github.com/luvtechno) and
|
14
|
+
[Alexander Egorov](https://github.com/qatsi))
|
15
|
+
|
16
|
+
* Updated dependency versions.
|
17
|
+
|
18
|
+
* Removed some deprecated configuration flags.
|
19
|
+
|
20
|
+
* Move the internal HTML class from the Haml namespace into the Html2haml
|
21
|
+
namespace.
|
22
|
+
|
3
23
|
## 1.0.1
|
4
24
|
|
5
25
|
Rescue from `RubyParser::SyntaxError` in check for valid ruby.
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# Html2haml
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/haml/html2haml)
|
4
|
+
|
5
|
+
Html2haml, not surprisingly, converts HTML to Haml. It works on HTML with
|
6
|
+
embedded ERB tags as well as plain old HTML.
|
4
7
|
|
5
8
|
## Installation
|
6
9
|
|
@@ -18,6 +21,33 @@ Or install it yourself as:
|
|
18
21
|
|
19
22
|
## Usage
|
20
23
|
|
24
|
+
|
25
|
+
### To convert a project from .erb to .haml
|
26
|
+
|
27
|
+
If your system has `sed` and `xargs` available and none of your .erb file names
|
28
|
+
have whitespace in them, you can convert all your templates like so:
|
29
|
+
|
30
|
+
find . -name \*.erb -print | sed 'p;s/.erb$/.haml/' | xargs -n2 html2haml
|
31
|
+
|
32
|
+
If some of your file names have whitespace or you need finer-grained control
|
33
|
+
over the process, you can convert your files using `gsed` or multi-line script
|
34
|
+
techniques discussed [here](http://stackoverflow.com/questions/17576814/).
|
35
|
+
|
36
|
+
|
37
|
+
### Documentation
|
38
|
+
|
39
|
+
#### About version 2.0
|
40
|
+
|
41
|
+
Html2haml 2.0 differs from 1.x primarily in that it uses Nokgiri as its HTML
|
42
|
+
parser rather than Hpricot. At the current time however, there are some
|
43
|
+
problems running Html2haml 2.0 on JRuby due to differences in the way the Java
|
44
|
+
version of Nokogiri parses HTML. If you are using JRuby you may wish to run
|
45
|
+
HTML2Haml on MRI or use a 1.x version until these problems have been resolved.
|
46
|
+
|
47
|
+
#### Options
|
48
|
+
|
49
|
+
Here are the options currently available to Html2haml:
|
50
|
+
|
21
51
|
See `html2haml --help`:
|
22
52
|
|
23
53
|
Usage: html2haml [options] [INPUT] [OUTPUT]
|
@@ -27,10 +57,8 @@ See `html2haml --help`:
|
|
27
57
|
Options:
|
28
58
|
-e, --erb Parse ERb tags.
|
29
59
|
--no-erb Don't parse ERb tags.
|
30
|
-
-r, --rhtml Deprecated; same as --erb.
|
31
|
-
--no-rhtml Deprecated; same as --no-erb.
|
32
|
-
-x, --xhtml Parse the input using the more strict XHTML parser.
|
33
60
|
--html-attributes Use HTML style attributes instead of Ruby hash style.
|
61
|
+
--ruby19-attributes Use Ruby 1.9-style attributes when possible.
|
34
62
|
-E ex[:in] Specify the default external and internal character encodings.
|
35
63
|
-s, --stdin Read input from standard input instead of an input file
|
36
64
|
--trace Show a full traceback on error
|
data/Rakefile
CHANGED
data/html2haml.gemspec
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require File.expand_path('../lib/html2haml/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Norman Clarke"]
|
6
|
-
gem.email = ["norman@njclarke.com"]
|
5
|
+
gem.authors = ["Norman Clarke", "Stefan Natchev"]
|
6
|
+
gem.email = ["norman@njclarke.com", "stefan.natchev@gmail.com"]
|
7
7
|
gem.description = %q{Converts HTML into Haml}
|
8
8
|
gem.summary = %q{Converts HTML into Haml}
|
9
9
|
gem.homepage = "http://haml.info"
|
@@ -15,10 +15,12 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Html2haml::VERSION
|
17
17
|
|
18
|
-
gem.
|
18
|
+
gem.required_ruby_version = '>= 1.9.2'
|
19
|
+
|
20
|
+
gem.add_dependency 'nokogiri', '~> 1.6.0'
|
19
21
|
gem.add_dependency 'erubis', '~> 2.7.0'
|
20
|
-
gem.add_dependency 'ruby_parser', '~> 3.
|
21
|
-
gem.add_dependency 'haml', '
|
22
|
+
gem.add_dependency 'ruby_parser', '~> 3.2.1'
|
23
|
+
gem.add_dependency 'haml', '~> 4.0.0'
|
22
24
|
gem.add_development_dependency 'simplecov', '~> 0.7.1'
|
23
25
|
gem.add_development_dependency 'minitest', '~> 4.4.0'
|
24
26
|
gem.add_development_dependency 'rake'
|
data/lib/html2haml/exec.rb
CHANGED
@@ -3,9 +3,12 @@ require 'fileutils'
|
|
3
3
|
require 'rbconfig'
|
4
4
|
|
5
5
|
module Html2haml
|
6
|
-
# This module handles the
|
6
|
+
# This module handles the Html2haml executable.
|
7
7
|
module Exec
|
8
|
-
# An abstract class that encapsulates the executable code for
|
8
|
+
# An abstract class that encapsulates the executable code for the Html2haml executable.
|
9
|
+
# It's split into a base class and a subclass for historic reasons: this previously
|
10
|
+
# was used by all the executables in the Haml project, before Html2haml was moved
|
11
|
+
# into its own gem.
|
9
12
|
class Generic
|
10
13
|
# @param args [Array<String>] The command-line arguments
|
11
14
|
def initialize(args)
|
@@ -208,28 +211,18 @@ END
|
|
208
211
|
@options[:no_erb] = true
|
209
212
|
end
|
210
213
|
|
211
|
-
opts.on('-r', '--rhtml', 'Deprecated; same as --erb.') do
|
212
|
-
@module_opts[:erb] = true
|
213
|
-
end
|
214
|
-
|
215
|
-
opts.on('--no-rhtml', "Deprecated; same as --no-erb.") do
|
216
|
-
@options[:no_erb] = true
|
217
|
-
end
|
218
|
-
|
219
|
-
opts.on('-x', '--xhtml', 'Parse the input using the more strict XHTML parser.') do
|
220
|
-
@module_opts[:xhtml] = true
|
221
|
-
end
|
222
|
-
|
223
214
|
opts.on("--html-attributes", "Use HTML style attributes instead of Ruby hash style.") do
|
224
215
|
@module_opts[:html_style_attributes] = true
|
225
216
|
end
|
226
217
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
218
|
+
opts.on("--ruby19-attributes", "Use Ruby 1.9-style attributes when possible.") do
|
219
|
+
@module_opts[:ruby19_style_attributes] = true
|
220
|
+
end
|
221
|
+
|
222
|
+
opts.on('-E ex[:in]', 'Specify the default external and internal character encodings.') do |encoding|
|
223
|
+
external, internal = encoding.split(':')
|
224
|
+
Encoding.default_external = external if external && !external.empty?
|
225
|
+
Encoding.default_internal = internal if internal && !internal.empty?
|
233
226
|
end
|
234
227
|
|
235
228
|
super
|
@@ -248,7 +241,7 @@ END
|
|
248
241
|
@module_opts[:erb] ||= input.respond_to?(:path) && input.path =~ /\.(rhtml|erb)$/
|
249
242
|
@module_opts[:erb] &&= @options[:no_erb] != false
|
250
243
|
|
251
|
-
output.write(
|
244
|
+
output.write(HTML.new(input, @module_opts).render)
|
252
245
|
rescue ::Haml::Error => e
|
253
246
|
raise "#{e.is_a?(::Haml::SyntaxError) ? "Syntax error" : "Error"} on line " +
|
254
247
|
"#{get_line e}: #{e.message}"
|
data/lib/html2haml/html.rb
CHANGED
@@ -1,116 +1,119 @@
|
|
1
1
|
require 'cgi'
|
2
|
-
require '
|
2
|
+
require 'nokogiri'
|
3
3
|
require 'html2haml/html/erb'
|
4
4
|
|
5
|
-
# Haml monkeypatches various
|
5
|
+
# Haml monkeypatches various Nokogiri classes
|
6
6
|
# to add methods for conversion to Haml.
|
7
7
|
# @private
|
8
|
-
module
|
9
|
-
|
10
|
-
module
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
node
|
27
|
-
|
28
|
-
CGI.unescapeHTML(node.inner_text).gsub(/\n\s*/, ' ').strip << '}'
|
29
|
-
|
30
|
-
if node.next_node.is_a?(::Hpricot::Text)
|
31
|
-
node = node.next_node
|
32
|
-
text << uninterp(node.to_s)
|
8
|
+
module Nokogiri
|
9
|
+
|
10
|
+
module XML
|
11
|
+
# @see Nokogiri
|
12
|
+
class Node
|
13
|
+
# Whether this node has already been converted to Haml.
|
14
|
+
# Only used for text nodes and elements.
|
15
|
+
#
|
16
|
+
# @return [Boolean]
|
17
|
+
attr_accessor :converted_to_haml
|
18
|
+
|
19
|
+
# Returns the Haml representation of the given node.
|
20
|
+
#
|
21
|
+
# @param tabs [Fixnum] The indentation level of the resulting Haml.
|
22
|
+
# @option options (see Html2haml::HTML#initialize)
|
23
|
+
def to_haml(tabs, options)
|
24
|
+
return "" if converted_to_haml || to_s.strip.empty?
|
25
|
+
text = uninterp(self.to_s)
|
26
|
+
node = next_sibling
|
27
|
+
while node.is_a?(::Nokogiri::XML::Element) && node.name == "haml_loud"
|
33
28
|
node.converted_to_haml = true
|
34
|
-
|
29
|
+
text << '#{' <<
|
30
|
+
CGI.unescapeHTML(node.inner_text).gsub(/\n\s*/, ' ').strip << '}'
|
31
|
+
|
32
|
+
if node.next_sibling.is_a?(::Nokogiri::XML::Text)
|
33
|
+
node = node.next_sibling
|
34
|
+
text << uninterp(node.to_s)
|
35
|
+
node.converted_to_haml = true
|
36
|
+
end
|
35
37
|
|
36
|
-
|
38
|
+
node = node.next_sibling
|
39
|
+
end
|
40
|
+
return parse_text_with_interpolation(text, tabs)
|
37
41
|
end
|
38
|
-
return parse_text_with_interpolation(text, tabs)
|
39
|
-
end
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
43
|
+
private
|
44
|
+
|
45
|
+
def erb_to_interpolation(text, options)
|
46
|
+
return text unless options[:erb]
|
47
|
+
text = CGI.escapeHTML(uninterp(text))
|
48
|
+
%w[<haml_loud> </haml_loud>].each {|str| text.gsub!(CGI.escapeHTML(str), str)}
|
49
|
+
::Nokogiri::XML.fragment(text).children.inject("") do |str, elem|
|
50
|
+
if elem.is_a?(::Nokogiri::XML::Text)
|
51
|
+
str + CGI.unescapeHTML(elem.to_s)
|
52
|
+
else # <haml_loud> element
|
53
|
+
str + '#{' + CGI.unescapeHTML(elem.inner_text.strip) + '}'
|
54
|
+
end
|
52
55
|
end
|
53
56
|
end
|
54
|
-
end
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
-
|
58
|
+
def tabulate(tabs)
|
59
|
+
' ' * tabs
|
60
|
+
end
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
62
|
+
def uninterp(text)
|
63
|
+
text.gsub('#{', '\#{') #'
|
64
|
+
end
|
63
65
|
|
64
|
-
|
65
|
-
|
66
|
-
|
66
|
+
def attr_hash
|
67
|
+
Hash[attributes.map {|k, v| [k.to_s, v.to_s]}]
|
68
|
+
end
|
67
69
|
|
68
|
-
|
69
|
-
|
70
|
-
|
70
|
+
def parse_text(text, tabs)
|
71
|
+
parse_text_with_interpolation(uninterp(text), tabs)
|
72
|
+
end
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
def parse_text_with_interpolation(text, tabs)
|
75
|
+
text.strip!
|
76
|
+
return "" if text.empty?
|
75
77
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
78
|
+
text.split("\n").map do |line|
|
79
|
+
line.strip!
|
80
|
+
"#{tabulate(tabs)}#{'\\' if Haml::Parser::SPECIAL_CHARACTERS.include?(line[0])}#{line}\n"
|
81
|
+
end.join
|
82
|
+
end
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
83
86
|
|
84
87
|
# @private
|
85
|
-
HAML_TAGS = %w[
|
86
|
-
|
87
|
-
HAML_TAGS.each do |t|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
module
|
88
|
+
HAML_TAGS = %w[haml_block haml_loud haml_silent]
|
89
|
+
#
|
90
|
+
# HAML_TAGS.each do |t|
|
91
|
+
# Nokogiri::XML::ElementContent[t] = {}
|
92
|
+
# Nokogiri::XML::ElementContent.keys.each do |key|
|
93
|
+
# Nokogiri::XML::ElementContent[t][key.hash] = true
|
94
|
+
# end
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
# Nokogiri::XML::ElementContent.keys.each do |k|
|
98
|
+
# HAML_TAGS.each do |el|
|
99
|
+
# val = Nokogiri::XML::ElementContent[k]
|
100
|
+
# val[el.hash] = true if val.is_a?(Hash)
|
101
|
+
# end
|
102
|
+
# end
|
103
|
+
|
104
|
+
module Html2haml
|
102
105
|
# Converts HTML documents into Haml templates.
|
103
|
-
# Depends on [
|
104
|
-
# If ERB conversion is being used, also depends on
|
106
|
+
# Depends on [Nokogiri](http://nokogiri.org/) for HTML parsing.
|
107
|
+
# If ERB conversion is being used, also depends on
|
105
108
|
# [Erubis](http://www.kuwata-lab.com/erubis) to parse the ERB
|
106
109
|
# and [ruby_parser](http://parsetree.rubyforge.org/) to parse the Ruby code.
|
107
110
|
#
|
108
111
|
# Example usage:
|
109
112
|
#
|
110
|
-
#
|
113
|
+
# HTML.new("<a href='http://google.com'>Blat</a>").render
|
111
114
|
# #=> "%a{:href => 'http://google.com'} Blat"
|
112
115
|
class HTML
|
113
|
-
# @param template [String,
|
116
|
+
# @param template [String, Nokogiri::Node] The HTML template to convert
|
114
117
|
# @option options :erb [Boolean] (false) Whether or not to parse
|
115
118
|
# ERB's `<%= %>` and `<% %>` into Haml's `=` and `-`
|
116
119
|
# @option options :xhtml [Boolean] (false) Whether or not to parse
|
@@ -118,7 +121,7 @@ module Haml
|
|
118
121
|
def initialize(template, options = {})
|
119
122
|
@options = options
|
120
123
|
|
121
|
-
if template.is_a?
|
124
|
+
if template.is_a? Nokogiri::XML::Node
|
122
125
|
@template = template
|
123
126
|
else
|
124
127
|
if template.is_a? IO
|
@@ -132,8 +135,23 @@ module Haml
|
|
132
135
|
template = ERB.compile(template)
|
133
136
|
end
|
134
137
|
|
135
|
-
|
136
|
-
|
138
|
+
if template =~ /^\s*<!DOCTYPE|<html/i
|
139
|
+
return @template = Nokogiri.HTML(template)
|
140
|
+
end
|
141
|
+
|
142
|
+
@template = Nokogiri::HTML.fragment(template)
|
143
|
+
|
144
|
+
#detect missplaced head or body tag
|
145
|
+
#XML_HTML_STRUCURE_ERROR : 800
|
146
|
+
if @template.errors.any? { |e| e.code == 800 }
|
147
|
+
return @template = Nokogiri.HTML(template).at('/html').children
|
148
|
+
end
|
149
|
+
|
150
|
+
#in order to support CDATA in HTML (which is invalid) try using the XML parser
|
151
|
+
# we can detect this when libxml returns error code XML_ERR_NAME_REQUIRED : 68
|
152
|
+
if @template.errors.any? { |e| e.code == 68 }
|
153
|
+
return @template = Nokogiri::XML.fragment(template)
|
154
|
+
end
|
137
155
|
end
|
138
156
|
end
|
139
157
|
|
@@ -146,42 +164,64 @@ module Haml
|
|
146
164
|
|
147
165
|
TEXT_REGEXP = /^(\s*).*$/
|
148
166
|
|
149
|
-
|
167
|
+
|
168
|
+
# @see Nokogiri
|
150
169
|
# @private
|
151
|
-
class ::
|
152
|
-
# @see
|
170
|
+
class ::Nokogiri::XML::Document
|
171
|
+
# @see Html2haml::HTML::Node#to_haml
|
153
172
|
def to_haml(tabs, options)
|
154
173
|
(children || []).inject('') {|s, c| s << c.to_haml(0, options)}
|
155
174
|
end
|
156
175
|
end
|
157
176
|
|
158
|
-
|
177
|
+
class ::Nokogiri::XML::DocumentFragment
|
178
|
+
# @see Html2haml::HTML::Node#to_haml
|
179
|
+
def to_haml(tabs, options)
|
180
|
+
(children || []).inject('') {|s, c| s << c.to_haml(0, options)}
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
class ::Nokogiri::XML::NodeSet
|
185
|
+
# @see Html2haml::HTML::Node#to_haml
|
186
|
+
def to_haml(tabs, options)
|
187
|
+
self.inject('') {|s, c| s << c.to_haml(tabs, options)}
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# @see Nokogiri
|
159
192
|
# @private
|
160
|
-
class ::
|
161
|
-
# @see
|
193
|
+
class ::Nokogiri::XML::ProcessingInstruction
|
194
|
+
# @see Html2haml::HTML::Node#to_haml
|
162
195
|
def to_haml(tabs, options)
|
163
196
|
"#{tabulate(tabs)}!!! XML\n"
|
164
197
|
end
|
165
198
|
end
|
166
199
|
|
167
|
-
# @see
|
200
|
+
# @see Nokogiri
|
168
201
|
# @private
|
169
|
-
class ::
|
170
|
-
# @see
|
202
|
+
class ::Nokogiri::XML::CDATA
|
203
|
+
# @see Html2haml::HTML::Node#to_haml
|
171
204
|
def to_haml(tabs, options)
|
172
205
|
content = parse_text_with_interpolation(
|
173
206
|
erb_to_interpolation(self.content, options), tabs + 1)
|
174
207
|
"#{tabulate(tabs)}:cdata\n#{content}"
|
175
208
|
end
|
209
|
+
|
210
|
+
# removes the start and stop markers for cdata
|
211
|
+
def content_without_cdata_tokens
|
212
|
+
content.
|
213
|
+
gsub(/^\s*<!\[CDATA\[\n/,"").
|
214
|
+
gsub(/^\s*\]\]>\n/, "")
|
215
|
+
end
|
176
216
|
end
|
177
217
|
|
178
|
-
# @see
|
218
|
+
# @see Nokogiri
|
179
219
|
# @private
|
180
|
-
class ::
|
181
|
-
# @see
|
220
|
+
class ::Nokogiri::XML::DTD
|
221
|
+
# @see Html2haml::HTML::Node#to_haml
|
182
222
|
def to_haml(tabs, options)
|
183
|
-
attrs =
|
184
|
-
|
223
|
+
attrs = external_id.nil? ? ["", "", ""] :
|
224
|
+
external_id.scan(/DTD\s+([^\s]+)\s*([^\s]*)\s*([^\s]*)\s*\/\//)[0]
|
185
225
|
raise Haml::SyntaxError.new("Invalid doctype") if attrs == nil
|
186
226
|
|
187
227
|
type, version, strictness = attrs.map { |a| a.downcase }
|
@@ -205,10 +245,10 @@ module Haml
|
|
205
245
|
end
|
206
246
|
end
|
207
247
|
|
208
|
-
# @see
|
248
|
+
# @see Nokogiri
|
209
249
|
# @private
|
210
|
-
class ::
|
211
|
-
# @see
|
250
|
+
class ::Nokogiri::XML::Comment
|
251
|
+
# @see Html2haml::HTML::Node#to_haml
|
212
252
|
def to_haml(tabs, options)
|
213
253
|
content = self.content
|
214
254
|
if content =~ /\A(\[[^\]]+\])>(.*)<!\[endif\]\z/m
|
@@ -224,26 +264,26 @@ module Haml
|
|
224
264
|
end
|
225
265
|
end
|
226
266
|
|
227
|
-
# @see
|
267
|
+
# @see Nokogiri
|
228
268
|
# @private
|
229
|
-
class ::
|
230
|
-
# @see
|
269
|
+
class ::Nokogiri::XML::Element
|
270
|
+
# @see Html2haml::HTML::Node#to_haml
|
231
271
|
def to_haml(tabs, options)
|
232
272
|
return "" if converted_to_haml
|
233
273
|
if name == "script" &&
|
234
|
-
(attr_hash['type'].nil? || attr_hash['type'] == "text/javascript") &&
|
274
|
+
(attr_hash['type'].nil? || attr_hash['type'].to_s == "text/javascript") &&
|
235
275
|
(attr_hash.keys - ['type']).empty?
|
236
276
|
return to_haml_filter(:javascript, tabs, options)
|
237
277
|
elsif name == "style" &&
|
238
|
-
(attr_hash['type'].nil? || attr_hash['type'] == "text/css") &&
|
278
|
+
(attr_hash['type'].nil? || attr_hash['type'].to_s == "text/css") &&
|
239
279
|
(attr_hash.keys - ['type']).empty?
|
240
280
|
return to_haml_filter(:css, tabs, options)
|
241
281
|
end
|
242
282
|
|
243
283
|
output = tabulate(tabs)
|
244
|
-
if options[:erb] && name
|
245
|
-
case name
|
246
|
-
when "
|
284
|
+
if options[:erb] && HAML_TAGS.include?(name)
|
285
|
+
case name
|
286
|
+
when "haml_loud"
|
247
287
|
lines = CGI.unescapeHTML(inner_text).split("\n").
|
248
288
|
map {|s| s.rstrip}.reject {|s| s.strip.empty?}
|
249
289
|
lines.first.gsub!(/^[ \t]*/, "= ")
|
@@ -261,18 +301,18 @@ module Haml
|
|
261
301
|
length = lines.map {|s| s.size}.max + 1
|
262
302
|
lines.map! {|s| "%#{-length}s|" % s}
|
263
303
|
|
264
|
-
if next_sibling && next_sibling.is_a?(
|
304
|
+
if next_sibling && next_sibling.is_a?(Nokogiri::XML::Element) && next_sibling.name == "haml_loud" &&
|
265
305
|
next_sibling.inner_text.split("\n").reject {|s| s.strip.empty?}.size > 1
|
266
306
|
lines << "-#"
|
267
307
|
end
|
268
308
|
end
|
269
309
|
return lines.map {|s| output + s + "\n"}.join
|
270
|
-
when "
|
310
|
+
when "haml_silent"
|
271
311
|
return CGI.unescapeHTML(inner_text).split("\n").map do |line|
|
272
312
|
next "" if line.strip.empty?
|
273
313
|
"#{output}- #{line.strip}\n"
|
274
314
|
end.join
|
275
|
-
when "
|
315
|
+
when "haml_block"
|
276
316
|
return render_children("", tabs, options)
|
277
317
|
end
|
278
318
|
end
|
@@ -286,21 +326,24 @@ module Haml
|
|
286
326
|
output << "= succeed #{self.next.content.slice!(/\A[^\s]+/).dump} do\n"
|
287
327
|
tabs += 1
|
288
328
|
output << tabulate(tabs)
|
329
|
+
#empty the text node since it was inserted into the block
|
330
|
+
self.next.content = ""
|
289
331
|
end
|
290
332
|
end
|
291
333
|
|
292
|
-
output << "%#{name}" unless name == 'div' &&
|
334
|
+
output << "%#{name}" unless name.to_s == 'div' &&
|
293
335
|
(static_id?(options) ||
|
294
336
|
static_classname?(options) &&
|
295
|
-
attr_hash['class'].split(' ').any?(&method(:haml_css_attr?)))
|
337
|
+
attr_hash['class'].to_s.split(' ').any?(&method(:haml_css_attr?)))
|
296
338
|
|
297
339
|
if attr_hash
|
340
|
+
|
298
341
|
if static_id?(options)
|
299
|
-
output << "##{attr_hash['id']}"
|
342
|
+
output << "##{attr_hash['id'].to_s}"
|
300
343
|
remove_attribute('id')
|
301
344
|
end
|
302
345
|
if static_classname?(options)
|
303
|
-
leftover = attr_hash['class'].split(' ').reject do |c|
|
346
|
+
leftover = attr_hash['class'].to_s.split(' ').reject do |c|
|
304
347
|
next unless haml_css_attr?(c)
|
305
348
|
output << ".#{c}"
|
306
349
|
end
|
@@ -311,21 +354,21 @@ module Haml
|
|
311
354
|
end
|
312
355
|
|
313
356
|
output << ">" if nuke_outer_whitespace
|
314
|
-
output << "/" if
|
357
|
+
output << "/" if to_xhtml.end_with?("/>")
|
315
358
|
|
316
359
|
if children && children.size == 1
|
317
360
|
child = children.first
|
318
|
-
if child.is_a?(::
|
361
|
+
if child.is_a?(::Nokogiri::XML::Text)
|
319
362
|
if !child.to_s.include?("\n")
|
320
363
|
text = child.to_haml(tabs + 1, options)
|
321
364
|
return output + " " + text.lstrip.gsub(/^\\/, '') unless text.chomp.include?("\n") || text.empty?
|
322
365
|
return output + "\n" + text
|
323
366
|
elsif ["pre", "textarea"].include?(name) ||
|
324
|
-
(name == "code" && parent.is_a?(::
|
367
|
+
(name == "code" && parent.is_a?(::Nokogiri::XML::Element) && parent.name == "pre")
|
325
368
|
return output + "\n#{tabulate(tabs + 1)}:preserve\n" +
|
326
|
-
|
369
|
+
inner_text.gsub(/^/, tabulate(tabs + 2))
|
327
370
|
end
|
328
|
-
elsif child.is_a?(::
|
371
|
+
elsif child.is_a?(::Nokogiri::XML::Element) && child.name == "haml_loud"
|
329
372
|
return output + child.to_haml(tabs + 1, options).lstrip
|
330
373
|
end
|
331
374
|
end
|
@@ -344,24 +387,30 @@ module Haml
|
|
344
387
|
def dynamic_attributes
|
345
388
|
@dynamic_attributes ||= begin
|
346
389
|
Hash[attr_hash.map do |name, value|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
full_match =
|
351
|
-
|
390
|
+
if value == ""
|
391
|
+
[nil, nil]
|
392
|
+
else
|
393
|
+
full_match = nil
|
394
|
+
ruby_value = value.to_s.gsub(%r{<haml_loud>\s*(.+?)\s*</haml_loud>}) do
|
395
|
+
full_match = $`.empty? && $'.empty?
|
396
|
+
CGI.unescapeHTML(full_match ? $1: "\#{#{$1}}")
|
397
|
+
end
|
398
|
+
if ruby_value == value
|
399
|
+
[nil, nil]
|
400
|
+
else
|
401
|
+
[name.to_s, full_match ? ruby_value : %("#{ruby_value}")]
|
402
|
+
end
|
352
403
|
end
|
353
|
-
next if ruby_value == value
|
354
|
-
[name, full_match ? ruby_value : %("#{ruby_value}")]
|
355
404
|
end]
|
356
405
|
end
|
357
406
|
end
|
358
407
|
|
359
408
|
def to_haml_filter(filter, tabs, options)
|
360
409
|
content =
|
361
|
-
if children.first.
|
362
|
-
children.first.
|
410
|
+
if children.first.cdata?
|
411
|
+
decode_entities(children.first.content_without_cdata_tokens)
|
363
412
|
else
|
364
|
-
|
413
|
+
decode_entities(self.inner_text)
|
365
414
|
end
|
366
415
|
|
367
416
|
content = erb_to_interpolation(content, options)
|
@@ -382,6 +431,17 @@ module Haml
|
|
382
431
|
"#{tabulate(tabs)}:#{filter}\n#{content}"
|
383
432
|
end
|
384
433
|
|
434
|
+
# TODO: this method is utterly awful, find a better way to decode HTML entities.
|
435
|
+
def decode_entities(str)
|
436
|
+
str.gsub(/&[\S]+;/) do |entity|
|
437
|
+
begin
|
438
|
+
[Nokogiri::HTML::NamedCharacters[entity[1..-2]]].pack("C")
|
439
|
+
rescue TypeError
|
440
|
+
entity
|
441
|
+
end
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
385
445
|
def static_attribute?(name, options)
|
386
446
|
attr_hash[name] && !dynamic_attribute?(name, options)
|
387
447
|
end
|
@@ -406,7 +466,7 @@ module Haml
|
|
406
466
|
# that's prettier than that produced by Hash#inspect
|
407
467
|
def haml_attributes(options)
|
408
468
|
attrs = attr_hash.sort.map do |name, value|
|
409
|
-
haml_attribute_pair(name, value, options)
|
469
|
+
haml_attribute_pair(name, value.to_s, options)
|
410
470
|
end
|
411
471
|
if options[:html_style_attributes]
|
412
472
|
"(#{attrs.join(' ')})"
|
@@ -418,12 +478,20 @@ module Haml
|
|
418
478
|
# Returns the string representation of a single attribute key value pair
|
419
479
|
def haml_attribute_pair(name, value, options)
|
420
480
|
value = dynamic_attribute?(name, options) ? dynamic_attributes[name] : value.inspect
|
481
|
+
|
421
482
|
if options[:html_style_attributes]
|
422
|
-
"#{name}=#{value}"
|
423
|
-
|
424
|
-
|
425
|
-
|
483
|
+
return "#{name}=#{value}"
|
484
|
+
end
|
485
|
+
|
486
|
+
if name.index(/\W/)
|
487
|
+
return "#{name.inspect} => #{value}"
|
426
488
|
end
|
489
|
+
|
490
|
+
if options[:ruby19_style_attributes]
|
491
|
+
return "#{name}: #{value}"
|
492
|
+
end
|
493
|
+
|
494
|
+
":#{name} => #{value}"
|
427
495
|
end
|
428
496
|
end
|
429
497
|
end
|
data/lib/html2haml/html/erb.rb
CHANGED
@@ -2,10 +2,10 @@ require 'cgi'
|
|
2
2
|
require 'erubis'
|
3
3
|
require 'ruby_parser'
|
4
4
|
|
5
|
-
module
|
5
|
+
module Html2haml
|
6
6
|
class HTML
|
7
7
|
# A class for converting ERB code into a format that's easier
|
8
|
-
# for the {
|
8
|
+
# for the {Html2haml::HTML} Nokogiri-based parser to understand.
|
9
9
|
#
|
10
10
|
# Uses [Erubis](http://www.kuwata-lab.com/erubis)'s extensible parsing powers
|
11
11
|
# to parse the ERB in a reliable way,
|
@@ -13,17 +13,17 @@ module Haml
|
|
13
13
|
# to figure out whether a given chunk of Ruby code starts a block or not.
|
14
14
|
#
|
15
15
|
# The ERB tags are converted to HTML tags in the following way.
|
16
|
-
# `<% ... %>` is converted into `<
|
17
|
-
# `<%= ... %>` is converted into `<
|
16
|
+
# `<% ... %>` is converted into `<haml_silent> ... </haml_silent>`.
|
17
|
+
# `<%= ... %>` is converted into `<haml_loud> ... </haml_loud>`.
|
18
18
|
# Finally, if either of these opens a Ruby block,
|
19
|
-
# `<
|
19
|
+
# `<haml_block> ... </haml_block>` will wrap the entire contents of the block -
|
20
20
|
# that is, everything that should be indented beneath the previous silent or loud tag.
|
21
21
|
class ERB < Erubis::Basic::Engine
|
22
|
-
# Compiles an ERB template into a HTML document containing `
|
22
|
+
# Compiles an ERB template into a HTML document containing `haml_*` tags.
|
23
23
|
#
|
24
24
|
# @param template [String] The ERB template
|
25
25
|
# @return [String] The output document
|
26
|
-
# @see
|
26
|
+
# @see Html2haml::HTML::ERB
|
27
27
|
def self.compile(template)
|
28
28
|
new(template).src
|
29
29
|
end
|
@@ -48,8 +48,8 @@ module Haml
|
|
48
48
|
end
|
49
49
|
|
50
50
|
# Concatenates a silent Ruby statement onto the source buffer.
|
51
|
-
# This uses the `<
|
52
|
-
# and may close and/or open a Ruby block with the `<
|
51
|
+
# This uses the `<haml_silent>` tag,
|
52
|
+
# and may close and/or open a Ruby block with the `<haml_block>` tag.
|
53
53
|
#
|
54
54
|
# In particular, a block is closed if this statement is some form of `end`,
|
55
55
|
# opened if it's a block opener like `do`, `if`, or `begin`,
|
@@ -59,9 +59,9 @@ module Haml
|
|
59
59
|
# @param src [String] The source buffer
|
60
60
|
# @param code [String] The Ruby statement to add to the buffer
|
61
61
|
def add_stmt(src, code)
|
62
|
-
src << '</
|
63
|
-
src << '<
|
64
|
-
src << '<
|
62
|
+
src << '</haml_block>' if block_closer?(code) || mid_block?(code)
|
63
|
+
src << '<haml_silent>' << h(code) << '</haml_silent>' unless code.strip == "end"
|
64
|
+
src << '<haml_block>' if block_opener?(code) || mid_block?(code)
|
65
65
|
end
|
66
66
|
|
67
67
|
# Concatenates a Ruby expression that's printed to the document
|
@@ -73,8 +73,8 @@ module Haml
|
|
73
73
|
# @param src [String] The source buffer
|
74
74
|
# @param code [String] The Ruby expression to add to the buffer
|
75
75
|
def add_expr_literal(src, code)
|
76
|
-
src << '<
|
77
|
-
src << '<
|
76
|
+
src << '<haml_loud>' << h(code) << '</haml_loud>'
|
77
|
+
src << '<haml_block>' if block_opener?(code)
|
78
78
|
end
|
79
79
|
|
80
80
|
# `html2haml` doesn't support debugging expressions.
|
data/lib/html2haml/version.rb
CHANGED
data/test/erb_test.rb
CHANGED
@@ -10,6 +10,12 @@ class ErbTest < MiniTest::Unit::TestCase
|
|
10
10
|
|
11
11
|
def test_inline_erb
|
12
12
|
assert_equal("%p= foo", render_erb("<p><%= foo %></p>"))
|
13
|
+
assert_equal(<<HAML.rstrip, render_erb(<<HTML))
|
14
|
+
%p= foo
|
15
|
+
HAML
|
16
|
+
<p><%= foo %>
|
17
|
+
</p>
|
18
|
+
HTML
|
13
19
|
end
|
14
20
|
|
15
21
|
def test_non_inline_erb
|
@@ -27,13 +33,6 @@ HTML
|
|
27
33
|
HAML
|
28
34
|
<p>
|
29
35
|
<%= foo %></p>
|
30
|
-
HTML
|
31
|
-
assert_equal(<<HAML.rstrip, render_erb(<<HTML))
|
32
|
-
%p
|
33
|
-
= foo
|
34
|
-
HAML
|
35
|
-
<p><%= foo %>
|
36
|
-
</p>
|
37
36
|
HTML
|
38
37
|
end
|
39
38
|
|
@@ -460,15 +459,15 @@ ERB
|
|
460
459
|
def test_can_parse_ruby_19_hashes_as_arguments
|
461
460
|
erb = "<%= foobar 'foo', {bar: 'baz'} %>"
|
462
461
|
begin
|
463
|
-
|
462
|
+
Html2haml::HTML::ERB.new(erb)
|
464
463
|
rescue
|
465
464
|
flunk "should not raise an error"
|
466
465
|
end
|
467
466
|
end
|
468
467
|
|
469
468
|
def test_should_wrap_in_silent
|
470
|
-
assert_equal(<<HTML.rstrip,
|
471
|
-
<
|
469
|
+
assert_equal(<<HTML.rstrip, Html2haml::HTML::ERB.new(<<ERB).src)
|
470
|
+
<haml_silent> some_variable_or_function \n</haml_silent>
|
472
471
|
HTML
|
473
472
|
<% some_variable_or_function %>
|
474
473
|
ERB
|
@@ -476,8 +475,8 @@ ERB
|
|
476
475
|
|
477
476
|
#comment content is removed by erubis
|
478
477
|
def test_should_wrap_process_comments_as_empty_lines
|
479
|
-
assert_equal(<<HTML.rstrip,
|
480
|
-
<
|
478
|
+
assert_equal(<<HTML.rstrip, Html2haml::HTML::ERB.new(<<ERB).src)
|
479
|
+
<haml_silent>\n</haml_silent>
|
481
480
|
HTML
|
482
481
|
<%# some_variable_or_function %>
|
483
482
|
ERB
|
data/test/html2haml_test.rb
CHANGED
@@ -45,6 +45,13 @@ class Html2HamlTest < MiniTest::Unit::TestCase
|
|
45
45
|
render('<meta http-equiv="Content-Type" content="text/html" />', :html_style_attributes => true))
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_should_have_ruby_19_hash_style_attributes
|
49
|
+
assert_equal('%input{name: "login", type: "text"}/',
|
50
|
+
render('<input type="text" name="login" />', :ruby19_style_attributes => true))
|
51
|
+
assert_equal('%meta{content: "text/html", "http-equiv" => "Content-Type"}/',
|
52
|
+
render('<meta http-equiv="Content-Type" content="text/html" />', :ruby19_style_attributes => true))
|
53
|
+
end
|
54
|
+
|
48
55
|
def test_class_with_dot_and_hash
|
49
56
|
assert_equal('%div{:class => "foo.bar"}', render("<div class='foo.bar'></div>"))
|
50
57
|
assert_equal('%div{:class => "foo#bar"}', render("<div class='foo#bar'></div>"))
|
@@ -81,7 +88,7 @@ HTML
|
|
81
88
|
end
|
82
89
|
|
83
90
|
def test_self_closing_tag
|
84
|
-
assert_equal("%
|
91
|
+
assert_equal("%img/", render("<img />"))
|
85
92
|
end
|
86
93
|
|
87
94
|
def test_inline_text
|
@@ -142,6 +149,21 @@ HTML
|
|
142
149
|
return "12" & "13";
|
143
150
|
}
|
144
151
|
HAML
|
152
|
+
<script type="text/javascript">
|
153
|
+
function foo() {
|
154
|
+
return "12" & "13";
|
155
|
+
}
|
156
|
+
</script>
|
157
|
+
HTML
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_script_tag_with_html_escaped_javascript
|
161
|
+
assert_equal(<<HAML.rstrip, render(<<HTML))
|
162
|
+
:javascript
|
163
|
+
function foo() {
|
164
|
+
return "12" & "13";
|
165
|
+
}
|
166
|
+
HAML
|
145
167
|
<script type="text/javascript">
|
146
168
|
function foo() {
|
147
169
|
return "12" & "13";
|
@@ -333,24 +355,22 @@ HTML
|
|
333
355
|
|
334
356
|
# Encodings
|
335
357
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
assert_equal('Invalid UTF-16LE character "\xFE"', e.message)
|
353
|
-
end
|
358
|
+
def test_encoding_error
|
359
|
+
render("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
|
360
|
+
assert(false, "Expected exception")
|
361
|
+
rescue Haml::Error => e
|
362
|
+
assert_equal(3, e.line)
|
363
|
+
assert_match(/Invalid UTF-8 character/, e.message)
|
364
|
+
end
|
365
|
+
|
366
|
+
def test_ascii_incompatible_encoding_error
|
367
|
+
template = "foo\nbar\nb_z".encode("utf-16le")
|
368
|
+
template[9] = "\xFE".force_encoding("utf-16le")
|
369
|
+
render(template)
|
370
|
+
assert(false, "Expected exception")
|
371
|
+
rescue Haml::Error => e
|
372
|
+
assert_equal(3, e.line)
|
373
|
+
assert_match(/Invalid UTF-16LE character/, e.message)
|
354
374
|
end
|
355
375
|
|
356
376
|
# Regression Tests
|
@@ -361,4 +381,25 @@ HTML
|
|
361
381
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
362
382
|
HTML
|
363
383
|
end
|
384
|
+
|
385
|
+
def test_html_document_without_doctype
|
386
|
+
assert_equal(<<HAML.rstrip, render(<<HTML))
|
387
|
+
!!!
|
388
|
+
%html
|
389
|
+
%head
|
390
|
+
%title Hello
|
391
|
+
%body
|
392
|
+
%p Hello
|
393
|
+
HAML
|
394
|
+
<html>
|
395
|
+
<head>
|
396
|
+
<title>Hello</title>
|
397
|
+
</head>
|
398
|
+
<body>
|
399
|
+
<p>Hello</p>
|
400
|
+
</body>
|
401
|
+
</html>
|
402
|
+
HTML
|
403
|
+
end
|
404
|
+
|
364
405
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,132 +1,126 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: html2haml
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 1
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
version: 1.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0.beta.1
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- Norman Clarke
|
8
|
+
- Stefan Natchev
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
prerelease: false
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
12
|
+
date: 2013-07-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
25
18
|
- - ~>
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
- 0
|
29
|
-
- 8
|
30
|
-
- 6
|
31
|
-
version: 0.8.6
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.6.0
|
32
21
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: erubis
|
36
22
|
prerelease: false
|
37
|
-
|
38
|
-
requirements:
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
39
25
|
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 1.6.0
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: erubis
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
45
34
|
version: 2.7.0
|
46
35
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: ruby_parser
|
50
36
|
prerelease: false
|
51
|
-
|
52
|
-
requirements:
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
53
39
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 2.7.0
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: ruby_parser
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 3.2.1
|
60
49
|
type: :runtime
|
61
|
-
version_requirements: *id003
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: haml
|
64
50
|
prerelease: false
|
65
|
-
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 3.2.1
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: haml
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 4.0.0
|
76
63
|
type: :runtime
|
77
|
-
version_requirements: *id004
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: simplecov
|
80
64
|
prerelease: false
|
81
|
-
|
82
|
-
requirements:
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 4.0.0
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: simplecov
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
83
74
|
- - ~>
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
segments:
|
86
|
-
- 0
|
87
|
-
- 7
|
88
|
-
- 1
|
75
|
+
- !ruby/object:Gem::Version
|
89
76
|
version: 0.7.1
|
90
77
|
type: :development
|
91
|
-
version_requirements: *id005
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: minitest
|
94
78
|
prerelease: false
|
95
|
-
|
96
|
-
requirements:
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ~>
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 0.7.1
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: minitest
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
97
88
|
- - ~>
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
segments:
|
100
|
-
- 4
|
101
|
-
- 4
|
102
|
-
- 0
|
89
|
+
- !ruby/object:Gem::Version
|
103
90
|
version: 4.4.0
|
104
91
|
type: :development
|
105
|
-
version_requirements: *id006
|
106
|
-
- !ruby/object:Gem::Dependency
|
107
|
-
name: rake
|
108
92
|
prerelease: false
|
109
|
-
|
110
|
-
requirements:
|
111
|
-
- -
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
|
114
|
-
|
115
|
-
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ~>
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 4.4.0
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rake
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
116
105
|
type: :development
|
117
|
-
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
118
112
|
description: Converts HTML into Haml
|
119
|
-
email:
|
113
|
+
email:
|
120
114
|
- norman@njclarke.com
|
121
|
-
|
115
|
+
- stefan.natchev@gmail.com
|
116
|
+
executables:
|
122
117
|
- html2haml
|
123
118
|
extensions: []
|
124
|
-
|
125
119
|
extra_rdoc_files: []
|
126
|
-
|
127
|
-
files:
|
120
|
+
files:
|
128
121
|
- .gitignore
|
129
122
|
- .travis.yml
|
123
|
+
- .yardopts
|
130
124
|
- Changelog.markdown
|
131
125
|
- Gemfile
|
132
126
|
- MIT-LICENSE
|
@@ -142,37 +136,30 @@ files:
|
|
142
136
|
- test/erb_test.rb
|
143
137
|
- test/html2haml_test.rb
|
144
138
|
- test/test_helper.rb
|
145
|
-
has_rdoc: true
|
146
139
|
homepage: http://haml.info
|
147
140
|
licenses: []
|
148
|
-
|
141
|
+
metadata: {}
|
149
142
|
post_install_message:
|
150
143
|
rdoc_options: []
|
151
|
-
|
152
|
-
require_paths:
|
144
|
+
require_paths:
|
153
145
|
- lib
|
154
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
-
requirements:
|
156
|
-
- -
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
- !ruby/object:Gem::Version
|
165
|
-
segments:
|
166
|
-
- 0
|
167
|
-
version: "0"
|
146
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - '>='
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 1.9.2
|
151
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - '>'
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: 1.3.1
|
168
156
|
requirements: []
|
169
|
-
|
170
157
|
rubyforge_project:
|
171
|
-
rubygems_version:
|
158
|
+
rubygems_version: 2.0.3
|
172
159
|
signing_key:
|
173
|
-
specification_version:
|
160
|
+
specification_version: 4
|
174
161
|
summary: Converts HTML into Haml
|
175
|
-
test_files:
|
162
|
+
test_files:
|
176
163
|
- test/erb_test.rb
|
177
164
|
- test/html2haml_test.rb
|
178
165
|
- test/test_helper.rb
|