berns 3.3.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8befdd27a627569fd4d81d583c107e97af40e9b8f29423c4178fffa1decb92e9
4
- data.tar.gz: e268d19c3fafd596d310fefddcda6e9ca2393f06f668d52c3d92a7d748e41c77
3
+ metadata.gz: 844af14032659e36711f21b482d7e07ba1627cdca43045ec1fb30869171ee21a
4
+ data.tar.gz: 828da05830d2d5c1a516fe51bcc2a5c5c9c346359f9eedde4b3ee5bd60a6bf25
5
5
  SHA512:
6
- metadata.gz: d14dbff87be26716aa466fab088ac036e25e27e72fd2893c4fb67f02422560c88d8bd2d15c08b176c6c9b4fa706ed3a4098edcfe54af273a43eef5cacd295142
7
- data.tar.gz: 34c7b95ee33095ea4e8712e280ad90cfe7d79d983996c72c0c245bb63ee9c10c28150a8bfbc3da0f56236ec5ac7df35f61a11f1f4a5e5f0255c167896e4bae5c
6
+ metadata.gz: 93e0a7fc35666b0395d338cafc5a7aa9bb8aa3d1467158cdb1fc325640d275b3cfa0033921edfd62f0d6a52cbf8728842b45c31ea4d19552d18ee6440c135b59
7
+ data.tar.gz: 6bc2ea5f4749e09d8bbc4dacd2fac2981ad66dfdc649cb14f78a50ed21af5705d057228764edf6bdd32e4eb4dc8e848f6a42ffbab157ec9bf78f05c94899be6c
data/README.org CHANGED
@@ -95,10 +95,84 @@ Note that this is an extremely naive implementation of HTML sanitization that
95
95
  literally just looks for "<" and ">" characters and removes the contents between
96
96
  them. This should probably only be used on trusted strings.
97
97
 
98
+ *** =build { content }=
99
+
100
+ The =build= method uses =Berns::Builder= to let you create HTML strings using a DSL.
101
+
102
+ #+begin_src ruby
103
+ Berns.build { h1 { 'Heading' } } # => '<h1>Heading</h1>'
104
+ #+end_src
105
+
106
+ See below for more on =Berns::Builder=.
107
+
108
+ *** =Berns::Builder= HTML DSL
109
+
110
+ Added in version 3.4.0 and heavily inspired by the likes of [[https://github.com/digital-fabric/papercraft][Papercraft]], [[https://github.com/markaby/markaby][Markaby]],
111
+ and [[https://github.com/activeadmin/arbre][Arbre]], the =Berns::Builder= class lets you create HTML strings using a DSL.
112
+
113
+ #+begin_src ruby
114
+ template = Berns::Builder.new do
115
+ h1 { 'Heading' }
116
+ p(class: 'paragraph') do
117
+ text 'Bare text here.'
118
+
119
+ b { 'Bold text here' }
120
+ end
121
+ end
122
+ #+end_src
123
+
124
+ Within the block provided to =Berns::Builder.new= every standard and void
125
+ element is available as a method and each time you use one of those methods the
126
+ result is appended to an internal buffer. In addition, the =#text= method can be
127
+ used to append a plain text string to the buffer and that text will be HTML
128
+ escaped, so it's good for untrusted content.
129
+
130
+ Once initialized, rendering the template to a string can be done with the
131
+ =#call= method and any arguments, positional or keyword, will be passed through
132
+ as-is to the block provided to =#new=.
133
+
134
+ #+begin_src ruby
135
+ string = template.call # =>
136
+ # <h1>
137
+ # Heading
138
+ # </h1>
139
+ # <p class='paragraph'>
140
+ # Bare text here.
141
+ # <b>
142
+ # Bold text here.
143
+ # </b>
144
+ # </p>
145
+ #+end_src
146
+
147
+ In addition to initializing a new instance of =Berns::Builder=, you can
148
+ construct and render a template to a string all at once with =Berns.build=.
149
+
150
+ #+begin_src ruby
151
+ Berns.build do
152
+ h1 { 'Heading' }
153
+ p(class: 'paragraph') do
154
+ text 'Bare text here.'
155
+
156
+ b { 'Bold text here' }
157
+ end
158
+ end # =>
159
+ # <h1>
160
+ # Heading
161
+ # </h1>
162
+ # <p class='paragraph'>
163
+ # Bare text here.
164
+ # <b>
165
+ # Bold text here.
166
+ # </b>
167
+ # </p>
168
+ #+end_src
169
+
98
170
  *** Standard and void elements
99
171
 
100
172
  All standard and void HTML elements are defined as methods on Berns, so you can
101
- create e.g. a link with =Berns.a=. Below is the full list of standard elements.
173
+ create e.g. a link with =Berns.a=. Below is the full list of standard elements
174
+ which are also available in the constant =Berns::STANDARD= as an array of
175
+ symbols.
102
176
 
103
177
  #+begin_example
104
178
  a abbr address article aside audio b bdi bdo blockquote body button
@@ -111,15 +185,33 @@ table tbody td template textarea tfoot th thead time title tr u ul var
111
185
  video
112
186
  #+end_example
113
187
 
114
-
115
188
  Below is the full list of void elements that are defined as singleton methods on
116
- Berns.
189
+ Berns which are also available in the constant =Berns::VOID= as an array of
190
+ symbols.
117
191
 
118
192
  #+begin_example
119
193
  area base br col embed hr img input link menuitem meta param source track wbr
120
194
  #+end_example
121
195
 
196
+ ** Performance
197
+
198
+ Berns 3 is about three times faster than the pure Ruby implementation used in
199
+ version 2. See the file [[file:benchmarks/performance.rb][benchmarks/performance.rb]] for the benchmark code.
200
+
201
+ #+begin_example
202
+ Warming up --------------------------------------
203
+ element 27.373k i/100ms
204
+ berns 94.118k i/100ms
205
+ Calculating -------------------------------------
206
+ element 314.078k (± 4.5%) i/s - 1.588M in 5.065539s
207
+ berns 935.528k (± 6.1%) i/s - 4.706M in 5.049718s
208
+
209
+ Comparison:
210
+ berns: 935527.9 i/s
211
+ element: 314078.4 i/s - 2.98x (± 0.00) slower
212
+ #+end_example
213
+
122
214
  ** Trivia
123
215
 
124
- The name "Berns" is taken from the name of [[https://en.wikipedia.org/wiki/HTML#Development][the inventor of HTML]], [[https://en.wikipedia.org/wiki/Tim_Berners-Lee][Sir Tim
125
- Berners-Lee]].
216
+ The name "Berns" is taken from the name of [[https://en.wikipedia.org/wiki/HTML#Development][the inventor of HTML]],
217
+ [[https://en.wikipedia.org/wiki/Tim_Berners-Lee][Sir Tim Berners-Lee]].
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+ require 'berns'
3
+
4
+ module Berns
5
+ # An HTML builder DSL using Berns' HTML methods.
6
+ class Builder
7
+ def initialize(&block)
8
+ @block = block
9
+ @buffer = +''
10
+ end
11
+
12
+ # @return [String]
13
+ def call(*args, **opts)
14
+ instance_exec(*args, **opts, &@block)
15
+ to_s
16
+ end
17
+
18
+ # @return [String]
19
+ def to_s
20
+ @buffer.freeze
21
+ end
22
+
23
+ # Append text to the buffer.
24
+ #
25
+ # @param string [String]
26
+ # @return [String]
27
+ def text(string)
28
+ @buffer << Berns.escape_html(string.to_s)
29
+ end
30
+
31
+ Berns::STANDARD.each do |meth|
32
+ define_method(meth) do |*args, **opts, &block|
33
+ content = Builder.new.instance_exec(*args, **opts, &block) if block
34
+ @buffer << Berns.send(meth, *args, **opts) { content }
35
+ end
36
+ end
37
+
38
+ Berns::VOID.each do |meth|
39
+ define_method(meth) do |*args, **opts|
40
+ @buffer << Berns.send(meth, *args, **opts)
41
+ end
42
+ end
43
+ end
44
+ end
data/lib/berns/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Berns
3
- VERSION = '3.3.1'
3
+ VERSION = '3.4.0'
4
4
  end
data/lib/berns.rb CHANGED
@@ -1,3 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
  require 'berns/berns'
3
3
  require 'berns/version'
4
+
5
+ module Berns # :nodoc:
6
+ autoload :Builder, 'berns/builder'
7
+
8
+ STANDARD = %i[
9
+ a abbr address article aside audio b bdi bdo blockquote body button canvas
10
+ caption cite code colgroup datalist dd del details dfn dialog div dl dt em
11
+ fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header html i
12
+ iframe ins kbd label legend li main map mark menu meter nav noscript object
13
+ ol optgroup option output p picture pre progress q rp rt ruby s samp script
14
+ section select small span strong style sub summary table tbody td template
15
+ textarea tfoot th thead time title tr u ul var video
16
+ ].freeze
17
+
18
+ VOID = %i[
19
+ area base br col embed hr img input link menuitem meta param source track wbr
20
+ ].freeze
21
+
22
+ # @return [String]
23
+ def self.build(*args, **opts, &block)
24
+ Builder.new(&block).call(*args, **opts)
25
+ end
26
+ end
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: 3.3.1
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taylor Beck
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-12-27 00:00:00.000000000 Z
12
+ date: 2022-02-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: benchmark-ips
@@ -168,6 +168,7 @@ files:
168
168
  - ext/berns/hescape.h
169
169
  - lib/berns.rb
170
170
  - lib/berns/berns.bundle
171
+ - lib/berns/builder.rb
171
172
  - lib/berns/version.rb
172
173
  homepage: https://github.com/evanleck/berns
173
174
  licenses: