berns 3.5.0 → 4.1.1
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/README.org +34 -13
- data/ext/berns/berns.c +14 -1
- data/lib/berns/berns.bundle +0 -0
- data/lib/berns/builder.rb +33 -19
- data/lib/berns/version.rb +1 -1
- metadata +7 -145
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6e746c49f8701090aa423558ef9ccc644cff448b9c9c4f0c55e2752fda3ccf6
|
4
|
+
data.tar.gz: 9cb5b7761c29041c95b0ae9e00b4d98f8bffc06130bd02f9d3e4cecec31bc310
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 465a227cbce7038041f4faf90a976fdd2d04a0833f140acf9c3aa26f74d6a9439155aa4bf15fbd78801aefc3b5fa88f7de11b248817e7e3ce83efc5983d9330e
|
7
|
+
data.tar.gz: e33fb6252cd1ab022d7543fb0275d2e1dc3e13fd1c966bb53ca3b806029d3b498212137995597910f6382bc036d4e22c322892732ca8a65ab49bc37b917451c7
|
data/README.org
CHANGED
@@ -125,12 +125,30 @@ end
|
|
125
125
|
Within the block provided to =Berns::Builder.new= every standard element method,
|
126
126
|
void element method, =#element=, and =#void= are available as methods and each
|
127
127
|
time you use one of those methods the result is appended to an internal buffer.
|
128
|
-
In addition, the =#text= method
|
129
|
-
|
128
|
+
In addition, the =#text= method appends HTML escaped text to the buffer and
|
129
|
+
=#raw= appends text to the buffer without modification.
|
130
130
|
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
The block provided to =Berns::Builder.new= can take both positional and keyword
|
132
|
+
arguments.
|
133
|
+
|
134
|
+
#+begin_src ruby
|
135
|
+
template = Berns::Builder.new do |content, title:|
|
136
|
+
h1 { title }
|
137
|
+
p(class: 'paragraph') { content }
|
138
|
+
end
|
139
|
+
|
140
|
+
template.call('Some text.', title: 'The title') # =>
|
141
|
+
# <h1>
|
142
|
+
# The title
|
143
|
+
# </h1>
|
144
|
+
# <p>
|
145
|
+
# Some text.
|
146
|
+
# </p>
|
147
|
+
#+end_src
|
148
|
+
|
149
|
+
Once initialized, the =#call= method will render the template to a string. Any
|
150
|
+
arguments, positional or keyword, are passed through as-is to the block provided
|
151
|
+
to =#new=.
|
134
152
|
|
135
153
|
#+begin_src ruby
|
136
154
|
string = template.call # =>
|
@@ -168,6 +186,7 @@ end # =>
|
|
168
186
|
# </p>
|
169
187
|
#+end_src
|
170
188
|
|
189
|
+
|
171
190
|
*** Standard and void elements
|
172
191
|
|
173
192
|
All standard and void HTML elements are defined as methods on Berns, so you can
|
@@ -196,20 +215,22 @@ area base br col embed hr img input link menuitem meta param source track wbr
|
|
196
215
|
|
197
216
|
** Performance
|
198
217
|
|
199
|
-
Berns 3
|
200
|
-
|
218
|
+
Berns 3 was a total rewrite from a pure Ruby implementation to one powered by a
|
219
|
+
C extension. That rewrite is about three times faster than the pure Ruby
|
220
|
+
implementation used in version 2. See the file [[file:benchmarks/performance.rb][benchmarks/performance.rb]] for the
|
221
|
+
benchmark code.
|
201
222
|
|
202
223
|
#+begin_example
|
203
224
|
Warming up --------------------------------------
|
204
|
-
|
205
|
-
|
225
|
+
ruby 27.521k i/100ms
|
226
|
+
c-ext 74.915k i/100ms
|
206
227
|
Calculating -------------------------------------
|
207
|
-
|
208
|
-
|
228
|
+
ruby 275.913k (± 1.0%) i/s - 1.404M in 5.087516s
|
229
|
+
c-ext 813.113k (± 1.0%) i/s - 4.120M in 5.067902s
|
209
230
|
|
210
231
|
Comparison:
|
211
|
-
|
212
|
-
|
232
|
+
c-ext: 813113.3 i/s
|
233
|
+
ruby: 275913.5 i/s - 2.95x (± 0.00) slower
|
213
234
|
#+end_example
|
214
235
|
|
215
236
|
** Trivia
|
data/ext/berns/berns.c
CHANGED
@@ -357,7 +357,20 @@ static char * hash_value_to_attribute(const char *attr, const size_t attrlen, VA
|
|
357
357
|
free(combined);
|
358
358
|
}
|
359
359
|
|
360
|
-
|
360
|
+
/*
|
361
|
+
* Reallocate destination to final size. This is generally a reduction in the
|
362
|
+
* allocated memory since we chunk allocations in 256 byte multiples.
|
363
|
+
*/
|
364
|
+
char *rightsizeddest = realloc(destination, occupied + 1);
|
365
|
+
|
366
|
+
if (rightsizeddest == NULL) {
|
367
|
+
free(destination);
|
368
|
+
rb_raise(rb_eNoMemError, "Berns could not allocate sufficient memory.");
|
369
|
+
}
|
370
|
+
|
371
|
+
rightsizeddest[occupied] = '\0';
|
372
|
+
|
373
|
+
return rightsizeddest;
|
361
374
|
}
|
362
375
|
|
363
376
|
/*
|
data/lib/berns/berns.bundle
CHANGED
Binary file
|
data/lib/berns/builder.rb
CHANGED
@@ -5,22 +5,28 @@ module Berns
|
|
5
5
|
# An HTML builder DSL using Berns' HTML methods.
|
6
6
|
class Builder
|
7
7
|
def initialize(&block)
|
8
|
+
raise(ArgumentError, 'Berns::Builder initialized without a block argument', caller) unless block
|
9
|
+
|
8
10
|
@block = block
|
9
|
-
@buffer = +''
|
10
11
|
end
|
11
12
|
|
12
13
|
# @return [String]
|
13
|
-
def call(*args, **
|
14
|
-
|
15
|
-
|
16
|
-
end
|
14
|
+
def call(*args, **kwargs)
|
15
|
+
@buffer = +''
|
16
|
+
content = instance_exec(*args, **kwargs, &@block)
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
@buffer.
|
18
|
+
# This is a special case where the buffer hasn't been appended to but the
|
19
|
+
# block returned a string.
|
20
|
+
if @buffer.empty? && content.is_a?(String)
|
21
|
+
Berns.escape_html(content).freeze
|
22
|
+
else
|
23
|
+
@buffer.freeze
|
24
|
+
end
|
21
25
|
end
|
26
|
+
alias to_s call
|
27
|
+
alias to_str call
|
22
28
|
|
23
|
-
# Append text to the buffer.
|
29
|
+
# Append HTML escaped text to the buffer.
|
24
30
|
#
|
25
31
|
# @param string [String]
|
26
32
|
# @return [String]
|
@@ -28,31 +34,39 @@ module Berns
|
|
28
34
|
@buffer << Berns.escape_html(string.to_s)
|
29
35
|
end
|
30
36
|
|
37
|
+
# Append raw text to the buffer.
|
38
|
+
#
|
39
|
+
# @param string [String]
|
40
|
+
# @return [String]
|
41
|
+
def raw(string)
|
42
|
+
@buffer << string.to_s
|
43
|
+
end
|
44
|
+
|
31
45
|
# Append an arbitrary standard element to the buffer.
|
32
46
|
#
|
33
47
|
# @return [String]
|
34
|
-
def element(*args, **
|
35
|
-
content = Builder.new
|
36
|
-
@buffer << Berns.element(*args, **
|
48
|
+
def element(elm, *args, **kwargs, &block)
|
49
|
+
content = Builder.new(&block).call if block
|
50
|
+
@buffer << Berns.element(elm, *args, **kwargs) { content }
|
37
51
|
end
|
38
52
|
|
39
53
|
# Append an arbitrary void element to the buffer.
|
40
54
|
#
|
41
55
|
# @return [String]
|
42
|
-
def void(
|
43
|
-
@buffer << Berns.void(
|
56
|
+
def void(...)
|
57
|
+
@buffer << Berns.void(...)
|
44
58
|
end
|
45
59
|
|
46
60
|
Berns::STANDARD.each do |meth|
|
47
|
-
define_method(meth) do |*args, **
|
48
|
-
content = Builder.new
|
49
|
-
@buffer << Berns.send(meth, *args, **
|
61
|
+
define_method(meth) do |*args, **kwargs, &block|
|
62
|
+
content = Builder.new(&block).call if block
|
63
|
+
@buffer << Berns.send(meth, *args, **kwargs) { content }
|
50
64
|
end
|
51
65
|
end
|
52
66
|
|
53
67
|
Berns::VOID.each do |meth|
|
54
|
-
define_method(meth) do |*args, **
|
55
|
-
@buffer << Berns.send(meth, *args, **
|
68
|
+
define_method(meth) do |*args, **kwargs|
|
69
|
+
@buffer << Berns.send(meth, *args, **kwargs)
|
56
70
|
end
|
57
71
|
end
|
58
72
|
end
|
data/lib/berns/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taylor Beck
|
@@ -9,148 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
13
|
-
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: benchmark-ips
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - ">="
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0'
|
21
|
-
type: :development
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '0'
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: bundler
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
-
requirements:
|
32
|
-
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '0'
|
35
|
-
type: :development
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
-
requirements:
|
39
|
-
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
version: '0'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: minitest
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
49
|
-
type: :development
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '0'
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: rake
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
59
|
-
requirements:
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0'
|
63
|
-
type: :development
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: rake-compiler
|
72
|
-
requirement: !ruby/object:Gem::Requirement
|
73
|
-
requirements:
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
80
|
-
requirements:
|
81
|
-
- - ">="
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version: '0'
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: rubocop
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
87
|
-
requirements:
|
88
|
-
- - ">="
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: '0'
|
91
|
-
type: :development
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
95
|
-
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: '0'
|
98
|
-
- !ruby/object:Gem::Dependency
|
99
|
-
name: rubocop-minitest
|
100
|
-
requirement: !ruby/object:Gem::Requirement
|
101
|
-
requirements:
|
102
|
-
- - ">="
|
103
|
-
- !ruby/object:Gem::Version
|
104
|
-
version: '0'
|
105
|
-
type: :development
|
106
|
-
prerelease: false
|
107
|
-
version_requirements: !ruby/object:Gem::Requirement
|
108
|
-
requirements:
|
109
|
-
- - ">="
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
112
|
-
- !ruby/object:Gem::Dependency
|
113
|
-
name: rubocop-packaging
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
115
|
-
requirements:
|
116
|
-
- - ">="
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '0'
|
119
|
-
type: :development
|
120
|
-
prerelease: false
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
requirements:
|
123
|
-
- - ">="
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: rubocop-performance
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
requirements:
|
130
|
-
- - ">="
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
version: '0'
|
133
|
-
type: :development
|
134
|
-
prerelease: false
|
135
|
-
version_requirements: !ruby/object:Gem::Requirement
|
136
|
-
requirements:
|
137
|
-
- - ">="
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
version: '0'
|
140
|
-
- !ruby/object:Gem::Dependency
|
141
|
-
name: rubocop-rake
|
142
|
-
requirement: !ruby/object:Gem::Requirement
|
143
|
-
requirements:
|
144
|
-
- - ">="
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: '0'
|
147
|
-
type: :development
|
148
|
-
prerelease: false
|
149
|
-
version_requirements: !ruby/object:Gem::Requirement
|
150
|
-
requirements:
|
151
|
-
- - ">="
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
version: '0'
|
12
|
+
date: 2022-09-01 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
154
14
|
description: A utility library for generating HTML strings.
|
155
15
|
email:
|
156
16
|
- beck.taylorg@gmail.com
|
@@ -175,6 +35,8 @@ licenses:
|
|
175
35
|
- MIT
|
176
36
|
metadata:
|
177
37
|
bug_tracker_uri: https://github.com/evanleck/berns/issues
|
38
|
+
changelog_uri: https://github.com/evanleck/berns/blob/main/CHANGELOG.org
|
39
|
+
homepage_uri: https://github.com/evanleck/berns
|
178
40
|
rubygems_mfa_required: 'true'
|
179
41
|
source_code_uri: https://github.com/evanleck/berns
|
180
42
|
post_install_message:
|
@@ -185,14 +47,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
47
|
requirements:
|
186
48
|
- - ">="
|
187
49
|
- !ruby/object:Gem::Version
|
188
|
-
version: 2.
|
50
|
+
version: 2.7.0
|
189
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
52
|
requirements:
|
191
53
|
- - ">="
|
192
54
|
- !ruby/object:Gem::Version
|
193
55
|
version: '2.0'
|
194
56
|
requirements: []
|
195
|
-
rubygems_version: 3.3.
|
57
|
+
rubygems_version: 3.3.7
|
196
58
|
signing_key:
|
197
59
|
specification_version: 4
|
198
60
|
summary: A utility library for generating HTML strings.
|