eclair 0.0.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.
data/lib/eclair.rb ADDED
@@ -0,0 +1,83 @@
1
+ # typed: strict
2
+ require "sorbet-runtime"
3
+ require "cgi"
4
+
5
+ require_relative "./eclair/element"
6
+ require_relative "./eclair/html"
7
+
8
+ module Eclair
9
+ extend T::Sig
10
+ extend T::Helpers
11
+ final!
12
+
13
+ sig(:final) do
14
+ params(
15
+ tag: Symbol,
16
+ attributes: T::Hash[Symbol, Element::AttributeValue],
17
+ children: Element::Children
18
+ )
19
+ .returns(Element)
20
+ end
21
+ def self.element(tag, attributes, children)
22
+ Element.new(
23
+ tag: tag,
24
+ attributes: attributes,
25
+ children: children
26
+ )
27
+ end
28
+
29
+ sig(:final) { params(element: Element).returns(String) }
30
+ def self.render(element)
31
+ attributes = element
32
+ .attributes
33
+ .map do |key, value|
34
+ if !value
35
+ next
36
+ end
37
+
38
+ attr_name = escape_html(key.to_s)
39
+ rendered_value = case value
40
+ when TrueClass
41
+ next attr_name
42
+ when String
43
+ escape_html(value)
44
+ else
45
+ T.absurd(value)
46
+ end
47
+
48
+ "#{attr_name}=\"#{rendered_value}\""
49
+ end
50
+ .compact
51
+ .join(" ")
52
+
53
+ start_tag_open = if attributes.empty?
54
+ "<#{element.tag}"
55
+ else
56
+ "<#{element.tag} #{attributes}"
57
+ end
58
+
59
+ if (c = element.children) == Element::Void
60
+ return "#{start_tag_open}>"
61
+ end
62
+
63
+ rendered_children = c.map do |child|
64
+ case child
65
+ when Element
66
+ render(child)
67
+ when Element::DangerousUnescapedHtml
68
+ child.html
69
+ when String
70
+ escape_html(child)
71
+ else
72
+ T.absurd(child)
73
+ end
74
+ end
75
+
76
+ "#{start_tag_open}>#{rendered_children.join}</#{element.tag}>"
77
+ end
78
+
79
+ sig(:final) { params(str: String).returns(String) }
80
+ private_class_method def self.escape_html(str)
81
+ ::CGI.escape_html(str)
82
+ end
83
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: eclair
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Andrejewski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sorbet-runtime
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.5'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.5.9204
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.5'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.5.9204
33
+ description: The main entrypoint for using Eclair
34
+ email: christopher.andrejewski@gmail.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - lib/eclair.rb
40
+ - lib/eclair/element.rb
41
+ - lib/eclair/html.rb
42
+ homepage: https://github.com/andrejewski/eclair
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubygems_version: 3.3.3
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Declarative HTML building for Ruby
65
+ test_files: []