berns 2.0.0 → 3.0.0

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,1052 @@
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
+ } else {
313
+ content = rb_str_new_cstr("");
314
+ }
315
+
316
+ StringValue(content);
317
+
318
+ const char *open = "<";
319
+ const char *close = ">";
320
+ const char *slash = "/";
321
+ const char *space = " ";
322
+
323
+ const size_t olen = strlen(open);
324
+ const size_t clen = strlen(close);
325
+ const size_t sllen = strlen(slash);
326
+ const size_t slen = strlen(space);
327
+
328
+ size_t tlen = RSTRING_LEN(tag);
329
+ size_t conlen = RSTRING_LEN(content);
330
+ size_t total = olen + tlen + clen + conlen + olen + sllen + tlen + clen + 1;
331
+
332
+ if (TYPE(attributes) != T_IMEMO) {
333
+ attributes = berns_to_attributes(berns, attributes);
334
+ total = total + slen + RSTRING_LEN(attributes);
335
+ }
336
+
337
+ char string[total];
338
+ char *ptr;
339
+ char *end = string + sizeof(string);
340
+
341
+ ptr = stecpy(string, open, end);
342
+ ptr = stecpy(ptr, RSTRING_PTR(tag), end);
343
+
344
+ if (TYPE(attributes) != T_IMEMO) {
345
+ ptr = stecpy(ptr, space, end);
346
+ ptr = stecpy(ptr, RSTRING_PTR(attributes), end);
347
+ }
348
+
349
+ ptr = stecpy(ptr, close, end);
350
+ ptr = stecpy(ptr, RSTRING_PTR(content), end);
351
+ ptr = stecpy(ptr, open, end);
352
+ ptr = stecpy(ptr, slash, end);
353
+ ptr = stecpy(ptr, RSTRING_PTR(tag), end);
354
+ stecpy(ptr, close, end);
355
+
356
+ return rb_str_new_cstr(string);
357
+ }
358
+
359
+ static VALUE berns_void_element(int argc, VALUE *argv, VALUE self) {
360
+ rb_check_arity(argc, 1, 2);
361
+ return berns_internal_void(argv[0], argv[1]);
362
+ }
363
+
364
+ static VALUE berns_area_element(int argc, VALUE *argv, VALUE self) {
365
+ rb_check_arity(argc, 0, 1);
366
+ return berns_internal_void(rb_str_new_cstr("area"), argv[0]);
367
+ }
368
+
369
+ static VALUE berns_base_element(int argc, VALUE *argv, VALUE self) {
370
+ rb_check_arity(argc, 0, 1);
371
+ return berns_internal_void(rb_str_new_cstr("base"), argv[0]);
372
+ }
373
+
374
+ static VALUE berns_br_element(int argc, VALUE *argv, VALUE self) {
375
+ rb_check_arity(argc, 0, 1);
376
+ return berns_internal_void(rb_str_new_cstr("br"), argv[0]);
377
+ }
378
+
379
+ static VALUE berns_col_element(int argc, VALUE *argv, VALUE self) {
380
+ rb_check_arity(argc, 0, 1);
381
+ return berns_internal_void(rb_str_new_cstr("col"), argv[0]);
382
+ }
383
+
384
+ static VALUE berns_embed_element(int argc, VALUE *argv, VALUE self) {
385
+ rb_check_arity(argc, 0, 1);
386
+ return berns_internal_void(rb_str_new_cstr("embed"), argv[0]);
387
+ }
388
+
389
+ static VALUE berns_hr_element(int argc, VALUE *argv, VALUE self) {
390
+ rb_check_arity(argc, 0, 1);
391
+ return berns_internal_void(rb_str_new_cstr("hr"), argv[0]);
392
+ }
393
+
394
+ static VALUE berns_img_element(int argc, VALUE *argv, VALUE self) {
395
+ rb_check_arity(argc, 0, 1);
396
+ return berns_internal_void(rb_str_new_cstr("img"), argv[0]);
397
+ }
398
+
399
+ static VALUE berns_input_element(int argc, VALUE *argv, VALUE self) {
400
+ rb_check_arity(argc, 0, 1);
401
+ return berns_internal_void(rb_str_new_cstr("input"), argv[0]);
402
+ }
403
+
404
+ static VALUE berns_link_element(int argc, VALUE *argv, VALUE self) {
405
+ rb_check_arity(argc, 0, 1);
406
+ return berns_internal_void(rb_str_new_cstr("link"), argv[0]);
407
+ }
408
+
409
+ static VALUE berns_menuitem_element(int argc, VALUE *argv, VALUE self) {
410
+ rb_check_arity(argc, 0, 1);
411
+ return berns_internal_void(rb_str_new_cstr("menuitem"), argv[0]);
412
+ }
413
+
414
+ static VALUE berns_meta_element(int argc, VALUE *argv, VALUE self) {
415
+ rb_check_arity(argc, 0, 1);
416
+ return berns_internal_void(rb_str_new_cstr("meta"), argv[0]);
417
+ }
418
+
419
+ static VALUE berns_param_element(int argc, VALUE *argv, VALUE self) {
420
+ rb_check_arity(argc, 0, 1);
421
+ return berns_internal_void(rb_str_new_cstr("param"), argv[0]);
422
+ }
423
+
424
+ static VALUE berns_source_element(int argc, VALUE *argv, VALUE self) {
425
+ rb_check_arity(argc, 0, 1);
426
+ return berns_internal_void(rb_str_new_cstr("source"), argv[0]);
427
+ }
428
+
429
+ static VALUE berns_track_element(int argc, VALUE *argv, VALUE self) {
430
+ rb_check_arity(argc, 0, 1);
431
+ return berns_internal_void(rb_str_new_cstr("track"), argv[0]);
432
+ }
433
+
434
+ static VALUE berns_wbr_element(int argc, VALUE *argv, VALUE self) {
435
+ rb_check_arity(argc, 0, 1);
436
+ return berns_internal_void(rb_str_new_cstr("wbr"), argv[0]);
437
+ }
438
+
439
+ static VALUE berns_element(int argc, VALUE* argv, VALUE self) {
440
+ rb_check_arity(argc, 1, 2);
441
+ return berns_internal_element(argv[0], argv[1]);
442
+ }
443
+
444
+ static VALUE berns_a_element(int argc, VALUE* argv, VALUE self) {
445
+ rb_check_arity(argc, 0, 1);
446
+ return berns_internal_element(rb_str_new_cstr("a"), argv[0]);
447
+ }
448
+
449
+ static VALUE berns_abbr_element(int argc, VALUE* argv, VALUE self) {
450
+ rb_check_arity(argc, 0, 1);
451
+ return berns_internal_element(rb_str_new_cstr("abbr"), argv[0]);
452
+ }
453
+
454
+ static VALUE berns_address_element(int argc, VALUE* argv, VALUE self) {
455
+ rb_check_arity(argc, 0, 1);
456
+ return berns_internal_element(rb_str_new_cstr("address"), argv[0]);
457
+ }
458
+
459
+ static VALUE berns_article_element(int argc, VALUE* argv, VALUE self) {
460
+ rb_check_arity(argc, 0, 1);
461
+ return berns_internal_element(rb_str_new_cstr("article"), argv[0]);
462
+ }
463
+
464
+ static VALUE berns_aside_element(int argc, VALUE* argv, VALUE self) {
465
+ rb_check_arity(argc, 0, 1);
466
+ return berns_internal_element(rb_str_new_cstr("aside"), argv[0]);
467
+ }
468
+
469
+ static VALUE berns_audio_element(int argc, VALUE* argv, VALUE self) {
470
+ rb_check_arity(argc, 0, 1);
471
+ return berns_internal_element(rb_str_new_cstr("audio"), argv[0]);
472
+ }
473
+
474
+ static VALUE berns_b_element(int argc, VALUE* argv, VALUE self) {
475
+ rb_check_arity(argc, 0, 1);
476
+ return berns_internal_element(rb_str_new_cstr("b"), argv[0]);
477
+ }
478
+
479
+ static VALUE berns_bdi_element(int argc, VALUE* argv, VALUE self) {
480
+ rb_check_arity(argc, 0, 1);
481
+ return berns_internal_element(rb_str_new_cstr("bdi"), argv[0]);
482
+ }
483
+
484
+ static VALUE berns_bdo_element(int argc, VALUE* argv, VALUE self) {
485
+ rb_check_arity(argc, 0, 1);
486
+ return berns_internal_element(rb_str_new_cstr("bdo"), argv[0]);
487
+ }
488
+
489
+ static VALUE berns_blockquote_element(int argc, VALUE* argv, VALUE self) {
490
+ rb_check_arity(argc, 0, 1);
491
+ return berns_internal_element(rb_str_new_cstr("blockquote"), argv[0]);
492
+ }
493
+
494
+ static VALUE berns_body_element(int argc, VALUE* argv, VALUE self) {
495
+ rb_check_arity(argc, 0, 1);
496
+ return berns_internal_element(rb_str_new_cstr("body"), argv[0]);
497
+ }
498
+
499
+ static VALUE berns_button_element(int argc, VALUE* argv, VALUE self) {
500
+ rb_check_arity(argc, 0, 1);
501
+ return berns_internal_element(rb_str_new_cstr("button"), argv[0]);
502
+ }
503
+
504
+ static VALUE berns_canvas_element(int argc, VALUE* argv, VALUE self) {
505
+ rb_check_arity(argc, 0, 1);
506
+ return berns_internal_element(rb_str_new_cstr("canvas"), argv[0]);
507
+ }
508
+
509
+ static VALUE berns_caption_element(int argc, VALUE* argv, VALUE self) {
510
+ rb_check_arity(argc, 0, 1);
511
+ return berns_internal_element(rb_str_new_cstr("caption"), argv[0]);
512
+ }
513
+
514
+ static VALUE berns_cite_element(int argc, VALUE* argv, VALUE self) {
515
+ rb_check_arity(argc, 0, 1);
516
+ return berns_internal_element(rb_str_new_cstr("cite"), argv[0]);
517
+ }
518
+
519
+ static VALUE berns_code_element(int argc, VALUE* argv, VALUE self) {
520
+ rb_check_arity(argc, 0, 1);
521
+ return berns_internal_element(rb_str_new_cstr("code"), argv[0]);
522
+ }
523
+
524
+ static VALUE berns_colgroup_element(int argc, VALUE* argv, VALUE self) {
525
+ rb_check_arity(argc, 0, 1);
526
+ return berns_internal_element(rb_str_new_cstr("colgroup"), argv[0]);
527
+ }
528
+
529
+ static VALUE berns_datalist_element(int argc, VALUE* argv, VALUE self) {
530
+ rb_check_arity(argc, 0, 1);
531
+ return berns_internal_element(rb_str_new_cstr("datalist"), argv[0]);
532
+ }
533
+
534
+ static VALUE berns_dd_element(int argc, VALUE* argv, VALUE self) {
535
+ rb_check_arity(argc, 0, 1);
536
+ return berns_internal_element(rb_str_new_cstr("dd"), argv[0]);
537
+ }
538
+
539
+ static VALUE berns_del_element(int argc, VALUE* argv, VALUE self) {
540
+ rb_check_arity(argc, 0, 1);
541
+ return berns_internal_element(rb_str_new_cstr("del"), argv[0]);
542
+ }
543
+
544
+ static VALUE berns_details_element(int argc, VALUE* argv, VALUE self) {
545
+ rb_check_arity(argc, 0, 1);
546
+ return berns_internal_element(rb_str_new_cstr("details"), argv[0]);
547
+ }
548
+
549
+ static VALUE berns_dfn_element(int argc, VALUE* argv, VALUE self) {
550
+ rb_check_arity(argc, 0, 1);
551
+ return berns_internal_element(rb_str_new_cstr("dfn"), argv[0]);
552
+ }
553
+
554
+ static VALUE berns_dialog_element(int argc, VALUE* argv, VALUE self) {
555
+ rb_check_arity(argc, 0, 1);
556
+ return berns_internal_element(rb_str_new_cstr("dialog"), argv[0]);
557
+ }
558
+
559
+ static VALUE berns_div_element(int argc, VALUE* argv, VALUE self) {
560
+ rb_check_arity(argc, 0, 1);
561
+ return berns_internal_element(rb_str_new_cstr("div"), argv[0]);
562
+ }
563
+
564
+ static VALUE berns_dl_element(int argc, VALUE* argv, VALUE self) {
565
+ rb_check_arity(argc, 0, 1);
566
+ return berns_internal_element(rb_str_new_cstr("dl"), argv[0]);
567
+ }
568
+
569
+ static VALUE berns_dt_element(int argc, VALUE* argv, VALUE self) {
570
+ rb_check_arity(argc, 0, 1);
571
+ return berns_internal_element(rb_str_new_cstr("dt"), argv[0]);
572
+ }
573
+
574
+ static VALUE berns_em_element(int argc, VALUE* argv, VALUE self) {
575
+ rb_check_arity(argc, 0, 1);
576
+ return berns_internal_element(rb_str_new_cstr("em"), argv[0]);
577
+ }
578
+
579
+ static VALUE berns_fieldset_element(int argc, VALUE* argv, VALUE self) {
580
+ rb_check_arity(argc, 0, 1);
581
+ return berns_internal_element(rb_str_new_cstr("fieldset"), argv[0]);
582
+ }
583
+
584
+ static VALUE berns_figcaption_element(int argc, VALUE* argv, VALUE self) {
585
+ rb_check_arity(argc, 0, 1);
586
+ return berns_internal_element(rb_str_new_cstr("figcaption"), argv[0]);
587
+ }
588
+
589
+ static VALUE berns_figure_element(int argc, VALUE* argv, VALUE self) {
590
+ rb_check_arity(argc, 0, 1);
591
+ return berns_internal_element(rb_str_new_cstr("figure"), argv[0]);
592
+ }
593
+
594
+ static VALUE berns_footer_element(int argc, VALUE* argv, VALUE self) {
595
+ rb_check_arity(argc, 0, 1);
596
+ return berns_internal_element(rb_str_new_cstr("footer"), argv[0]);
597
+ }
598
+
599
+ static VALUE berns_form_element(int argc, VALUE* argv, VALUE self) {
600
+ rb_check_arity(argc, 0, 1);
601
+ return berns_internal_element(rb_str_new_cstr("form"), argv[0]);
602
+ }
603
+
604
+ static VALUE berns_h1_element(int argc, VALUE* argv, VALUE self) {
605
+ rb_check_arity(argc, 0, 1);
606
+ return berns_internal_element(rb_str_new_cstr("h1"), argv[0]);
607
+ }
608
+
609
+ static VALUE berns_h2_element(int argc, VALUE* argv, VALUE self) {
610
+ rb_check_arity(argc, 0, 1);
611
+ return berns_internal_element(rb_str_new_cstr("h2"), argv[0]);
612
+ }
613
+
614
+ static VALUE berns_h3_element(int argc, VALUE* argv, VALUE self) {
615
+ rb_check_arity(argc, 0, 1);
616
+ return berns_internal_element(rb_str_new_cstr("h3"), argv[0]);
617
+ }
618
+
619
+ static VALUE berns_h4_element(int argc, VALUE* argv, VALUE self) {
620
+ rb_check_arity(argc, 0, 1);
621
+ return berns_internal_element(rb_str_new_cstr("h4"), argv[0]);
622
+ }
623
+
624
+ static VALUE berns_h5_element(int argc, VALUE* argv, VALUE self) {
625
+ rb_check_arity(argc, 0, 1);
626
+ return berns_internal_element(rb_str_new_cstr("h5"), argv[0]);
627
+ }
628
+
629
+ static VALUE berns_h6_element(int argc, VALUE* argv, VALUE self) {
630
+ rb_check_arity(argc, 0, 1);
631
+ return berns_internal_element(rb_str_new_cstr("h6"), argv[0]);
632
+ }
633
+
634
+ static VALUE berns_head_element(int argc, VALUE* argv, VALUE self) {
635
+ rb_check_arity(argc, 0, 1);
636
+ return berns_internal_element(rb_str_new_cstr("head"), argv[0]);
637
+ }
638
+
639
+ static VALUE berns_header_element(int argc, VALUE* argv, VALUE self) {
640
+ rb_check_arity(argc, 0, 1);
641
+ return berns_internal_element(rb_str_new_cstr("header"), argv[0]);
642
+ }
643
+
644
+ static VALUE berns_html_element(int argc, VALUE* argv, VALUE self) {
645
+ rb_check_arity(argc, 0, 1);
646
+ return berns_internal_element(rb_str_new_cstr("html"), argv[0]);
647
+ }
648
+
649
+ static VALUE berns_i_element(int argc, VALUE* argv, VALUE self) {
650
+ rb_check_arity(argc, 0, 1);
651
+ return berns_internal_element(rb_str_new_cstr("i"), argv[0]);
652
+ }
653
+
654
+ static VALUE berns_iframe_element(int argc, VALUE* argv, VALUE self) {
655
+ rb_check_arity(argc, 0, 1);
656
+ return berns_internal_element(rb_str_new_cstr("iframe"), argv[0]);
657
+ }
658
+
659
+ static VALUE berns_ins_element(int argc, VALUE* argv, VALUE self) {
660
+ rb_check_arity(argc, 0, 1);
661
+ return berns_internal_element(rb_str_new_cstr("ins"), argv[0]);
662
+ }
663
+
664
+ static VALUE berns_kbd_element(int argc, VALUE* argv, VALUE self) {
665
+ rb_check_arity(argc, 0, 1);
666
+ return berns_internal_element(rb_str_new_cstr("kbd"), argv[0]);
667
+ }
668
+
669
+ static VALUE berns_label_element(int argc, VALUE* argv, VALUE self) {
670
+ rb_check_arity(argc, 0, 1);
671
+ return berns_internal_element(rb_str_new_cstr("label"), argv[0]);
672
+ }
673
+
674
+ static VALUE berns_legend_element(int argc, VALUE* argv, VALUE self) {
675
+ rb_check_arity(argc, 0, 1);
676
+ return berns_internal_element(rb_str_new_cstr("legend"), argv[0]);
677
+ }
678
+
679
+ static VALUE berns_li_element(int argc, VALUE* argv, VALUE self) {
680
+ rb_check_arity(argc, 0, 1);
681
+ return berns_internal_element(rb_str_new_cstr("li"), argv[0]);
682
+ }
683
+
684
+ static VALUE berns_main_element(int argc, VALUE* argv, VALUE self) {
685
+ rb_check_arity(argc, 0, 1);
686
+ return berns_internal_element(rb_str_new_cstr("main"), argv[0]);
687
+ }
688
+
689
+ static VALUE berns_map_element(int argc, VALUE* argv, VALUE self) {
690
+ rb_check_arity(argc, 0, 1);
691
+ return berns_internal_element(rb_str_new_cstr("map"), argv[0]);
692
+ }
693
+
694
+ static VALUE berns_mark_element(int argc, VALUE* argv, VALUE self) {
695
+ rb_check_arity(argc, 0, 1);
696
+ return berns_internal_element(rb_str_new_cstr("mark"), argv[0]);
697
+ }
698
+
699
+ static VALUE berns_menu_element(int argc, VALUE* argv, VALUE self) {
700
+ rb_check_arity(argc, 0, 1);
701
+ return berns_internal_element(rb_str_new_cstr("menu"), argv[0]);
702
+ }
703
+
704
+ static VALUE berns_meter_element(int argc, VALUE* argv, VALUE self) {
705
+ rb_check_arity(argc, 0, 1);
706
+ return berns_internal_element(rb_str_new_cstr("meter"), argv[0]);
707
+ }
708
+
709
+ static VALUE berns_nav_element(int argc, VALUE* argv, VALUE self) {
710
+ rb_check_arity(argc, 0, 1);
711
+ return berns_internal_element(rb_str_new_cstr("nav"), argv[0]);
712
+ }
713
+
714
+ static VALUE berns_noscript_element(int argc, VALUE* argv, VALUE self) {
715
+ rb_check_arity(argc, 0, 1);
716
+ return berns_internal_element(rb_str_new_cstr("noscript"), argv[0]);
717
+ }
718
+
719
+ static VALUE berns_object_element(int argc, VALUE* argv, VALUE self) {
720
+ rb_check_arity(argc, 0, 1);
721
+ return berns_internal_element(rb_str_new_cstr("object"), argv[0]);
722
+ }
723
+
724
+ static VALUE berns_ol_element(int argc, VALUE* argv, VALUE self) {
725
+ rb_check_arity(argc, 0, 1);
726
+ return berns_internal_element(rb_str_new_cstr("ol"), argv[0]);
727
+ }
728
+
729
+ static VALUE berns_optgroup_element(int argc, VALUE* argv, VALUE self) {
730
+ rb_check_arity(argc, 0, 1);
731
+ return berns_internal_element(rb_str_new_cstr("optgroup"), argv[0]);
732
+ }
733
+
734
+ static VALUE berns_option_element(int argc, VALUE* argv, VALUE self) {
735
+ rb_check_arity(argc, 0, 1);
736
+ return berns_internal_element(rb_str_new_cstr("option"), argv[0]);
737
+ }
738
+
739
+ static VALUE berns_output_element(int argc, VALUE* argv, VALUE self) {
740
+ rb_check_arity(argc, 0, 1);
741
+ return berns_internal_element(rb_str_new_cstr("output"), argv[0]);
742
+ }
743
+
744
+ static VALUE berns_p_element(int argc, VALUE* argv, VALUE self) {
745
+ rb_check_arity(argc, 0, 1);
746
+ return berns_internal_element(rb_str_new_cstr("p"), argv[0]);
747
+ }
748
+
749
+ static VALUE berns_picture_element(int argc, VALUE* argv, VALUE self) {
750
+ rb_check_arity(argc, 0, 1);
751
+ return berns_internal_element(rb_str_new_cstr("picture"), argv[0]);
752
+ }
753
+
754
+ static VALUE berns_pre_element(int argc, VALUE* argv, VALUE self) {
755
+ rb_check_arity(argc, 0, 1);
756
+ return berns_internal_element(rb_str_new_cstr("pre"), argv[0]);
757
+ }
758
+
759
+ static VALUE berns_progress_element(int argc, VALUE* argv, VALUE self) {
760
+ rb_check_arity(argc, 0, 1);
761
+ return berns_internal_element(rb_str_new_cstr("progress"), argv[0]);
762
+ }
763
+
764
+ static VALUE berns_q_element(int argc, VALUE* argv, VALUE self) {
765
+ rb_check_arity(argc, 0, 1);
766
+ return berns_internal_element(rb_str_new_cstr("q"), argv[0]);
767
+ }
768
+
769
+ static VALUE berns_rp_element(int argc, VALUE* argv, VALUE self) {
770
+ rb_check_arity(argc, 0, 1);
771
+ return berns_internal_element(rb_str_new_cstr("rp"), argv[0]);
772
+ }
773
+
774
+ static VALUE berns_rt_element(int argc, VALUE* argv, VALUE self) {
775
+ rb_check_arity(argc, 0, 1);
776
+ return berns_internal_element(rb_str_new_cstr("rt"), argv[0]);
777
+ }
778
+
779
+ static VALUE berns_ruby_element(int argc, VALUE* argv, VALUE self) {
780
+ rb_check_arity(argc, 0, 1);
781
+ return berns_internal_element(rb_str_new_cstr("ruby"), argv[0]);
782
+ }
783
+
784
+ static VALUE berns_s_element(int argc, VALUE* argv, VALUE self) {
785
+ rb_check_arity(argc, 0, 1);
786
+ return berns_internal_element(rb_str_new_cstr("s"), argv[0]);
787
+ }
788
+
789
+ static VALUE berns_samp_element(int argc, VALUE* argv, VALUE self) {
790
+ rb_check_arity(argc, 0, 1);
791
+ return berns_internal_element(rb_str_new_cstr("samp"), argv[0]);
792
+ }
793
+
794
+ static VALUE berns_script_element(int argc, VALUE* argv, VALUE self) {
795
+ rb_check_arity(argc, 0, 1);
796
+ return berns_internal_element(rb_str_new_cstr("script"), argv[0]);
797
+ }
798
+
799
+ static VALUE berns_section_element(int argc, VALUE* argv, VALUE self) {
800
+ rb_check_arity(argc, 0, 1);
801
+ return berns_internal_element(rb_str_new_cstr("section"), argv[0]);
802
+ }
803
+
804
+ static VALUE berns_select_element(int argc, VALUE* argv, VALUE self) {
805
+ rb_check_arity(argc, 0, 1);
806
+ return berns_internal_element(rb_str_new_cstr("select"), argv[0]);
807
+ }
808
+
809
+ static VALUE berns_small_element(int argc, VALUE* argv, VALUE self) {
810
+ rb_check_arity(argc, 0, 1);
811
+ return berns_internal_element(rb_str_new_cstr("small"), argv[0]);
812
+ }
813
+
814
+ static VALUE berns_span_element(int argc, VALUE* argv, VALUE self) {
815
+ rb_check_arity(argc, 0, 1);
816
+ return berns_internal_element(rb_str_new_cstr("span"), argv[0]);
817
+ }
818
+
819
+ static VALUE berns_strong_element(int argc, VALUE* argv, VALUE self) {
820
+ rb_check_arity(argc, 0, 1);
821
+ return berns_internal_element(rb_str_new_cstr("strong"), argv[0]);
822
+ }
823
+
824
+ static VALUE berns_style_element(int argc, VALUE* argv, VALUE self) {
825
+ rb_check_arity(argc, 0, 1);
826
+ return berns_internal_element(rb_str_new_cstr("style"), argv[0]);
827
+ }
828
+
829
+ static VALUE berns_sub_element(int argc, VALUE* argv, VALUE self) {
830
+ rb_check_arity(argc, 0, 1);
831
+ return berns_internal_element(rb_str_new_cstr("sub"), argv[0]);
832
+ }
833
+
834
+ static VALUE berns_summary_element(int argc, VALUE* argv, VALUE self) {
835
+ rb_check_arity(argc, 0, 1);
836
+ return berns_internal_element(rb_str_new_cstr("summary"), argv[0]);
837
+ }
838
+
839
+ static VALUE berns_table_element(int argc, VALUE* argv, VALUE self) {
840
+ rb_check_arity(argc, 0, 1);
841
+ return berns_internal_element(rb_str_new_cstr("table"), argv[0]);
842
+ }
843
+
844
+ static VALUE berns_tbody_element(int argc, VALUE* argv, VALUE self) {
845
+ rb_check_arity(argc, 0, 1);
846
+ return berns_internal_element(rb_str_new_cstr("tbody"), argv[0]);
847
+ }
848
+
849
+ static VALUE berns_td_element(int argc, VALUE* argv, VALUE self) {
850
+ rb_check_arity(argc, 0, 1);
851
+ return berns_internal_element(rb_str_new_cstr("td"), argv[0]);
852
+ }
853
+
854
+ static VALUE berns_template_element(int argc, VALUE* argv, VALUE self) {
855
+ rb_check_arity(argc, 0, 1);
856
+ return berns_internal_element(rb_str_new_cstr("template"), argv[0]);
857
+ }
858
+
859
+ static VALUE berns_textarea_element(int argc, VALUE* argv, VALUE self) {
860
+ rb_check_arity(argc, 0, 1);
861
+ return berns_internal_element(rb_str_new_cstr("textarea"), argv[0]);
862
+ }
863
+
864
+ static VALUE berns_tfoot_element(int argc, VALUE* argv, VALUE self) {
865
+ rb_check_arity(argc, 0, 1);
866
+ return berns_internal_element(rb_str_new_cstr("tfoot"), argv[0]);
867
+ }
868
+
869
+ static VALUE berns_th_element(int argc, VALUE* argv, VALUE self) {
870
+ rb_check_arity(argc, 0, 1);
871
+ return berns_internal_element(rb_str_new_cstr("th"), argv[0]);
872
+ }
873
+
874
+ static VALUE berns_thead_element(int argc, VALUE* argv, VALUE self) {
875
+ rb_check_arity(argc, 0, 1);
876
+ return berns_internal_element(rb_str_new_cstr("thead"), argv[0]);
877
+ }
878
+
879
+ static VALUE berns_time_element(int argc, VALUE* argv, VALUE self) {
880
+ rb_check_arity(argc, 0, 1);
881
+ return berns_internal_element(rb_str_new_cstr("time"), argv[0]);
882
+ }
883
+
884
+ static VALUE berns_title_element(int argc, VALUE* argv, VALUE self) {
885
+ rb_check_arity(argc, 0, 1);
886
+ return berns_internal_element(rb_str_new_cstr("title"), argv[0]);
887
+ }
888
+
889
+ static VALUE berns_tr_element(int argc, VALUE* argv, VALUE self) {
890
+ rb_check_arity(argc, 0, 1);
891
+ return berns_internal_element(rb_str_new_cstr("tr"), argv[0]);
892
+ }
893
+
894
+ static VALUE berns_u_element(int argc, VALUE* argv, VALUE self) {
895
+ rb_check_arity(argc, 0, 1);
896
+ return berns_internal_element(rb_str_new_cstr("u"), argv[0]);
897
+ }
898
+
899
+ static VALUE berns_ul_element(int argc, VALUE* argv, VALUE self) {
900
+ rb_check_arity(argc, 0, 1);
901
+ return berns_internal_element(rb_str_new_cstr("ul"), argv[0]);
902
+ }
903
+
904
+ static VALUE berns_var_element(int argc, VALUE* argv, VALUE self) {
905
+ rb_check_arity(argc, 0, 1);
906
+ return berns_internal_element(rb_str_new_cstr("var"), argv[0]);
907
+ }
908
+
909
+ static VALUE berns_video_element(int argc, VALUE* argv, VALUE self) {
910
+ rb_check_arity(argc, 0, 1);
911
+ return berns_internal_element(rb_str_new_cstr("video"), argv[0]);
912
+ }
913
+
914
+ void Init_berns() {
915
+ VALUE Berns = rb_define_module("Berns");
916
+
917
+ rb_define_singleton_method(Berns, "element", berns_element, -1);
918
+ rb_define_singleton_method(Berns, "escape_html", berns_escape_html, 1);
919
+ rb_define_singleton_method(Berns, "to_attribute", berns_to_attribute, 2);
920
+ rb_define_singleton_method(Berns, "to_attributes", berns_to_attributes, 1);
921
+ rb_define_singleton_method(Berns, "void", berns_void_element, -1);
922
+
923
+ /*
924
+ * List of void elements - http://xahlee.info/js/html5_non-closing_tag.html
925
+ *
926
+ * area base br col embed hr img input link menuitem meta param source track wbr
927
+ *
928
+ */
929
+ rb_define_singleton_method(Berns, "area", berns_area_element, -1);
930
+ rb_define_singleton_method(Berns, "base", berns_base_element, -1);
931
+ rb_define_singleton_method(Berns, "br", berns_br_element, -1);
932
+ rb_define_singleton_method(Berns, "col", berns_col_element, -1);
933
+ rb_define_singleton_method(Berns, "embed", berns_embed_element, -1);
934
+ rb_define_singleton_method(Berns, "hr", berns_hr_element, -1);
935
+ rb_define_singleton_method(Berns, "img", berns_img_element, -1);
936
+ rb_define_singleton_method(Berns, "input", berns_input_element, -1);
937
+ rb_define_singleton_method(Berns, "link", berns_link_element, -1);
938
+ rb_define_singleton_method(Berns, "menuitem", berns_menuitem_element, -1);
939
+ rb_define_singleton_method(Berns, "meta", berns_meta_element, -1);
940
+ rb_define_singleton_method(Berns, "param", berns_param_element, -1);
941
+ rb_define_singleton_method(Berns, "source", berns_source_element, -1);
942
+ rb_define_singleton_method(Berns, "track", berns_track_element, -1);
943
+ rb_define_singleton_method(Berns, "wbr", berns_wbr_element, -1);
944
+
945
+ /*
946
+ * List of standard HTML5 elements - https://www.w3schools.com/TAgs/default.asp
947
+ *
948
+ * a abbr address article aside audio b bdi bdo blockquote body button
949
+ * canvas caption cite code colgroup datalist dd del details dfn dialog div
950
+ * dl dt em fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head
951
+ * header html i iframe ins kbd label legend li main map mark menu meter nav
952
+ * noscript object ol optgroup option output p picture pre progress q rp rt
953
+ * ruby s samp script section select small span strong style sub summary
954
+ * table tbody td template textarea tfoot th thead time title tr u ul var
955
+ * video
956
+ *
957
+ */
958
+ rb_define_singleton_method(Berns, "a", berns_a_element, -1);
959
+ rb_define_singleton_method(Berns, "abbr", berns_abbr_element, -1);
960
+ rb_define_singleton_method(Berns, "address", berns_address_element, -1);
961
+ rb_define_singleton_method(Berns, "article", berns_article_element, -1);
962
+ rb_define_singleton_method(Berns, "aside", berns_aside_element, -1);
963
+ rb_define_singleton_method(Berns, "audio", berns_audio_element, -1);
964
+ rb_define_singleton_method(Berns, "b", berns_b_element, -1);
965
+ rb_define_singleton_method(Berns, "bdi", berns_bdi_element, -1);
966
+ rb_define_singleton_method(Berns, "bdo", berns_bdo_element, -1);
967
+ rb_define_singleton_method(Berns, "blockquote", berns_blockquote_element, -1);
968
+ rb_define_singleton_method(Berns, "body", berns_body_element, -1);
969
+ rb_define_singleton_method(Berns, "button", berns_button_element, -1);
970
+ rb_define_singleton_method(Berns, "canvas", berns_canvas_element, -1);
971
+ rb_define_singleton_method(Berns, "caption", berns_caption_element, -1);
972
+ rb_define_singleton_method(Berns, "cite", berns_cite_element, -1);
973
+ rb_define_singleton_method(Berns, "code", berns_code_element, -1);
974
+ rb_define_singleton_method(Berns, "colgroup", berns_colgroup_element, -1);
975
+ rb_define_singleton_method(Berns, "datalist", berns_datalist_element, -1);
976
+ rb_define_singleton_method(Berns, "dd", berns_dd_element, -1);
977
+ rb_define_singleton_method(Berns, "del", berns_del_element, -1);
978
+ rb_define_singleton_method(Berns, "details", berns_details_element, -1);
979
+ rb_define_singleton_method(Berns, "dfn", berns_dfn_element, -1);
980
+ rb_define_singleton_method(Berns, "dialog", berns_dialog_element, -1);
981
+ rb_define_singleton_method(Berns, "div", berns_div_element, -1);
982
+ rb_define_singleton_method(Berns, "dl", berns_dl_element, -1);
983
+ rb_define_singleton_method(Berns, "dt", berns_dt_element, -1);
984
+ rb_define_singleton_method(Berns, "em", berns_em_element, -1);
985
+ rb_define_singleton_method(Berns, "fieldset", berns_fieldset_element, -1);
986
+ rb_define_singleton_method(Berns, "figcaption", berns_figcaption_element, -1);
987
+ rb_define_singleton_method(Berns, "figure", berns_figure_element, -1);
988
+ rb_define_singleton_method(Berns, "footer", berns_footer_element, -1);
989
+ rb_define_singleton_method(Berns, "form", berns_form_element, -1);
990
+ rb_define_singleton_method(Berns, "h1", berns_h1_element, -1);
991
+ rb_define_singleton_method(Berns, "h2", berns_h2_element, -1);
992
+ rb_define_singleton_method(Berns, "h3", berns_h3_element, -1);
993
+ rb_define_singleton_method(Berns, "h4", berns_h4_element, -1);
994
+ rb_define_singleton_method(Berns, "h5", berns_h5_element, -1);
995
+ rb_define_singleton_method(Berns, "h6", berns_h6_element, -1);
996
+ rb_define_singleton_method(Berns, "head", berns_head_element, -1);
997
+ rb_define_singleton_method(Berns, "header", berns_header_element, -1);
998
+ rb_define_singleton_method(Berns, "html", berns_html_element, -1);
999
+ rb_define_singleton_method(Berns, "i", berns_i_element, -1);
1000
+ rb_define_singleton_method(Berns, "iframe", berns_iframe_element, -1);
1001
+ rb_define_singleton_method(Berns, "ins", berns_ins_element, -1);
1002
+ rb_define_singleton_method(Berns, "kbd", berns_kbd_element, -1);
1003
+ rb_define_singleton_method(Berns, "label", berns_label_element, -1);
1004
+ rb_define_singleton_method(Berns, "legend", berns_legend_element, -1);
1005
+ rb_define_singleton_method(Berns, "li", berns_li_element, -1);
1006
+ rb_define_singleton_method(Berns, "main", berns_main_element, -1);
1007
+ rb_define_singleton_method(Berns, "map", berns_map_element, -1);
1008
+ rb_define_singleton_method(Berns, "mark", berns_mark_element, -1);
1009
+ rb_define_singleton_method(Berns, "menu", berns_menu_element, -1);
1010
+ rb_define_singleton_method(Berns, "meter", berns_meter_element, -1);
1011
+ rb_define_singleton_method(Berns, "nav", berns_nav_element, -1);
1012
+ rb_define_singleton_method(Berns, "noscript", berns_noscript_element, -1);
1013
+ rb_define_singleton_method(Berns, "object", berns_object_element, -1);
1014
+ rb_define_singleton_method(Berns, "ol", berns_ol_element, -1);
1015
+ rb_define_singleton_method(Berns, "optgroup", berns_optgroup_element, -1);
1016
+ rb_define_singleton_method(Berns, "option", berns_option_element, -1);
1017
+ rb_define_singleton_method(Berns, "output", berns_output_element, -1);
1018
+ rb_define_singleton_method(Berns, "p", berns_p_element, -1);
1019
+ rb_define_singleton_method(Berns, "picture", berns_picture_element, -1);
1020
+ rb_define_singleton_method(Berns, "pre", berns_pre_element, -1);
1021
+ rb_define_singleton_method(Berns, "progress", berns_progress_element, -1);
1022
+ rb_define_singleton_method(Berns, "q", berns_q_element, -1);
1023
+ rb_define_singleton_method(Berns, "rp", berns_rp_element, -1);
1024
+ rb_define_singleton_method(Berns, "rt", berns_rt_element, -1);
1025
+ rb_define_singleton_method(Berns, "ruby", berns_ruby_element, -1);
1026
+ rb_define_singleton_method(Berns, "s", berns_s_element, -1);
1027
+ rb_define_singleton_method(Berns, "samp", berns_samp_element, -1);
1028
+ rb_define_singleton_method(Berns, "script", berns_script_element, -1);
1029
+ rb_define_singleton_method(Berns, "section", berns_section_element, -1);
1030
+ rb_define_singleton_method(Berns, "select", berns_select_element, -1);
1031
+ rb_define_singleton_method(Berns, "small", berns_small_element, -1);
1032
+ rb_define_singleton_method(Berns, "span", berns_span_element, -1);
1033
+ rb_define_singleton_method(Berns, "strong", berns_strong_element, -1);
1034
+ rb_define_singleton_method(Berns, "style", berns_style_element, -1);
1035
+ rb_define_singleton_method(Berns, "sub", berns_sub_element, -1);
1036
+ rb_define_singleton_method(Berns, "summary", berns_summary_element, -1);
1037
+ rb_define_singleton_method(Berns, "table", berns_table_element, -1);
1038
+ rb_define_singleton_method(Berns, "tbody", berns_tbody_element, -1);
1039
+ rb_define_singleton_method(Berns, "td", berns_td_element, -1);
1040
+ rb_define_singleton_method(Berns, "template", berns_template_element, -1);
1041
+ rb_define_singleton_method(Berns, "textarea", berns_textarea_element, -1);
1042
+ rb_define_singleton_method(Berns, "tfoot", berns_tfoot_element, -1);
1043
+ rb_define_singleton_method(Berns, "th", berns_th_element, -1);
1044
+ rb_define_singleton_method(Berns, "thead", berns_thead_element, -1);
1045
+ rb_define_singleton_method(Berns, "time", berns_time_element, -1);
1046
+ rb_define_singleton_method(Berns, "title", berns_title_element, -1);
1047
+ rb_define_singleton_method(Berns, "tr", berns_tr_element, -1);
1048
+ rb_define_singleton_method(Berns, "u", berns_u_element, -1);
1049
+ rb_define_singleton_method(Berns, "ul", berns_ul_element, -1);
1050
+ rb_define_singleton_method(Berns, "var", berns_var_element, -1);
1051
+ rb_define_singleton_method(Berns, "video", berns_video_element, -1);
1052
+ }