dhtml 0.1.3

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: 0d19e6ad8effeadc4ba60d79a1df5cc0a66ca25e7c8f75f513e73faf439abccf
4
+ data.tar.gz: 42e1449cda9a9874bd36bb0b261537c4f147b2af56b0e26aba742b231297332f
5
+ SHA512:
6
+ metadata.gz: f26aaa41af798393b2865477d742bf59c9723dc3714d43e1f2e7c463c8465801c7947c1cc33b45671e05ef68f63bff1f7db5e684cbd50720d6df3f9cf18c286a
7
+ data.tar.gz: 07c3a590c080c087a543628db94fe171e16f7746f7863110c82b7a9a6aa18a55378d39abb95b64abd96b47251b94e25d3e0f3b4831d2f652431e8637b09d2152
data/CHANGELOG.md ADDED
@@ -0,0 +1,25 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog], and this project adheres to [Semantic Versioning].
5
+
6
+ ## [Unreleased]
7
+
8
+ ## [0.1.3] - 2021-05-10
9
+ ### Fixed
10
+ - The gemspec no longer uses absolute paths for the sources.
11
+
12
+ ## [0.1.2] - 2021-05-10
13
+ ### Added
14
+ - `reset` method so the document can be generated more than once.
15
+
16
+ ## [0.1.0] - 2021-05-10
17
+ - Initial release
18
+
19
+
20
+ [Unreleased]: https://github.com/hi5dev/dhtml/compare/v0.1.2...HEAD
21
+ [0.1.2]: https://github.com/hi5dev/dhtml/compare/v0.1.2..v0.1.0
22
+ [0.1.0]: https://github.com/hi5dev/dhtml/releases/tag/v0.1.0
23
+
24
+ [Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
25
+ [Semantic Versioning]: https://semver.org/spec/v2.0.0.html
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'rake', '~> 13.0'
8
+
9
+ gem 'minitest', '~> 5.14'
10
+
11
+ gem 'opal', '~> 1.0'
data/Gemfile.lock ADDED
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dhtml (0.1.3)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.2)
10
+ minitest (5.14.2)
11
+ opal (1.1.1)
12
+ ast (>= 2.3.0)
13
+ parser (~> 3.0)
14
+ parser (3.0.1.1)
15
+ ast (~> 2.4.1)
16
+ rake (13.0.3)
17
+
18
+ PLATFORMS
19
+ x86_64-linux
20
+
21
+ DEPENDENCIES
22
+ dhtml!
23
+ minitest (~> 5.14)
24
+ opal (~> 1.0)
25
+ rake (~> 13.0)
26
+
27
+ BUNDLED WITH
28
+ 2.2.16
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Hi5 Development, LLC
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,111 @@
1
+ # DHTML
2
+
3
+ A fast, simple, and elegant DSL for generating HTML using Ruby that is compatible with [Opal](https://opalrb.com/).
4
+
5
+ Here's an example:
6
+
7
+ ```ruby
8
+ extend DHTML
9
+
10
+ doctype :html
11
+
12
+ html(lang: 'en') {
13
+ head {
14
+ meta charset: 'utf-8'
15
+ title { 'Example' }
16
+ link rel: 'stylesheet', href: 'style.css'
17
+ script src: 'main.js'
18
+ }
19
+ body {
20
+ div(id: 'main') {
21
+ _p { <<~TEXT }
22
+ Some of Ruby's internal methods would be overwritten if this library added a method for all the
23
+ HTML tags. To solve this, the alias for these methods begins with an underscore:
24
+ TEXT
25
+
26
+ ol {
27
+ li { code { '_p' } }
28
+ li { code { '_select' } }
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ puts read_html
35
+ ```
36
+
37
+ ## Proof of Concept
38
+
39
+ Using Ruby to generate HTML makes it possible to write modular, easily testable views. Here's a simple
40
+ example:
41
+
42
+ ```ruby
43
+ module Layout
44
+ include DHTML
45
+
46
+ def inner_body
47
+ end
48
+
49
+ def render
50
+ reset if document.length > 0
51
+
52
+ doctype :html
53
+
54
+ html do
55
+ head do
56
+ title { 'Proof of Concept' }
57
+ end
58
+ body do
59
+ inner_body
60
+ end
61
+ end
62
+
63
+ finish
64
+ end
65
+ end
66
+
67
+ class IndexPage
68
+ include Layout
69
+
70
+ def inner_body
71
+ h1 { 'It works!' }
72
+ end
73
+ end
74
+
75
+ page = IndexPage.new
76
+
77
+ html = page.render
78
+
79
+ puts html.read
80
+
81
+ # => "<!doctype html><html><head><title>Proof of Concept</title></head><body><h1>It works!</h1></body></html>"
82
+ ```
83
+
84
+ It's easy to see how that could be plugged into many Ruby web frameworks. Here's how the above example can work with
85
+ Rack:
86
+
87
+ ```ruby
88
+ run -> (_env) do
89
+ [200, { Rack::CONTENT_TYPE => 'text/html' }, IndexPage.new.render]
90
+ end
91
+ ```
92
+
93
+ ## Development
94
+
95
+ A `Dockerfile` and Docker Compose configuration is provided to simplify the onboarding process. After cloning this
96
+ repository, all you have to do to get started is run the tests with:
97
+
98
+ $ docker-compose run test
99
+
100
+ You can log into the container with:
101
+
102
+ $ docker-compose run ruby ash
103
+
104
+ ## Contributing
105
+
106
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hi5dev/dhtml. Make sure to add your
107
+ contact information to `spec.authors` and `spec.email` in the gemspec file if you do contribute.
108
+
109
+ ## License
110
+
111
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/dhtml.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/dhtml/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'dhtml'
7
+ spec.version = DHTML::VERSION
8
+ spec.authors = ['Travis Haynes']
9
+ spec.email = %w[travis@hi5dev.com]
10
+
11
+ spec.summary = 'A fast, simple, and elegant DSL for generating HTML using Ruby. Also compatible with Opal.'
12
+ spec.description = spec.summary
13
+ spec.homepage = 'https://www.hi5dev.com/dhtml'
14
+ spec.license = 'MIT'
15
+
16
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
17
+
18
+ spec.metadata['homepage_uri'] = spec.homepage
19
+ spec.metadata['source_code_uri'] = 'https://github.com/hi5dev/dhtml'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/hi5dev/dhtml/blob/base/CHANGELOG.md'
21
+
22
+ spec.files = %w[
23
+ CHANGELOG.md
24
+ dhtml.gemspec
25
+ Gemfile
26
+ Gemfile.lock
27
+ lib/dhtml.rb
28
+ lib/dhtml/document.rb
29
+ lib/dhtml/opal.rb
30
+ lib/dhtml/version.rb
31
+ LICENSE.txt
32
+ README.md
33
+ ]
34
+
35
+ spec.require_paths = %w[lib]
36
+ end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
4
+
5
+ module DHTML
6
+ # Provides methods for generating HTML.
7
+ #
8
+ # @since 0.1.0
9
+ module Document
10
+ # Most commonly used HTML escape sequences.
11
+ #
12
+ # @type [Hash<String => String>]
13
+ # @since 0.1.0
14
+ ESCAPE_HTML = {
15
+ "'" => '&#x27;',
16
+ '"' => '&quot;',
17
+ '&' => '&amp;',
18
+ '/' => '&#x2F;',
19
+ '<' => '&lt;',
20
+ '>' => '&gt;',
21
+ }
22
+
23
+ # Regular expression that matches the most common characters that need to be escaped in HTML strings.
24
+ #
25
+ # @type [Regexp]
26
+ # @since 0.1.0
27
+ ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
28
+
29
+ # Writes the HTML doctype.
30
+ #
31
+ # @param [Symbol] type of document
32
+ # @return [Integer] number of bytes written to the document.
33
+ # @since 0.1.0
34
+ def doctype(type)
35
+ tag = case type
36
+ when :html3
37
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">|
38
+ when :html4
39
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">|
40
+ when :html4_framesets, :html4_fr
41
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">|
42
+ when :html4_transitional, :html4_tr
43
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">|
44
+ when :html5, :html
45
+ %|<!doctype html>|
46
+ else
47
+ fail ArgumentError, "unsupported doctype: #{type.inspect}"
48
+ end
49
+
50
+ document.write(tag)
51
+ end
52
+
53
+ # The document is written to this buffer.
54
+ #
55
+ # @return [StringIO]
56
+ # @since 0.1.0
57
+ def document
58
+ @document ||= StringIO.new
59
+ end
60
+
61
+ # Rewinds the document so it can be read.
62
+ #
63
+ # @return [StringIO]
64
+ # @since 0.1.0
65
+ def finish
66
+ document.tap(&:rewind)
67
+ end
68
+
69
+ # Generates an HTML attribute (e.g. +class="form"+).
70
+ #
71
+ # @param [Symbol, String] name
72
+ # @param [Symbol, String] value
73
+ # @return [String]
74
+ # @since 0.1.0
75
+ def html_attribute(name, value)
76
+ [h(name.to_s), h(value.to_s).inspect].join('=')
77
+ end
78
+
79
+ # Generates a string of HTML attributes from a Hash.
80
+ #
81
+ # @param [Hash] attributes
82
+ # @return [String]
83
+ # @since 0.1.0
84
+ def html_attributes(attributes)
85
+ # noinspection RubyYardParamTypeMatch
86
+ attributes.inject([]) { _1 << html_attribute(_2[0], _2[1]) }.join(' ')
87
+ end
88
+
89
+ # Escape ampersands, brackets and quotes for HTML.
90
+ #
91
+ # @param [String] string to escape.
92
+ # @return [String] HTML escaped string.
93
+ # @since 0.1.0
94
+ def html_escape(string)
95
+ string.to_s.gsub(ESCAPE_HTML_PATTERN) { ESCAPE_HTML[_1] }
96
+ end
97
+
98
+ alias_method :h, :html_escape
99
+
100
+ # Reads the entire HTML document.
101
+ #
102
+ # @return [String]
103
+ # @since 0.1.0
104
+ def read_html
105
+ document.tap(&:rewind).read
106
+ end
107
+
108
+ # Clears all content from the document.
109
+ #
110
+ # @return [StringIO]
111
+ # @since 0.1.1
112
+ def reset
113
+ document.close
114
+ document.reopen
115
+ end
116
+
117
+ # Writes the opening element for the given HTML tag to the document.
118
+ #
119
+ # @!attribute [String] tag
120
+ # @!attribute [Hash] attributes
121
+ # @return [Integer] Number of bytes written to the stream.
122
+ # @since 0.1.0
123
+ def write_html_element(tag, attributes = {})
124
+ document << '<'
125
+ document << tag
126
+ document << " #{html_attributes(attributes)}" unless attributes.empty?
127
+ document << '>'
128
+ end
129
+
130
+ # Write a tag to the HTML document.
131
+ #
132
+ # @param [Symbol] tag name.
133
+ # @param [Hash] attributes for the tag.
134
+ # @param [Proc] inner_html to include in the tag.
135
+ # @return [void]
136
+ # @since 0.1.0
137
+ def write_html_tag(tag: __callee__, **attributes, &inner_html)
138
+ # Ensure the method isn't being called directly.
139
+ fail ArgumentError, 'invalid tag' if tag == :write_html_tag
140
+
141
+ # Remove the underscore prefix added to prevent conflicts with internal Ruby methods.
142
+ tag = tag.to_s
143
+ tag = tag[1..-1] if tag[0] == '_'
144
+
145
+ # Opening tag with its HTML attributes - e.g. <div id="main">
146
+ write_html_element(tag, attributes)
147
+
148
+ # Capture the inner HTML.
149
+ content = inner_html&.call(document)
150
+
151
+ # Write the inner HTML to the document when present.
152
+ document.write(content) if content.is_a?(String)
153
+
154
+ # Close the tag when necessary.
155
+ document.write("</#{tag}>") if content.is_a?(String) || block_given? || !void?(tag.to_sym)
156
+ end
157
+ end
158
+ end
data/lib/dhtml/opal.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Only continue when not running in Opal, and the gem is available.
4
+ return if RUBY_ENGINE == 'opal' || !defined?(Opal)
5
+
6
+ # Add the library to the Opal load path when it's available.
7
+ Opal.append_path File.expand_path(File.join('..', '..'), __FILE__)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DHTML
4
+ # The gem's semantic version number.
5
+ #
6
+ # @see https://semver.org/spec/v2.0.0.html
7
+ # @type [String]
8
+ VERSION = '0.1.3'
9
+ end
data/lib/dhtml.rb ADDED
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'dhtml/document'
4
+ require_relative 'dhtml/opal'
5
+ require_relative 'dhtml/version'
6
+
7
+ # @since 0.1.0
8
+ module DHTML
9
+ include DHTML::Document
10
+
11
+ # List of tags that do not require a closing tag.
12
+ #
13
+ # @type [Array<Symbol>]
14
+ # @since 0.1.0
15
+ VOID_TAGS = %i[area audio base br col hr img input link meta param picture source video]
16
+
17
+ # @param [Symbol] tag
18
+ # @return [TrueClass, FalseClass]
19
+ # @since 0.1.0
20
+ def void?(tag)
21
+ VOID_TAGS.include?(tag)
22
+ end
23
+
24
+ if RUBY_ENGINE == 'opal'
25
+ # Opal does not support __callee__, so #alias_method is being overridden to provide implementation sufficient for
26
+ # this module.
27
+ #
28
+ # @param [Symbol] tag
29
+ # @return [Symbol] The name of the aliased method.
30
+ # @since 0.1.0
31
+ def self.alias_method(tag, _)
32
+ define_method(tag) do |**attributes, &block|
33
+ write_html_tag(tag: tag, **attributes, &block)
34
+ end
35
+ end
36
+ end
37
+
38
+ # An underscore is added to HTML tags that already have Ruby methods. This makes it both easy to remember, and to
39
+ # detect them in #write_html_tag.
40
+ begin
41
+ alias_method :_p, :write_html_tag
42
+ alias_method :_select, :write_html_tag
43
+ end
44
+
45
+ # The HTML tags are aliased to #write_html_tag, which uses reflection to determine which tag to generate.
46
+ begin
47
+ alias_method :a, :write_html_tag
48
+ alias_method :abbr, :write_html_tag
49
+ alias_method :address, :write_html_tag
50
+ alias_method :area, :write_html_tag
51
+ alias_method :article, :write_html_tag
52
+ alias_method :aside, :write_html_tag
53
+ alias_method :audio, :write_html_tag
54
+ alias_method :b, :write_html_tag
55
+ alias_method :base, :write_html_tag
56
+ alias_method :bdi, :write_html_tag
57
+ alias_method :bdo, :write_html_tag
58
+ alias_method :blockquote, :write_html_tag
59
+ alias_method :body, :write_html_tag
60
+ alias_method :br, :write_html_tag
61
+ alias_method :button, :write_html_tag
62
+ alias_method :canvas, :write_html_tag
63
+ alias_method :caption, :write_html_tag
64
+ alias_method :cite, :write_html_tag
65
+ alias_method :code, :write_html_tag
66
+ alias_method :col, :write_html_tag
67
+ alias_method :colgroup, :write_html_tag
68
+ alias_method :data, :write_html_tag
69
+ alias_method :datalist, :write_html_tag
70
+ alias_method :dd, :write_html_tag
71
+ alias_method :del, :write_html_tag
72
+ alias_method :details, :write_html_tag
73
+ alias_method :dfn, :write_html_tag
74
+ alias_method :dialog, :write_html_tag
75
+ alias_method :div, :write_html_tag
76
+ alias_method :dl, :write_html_tag
77
+ alias_method :dt, :write_html_tag
78
+ alias_method :em, :write_html_tag
79
+ alias_method :embed, :write_html_tag
80
+ alias_method :fieldset, :write_html_tag
81
+ alias_method :figcaption, :write_html_tag
82
+ alias_method :figure, :write_html_tag
83
+ alias_method :footer, :write_html_tag
84
+ alias_method :form, :write_html_tag
85
+ alias_method :h1, :write_html_tag
86
+ alias_method :h2, :write_html_tag
87
+ alias_method :h3, :write_html_tag
88
+ alias_method :h4, :write_html_tag
89
+ alias_method :h5, :write_html_tag
90
+ alias_method :h6, :write_html_tag
91
+ alias_method :head, :write_html_tag
92
+ alias_method :header, :write_html_tag
93
+ alias_method :hgroup, :write_html_tag
94
+ alias_method :hr, :write_html_tag
95
+ alias_method :html, :write_html_tag
96
+ alias_method :i, :write_html_tag
97
+ alias_method :iframe, :write_html_tag
98
+ alias_method :img, :write_html_tag
99
+ alias_method :input, :write_html_tag
100
+ alias_method :ins, :write_html_tag
101
+ alias_method :kbd, :write_html_tag
102
+ alias_method :label, :write_html_tag
103
+ alias_method :legend, :write_html_tag
104
+ alias_method :li, :write_html_tag
105
+ alias_method :link, :write_html_tag
106
+ alias_method :main, :write_html_tag
107
+ alias_method :map, :write_html_tag
108
+ alias_method :mark, :write_html_tag
109
+ alias_method :meta, :write_html_tag
110
+ alias_method :meter, :write_html_tag
111
+ alias_method :nav, :write_html_tag
112
+ alias_method :noscript, :write_html_tag
113
+ alias_method :object, :write_html_tag
114
+ alias_method :ol, :write_html_tag
115
+ alias_method :optgroup, :write_html_tag
116
+ alias_method :option, :write_html_tag
117
+ alias_method :output, :write_html_tag
118
+ alias_method :param, :write_html_tag
119
+ alias_method :picture, :write_html_tag
120
+ alias_method :pre, :write_html_tag
121
+ alias_method :progress, :write_html_tag
122
+ alias_method :q, :write_html_tag
123
+ alias_method :rb, :write_html_tag
124
+ alias_method :rp, :write_html_tag
125
+ alias_method :rt, :write_html_tag
126
+ alias_method :rtc, :write_html_tag
127
+ alias_method :ruby, :write_html_tag
128
+ alias_method :s, :write_html_tag
129
+ alias_method :samp, :write_html_tag
130
+ alias_method :script, :write_html_tag
131
+ alias_method :section, :write_html_tag
132
+ alias_method :slot, :write_html_tag
133
+ alias_method :small, :write_html_tag
134
+ alias_method :source, :write_html_tag
135
+ alias_method :span, :write_html_tag
136
+ alias_method :strong, :write_html_tag
137
+ alias_method :style, :write_html_tag
138
+ alias_method :sub, :write_html_tag
139
+ alias_method :summary, :write_html_tag
140
+ alias_method :sup, :write_html_tag
141
+ alias_method :table, :write_html_tag
142
+ alias_method :tbody, :write_html_tag
143
+ alias_method :td, :write_html_tag
144
+ alias_method :template, :write_html_tag
145
+ alias_method :textarea, :write_html_tag
146
+ alias_method :tfoot, :write_html_tag
147
+ alias_method :th, :write_html_tag
148
+ alias_method :thead, :write_html_tag
149
+ alias_method :time, :write_html_tag
150
+ alias_method :title, :write_html_tag
151
+ alias_method :tr, :write_html_tag
152
+ alias_method :track, :write_html_tag
153
+ alias_method :u, :write_html_tag
154
+ alias_method :ul, :write_html_tag
155
+ alias_method :var, :write_html_tag
156
+ alias_method :video, :write_html_tag
157
+ alias_method :wbr, :write_html_tag
158
+ end
159
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dhtml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Travis Haynes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-05-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A fast, simple, and elegant DSL for generating HTML using Ruby. Also
14
+ compatible with Opal.
15
+ email:
16
+ - travis@hi5dev.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - CHANGELOG.md
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE.txt
25
+ - README.md
26
+ - dhtml.gemspec
27
+ - lib/dhtml.rb
28
+ - lib/dhtml/document.rb
29
+ - lib/dhtml/opal.rb
30
+ - lib/dhtml/version.rb
31
+ homepage: https://www.hi5dev.com/dhtml
32
+ licenses:
33
+ - MIT
34
+ metadata:
35
+ homepage_uri: https://www.hi5dev.com/dhtml
36
+ source_code_uri: https://github.com/hi5dev/dhtml
37
+ changelog_uri: https://github.com/hi5dev/dhtml/blob/base/CHANGELOG.md
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.4.0
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubygems_version: 3.2.16
54
+ signing_key:
55
+ specification_version: 4
56
+ summary: A fast, simple, and elegant DSL for generating HTML using Ruby. Also compatible
57
+ with Opal.
58
+ test_files: []