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 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
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ Gemfile.lock
11
+ .byebug_history
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.7.0
7
+ before_install: gem install bundler -v 2.0.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in himl.gemspec
4
+ gemspec
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
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'himl/version'
4
+ require_relative 'himl/parser'
5
+ require_relative 'himl/railtie'
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Himl
4
+ VERSION = '0.1.0'
5
+ end
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: []