berns 3.5.0 → 4.1.1

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: bcded7fea247763fc7b27807c2c945943e0f08895b117ae086e4041bf1b08371
4
- data.tar.gz: 965518819feb3eef689f19b7cc5470a973198b891e00f9d7f8ac7fd5b4620119
3
+ metadata.gz: c6e746c49f8701090aa423558ef9ccc644cff448b9c9c4f0c55e2752fda3ccf6
4
+ data.tar.gz: 9cb5b7761c29041c95b0ae9e00b4d98f8bffc06130bd02f9d3e4cecec31bc310
5
5
  SHA512:
6
- metadata.gz: f023bfcde5d5b272477d2dd7e7c2d6de430c4ec544d6a10da75f7ff72b5980349d282710796a2ac5c4bede5e72df5456dd733828c7869f3f1231b26314f450e4
7
- data.tar.gz: d606bdeed6b199fa467c4f80236d9dab40ef0db13e3105397bbe411caffa71c00274ea5902e1ce3f4764ab915cada0a9574d133905f07e28a348e2e28f9b7cfa
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 can be used to append a plain text string to the
129
- buffer and that text will be HTML escaped, so it's good for untrusted content.
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
- Once initialized, rendering the template to a string can be done with the
132
- =#call= method and any arguments, positional or keyword, will be passed through
133
- as-is to the block provided to =#new=.
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 is about three times faster than the pure Ruby implementation used in
200
- version 2. See the file [[file:benchmarks/performance.rb][benchmarks/performance.rb]] for the benchmark code.
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
- element 27.373k i/100ms
205
- berns 94.118k i/100ms
225
+ ruby 27.521k i/100ms
226
+ c-ext 74.915k i/100ms
206
227
  Calculating -------------------------------------
207
- element 314.078k4.5%) i/s - 1.588M in 5.065539s
208
- berns 935.528k6.1%) i/s - 4.706M in 5.049718s
228
+ ruby 275.913k1.0%) i/s - 1.404M in 5.087516s
229
+ c-ext 813.113k1.0%) i/s - 4.120M in 5.067902s
209
230
 
210
231
  Comparison:
211
- berns: 935527.9 i/s
212
- element: 314078.4 i/s - 2.98x (± 0.00) slower
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
- return destination;
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
  /*
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, **opts)
14
- instance_exec(*args, **opts, &@block)
15
- to_s
16
- end
14
+ def call(*args, **kwargs)
15
+ @buffer = +''
16
+ content = instance_exec(*args, **kwargs, &@block)
17
17
 
18
- # @return [String]
19
- def to_s
20
- @buffer.freeze
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, **opts, &block)
35
- content = Builder.new.instance_exec(*args, **opts, &block) if block
36
- @buffer << Berns.element(*args, **opts) { content }
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(*args, **opts)
43
- @buffer << Berns.void(*args, **opts)
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, **opts, &block|
48
- content = Builder.new.instance_exec(*args, **opts, &block) if block
49
- @buffer << Berns.send(meth, *args, **opts) { content }
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, **opts|
55
- @buffer << Berns.send(meth, *args, **opts)
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
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Berns
3
- VERSION = '3.5.0'
3
+ VERSION = '4.1.1'
4
4
  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.5.0
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-02-15 00:00:00.000000000 Z
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.5.0
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.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.