fun_html 0.1.4 → 0.3.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 +4 -4
- data/lib/fun_html/attribute.rb +96 -0
- data/lib/fun_html/{attribute_definitions.rb → spec_attributes.rb} +87 -33
- data/lib/fun_html/{node_definitions.rb → spec_elements.rb} +14 -17
- data/lib/fun_html/template.rb +104 -0
- data/lib/fun_html/version.rb +1 -1
- data/lib/fun_html/writer.rb +49 -0
- data/lib/fun_html.rb +4 -108
- data/rbi/attributes.rbx +183 -3
- data/rbi/{node_definitions.rbx → elements.rbx} +142 -142
- data/rbi/fun_html.rbi +396 -157
- data/rbi/fun_html.rbx +71 -12
- metadata +8 -5
data/lib/fun_html.rb
CHANGED
@@ -1,113 +1,9 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require_relative 'fun_html/
|
4
|
-
require_relative 'fun_html/attribute_definitions'
|
5
|
-
require_relative 'fun_html/version'
|
6
|
-
require 'erb/escape'
|
4
|
+
require_relative 'fun_html/template'
|
7
5
|
|
8
|
-
#
|
6
|
+
# FunHtml is a Ruby module to generate HTML and attributes. It is meant to be
|
7
|
+
# simple, reasonably fast, and support Sorbet typing.
|
9
8
|
module FunHtml
|
10
|
-
# nodoc
|
11
|
-
module Writer
|
12
|
-
def include(func)
|
13
|
-
begin
|
14
|
-
@__buffer << func.render
|
15
|
-
# it is faster to error and try than to detect the type and branch
|
16
|
-
rescue StandardError
|
17
|
-
instance_exec(&func)
|
18
|
-
end
|
19
|
-
self
|
20
|
-
end
|
21
|
-
|
22
|
-
def text(value)
|
23
|
-
(@__buffer ||= +'') << ERB::Escape.html_escape(value)
|
24
|
-
self
|
25
|
-
end
|
26
|
-
|
27
|
-
def attr(&blk) # rubocop:disable Style/ArgumentsForwarding
|
28
|
-
Attribute.new(&blk) # rubocop:disable Style/ArgumentsForwarding
|
29
|
-
end
|
30
|
-
|
31
|
-
def comment(&elements)
|
32
|
-
write('<!--', '-->', nil, closing_char: '', closing_void_char: '-->', &elements)
|
33
|
-
end
|
34
|
-
|
35
|
-
def doctype
|
36
|
-
(@__buffer ||= +'') << '<!DOCTYPE html>'
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
def render
|
41
|
-
@__buffer
|
42
|
-
ensure
|
43
|
-
# empty the buffer to prevent double rendering
|
44
|
-
@__buffer = +''
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
CLOSE = '>'
|
50
|
-
CLOSE_VOID = '/>'
|
51
|
-
|
52
|
-
def write(open, close, attr = nil, closing_char: CLOSE, closing_void_char: CLOSE_VOID, &block)
|
53
|
-
(@__buffer ||= +'') << open << Attribute.to_html(attr)
|
54
|
-
|
55
|
-
if block
|
56
|
-
@__buffer << closing_char
|
57
|
-
|
58
|
-
begin
|
59
|
-
yield
|
60
|
-
# it is faster to error and try than to detect the type and branch
|
61
|
-
rescue StandardError
|
62
|
-
instance_eval(&block)
|
63
|
-
end
|
64
|
-
@__buffer << close
|
65
|
-
else
|
66
|
-
@__buffer << closing_void_char
|
67
|
-
end
|
68
|
-
|
69
|
-
self
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# nodoc
|
74
|
-
class Template
|
75
|
-
include FunHtml::Writer
|
76
|
-
include FunHtml::NodeDefinitions::HTMLAllElements
|
77
|
-
end
|
78
|
-
|
79
|
-
# nodoc
|
80
|
-
class Attribute
|
81
|
-
include FunHtml::AttributeDefinitions
|
82
|
-
|
83
|
-
# only allow nil or objects that respond to `safe_attribute`
|
84
|
-
def self.to_html(attr)
|
85
|
-
attr&.safe_attribute.to_s
|
86
|
-
end
|
87
|
-
|
88
|
-
# create a new Attribute object to create reuseable attributes
|
89
|
-
def initialize(buffer = {}, &block)
|
90
|
-
@__buffer = buffer
|
91
|
-
instance_eval(&block) if block
|
92
|
-
end
|
93
|
-
|
94
|
-
# merge two attribute sets together
|
95
|
-
def merge(other)
|
96
|
-
self.class.new(@__buffer.merge(other.instance_variable_get(:@__buffer)))
|
97
|
-
end
|
98
|
-
|
99
|
-
def safe_attribute
|
100
|
-
@__buffer.values.join
|
101
|
-
end
|
102
|
-
|
103
|
-
private
|
104
|
-
|
105
|
-
def write(name, value)
|
106
|
-
@__buffer[name] = "#{name}#{ERB::Escape.html_escape(value)}\""
|
107
|
-
end
|
108
|
-
|
109
|
-
def write_empty(name, print)
|
110
|
-
@__buffer[name] = print ? name : ''
|
111
|
-
end
|
112
|
-
end
|
113
9
|
end
|
data/rbi/attributes.rbx
CHANGED
@@ -2,8 +2,188 @@
|
|
2
2
|
|
3
3
|
module FunHtml
|
4
4
|
# HTML attributes autogenerated, do not edit
|
5
|
-
module
|
6
|
-
sig { params(
|
7
|
-
def
|
5
|
+
module SpecAttributes
|
6
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
7
|
+
def accept(value); end
|
8
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
9
|
+
def accept_charset(value); end
|
10
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
11
|
+
def accesskey(value); end
|
12
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
13
|
+
def action(value); end
|
14
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
15
|
+
def align(value); end
|
16
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
17
|
+
def alt(value); end
|
18
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
19
|
+
def async(value); end
|
20
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
21
|
+
def autocomplete(value); end
|
22
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
23
|
+
def autofocus(value); end
|
24
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
25
|
+
def autoplay(value); end
|
26
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
27
|
+
def bgcolor(value); end
|
28
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
29
|
+
def border(value); end
|
30
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
31
|
+
def charset(value); end
|
32
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
33
|
+
def checked(value); end
|
34
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
35
|
+
def cols(value); end
|
36
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
37
|
+
def colspan(value); end
|
38
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
39
|
+
def content(value); end
|
40
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
41
|
+
def contenteditable(value); end
|
42
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
43
|
+
def controls(value); end
|
44
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
45
|
+
def coords(value); end
|
46
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
47
|
+
def datetime(value); end
|
48
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
49
|
+
def default(value); end
|
50
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
51
|
+
def defer(value); end
|
52
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
53
|
+
def dir(value); end
|
54
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
55
|
+
def disabled(value); end
|
56
|
+
sig { params(value: T.any(String, T::Boolean)).returns(FunHtml::Attribute) }
|
57
|
+
def download(value); end
|
58
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
59
|
+
def draggable(value); end
|
60
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
61
|
+
def enctype(value); end
|
62
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
63
|
+
def for(value); end
|
64
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
65
|
+
def form(value); end
|
66
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
67
|
+
def formaction(value); end
|
68
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
69
|
+
def headers(value); end
|
70
|
+
sig { params(value: T.any(Numeric, String)).returns(FunHtml::Attribute) }
|
71
|
+
def height(value); end
|
72
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
73
|
+
def hidden(value); end
|
74
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
75
|
+
def high(value); end
|
76
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
77
|
+
def href(value); end
|
78
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
79
|
+
def hreflang(value); end
|
80
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
81
|
+
def id(value); end
|
82
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
83
|
+
def integrity(value); end
|
84
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
85
|
+
def ismap(value); end
|
86
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
87
|
+
def kind(value); end
|
88
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
89
|
+
def label(value); end
|
90
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
91
|
+
def lang(value); end
|
92
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
93
|
+
def list(value); end
|
94
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
95
|
+
def loop(value); end
|
96
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
97
|
+
def low(value); end
|
98
|
+
sig { params(value: T.any(Numeric, String)).returns(FunHtml::Attribute) }
|
99
|
+
def max(value); end
|
100
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
101
|
+
def maxlength(value); end
|
102
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
103
|
+
def media(value); end
|
104
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
105
|
+
def method(value); end
|
106
|
+
sig { params(value: T.any(Numeric, String)).returns(FunHtml::Attribute) }
|
107
|
+
def min(value); end
|
108
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
109
|
+
def multiple(value); end
|
110
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
111
|
+
def muted(value); end
|
112
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
113
|
+
def name(value); end
|
114
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
115
|
+
def novalidate(value); end
|
116
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
117
|
+
def open(value); end
|
118
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
119
|
+
def optimum(value); end
|
120
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
121
|
+
def pattern(value); end
|
122
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
123
|
+
def placeholder(value); end
|
124
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
125
|
+
def poster(value); end
|
126
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
127
|
+
def preload(value); end
|
128
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
129
|
+
def readonly(value); end
|
130
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
131
|
+
def rel(value); end
|
132
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
133
|
+
def required(value); end
|
134
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
135
|
+
def reversed(value); end
|
136
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
137
|
+
def rows(value); end
|
138
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
139
|
+
def rowspan(value); end
|
140
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
141
|
+
def sandbox(value); end
|
142
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
143
|
+
def span(value); end
|
144
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
145
|
+
def scope(value); end
|
146
|
+
sig { params(value: T::Boolean).returns(FunHtml::Attribute) }
|
147
|
+
def selected(value); end
|
148
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
149
|
+
def shape(value); end
|
150
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
151
|
+
def size(value); end
|
152
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
153
|
+
def sizes(value); end
|
154
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
155
|
+
def spellcheck(value); end
|
156
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
157
|
+
def src(value); end
|
158
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
159
|
+
def srcdoc(value); end
|
160
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
161
|
+
def srclang(value); end
|
162
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
163
|
+
def srcset(value); end
|
164
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
165
|
+
def start(value); end
|
166
|
+
sig { params(value: T.any(Numeric, String)).returns(FunHtml::Attribute) }
|
167
|
+
def step(value); end
|
168
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
169
|
+
def style(value); end
|
170
|
+
sig { params(value: Numeric).returns(FunHtml::Attribute) }
|
171
|
+
def tabindex(value); end
|
172
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
173
|
+
def target(value); end
|
174
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
175
|
+
def title(value); end
|
176
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
177
|
+
def translate(value); end
|
178
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
179
|
+
def type(value); end
|
180
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
181
|
+
def usemap(value); end
|
182
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
183
|
+
def value(value); end
|
184
|
+
sig { params(value: T.any(Numeric, String)).returns(FunHtml::Attribute) }
|
185
|
+
def width(value); end
|
186
|
+
sig { params(value: String).returns(FunHtml::Attribute) }
|
187
|
+
def wrap(value); end
|
8
188
|
end
|
9
189
|
end
|