himl 0.1.0
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/.gitignore +11 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +21 -0
- data/README.md +195 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/himl.gemspec +33 -0
- data/lib/himl.rb +5 -0
- data/lib/himl/handler.rb +25 -0
- data/lib/himl/parser.rb +174 -0
- data/lib/himl/railtie.rb +19 -0
- data/lib/himl/version.rb +5 -0
- metadata +141 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f6bf41980a84e9ae83b46f6bc7066ae6b8e8eacbd52ad8df5da3fbb3a23d9617
|
4
|
+
data.tar.gz: aa083fd9b6d315151b4549e9de289a0c5a31d4c199e697482dcb3ce475aac9b1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79df19e4b753f89b853457026a9065f63a02272745056e65b2e93d01fc5fb3b5a228254ff74b0902f3c9f451db3407fd00191a0372c5c49348f562de77fe9781
|
7
|
+
data.tar.gz: fe1df061276d7696d73bb15356500cf17980976510eeda51a564508f9abc4adf10e665c9d6565960d2c8cad3ac70fbc2c866d3f746b1c50945c3400a82df1652
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2019 Akira Matsuda
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
# Himl
|
2
|
+
|
3
|
+
Himl is an HTML-based Indented Markup Language for Ruby.
|
4
|
+
|
5
|
+
|
6
|
+
## What's This?
|
7
|
+
|
8
|
+
Himl is a yet another template engine for Haml-lovers and non Haml lovers, deriving HTML validity from Haml and syntax intuitiveness from ERB.
|
9
|
+
|
10
|
+
|
11
|
+
## Motivation
|
12
|
+
|
13
|
+
Haml is a great template engine that liberates us from annoying HTML bugs.
|
14
|
+
By automatically closing the HTML tags, Haml always produces perfectly structured 100% valid HTML responses.
|
15
|
+
Actually, I've never experienced the HTML closing tag mismatch error over the past 10 years or so, thanks to Haml.
|
16
|
+
|
17
|
+
However, the Haml (or Slim or whatever equivalent) syntax is very much different from that of HTML.
|
18
|
+
And to be honest, I still rarely can complete my template markup works without consulting the Haml online reference manual.
|
19
|
+
|
20
|
+
Oh, why do we have to learn another markup language syntax where we just want to generate HTML documents?
|
21
|
+
HTML has tags. HTML has indentations. Why can't we just use them?
|
22
|
+
|
23
|
+
|
24
|
+
## Syntax
|
25
|
+
|
26
|
+
Himl syntax is a hybrid of ERB and Haml.
|
27
|
+
Himl is besically just a kind of ERB. Indeed, Himl documents are compiled to ERB internally, then rendered by the ERB handler.
|
28
|
+
|
29
|
+
So, the following Himl template opening and closing a tag will be compiled to exactly the same ERB template.
|
30
|
+
|
31
|
+
Himl
|
32
|
+
```erb
|
33
|
+
<div>
|
34
|
+
</div>
|
35
|
+
```
|
36
|
+
|
37
|
+
ERB
|
38
|
+
```erb
|
39
|
+
<div>
|
40
|
+
</div>
|
41
|
+
```
|
42
|
+
|
43
|
+
You can omit closing tags. Then Himl auto-closes them, just like Haml does.
|
44
|
+
|
45
|
+
Himl
|
46
|
+
```erb
|
47
|
+
<div>
|
48
|
+
```
|
49
|
+
ERB
|
50
|
+
```erb
|
51
|
+
<div>
|
52
|
+
</div>
|
53
|
+
```
|
54
|
+
|
55
|
+
For nesting tags, use whitespaces just like you do in the Haml templates.
|
56
|
+
|
57
|
+
Himl
|
58
|
+
```erb
|
59
|
+
<section>
|
60
|
+
<div>
|
61
|
+
```
|
62
|
+
|
63
|
+
ERB
|
64
|
+
```erb
|
65
|
+
<section>
|
66
|
+
<div>
|
67
|
+
</div>
|
68
|
+
</section>
|
69
|
+
```
|
70
|
+
|
71
|
+
Of course you can include dynamic Ruby code in the ERB way.
|
72
|
+
|
73
|
+
Himl
|
74
|
+
```erb
|
75
|
+
<section>
|
76
|
+
<div>
|
77
|
+
<%= post.content %>
|
78
|
+
```
|
79
|
+
|
80
|
+
ERB
|
81
|
+
```erb
|
82
|
+
<section>
|
83
|
+
<div>
|
84
|
+
<%= post.content %>
|
85
|
+
</div>
|
86
|
+
</section>
|
87
|
+
```
|
88
|
+
|
89
|
+
You can open and close tags in the same line.
|
90
|
+
|
91
|
+
Himl
|
92
|
+
```erb
|
93
|
+
<section>
|
94
|
+
<h1><%= post.title %></h1>
|
95
|
+
```
|
96
|
+
|
97
|
+
ERB
|
98
|
+
```erb
|
99
|
+
<section>
|
100
|
+
<h1><%= post.title %></h1>
|
101
|
+
</section>
|
102
|
+
```
|
103
|
+
|
104
|
+
There's no special syntax for adding HTML attributes to the tags. You see, it's just ERB.
|
105
|
+
|
106
|
+
Himl
|
107
|
+
```erb
|
108
|
+
<section class="container">
|
109
|
+
<div class="content">
|
110
|
+
```
|
111
|
+
|
112
|
+
ERB
|
113
|
+
```erb
|
114
|
+
<section class="container">
|
115
|
+
<div class="content">
|
116
|
+
</div>
|
117
|
+
</section>
|
118
|
+
```
|
119
|
+
|
120
|
+
|
121
|
+
## Example
|
122
|
+
|
123
|
+
Following is a comparison of ERB, Haml, and Himl templates that renderes similar HTML results (the Haml example is taken from the [Haml documentation](http://haml.info/)).
|
124
|
+
You'll notice that Himl consumes the same LOC with the Haml version for expressing the structure of this document, without introducing any new syntax from the ERB version.
|
125
|
+
|
126
|
+
### ERB Template
|
127
|
+
```erb
|
128
|
+
<section class="container">
|
129
|
+
<h1><%= post.title %></h1>
|
130
|
+
<h2><%= post.subtitle %></h2>
|
131
|
+
<div class="content">
|
132
|
+
<%= post.content %>
|
133
|
+
</div>
|
134
|
+
</section>
|
135
|
+
|
136
|
+
```
|
137
|
+
|
138
|
+
### Haml Template
|
139
|
+
```haml
|
140
|
+
%section.container
|
141
|
+
%h1= post.title
|
142
|
+
%h2= post.subtitle
|
143
|
+
.content
|
144
|
+
= post.content
|
145
|
+
```
|
146
|
+
|
147
|
+
### Himl Template
|
148
|
+
```erb
|
149
|
+
<section class="container">
|
150
|
+
<h1><%= post.title %></h1>
|
151
|
+
<h2><%= post.subtitle %></h2>
|
152
|
+
<div class="content">
|
153
|
+
<%= post.content %>
|
154
|
+
```
|
155
|
+
|
156
|
+
|
157
|
+
## Installation
|
158
|
+
|
159
|
+
Bundle 'himl' gem to your project.
|
160
|
+
|
161
|
+
|
162
|
+
## Usage
|
163
|
+
|
164
|
+
The gem contains the Himl template handler for Rails.
|
165
|
+
You need no extra configurations for your Rails app to render `*.himl` templates.
|
166
|
+
|
167
|
+
|
168
|
+
## Runtime Performance
|
169
|
+
|
170
|
+
Since every Himl template is converted to ERB, then cached as a Ruby method inside the view frameworks (such as Action View in Rails), Himl runtime performance in production is exactly the same with that of ERB.
|
171
|
+
|
172
|
+
|
173
|
+
## Contributing
|
174
|
+
|
175
|
+
Pull requests are welcome on GitHub at https://github.com/amatsuda/himl.
|
176
|
+
|
177
|
+
|
178
|
+
## Other Template Engines That I Maintain
|
179
|
+
|
180
|
+
### [jb](https://github.com/amatsuda/jb)
|
181
|
+
|
182
|
+
A faster and simpler and stronger alternative to Jbuilder.
|
183
|
+
|
184
|
+
### [string_template](https://github.com/amatsuda/string_template)
|
185
|
+
|
186
|
+
The ultimate fastest template engine for Rails in the world.
|
187
|
+
|
188
|
+
### [Haml](https://github.com/haml/haml)
|
189
|
+
|
190
|
+
The one that you may be currently using everyday.
|
191
|
+
|
192
|
+
|
193
|
+
## License
|
194
|
+
|
195
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "himl"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/himl.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "himl/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "himl"
|
8
|
+
spec.version = Himl::VERSION
|
9
|
+
spec.authors = ["Akira Matsuda"]
|
10
|
+
spec.email = ["ronnie@dio.jp"]
|
11
|
+
|
12
|
+
spec.summary = 'HTML-based Indented Markup Language'
|
13
|
+
spec.description = 'HTML + ERB + Haml = Himl'
|
14
|
+
spec.homepage = 'https://github.com/amatsuda/himl'
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Specify which files should be added to the gem when it is released.
|
18
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_dependency 'nokogiri'
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
29
|
+
spec.add_development_dependency 'rake'
|
30
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
31
|
+
spec.add_development_dependency 'test-unit'
|
32
|
+
spec.add_development_dependency 'byebug'
|
33
|
+
end
|
data/lib/himl.rb
ADDED
data/lib/himl/handler.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Himl
|
4
|
+
class Handler
|
5
|
+
ERB_HANDLER = ActionView::Template.handler_for_extension('erb')
|
6
|
+
|
7
|
+
def self.call(template, source = nil)
|
8
|
+
new.call(template, source || template.source)
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(template, source)
|
12
|
+
parser = Himl::Parser.new
|
13
|
+
parser.call(source)
|
14
|
+
erb = parser.to_erb
|
15
|
+
|
16
|
+
escape = ERB_HANDLER.respond_to?(:escape_ignore_list) ? ERB_HANDLER.escape_ignore_list.include?(template.type) : ERB_HANDLER.escape_whitelist.include?(template.type)
|
17
|
+
|
18
|
+
ERB_HANDLER.erb_implementation.new(
|
19
|
+
erb,
|
20
|
+
escape: escape,
|
21
|
+
trim: (ERB_HANDLER.erb_trim_mode == "-")
|
22
|
+
).src
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/himl/parser.rb
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
module Himl
|
6
|
+
class Parser
|
7
|
+
class Document < Nokogiri::XML::SAX::Document
|
8
|
+
Tag = Struct.new(:name, :indentation, :line, :block_end) do
|
9
|
+
def end_tag
|
10
|
+
if has_block?
|
11
|
+
"#{' ' * indentation}<% #{block_end} %>\n"
|
12
|
+
else
|
13
|
+
"#{' ' * indentation}</#{name}>\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def erb_tag?
|
18
|
+
name == ERB_TAG
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_block?
|
22
|
+
block_end
|
23
|
+
end
|
24
|
+
|
25
|
+
def block_start=(start)
|
26
|
+
self.block_end = case start
|
27
|
+
when 'do'
|
28
|
+
'end'
|
29
|
+
when '{'
|
30
|
+
'}'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
ErbEndMarker = Class.new(Tag)
|
36
|
+
ErbBlockStartMarker = Class.new(Tag)
|
37
|
+
|
38
|
+
ROOT_NODE = 'THE_HIML_ROOT_NODE'
|
39
|
+
ERB_TAG = 'HIML_ERB_TAG'
|
40
|
+
ERB_TAG_REGEXP = /<%(?:=|==|-|#|%)?(.*?)(?:[-=])?%>/
|
41
|
+
BLOCK_REGEXP = /\s*((\s+|\))do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
42
|
+
VOID_TAGS = %w(area base br col command embed hr img input keygen link meta param source track wbr).freeze # https://www.w3.org/TR/2011/WD-html-markup-20110113/syntax.html#syntax-elements
|
43
|
+
|
44
|
+
# Copied from Haml
|
45
|
+
MID_BLOCK_KEYWORDS = %w[else elsif rescue ensure end when]
|
46
|
+
START_BLOCK_KEYWORDS = %w[if begin case unless]
|
47
|
+
START_BLOCK_KEYWORD_REGEX = /(?:\w+(?:,\s*\w+)*\s*=\s*)?(#{START_BLOCK_KEYWORDS.join('|')})/
|
48
|
+
BLOCK_KEYWORD_REGEX = /^-?\s*(?:(#{MID_BLOCK_KEYWORDS.join('|')})|#{START_BLOCK_KEYWORD_REGEX.source})\b/
|
49
|
+
|
50
|
+
attr_accessor :context
|
51
|
+
|
52
|
+
def initialize(template)
|
53
|
+
@original_template, @tags, @end_tags = template, [], []
|
54
|
+
template = template.gsub(ERB_TAG_REGEXP, "<#{ERB_TAG}>\\1</#{ERB_TAG}>")
|
55
|
+
@lines = "<#{ROOT_NODE}>\n#{template}</#{ROOT_NODE}>\n".lines
|
56
|
+
end
|
57
|
+
|
58
|
+
def template
|
59
|
+
@lines.join
|
60
|
+
end
|
61
|
+
|
62
|
+
def erb_template
|
63
|
+
lines = @original_template.lines
|
64
|
+
|
65
|
+
@end_tags.reverse_each do |index, tag|
|
66
|
+
lines.insert index - 1, tag
|
67
|
+
end
|
68
|
+
|
69
|
+
lines.join
|
70
|
+
end
|
71
|
+
|
72
|
+
def start_element(name, *)
|
73
|
+
@current_tag = name
|
74
|
+
|
75
|
+
close_tags unless name == ROOT_NODE
|
76
|
+
|
77
|
+
@tags << Tag.new(name, current_indentation, current_line) unless VOID_TAGS.include? name.downcase
|
78
|
+
end
|
79
|
+
|
80
|
+
def end_element(name)
|
81
|
+
last_tag = @tags.last
|
82
|
+
return if last_tag.name == ROOT_NODE
|
83
|
+
|
84
|
+
if (name == ERB_TAG) && last_tag.is_a?(ErbEndMarker)
|
85
|
+
raise SyntaxError "end of block indentation mismatch at line: #{current_line}, column: #{current_indentation}" if last_tag.indentation != @tags[-2].indentation
|
86
|
+
|
87
|
+
@tags.pop
|
88
|
+
@tags.pop
|
89
|
+
end
|
90
|
+
|
91
|
+
if name == last_tag.name
|
92
|
+
if ((last_tag.indentation == current_indentation) || (last_tag.line == current_line))
|
93
|
+
@tags.pop
|
94
|
+
else
|
95
|
+
raise SyntaxError, "end tag indentation mismatch for <#{name}> at line: #{current_line}, column: #{current_indentation}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
@tags << ErbBlockStartMarker.new(nil, last_tag.indentation, last_tag.line, last_tag.block_end) if (last_tag.name == ERB_TAG) && last_tag.has_block?
|
99
|
+
end
|
100
|
+
|
101
|
+
def characters(string)
|
102
|
+
if (last_tag = @tags.last).erb_tag?
|
103
|
+
case string.strip
|
104
|
+
when 'end', '}'
|
105
|
+
@tags.pop
|
106
|
+
@tags << ErbEndMarker.new(nil, last_tag.indentation, last_tag.line)
|
107
|
+
when BLOCK_KEYWORD_REGEX
|
108
|
+
@tags.pop
|
109
|
+
@tags.pop if (ErbBlockStartMarker === @tags.last) && (@tags.last.indentation == last_tag.indentation)
|
110
|
+
@tags << ErbBlockStartMarker.new(nil, last_tag.indentation, last_tag.line, 'end')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
erb_tag = @tags.reverse_each.detect(&:erb_tag?)
|
115
|
+
if erb_tag && (match = BLOCK_REGEXP.match(string))
|
116
|
+
erb_tag.block_start = match[1].strip
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def close_document!
|
121
|
+
@current_tag = nil
|
122
|
+
close_tags
|
123
|
+
|
124
|
+
raise SyntaxError, "Unclosed tag: #{@tags.last}" if @tags.last.name != ROOT_NODE
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def current_indentation
|
130
|
+
line = @lines[current_line]
|
131
|
+
line.slice(0, context.column).rindex('<')
|
132
|
+
end
|
133
|
+
|
134
|
+
def current_line
|
135
|
+
(context.column == 1) && (context.line > 1) ? context.line - 2 : context.line - 1
|
136
|
+
end
|
137
|
+
|
138
|
+
def last_non_empty_line
|
139
|
+
@lines[0, current_line].each_with_index.reverse_each {|str, i| break i + 1 unless str.chomp.empty? }
|
140
|
+
end
|
141
|
+
|
142
|
+
def close_tags
|
143
|
+
while (@tags.last.name != ROOT_NODE) && (current_indentation <= @tags.last.indentation)
|
144
|
+
if (@current_tag == ERB_TAG) && (ErbBlockStartMarker === @tags.last) && (@tags.last.indentation == current_indentation)
|
145
|
+
break
|
146
|
+
else
|
147
|
+
@end_tags << [last_non_empty_line, @tags.last.end_tag]
|
148
|
+
@tags.pop
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def call(template)
|
155
|
+
parse_template template
|
156
|
+
end
|
157
|
+
|
158
|
+
def to_erb
|
159
|
+
@document.erb_template
|
160
|
+
end
|
161
|
+
|
162
|
+
private
|
163
|
+
|
164
|
+
def parse_template(template)
|
165
|
+
@document = Document.new template
|
166
|
+
@parser = Nokogiri::XML::SAX::Parser.new(@document)
|
167
|
+
@parser.parse @document.template do |ctx|
|
168
|
+
@document.context = ctx
|
169
|
+
end
|
170
|
+
|
171
|
+
@document.close_document!
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
data/lib/himl/railtie.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rails'
|
5
|
+
|
6
|
+
module Himl
|
7
|
+
class Railtie < ::Rails::Railtie
|
8
|
+
initializer 'himl' do
|
9
|
+
ActiveSupport.on_load :action_view do
|
10
|
+
require_relative 'handler'
|
11
|
+
|
12
|
+
ActionView::Template.register_template_handler :himl, Himl::Handler
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
rescue LoadError
|
18
|
+
# do nothing
|
19
|
+
end
|
data/lib/himl/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: himl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Akira Matsuda
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-03-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: test-unit
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: HTML + ERB + Haml = Himl
|
98
|
+
email:
|
99
|
+
- ronnie@dio.jp
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".travis.yml"
|
106
|
+
- Gemfile
|
107
|
+
- MIT-LICENSE
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- bin/console
|
111
|
+
- bin/setup
|
112
|
+
- himl.gemspec
|
113
|
+
- lib/himl.rb
|
114
|
+
- lib/himl/handler.rb
|
115
|
+
- lib/himl/parser.rb
|
116
|
+
- lib/himl/railtie.rb
|
117
|
+
- lib/himl/version.rb
|
118
|
+
homepage: https://github.com/amatsuda/himl
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
metadata: {}
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
requirements: []
|
137
|
+
rubygems_version: 3.0.3
|
138
|
+
signing_key:
|
139
|
+
specification_version: 4
|
140
|
+
summary: HTML-based Indented Markup Language
|
141
|
+
test_files: []
|