berns 1.2.1 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/ext/berns/berns.c ADDED
@@ -0,0 +1,1056 @@
1
+ #include "ruby.h"
2
+ #include "extconf.h"
3
+
4
+ /*
5
+ * "Safe strcpy" - https://twitter.com/hyc_symas/status/1102573036534972416?s=12
6
+ */
7
+ static char *stecpy(char *destination, const char *source, const char *end) {
8
+ while (*source && destination < end) {
9
+ *destination++ = *source++;
10
+ }
11
+
12
+ if (destination < end) {
13
+ *destination = '\0';
14
+ }
15
+
16
+ return destination;
17
+ }
18
+
19
+ /*
20
+ * Berns.escape_html is effectively a proxy to CGI.escapeHTML so we limit the
21
+ * type to strings.
22
+ */
23
+ static VALUE berns_escape_html(const VALUE self, VALUE string) {
24
+ StringValue(string);
25
+
26
+ const VALUE cgi = rb_const_get(rb_cObject, rb_intern("CGI"));
27
+ const VALUE escape = rb_intern("escapeHTML");
28
+
29
+ return rb_funcall(cgi, escape, 1, string);
30
+ }
31
+
32
+ static VALUE berns_to_attribute(const VALUE self, VALUE attribute, const VALUE value) {
33
+ const VALUE empty = rb_str_new_cstr("");
34
+
35
+ VALUE escaped;
36
+ VALUE key;
37
+ VALUE keys;
38
+ VALUE length;
39
+ VALUE rstring;
40
+ VALUE subattr;
41
+ VALUE subkey;
42
+ VALUE subvalue;
43
+
44
+ switch(TYPE(attribute)) {
45
+ case T_STRING:
46
+ break;
47
+ case T_SYMBOL:
48
+ attribute = rb_sym_to_s(attribute);
49
+ break;
50
+ default:
51
+ rb_raise(rb_eTypeError, "Berns.to_attribute attributes must be Strings or Symbols.");
52
+ break;
53
+ }
54
+
55
+ const char *close = "\"";
56
+ const char *dash = "-";
57
+ const char *equals = "=\"";
58
+ const char *space = " ";
59
+
60
+ const size_t clen = strlen(close);
61
+ const size_t dlen = strlen(dash);
62
+ const size_t eqlen = strlen(equals);
63
+ const size_t splen = strlen(space);
64
+
65
+ switch(TYPE(value)) {
66
+ case T_NIL:
67
+ case T_TRUE:
68
+ return attribute;
69
+ case T_FALSE:
70
+ return empty;
71
+ case T_HASH:
72
+ keys = rb_funcall(value, rb_intern("keys"), 0);
73
+ length = RARRAY_LEN(keys);
74
+
75
+ char *substring = NULL;
76
+ size_t size = 0;
77
+
78
+ for (unsigned int i = 0; i < length; i++) {
79
+ key = rb_ary_entry(keys, i);
80
+ subvalue = rb_hash_aref(value, key);
81
+
82
+ switch(TYPE(key)) {
83
+ case T_NIL:
84
+ subkey = empty;
85
+ break;
86
+ case T_STRING:
87
+ subkey = key;
88
+ break;
89
+ case T_SYMBOL:
90
+ subkey = rb_sym_to_s(key);
91
+ break;
92
+ default:
93
+ if (substring != NULL) {
94
+ free(substring);
95
+ }
96
+
97
+ rb_raise(rb_eTypeError, "Berns.to_attribute value keys must be Strings or Symbols.");
98
+ break;
99
+ }
100
+
101
+ size_t total = RSTRING_LEN(attribute) + 1;
102
+
103
+ if (RSTRING_LEN(subkey) > 0) {
104
+ total = RSTRING_LEN(attribute) + dlen + RSTRING_LEN(subkey) + 1;
105
+ }
106
+
107
+ char subname[total];
108
+ char *ptr;
109
+ char *end = subname + sizeof(subname);
110
+
111
+ ptr = stecpy(subname, RSTRING_PTR(attribute), end);
112
+
113
+ if (RSTRING_LEN(subkey) > 0) {
114
+ ptr = stecpy(ptr, dash, end);
115
+ }
116
+
117
+ stecpy(ptr, RSTRING_PTR(subkey), end);
118
+
119
+ subattr = berns_to_attribute(self, rb_str_new_cstr(subname), subvalue);
120
+ size_t subattrlen = RSTRING_LEN(subattr);
121
+
122
+ if (i > 0) {
123
+ size = size + splen + subattrlen;
124
+
125
+ char *tmp = realloc(substring, size);
126
+
127
+ if (tmp == NULL) {
128
+ rb_raise(rb_eNoMemError, "Berns.to_attribute could not allocate sufficient memory.");
129
+ }
130
+
131
+ substring = tmp;
132
+
133
+ stecpy(substring + size - splen - subattrlen, space, substring + size);
134
+ stecpy(substring + size - subattrlen, RSTRING_PTR(subattr), substring + size + 1);
135
+ } else {
136
+ size = size + subattrlen;
137
+ char *tmp = realloc(substring, size);
138
+
139
+ if (tmp == NULL) {
140
+ rb_raise(rb_eNoMemError, "Berns.to_attribute could not allocate sufficient memory.");
141
+ }
142
+
143
+ substring = tmp;
144
+
145
+ stecpy(substring + size - subattrlen, RSTRING_PTR(subattr), substring + size + 1);
146
+ }
147
+ }
148
+
149
+ rstring = rb_str_new_cstr(substring);
150
+ free(substring);
151
+
152
+ return rstring;
153
+ default:
154
+ switch (TYPE(value)) {
155
+ case T_STRING:
156
+ escaped = berns_escape_html(self, value);
157
+ break;
158
+ case T_SYMBOL:
159
+ escaped = berns_escape_html(self, rb_sym_to_s(value));
160
+ break;
161
+ default:
162
+ escaped = berns_escape_html(self, rb_funcall(value, rb_intern("to_s"), 0));
163
+ break;
164
+ }
165
+
166
+ char string[RSTRING_LEN(attribute) + eqlen + RSTRING_LEN(escaped) + clen + 1];
167
+ char *ptr;
168
+ char *end = string + sizeof(string);
169
+
170
+ ptr = stecpy(string, RSTRING_PTR(attribute), end);
171
+ ptr = stecpy(ptr, equals, end);
172
+ ptr = stecpy(ptr, RSTRING_PTR(escaped), end);
173
+ stecpy(ptr, close, end);
174
+
175
+ return rb_str_new_cstr(string);
176
+ }
177
+ }
178
+
179
+ /* Expects a Ruby Hash as a single argument. */
180
+ static VALUE berns_to_attributes(const VALUE self, const VALUE attributes) {
181
+ Check_Type(attributes, T_HASH);
182
+
183
+ VALUE key;
184
+ VALUE attribute;
185
+ VALUE rstring;
186
+
187
+ const VALUE keys = rb_funcall(attributes, rb_intern("keys"), 0);
188
+ const VALUE length = RARRAY_LEN(keys);
189
+
190
+ if (length == 0) {
191
+ return rb_str_new_cstr("");
192
+ }
193
+
194
+ char *string = NULL;
195
+ size_t size = 0; /* IN BYTES */
196
+
197
+ const char *space = " ";
198
+ const size_t splen = strlen(space);
199
+
200
+ size_t alen;
201
+
202
+ for (unsigned int i = 0; i < length; i++) {
203
+ key = rb_ary_entry(keys, i);
204
+ attribute = berns_to_attribute(self, key, rb_hash_aref(attributes, key));
205
+ alen = RSTRING_LEN(attribute);
206
+
207
+ if (i > 0) {
208
+ char *tmp = realloc(string, size + alen + splen + 1);
209
+
210
+ if (tmp == NULL) {
211
+ rb_raise(rb_eNoMemError, "Berns.to_attributes could not allocate sufficient memory.");
212
+ }
213
+
214
+ string = tmp;
215
+
216
+ stecpy(string + size, space, string + size + splen);
217
+ stecpy(string + size + splen, RSTRING_PTR(attribute), string + size + splen + alen + 1);
218
+ size = size + splen + alen;
219
+ } else {
220
+ char *tmp = realloc(string, size + alen + 1);
221
+
222
+ if (tmp == NULL) {
223
+ rb_raise(rb_eNoMemError, "Berns.to_attributes could not allocate sufficient memory.");
224
+ }
225
+
226
+ string = tmp;
227
+
228
+ stecpy(string + size, RSTRING_PTR(attribute), string + size + alen + 1);
229
+ size = size + alen;
230
+ }
231
+ }
232
+
233
+ rstring = rb_str_new_cstr(string);
234
+ free(string);
235
+
236
+ return rstring;
237
+ }
238
+
239
+ static VALUE berns_internal_void(VALUE tag, VALUE attributes) {
240
+ const VALUE berns = rb_const_get(rb_cObject, rb_intern("Berns"));
241
+
242
+ switch(TYPE(tag)) {
243
+ case T_STRING:
244
+ break;
245
+ case T_SYMBOL:
246
+ tag = rb_sym_to_s(tag);
247
+ break;
248
+ default:
249
+ rb_raise(rb_eTypeError, "Berns.void elements must be a String or Symbol.");
250
+ break;
251
+ }
252
+
253
+ const char *open = "<";
254
+ const char *close = ">";
255
+ const char *space = " ";
256
+
257
+ const size_t olen = strlen(open);
258
+ const size_t clen = strlen(close);
259
+ const size_t slen = strlen(space);
260
+
261
+ size_t tlen = RSTRING_LEN(tag);
262
+ size_t total;
263
+ size_t alen = 0;
264
+
265
+ if (TYPE(attributes) != T_IMEMO) {
266
+ attributes = berns_to_attributes(berns, attributes);
267
+ alen = RSTRING_LEN(attributes);
268
+
269
+ if (alen > 0) {
270
+ total = olen + tlen + slen + alen + clen + 1;
271
+ } else {
272
+ total = olen + tlen + clen + 1;
273
+ }
274
+ } else {
275
+ total = olen + tlen + clen + 1;
276
+ }
277
+
278
+ char string[total];
279
+ char *ptr, *end = string + sizeof(string);
280
+
281
+ ptr = stecpy(string, open, end);
282
+ ptr = stecpy(ptr, RSTRING_PTR(tag), end);
283
+
284
+ if (TYPE(attributes) != T_IMEMO && alen > 0) {
285
+ ptr = stecpy(ptr, space, end);
286
+ ptr = stecpy(ptr, RSTRING_PTR(attributes), end);
287
+ }
288
+
289
+ stecpy(ptr, close, end);
290
+
291
+ return rb_str_new_cstr(string);
292
+ }
293
+
294
+ static VALUE berns_internal_element(VALUE tag, VALUE attributes) {
295
+ const VALUE berns = rb_const_get(rb_cObject, rb_intern("Berns"));
296
+
297
+ VALUE content;
298
+
299
+ switch(TYPE(tag)) {
300
+ case T_STRING:
301
+ break;
302
+ case T_SYMBOL:
303
+ tag = rb_sym_to_s(tag);
304
+ break;
305
+ default:
306
+ rb_raise(rb_eTypeError, "Berns.element elements must be a String or Symbol.");
307
+ break;
308
+ }
309
+
310
+ if (rb_block_given_p()) {
311
+ content = rb_yield(Qnil);
312
+
313
+ if (TYPE(content) == T_NIL) {
314
+ content = rb_str_new_cstr("");
315
+ }
316
+ } else {
317
+ content = rb_str_new_cstr("");
318
+ }
319
+
320
+ StringValue(content);
321
+
322
+ const char *open = "<";
323
+ const char *close = ">";
324
+ const char *slash = "/";
325
+ const char *space = " ";
326
+
327
+ const size_t olen = strlen(open);
328
+ const size_t clen = strlen(close);
329
+ const size_t sllen = strlen(slash);
330
+ const size_t slen = strlen(space);
331
+
332
+ size_t tlen = RSTRING_LEN(tag);
333
+ size_t conlen = RSTRING_LEN(content);
334
+ size_t total = olen + tlen + clen + conlen + olen + sllen + tlen + clen + 1;
335
+
336
+ if (TYPE(attributes) != T_IMEMO) {
337
+ attributes = berns_to_attributes(berns, attributes);
338
+ total = total + slen + RSTRING_LEN(attributes);
339
+ }
340
+
341
+ char string[total];
342
+ char *ptr;
343
+ char *end = string + sizeof(string);
344
+
345
+ ptr = stecpy(string, open, end);
346
+ ptr = stecpy(ptr, RSTRING_PTR(tag), end);
347
+
348
+ if (TYPE(attributes) != T_IMEMO) {
349
+ ptr = stecpy(ptr, space, end);
350
+ ptr = stecpy(ptr, RSTRING_PTR(attributes), end);
351
+ }
352
+
353
+ ptr = stecpy(ptr, close, end);
354
+ ptr = stecpy(ptr, RSTRING_PTR(content), end);
355
+ ptr = stecpy(ptr, open, end);
356
+ ptr = stecpy(ptr, slash, end);
357
+ ptr = stecpy(ptr, RSTRING_PTR(tag), end);
358
+ stecpy(ptr, close, end);
359
+
360
+ return rb_str_new_cstr(string);
361
+ }
362
+
363
+ static VALUE berns_void_element(int argc, VALUE *argv, VALUE self) {
364
+ rb_check_arity(argc, 1, 2);
365
+ return berns_internal_void(argv[0], argv[1]);
366
+ }
367
+
368
+ static VALUE berns_area_element(int argc, VALUE *argv, VALUE self) {
369
+ rb_check_arity(argc, 0, 1);
370
+ return berns_internal_void(rb_str_new_cstr("area"), argv[0]);
371
+ }
372
+
373
+ static VALUE berns_base_element(int argc, VALUE *argv, VALUE self) {
374
+ rb_check_arity(argc, 0, 1);
375
+ return berns_internal_void(rb_str_new_cstr("base"), argv[0]);
376
+ }
377
+
378
+ static VALUE berns_br_element(int argc, VALUE *argv, VALUE self) {
379
+ rb_check_arity(argc, 0, 1);
380
+ return berns_internal_void(rb_str_new_cstr("br"), argv[0]);
381
+ }
382
+
383
+ static VALUE berns_col_element(int argc, VALUE *argv, VALUE self) {
384
+ rb_check_arity(argc, 0, 1);
385
+ return berns_internal_void(rb_str_new_cstr("col"), argv[0]);
386
+ }
387
+
388
+ static VALUE berns_embed_element(int argc, VALUE *argv, VALUE self) {
389
+ rb_check_arity(argc, 0, 1);
390
+ return berns_internal_void(rb_str_new_cstr("embed"), argv[0]);
391
+ }
392
+
393
+ static VALUE berns_hr_element(int argc, VALUE *argv, VALUE self) {
394
+ rb_check_arity(argc, 0, 1);
395
+ return berns_internal_void(rb_str_new_cstr("hr"), argv[0]);
396
+ }
397
+
398
+ static VALUE berns_img_element(int argc, VALUE *argv, VALUE self) {
399
+ rb_check_arity(argc, 0, 1);
400
+ return berns_internal_void(rb_str_new_cstr("img"), argv[0]);
401
+ }
402
+
403
+ static VALUE berns_input_element(int argc, VALUE *argv, VALUE self) {
404
+ rb_check_arity(argc, 0, 1);
405
+ return berns_internal_void(rb_str_new_cstr("input"), argv[0]);
406
+ }
407
+
408
+ static VALUE berns_link_element(int argc, VALUE *argv, VALUE self) {
409
+ rb_check_arity(argc, 0, 1);
410
+ return berns_internal_void(rb_str_new_cstr("link"), argv[0]);
411
+ }
412
+
413
+ static VALUE berns_menuitem_element(int argc, VALUE *argv, VALUE self) {
414
+ rb_check_arity(argc, 0, 1);
415
+ return berns_internal_void(rb_str_new_cstr("menuitem"), argv[0]);
416
+ }
417
+
418
+ static VALUE berns_meta_element(int argc, VALUE *argv, VALUE self) {
419
+ rb_check_arity(argc, 0, 1);
420
+ return berns_internal_void(rb_str_new_cstr("meta"), argv[0]);
421
+ }
422
+
423
+ static VALUE berns_param_element(int argc, VALUE *argv, VALUE self) {
424
+ rb_check_arity(argc, 0, 1);
425
+ return berns_internal_void(rb_str_new_cstr("param"), argv[0]);
426
+ }
427
+
428
+ static VALUE berns_source_element(int argc, VALUE *argv, VALUE self) {
429
+ rb_check_arity(argc, 0, 1);
430
+ return berns_internal_void(rb_str_new_cstr("source"), argv[0]);
431
+ }
432
+
433
+ static VALUE berns_track_element(int argc, VALUE *argv, VALUE self) {
434
+ rb_check_arity(argc, 0, 1);
435
+ return berns_internal_void(rb_str_new_cstr("track"), argv[0]);
436
+ }
437
+
438
+ static VALUE berns_wbr_element(int argc, VALUE *argv, VALUE self) {
439
+ rb_check_arity(argc, 0, 1);
440
+ return berns_internal_void(rb_str_new_cstr("wbr"), argv[0]);
441
+ }
442
+
443
+ static VALUE berns_element(int argc, VALUE* argv, VALUE self) {
444
+ rb_check_arity(argc, 1, 2);
445
+ return berns_internal_element(argv[0], argv[1]);
446
+ }
447
+
448
+ static VALUE berns_a_element(int argc, VALUE* argv, VALUE self) {
449
+ rb_check_arity(argc, 0, 1);
450
+ return berns_internal_element(rb_str_new_cstr("a"), argv[0]);
451
+ }
452
+
453
+ static VALUE berns_abbr_element(int argc, VALUE* argv, VALUE self) {
454
+ rb_check_arity(argc, 0, 1);
455
+ return berns_internal_element(rb_str_new_cstr("abbr"), argv[0]);
456
+ }
457
+
458
+ static VALUE berns_address_element(int argc, VALUE* argv, VALUE self) {
459
+ rb_check_arity(argc, 0, 1);
460
+ return berns_internal_element(rb_str_new_cstr("address"), argv[0]);
461
+ }
462
+
463
+ static VALUE berns_article_element(int argc, VALUE* argv, VALUE self) {
464
+ rb_check_arity(argc, 0, 1);
465
+ return berns_internal_element(rb_str_new_cstr("article"), argv[0]);
466
+ }
467
+
468
+ static VALUE berns_aside_element(int argc, VALUE* argv, VALUE self) {
469
+ rb_check_arity(argc, 0, 1);
470
+ return berns_internal_element(rb_str_new_cstr("aside"), argv[0]);
471
+ }
472
+
473
+ static VALUE berns_audio_element(int argc, VALUE* argv, VALUE self) {
474
+ rb_check_arity(argc, 0, 1);
475
+ return berns_internal_element(rb_str_new_cstr("audio"), argv[0]);
476
+ }
477
+
478
+ static VALUE berns_b_element(int argc, VALUE* argv, VALUE self) {
479
+ rb_check_arity(argc, 0, 1);
480
+ return berns_internal_element(rb_str_new_cstr("b"), argv[0]);
481
+ }
482
+
483
+ static VALUE berns_bdi_element(int argc, VALUE* argv, VALUE self) {
484
+ rb_check_arity(argc, 0, 1);
485
+ return berns_internal_element(rb_str_new_cstr("bdi"), argv[0]);
486
+ }
487
+
488
+ static VALUE berns_bdo_element(int argc, VALUE* argv, VALUE self) {
489
+ rb_check_arity(argc, 0, 1);
490
+ return berns_internal_element(rb_str_new_cstr("bdo"), argv[0]);
491
+ }
492
+
493
+ static VALUE berns_blockquote_element(int argc, VALUE* argv, VALUE self) {
494
+ rb_check_arity(argc, 0, 1);
495
+ return berns_internal_element(rb_str_new_cstr("blockquote"), argv[0]);
496
+ }
497
+
498
+ static VALUE berns_body_element(int argc, VALUE* argv, VALUE self) {
499
+ rb_check_arity(argc, 0, 1);
500
+ return berns_internal_element(rb_str_new_cstr("body"), argv[0]);
501
+ }
502
+
503
+ static VALUE berns_button_element(int argc, VALUE* argv, VALUE self) {
504
+ rb_check_arity(argc, 0, 1);
505
+ return berns_internal_element(rb_str_new_cstr("button"), argv[0]);
506
+ }
507
+
508
+ static VALUE berns_canvas_element(int argc, VALUE* argv, VALUE self) {
509
+ rb_check_arity(argc, 0, 1);
510
+ return berns_internal_element(rb_str_new_cstr("canvas"), argv[0]);
511
+ }
512
+
513
+ static VALUE berns_caption_element(int argc, VALUE* argv, VALUE self) {
514
+ rb_check_arity(argc, 0, 1);
515
+ return berns_internal_element(rb_str_new_cstr("caption"), argv[0]);
516
+ }
517
+
518
+ static VALUE berns_cite_element(int argc, VALUE* argv, VALUE self) {
519
+ rb_check_arity(argc, 0, 1);
520
+ return berns_internal_element(rb_str_new_cstr("cite"), argv[0]);
521
+ }
522
+
523
+ static VALUE berns_code_element(int argc, VALUE* argv, VALUE self) {
524
+ rb_check_arity(argc, 0, 1);
525
+ return berns_internal_element(rb_str_new_cstr("code"), argv[0]);
526
+ }
527
+
528
+ static VALUE berns_colgroup_element(int argc, VALUE* argv, VALUE self) {
529
+ rb_check_arity(argc, 0, 1);
530
+ return berns_internal_element(rb_str_new_cstr("colgroup"), argv[0]);
531
+ }
532
+
533
+ static VALUE berns_datalist_element(int argc, VALUE* argv, VALUE self) {
534
+ rb_check_arity(argc, 0, 1);
535
+ return berns_internal_element(rb_str_new_cstr("datalist"), argv[0]);
536
+ }
537
+
538
+ static VALUE berns_dd_element(int argc, VALUE* argv, VALUE self) {
539
+ rb_check_arity(argc, 0, 1);
540
+ return berns_internal_element(rb_str_new_cstr("dd"), argv[0]);
541
+ }
542
+
543
+ static VALUE berns_del_element(int argc, VALUE* argv, VALUE self) {
544
+ rb_check_arity(argc, 0, 1);
545
+ return berns_internal_element(rb_str_new_cstr("del"), argv[0]);
546
+ }
547
+
548
+ static VALUE berns_details_element(int argc, VALUE* argv, VALUE self) {
549
+ rb_check_arity(argc, 0, 1);
550
+ return berns_internal_element(rb_str_new_cstr("details"), argv[0]);
551
+ }
552
+
553
+ static VALUE berns_dfn_element(int argc, VALUE* argv, VALUE self) {
554
+ rb_check_arity(argc, 0, 1);
555
+ return berns_internal_element(rb_str_new_cstr("dfn"), argv[0]);
556
+ }
557
+
558
+ static VALUE berns_dialog_element(int argc, VALUE* argv, VALUE self) {
559
+ rb_check_arity(argc, 0, 1);
560
+ return berns_internal_element(rb_str_new_cstr("dialog"), argv[0]);
561
+ }
562
+
563
+ static VALUE berns_div_element(int argc, VALUE* argv, VALUE self) {
564
+ rb_check_arity(argc, 0, 1);
565
+ return berns_internal_element(rb_str_new_cstr("div"), argv[0]);
566
+ }
567
+
568
+ static VALUE berns_dl_element(int argc, VALUE* argv, VALUE self) {
569
+ rb_check_arity(argc, 0, 1);
570
+ return berns_internal_element(rb_str_new_cstr("dl"), argv[0]);
571
+ }
572
+
573
+ static VALUE berns_dt_element(int argc, VALUE* argv, VALUE self) {
574
+ rb_check_arity(argc, 0, 1);
575
+ return berns_internal_element(rb_str_new_cstr("dt"), argv[0]);
576
+ }
577
+
578
+ static VALUE berns_em_element(int argc, VALUE* argv, VALUE self) {
579
+ rb_check_arity(argc, 0, 1);
580
+ return berns_internal_element(rb_str_new_cstr("em"), argv[0]);
581
+ }
582
+
583
+ static VALUE berns_fieldset_element(int argc, VALUE* argv, VALUE self) {
584
+ rb_check_arity(argc, 0, 1);
585
+ return berns_internal_element(rb_str_new_cstr("fieldset"), argv[0]);
586
+ }
587
+
588
+ static VALUE berns_figcaption_element(int argc, VALUE* argv, VALUE self) {
589
+ rb_check_arity(argc, 0, 1);
590
+ return berns_internal_element(rb_str_new_cstr("figcaption"), argv[0]);
591
+ }
592
+
593
+ static VALUE berns_figure_element(int argc, VALUE* argv, VALUE self) {
594
+ rb_check_arity(argc, 0, 1);
595
+ return berns_internal_element(rb_str_new_cstr("figure"), argv[0]);
596
+ }
597
+
598
+ static VALUE berns_footer_element(int argc, VALUE* argv, VALUE self) {
599
+ rb_check_arity(argc, 0, 1);
600
+ return berns_internal_element(rb_str_new_cstr("footer"), argv[0]);
601
+ }
602
+
603
+ static VALUE berns_form_element(int argc, VALUE* argv, VALUE self) {
604
+ rb_check_arity(argc, 0, 1);
605
+ return berns_internal_element(rb_str_new_cstr("form"), argv[0]);
606
+ }
607
+
608
+ static VALUE berns_h1_element(int argc, VALUE* argv, VALUE self) {
609
+ rb_check_arity(argc, 0, 1);
610
+ return berns_internal_element(rb_str_new_cstr("h1"), argv[0]);
611
+ }
612
+
613
+ static VALUE berns_h2_element(int argc, VALUE* argv, VALUE self) {
614
+ rb_check_arity(argc, 0, 1);
615
+ return berns_internal_element(rb_str_new_cstr("h2"), argv[0]);
616
+ }
617
+
618
+ static VALUE berns_h3_element(int argc, VALUE* argv, VALUE self) {
619
+ rb_check_arity(argc, 0, 1);
620
+ return berns_internal_element(rb_str_new_cstr("h3"), argv[0]);
621
+ }
622
+
623
+ static VALUE berns_h4_element(int argc, VALUE* argv, VALUE self) {
624
+ rb_check_arity(argc, 0, 1);
625
+ return berns_internal_element(rb_str_new_cstr("h4"), argv[0]);
626
+ }
627
+
628
+ static VALUE berns_h5_element(int argc, VALUE* argv, VALUE self) {
629
+ rb_check_arity(argc, 0, 1);
630
+ return berns_internal_element(rb_str_new_cstr("h5"), argv[0]);
631
+ }
632
+
633
+ static VALUE berns_h6_element(int argc, VALUE* argv, VALUE self) {
634
+ rb_check_arity(argc, 0, 1);
635
+ return berns_internal_element(rb_str_new_cstr("h6"), argv[0]);
636
+ }
637
+
638
+ static VALUE berns_head_element(int argc, VALUE* argv, VALUE self) {
639
+ rb_check_arity(argc, 0, 1);
640
+ return berns_internal_element(rb_str_new_cstr("head"), argv[0]);
641
+ }
642
+
643
+ static VALUE berns_header_element(int argc, VALUE* argv, VALUE self) {
644
+ rb_check_arity(argc, 0, 1);
645
+ return berns_internal_element(rb_str_new_cstr("header"), argv[0]);
646
+ }
647
+
648
+ static VALUE berns_html_element(int argc, VALUE* argv, VALUE self) {
649
+ rb_check_arity(argc, 0, 1);
650
+ return berns_internal_element(rb_str_new_cstr("html"), argv[0]);
651
+ }
652
+
653
+ static VALUE berns_i_element(int argc, VALUE* argv, VALUE self) {
654
+ rb_check_arity(argc, 0, 1);
655
+ return berns_internal_element(rb_str_new_cstr("i"), argv[0]);
656
+ }
657
+
658
+ static VALUE berns_iframe_element(int argc, VALUE* argv, VALUE self) {
659
+ rb_check_arity(argc, 0, 1);
660
+ return berns_internal_element(rb_str_new_cstr("iframe"), argv[0]);
661
+ }
662
+
663
+ static VALUE berns_ins_element(int argc, VALUE* argv, VALUE self) {
664
+ rb_check_arity(argc, 0, 1);
665
+ return berns_internal_element(rb_str_new_cstr("ins"), argv[0]);
666
+ }
667
+
668
+ static VALUE berns_kbd_element(int argc, VALUE* argv, VALUE self) {
669
+ rb_check_arity(argc, 0, 1);
670
+ return berns_internal_element(rb_str_new_cstr("kbd"), argv[0]);
671
+ }
672
+
673
+ static VALUE berns_label_element(int argc, VALUE* argv, VALUE self) {
674
+ rb_check_arity(argc, 0, 1);
675
+ return berns_internal_element(rb_str_new_cstr("label"), argv[0]);
676
+ }
677
+
678
+ static VALUE berns_legend_element(int argc, VALUE* argv, VALUE self) {
679
+ rb_check_arity(argc, 0, 1);
680
+ return berns_internal_element(rb_str_new_cstr("legend"), argv[0]);
681
+ }
682
+
683
+ static VALUE berns_li_element(int argc, VALUE* argv, VALUE self) {
684
+ rb_check_arity(argc, 0, 1);
685
+ return berns_internal_element(rb_str_new_cstr("li"), argv[0]);
686
+ }
687
+
688
+ static VALUE berns_main_element(int argc, VALUE* argv, VALUE self) {
689
+ rb_check_arity(argc, 0, 1);
690
+ return berns_internal_element(rb_str_new_cstr("main"), argv[0]);
691
+ }
692
+
693
+ static VALUE berns_map_element(int argc, VALUE* argv, VALUE self) {
694
+ rb_check_arity(argc, 0, 1);
695
+ return berns_internal_element(rb_str_new_cstr("map"), argv[0]);
696
+ }
697
+
698
+ static VALUE berns_mark_element(int argc, VALUE* argv, VALUE self) {
699
+ rb_check_arity(argc, 0, 1);
700
+ return berns_internal_element(rb_str_new_cstr("mark"), argv[0]);
701
+ }
702
+
703
+ static VALUE berns_menu_element(int argc, VALUE* argv, VALUE self) {
704
+ rb_check_arity(argc, 0, 1);
705
+ return berns_internal_element(rb_str_new_cstr("menu"), argv[0]);
706
+ }
707
+
708
+ static VALUE berns_meter_element(int argc, VALUE* argv, VALUE self) {
709
+ rb_check_arity(argc, 0, 1);
710
+ return berns_internal_element(rb_str_new_cstr("meter"), argv[0]);
711
+ }
712
+
713
+ static VALUE berns_nav_element(int argc, VALUE* argv, VALUE self) {
714
+ rb_check_arity(argc, 0, 1);
715
+ return berns_internal_element(rb_str_new_cstr("nav"), argv[0]);
716
+ }
717
+
718
+ static VALUE berns_noscript_element(int argc, VALUE* argv, VALUE self) {
719
+ rb_check_arity(argc, 0, 1);
720
+ return berns_internal_element(rb_str_new_cstr("noscript"), argv[0]);
721
+ }
722
+
723
+ static VALUE berns_object_element(int argc, VALUE* argv, VALUE self) {
724
+ rb_check_arity(argc, 0, 1);
725
+ return berns_internal_element(rb_str_new_cstr("object"), argv[0]);
726
+ }
727
+
728
+ static VALUE berns_ol_element(int argc, VALUE* argv, VALUE self) {
729
+ rb_check_arity(argc, 0, 1);
730
+ return berns_internal_element(rb_str_new_cstr("ol"), argv[0]);
731
+ }
732
+
733
+ static VALUE berns_optgroup_element(int argc, VALUE* argv, VALUE self) {
734
+ rb_check_arity(argc, 0, 1);
735
+ return berns_internal_element(rb_str_new_cstr("optgroup"), argv[0]);
736
+ }
737
+
738
+ static VALUE berns_option_element(int argc, VALUE* argv, VALUE self) {
739
+ rb_check_arity(argc, 0, 1);
740
+ return berns_internal_element(rb_str_new_cstr("option"), argv[0]);
741
+ }
742
+
743
+ static VALUE berns_output_element(int argc, VALUE* argv, VALUE self) {
744
+ rb_check_arity(argc, 0, 1);
745
+ return berns_internal_element(rb_str_new_cstr("output"), argv[0]);
746
+ }
747
+
748
+ static VALUE berns_p_element(int argc, VALUE* argv, VALUE self) {
749
+ rb_check_arity(argc, 0, 1);
750
+ return berns_internal_element(rb_str_new_cstr("p"), argv[0]);
751
+ }
752
+
753
+ static VALUE berns_picture_element(int argc, VALUE* argv, VALUE self) {
754
+ rb_check_arity(argc, 0, 1);
755
+ return berns_internal_element(rb_str_new_cstr("picture"), argv[0]);
756
+ }
757
+
758
+ static VALUE berns_pre_element(int argc, VALUE* argv, VALUE self) {
759
+ rb_check_arity(argc, 0, 1);
760
+ return berns_internal_element(rb_str_new_cstr("pre"), argv[0]);
761
+ }
762
+
763
+ static VALUE berns_progress_element(int argc, VALUE* argv, VALUE self) {
764
+ rb_check_arity(argc, 0, 1);
765
+ return berns_internal_element(rb_str_new_cstr("progress"), argv[0]);
766
+ }
767
+
768
+ static VALUE berns_q_element(int argc, VALUE* argv, VALUE self) {
769
+ rb_check_arity(argc, 0, 1);
770
+ return berns_internal_element(rb_str_new_cstr("q"), argv[0]);
771
+ }
772
+
773
+ static VALUE berns_rp_element(int argc, VALUE* argv, VALUE self) {
774
+ rb_check_arity(argc, 0, 1);
775
+ return berns_internal_element(rb_str_new_cstr("rp"), argv[0]);
776
+ }
777
+
778
+ static VALUE berns_rt_element(int argc, VALUE* argv, VALUE self) {
779
+ rb_check_arity(argc, 0, 1);
780
+ return berns_internal_element(rb_str_new_cstr("rt"), argv[0]);
781
+ }
782
+
783
+ static VALUE berns_ruby_element(int argc, VALUE* argv, VALUE self) {
784
+ rb_check_arity(argc, 0, 1);
785
+ return berns_internal_element(rb_str_new_cstr("ruby"), argv[0]);
786
+ }
787
+
788
+ static VALUE berns_s_element(int argc, VALUE* argv, VALUE self) {
789
+ rb_check_arity(argc, 0, 1);
790
+ return berns_internal_element(rb_str_new_cstr("s"), argv[0]);
791
+ }
792
+
793
+ static VALUE berns_samp_element(int argc, VALUE* argv, VALUE self) {
794
+ rb_check_arity(argc, 0, 1);
795
+ return berns_internal_element(rb_str_new_cstr("samp"), argv[0]);
796
+ }
797
+
798
+ static VALUE berns_script_element(int argc, VALUE* argv, VALUE self) {
799
+ rb_check_arity(argc, 0, 1);
800
+ return berns_internal_element(rb_str_new_cstr("script"), argv[0]);
801
+ }
802
+
803
+ static VALUE berns_section_element(int argc, VALUE* argv, VALUE self) {
804
+ rb_check_arity(argc, 0, 1);
805
+ return berns_internal_element(rb_str_new_cstr("section"), argv[0]);
806
+ }
807
+
808
+ static VALUE berns_select_element(int argc, VALUE* argv, VALUE self) {
809
+ rb_check_arity(argc, 0, 1);
810
+ return berns_internal_element(rb_str_new_cstr("select"), argv[0]);
811
+ }
812
+
813
+ static VALUE berns_small_element(int argc, VALUE* argv, VALUE self) {
814
+ rb_check_arity(argc, 0, 1);
815
+ return berns_internal_element(rb_str_new_cstr("small"), argv[0]);
816
+ }
817
+
818
+ static VALUE berns_span_element(int argc, VALUE* argv, VALUE self) {
819
+ rb_check_arity(argc, 0, 1);
820
+ return berns_internal_element(rb_str_new_cstr("span"), argv[0]);
821
+ }
822
+
823
+ static VALUE berns_strong_element(int argc, VALUE* argv, VALUE self) {
824
+ rb_check_arity(argc, 0, 1);
825
+ return berns_internal_element(rb_str_new_cstr("strong"), argv[0]);
826
+ }
827
+
828
+ static VALUE berns_style_element(int argc, VALUE* argv, VALUE self) {
829
+ rb_check_arity(argc, 0, 1);
830
+ return berns_internal_element(rb_str_new_cstr("style"), argv[0]);
831
+ }
832
+
833
+ static VALUE berns_sub_element(int argc, VALUE* argv, VALUE self) {
834
+ rb_check_arity(argc, 0, 1);
835
+ return berns_internal_element(rb_str_new_cstr("sub"), argv[0]);
836
+ }
837
+
838
+ static VALUE berns_summary_element(int argc, VALUE* argv, VALUE self) {
839
+ rb_check_arity(argc, 0, 1);
840
+ return berns_internal_element(rb_str_new_cstr("summary"), argv[0]);
841
+ }
842
+
843
+ static VALUE berns_table_element(int argc, VALUE* argv, VALUE self) {
844
+ rb_check_arity(argc, 0, 1);
845
+ return berns_internal_element(rb_str_new_cstr("table"), argv[0]);
846
+ }
847
+
848
+ static VALUE berns_tbody_element(int argc, VALUE* argv, VALUE self) {
849
+ rb_check_arity(argc, 0, 1);
850
+ return berns_internal_element(rb_str_new_cstr("tbody"), argv[0]);
851
+ }
852
+
853
+ static VALUE berns_td_element(int argc, VALUE* argv, VALUE self) {
854
+ rb_check_arity(argc, 0, 1);
855
+ return berns_internal_element(rb_str_new_cstr("td"), argv[0]);
856
+ }
857
+
858
+ static VALUE berns_template_element(int argc, VALUE* argv, VALUE self) {
859
+ rb_check_arity(argc, 0, 1);
860
+ return berns_internal_element(rb_str_new_cstr("template"), argv[0]);
861
+ }
862
+
863
+ static VALUE berns_textarea_element(int argc, VALUE* argv, VALUE self) {
864
+ rb_check_arity(argc, 0, 1);
865
+ return berns_internal_element(rb_str_new_cstr("textarea"), argv[0]);
866
+ }
867
+
868
+ static VALUE berns_tfoot_element(int argc, VALUE* argv, VALUE self) {
869
+ rb_check_arity(argc, 0, 1);
870
+ return berns_internal_element(rb_str_new_cstr("tfoot"), argv[0]);
871
+ }
872
+
873
+ static VALUE berns_th_element(int argc, VALUE* argv, VALUE self) {
874
+ rb_check_arity(argc, 0, 1);
875
+ return berns_internal_element(rb_str_new_cstr("th"), argv[0]);
876
+ }
877
+
878
+ static VALUE berns_thead_element(int argc, VALUE* argv, VALUE self) {
879
+ rb_check_arity(argc, 0, 1);
880
+ return berns_internal_element(rb_str_new_cstr("thead"), argv[0]);
881
+ }
882
+
883
+ static VALUE berns_time_element(int argc, VALUE* argv, VALUE self) {
884
+ rb_check_arity(argc, 0, 1);
885
+ return berns_internal_element(rb_str_new_cstr("time"), argv[0]);
886
+ }
887
+
888
+ static VALUE berns_title_element(int argc, VALUE* argv, VALUE self) {
889
+ rb_check_arity(argc, 0, 1);
890
+ return berns_internal_element(rb_str_new_cstr("title"), argv[0]);
891
+ }
892
+
893
+ static VALUE berns_tr_element(int argc, VALUE* argv, VALUE self) {
894
+ rb_check_arity(argc, 0, 1);
895
+ return berns_internal_element(rb_str_new_cstr("tr"), argv[0]);
896
+ }
897
+
898
+ static VALUE berns_u_element(int argc, VALUE* argv, VALUE self) {
899
+ rb_check_arity(argc, 0, 1);
900
+ return berns_internal_element(rb_str_new_cstr("u"), argv[0]);
901
+ }
902
+
903
+ static VALUE berns_ul_element(int argc, VALUE* argv, VALUE self) {
904
+ rb_check_arity(argc, 0, 1);
905
+ return berns_internal_element(rb_str_new_cstr("ul"), argv[0]);
906
+ }
907
+
908
+ static VALUE berns_var_element(int argc, VALUE* argv, VALUE self) {
909
+ rb_check_arity(argc, 0, 1);
910
+ return berns_internal_element(rb_str_new_cstr("var"), argv[0]);
911
+ }
912
+
913
+ static VALUE berns_video_element(int argc, VALUE* argv, VALUE self) {
914
+ rb_check_arity(argc, 0, 1);
915
+ return berns_internal_element(rb_str_new_cstr("video"), argv[0]);
916
+ }
917
+
918
+ void Init_berns() {
919
+ VALUE Berns = rb_define_module("Berns");
920
+
921
+ rb_define_singleton_method(Berns, "element", berns_element, -1);
922
+ rb_define_singleton_method(Berns, "escape_html", berns_escape_html, 1);
923
+ rb_define_singleton_method(Berns, "to_attribute", berns_to_attribute, 2);
924
+ rb_define_singleton_method(Berns, "to_attributes", berns_to_attributes, 1);
925
+ rb_define_singleton_method(Berns, "void", berns_void_element, -1);
926
+
927
+ /*
928
+ * List of void elements - http://xahlee.info/js/html5_non-closing_tag.html
929
+ *
930
+ * area base br col embed hr img input link menuitem meta param source track wbr
931
+ *
932
+ */
933
+ rb_define_singleton_method(Berns, "area", berns_area_element, -1);
934
+ rb_define_singleton_method(Berns, "base", berns_base_element, -1);
935
+ rb_define_singleton_method(Berns, "br", berns_br_element, -1);
936
+ rb_define_singleton_method(Berns, "col", berns_col_element, -1);
937
+ rb_define_singleton_method(Berns, "embed", berns_embed_element, -1);
938
+ rb_define_singleton_method(Berns, "hr", berns_hr_element, -1);
939
+ rb_define_singleton_method(Berns, "img", berns_img_element, -1);
940
+ rb_define_singleton_method(Berns, "input", berns_input_element, -1);
941
+ rb_define_singleton_method(Berns, "link", berns_link_element, -1);
942
+ rb_define_singleton_method(Berns, "menuitem", berns_menuitem_element, -1);
943
+ rb_define_singleton_method(Berns, "meta", berns_meta_element, -1);
944
+ rb_define_singleton_method(Berns, "param", berns_param_element, -1);
945
+ rb_define_singleton_method(Berns, "source", berns_source_element, -1);
946
+ rb_define_singleton_method(Berns, "track", berns_track_element, -1);
947
+ rb_define_singleton_method(Berns, "wbr", berns_wbr_element, -1);
948
+
949
+ /*
950
+ * List of standard HTML5 elements - https://www.w3schools.com/TAgs/default.asp
951
+ *
952
+ * a abbr address article aside audio b bdi bdo blockquote body button
953
+ * canvas caption cite code colgroup datalist dd del details dfn dialog div
954
+ * dl dt em fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head
955
+ * header html i iframe ins kbd label legend li main map mark menu meter nav
956
+ * noscript object ol optgroup option output p picture pre progress q rp rt
957
+ * ruby s samp script section select small span strong style sub summary
958
+ * table tbody td template textarea tfoot th thead time title tr u ul var
959
+ * video
960
+ *
961
+ */
962
+ rb_define_singleton_method(Berns, "a", berns_a_element, -1);
963
+ rb_define_singleton_method(Berns, "abbr", berns_abbr_element, -1);
964
+ rb_define_singleton_method(Berns, "address", berns_address_element, -1);
965
+ rb_define_singleton_method(Berns, "article", berns_article_element, -1);
966
+ rb_define_singleton_method(Berns, "aside", berns_aside_element, -1);
967
+ rb_define_singleton_method(Berns, "audio", berns_audio_element, -1);
968
+ rb_define_singleton_method(Berns, "b", berns_b_element, -1);
969
+ rb_define_singleton_method(Berns, "bdi", berns_bdi_element, -1);
970
+ rb_define_singleton_method(Berns, "bdo", berns_bdo_element, -1);
971
+ rb_define_singleton_method(Berns, "blockquote", berns_blockquote_element, -1);
972
+ rb_define_singleton_method(Berns, "body", berns_body_element, -1);
973
+ rb_define_singleton_method(Berns, "button", berns_button_element, -1);
974
+ rb_define_singleton_method(Berns, "canvas", berns_canvas_element, -1);
975
+ rb_define_singleton_method(Berns, "caption", berns_caption_element, -1);
976
+ rb_define_singleton_method(Berns, "cite", berns_cite_element, -1);
977
+ rb_define_singleton_method(Berns, "code", berns_code_element, -1);
978
+ rb_define_singleton_method(Berns, "colgroup", berns_colgroup_element, -1);
979
+ rb_define_singleton_method(Berns, "datalist", berns_datalist_element, -1);
980
+ rb_define_singleton_method(Berns, "dd", berns_dd_element, -1);
981
+ rb_define_singleton_method(Berns, "del", berns_del_element, -1);
982
+ rb_define_singleton_method(Berns, "details", berns_details_element, -1);
983
+ rb_define_singleton_method(Berns, "dfn", berns_dfn_element, -1);
984
+ rb_define_singleton_method(Berns, "dialog", berns_dialog_element, -1);
985
+ rb_define_singleton_method(Berns, "div", berns_div_element, -1);
986
+ rb_define_singleton_method(Berns, "dl", berns_dl_element, -1);
987
+ rb_define_singleton_method(Berns, "dt", berns_dt_element, -1);
988
+ rb_define_singleton_method(Berns, "em", berns_em_element, -1);
989
+ rb_define_singleton_method(Berns, "fieldset", berns_fieldset_element, -1);
990
+ rb_define_singleton_method(Berns, "figcaption", berns_figcaption_element, -1);
991
+ rb_define_singleton_method(Berns, "figure", berns_figure_element, -1);
992
+ rb_define_singleton_method(Berns, "footer", berns_footer_element, -1);
993
+ rb_define_singleton_method(Berns, "form", berns_form_element, -1);
994
+ rb_define_singleton_method(Berns, "h1", berns_h1_element, -1);
995
+ rb_define_singleton_method(Berns, "h2", berns_h2_element, -1);
996
+ rb_define_singleton_method(Berns, "h3", berns_h3_element, -1);
997
+ rb_define_singleton_method(Berns, "h4", berns_h4_element, -1);
998
+ rb_define_singleton_method(Berns, "h5", berns_h5_element, -1);
999
+ rb_define_singleton_method(Berns, "h6", berns_h6_element, -1);
1000
+ rb_define_singleton_method(Berns, "head", berns_head_element, -1);
1001
+ rb_define_singleton_method(Berns, "header", berns_header_element, -1);
1002
+ rb_define_singleton_method(Berns, "html", berns_html_element, -1);
1003
+ rb_define_singleton_method(Berns, "i", berns_i_element, -1);
1004
+ rb_define_singleton_method(Berns, "iframe", berns_iframe_element, -1);
1005
+ rb_define_singleton_method(Berns, "ins", berns_ins_element, -1);
1006
+ rb_define_singleton_method(Berns, "kbd", berns_kbd_element, -1);
1007
+ rb_define_singleton_method(Berns, "label", berns_label_element, -1);
1008
+ rb_define_singleton_method(Berns, "legend", berns_legend_element, -1);
1009
+ rb_define_singleton_method(Berns, "li", berns_li_element, -1);
1010
+ rb_define_singleton_method(Berns, "main", berns_main_element, -1);
1011
+ rb_define_singleton_method(Berns, "map", berns_map_element, -1);
1012
+ rb_define_singleton_method(Berns, "mark", berns_mark_element, -1);
1013
+ rb_define_singleton_method(Berns, "menu", berns_menu_element, -1);
1014
+ rb_define_singleton_method(Berns, "meter", berns_meter_element, -1);
1015
+ rb_define_singleton_method(Berns, "nav", berns_nav_element, -1);
1016
+ rb_define_singleton_method(Berns, "noscript", berns_noscript_element, -1);
1017
+ rb_define_singleton_method(Berns, "object", berns_object_element, -1);
1018
+ rb_define_singleton_method(Berns, "ol", berns_ol_element, -1);
1019
+ rb_define_singleton_method(Berns, "optgroup", berns_optgroup_element, -1);
1020
+ rb_define_singleton_method(Berns, "option", berns_option_element, -1);
1021
+ rb_define_singleton_method(Berns, "output", berns_output_element, -1);
1022
+ rb_define_singleton_method(Berns, "p", berns_p_element, -1);
1023
+ rb_define_singleton_method(Berns, "picture", berns_picture_element, -1);
1024
+ rb_define_singleton_method(Berns, "pre", berns_pre_element, -1);
1025
+ rb_define_singleton_method(Berns, "progress", berns_progress_element, -1);
1026
+ rb_define_singleton_method(Berns, "q", berns_q_element, -1);
1027
+ rb_define_singleton_method(Berns, "rp", berns_rp_element, -1);
1028
+ rb_define_singleton_method(Berns, "rt", berns_rt_element, -1);
1029
+ rb_define_singleton_method(Berns, "ruby", berns_ruby_element, -1);
1030
+ rb_define_singleton_method(Berns, "s", berns_s_element, -1);
1031
+ rb_define_singleton_method(Berns, "samp", berns_samp_element, -1);
1032
+ rb_define_singleton_method(Berns, "script", berns_script_element, -1);
1033
+ rb_define_singleton_method(Berns, "section", berns_section_element, -1);
1034
+ rb_define_singleton_method(Berns, "select", berns_select_element, -1);
1035
+ rb_define_singleton_method(Berns, "small", berns_small_element, -1);
1036
+ rb_define_singleton_method(Berns, "span", berns_span_element, -1);
1037
+ rb_define_singleton_method(Berns, "strong", berns_strong_element, -1);
1038
+ rb_define_singleton_method(Berns, "style", berns_style_element, -1);
1039
+ rb_define_singleton_method(Berns, "sub", berns_sub_element, -1);
1040
+ rb_define_singleton_method(Berns, "summary", berns_summary_element, -1);
1041
+ rb_define_singleton_method(Berns, "table", berns_table_element, -1);
1042
+ rb_define_singleton_method(Berns, "tbody", berns_tbody_element, -1);
1043
+ rb_define_singleton_method(Berns, "td", berns_td_element, -1);
1044
+ rb_define_singleton_method(Berns, "template", berns_template_element, -1);
1045
+ rb_define_singleton_method(Berns, "textarea", berns_textarea_element, -1);
1046
+ rb_define_singleton_method(Berns, "tfoot", berns_tfoot_element, -1);
1047
+ rb_define_singleton_method(Berns, "th", berns_th_element, -1);
1048
+ rb_define_singleton_method(Berns, "thead", berns_thead_element, -1);
1049
+ rb_define_singleton_method(Berns, "time", berns_time_element, -1);
1050
+ rb_define_singleton_method(Berns, "title", berns_title_element, -1);
1051
+ rb_define_singleton_method(Berns, "tr", berns_tr_element, -1);
1052
+ rb_define_singleton_method(Berns, "u", berns_u_element, -1);
1053
+ rb_define_singleton_method(Berns, "ul", berns_ul_element, -1);
1054
+ rb_define_singleton_method(Berns, "var", berns_var_element, -1);
1055
+ rb_define_singleton_method(Berns, "video", berns_video_element, -1);
1056
+ }