berns 3.1.2 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.org +4 -0
- data/ext/berns/berns.c +193 -158
- data/ext/berns/extconf.rb +9 -3
- data/lib/berns.rb +0 -22
- data/lib/berns/berns.so +0 -0
- data/lib/berns/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d9597d10ff728258b758e65aca73ec692374d3d359acb976677f0e143800978
|
4
|
+
data.tar.gz: 8eb851e88a7674a5d9e9af5f111085af87bb958db03f0539574bdd9358dad9be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e62bb1798243beab62f44e1ba7a3fc211b53997ce44e4ba37e6c46303974a96d4391d3fcdb9c807f3b894f097e9d3c823831026d4dca645362b21f4cab050da
|
7
|
+
data.tar.gz: 047c09ea060864337ee852e51b85964bfed265009123e290e17d0f3b51782aca5ad3ca877ea45195536e8a93258dd5536e66c6e553d6afc5dfcbf970bccf7807
|
data/README.org
CHANGED
@@ -91,6 +91,10 @@ The =sanitize= method strips HTML tags from strings.
|
|
91
91
|
Berns.sanitize('This <span>should be clean</span>') # => 'This should be clean'
|
92
92
|
#+end_src
|
93
93
|
|
94
|
+
Note that this is an extremely naive implementation of HTML sanitization that
|
95
|
+
literally just looks for "<" and ">" characters and removes the contents between
|
96
|
+
them. This should probably only be used on trusted strings.
|
97
|
+
|
94
98
|
*** Standard and void elements
|
95
99
|
|
96
100
|
All standard and void HTML elements are defined as methods on Berns, so you can
|
data/ext/berns/berns.c
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
#include "ruby.h"
|
2
|
-
#include "extconf.h"
|
3
2
|
#include "hescape.h"
|
4
3
|
|
5
4
|
static const char *attr_close = "\"";
|
@@ -47,11 +46,11 @@ static const size_t sllen = 1;
|
|
47
46
|
* Macro to define a "dynamic" function that generates a void element.
|
48
47
|
*/
|
49
48
|
#define VOID_ELEMENT(element_name) \
|
50
|
-
static VALUE external_##element_name##_element(int argc, VALUE*
|
49
|
+
static VALUE external_##element_name##_element(int argc, VALUE *argv, RB_UNUSED_VAR(VALUE self)) { \
|
51
50
|
rb_check_arity(argc, 0, 1); \
|
52
51
|
\
|
53
|
-
char *tag = #element_name; \
|
54
|
-
char *string = void_element(tag, strlen(tag),
|
52
|
+
const char *tag = #element_name; \
|
53
|
+
char *string = void_element(tag, strlen(tag), argv[0]); \
|
55
54
|
VALUE rstring = rb_utf8_str_new_cstr(string); \
|
56
55
|
free(string); \
|
57
56
|
\
|
@@ -62,12 +61,12 @@ static const size_t sllen = 1;
|
|
62
61
|
* Macro to define a "dynamic" function that generates a standard element.
|
63
62
|
*/
|
64
63
|
#define STANDARD_ELEMENT(element_name) \
|
65
|
-
static VALUE external_##element_name##_element(int argc, VALUE*
|
64
|
+
static VALUE external_##element_name##_element(int argc, VALUE *argv, RB_UNUSED_VAR(VALUE self)) { \
|
66
65
|
rb_check_arity(argc, 0, 1); \
|
67
66
|
\
|
68
67
|
CONTENT_FROM_BLOCK; \
|
69
|
-
char *tag = #element_name; \
|
70
|
-
char *string = element(tag, strlen(tag), RSTRING_PTR(content), RSTRING_LEN(content),
|
68
|
+
const char *tag = #element_name; \
|
69
|
+
char *string = element(tag, strlen(tag), RSTRING_PTR(content), RSTRING_LEN(content), argv[0]); \
|
71
70
|
VALUE rstring = rb_utf8_str_new_cstr(string); \
|
72
71
|
free(string); \
|
73
72
|
\
|
@@ -78,25 +77,64 @@ static const size_t sllen = 1;
|
|
78
77
|
/*
|
79
78
|
* "Safe strcpy" - https://twitter.com/hyc_symas/status/1102573036534972416?s=12
|
80
79
|
*/
|
81
|
-
static char *stecpy(char *destination, const char *source, const char *end) {
|
80
|
+
static char * stecpy(char *destination, const char *source, const char *end) {
|
81
|
+
if (end) {
|
82
|
+
end--;
|
83
|
+
}
|
84
|
+
|
82
85
|
while (*source && destination < end) {
|
83
86
|
*destination++ = *source++;
|
84
87
|
}
|
85
88
|
|
86
|
-
if (destination
|
89
|
+
if (destination) {
|
87
90
|
*destination = '\0';
|
88
91
|
}
|
89
92
|
|
90
93
|
return destination;
|
91
94
|
}
|
92
95
|
|
96
|
+
/*
|
97
|
+
* The external API for Berns.sanitize
|
98
|
+
*
|
99
|
+
* string should be a string or nil, anything else will raise an error.
|
100
|
+
*
|
101
|
+
*/
|
102
|
+
static VALUE external_sanitize(RB_UNUSED_VAR(VALUE self), VALUE string) {
|
103
|
+
if (TYPE(string) == T_NIL) {
|
104
|
+
return Qnil;
|
105
|
+
}
|
106
|
+
|
107
|
+
StringValue(string);
|
108
|
+
|
109
|
+
size_t slen = RSTRING_LEN(string);
|
110
|
+
char *str = RSTRING_PTR(string);
|
111
|
+
|
112
|
+
char dest[slen + 1];
|
113
|
+
int index = 0;
|
114
|
+
int open = 0;
|
115
|
+
|
116
|
+
for (unsigned int i = 0; i < slen; i++) {
|
117
|
+
if (str[i] == '<') {
|
118
|
+
open = 1;
|
119
|
+
} else if (str[i] == '>') {
|
120
|
+
open = 0;
|
121
|
+
} else if (!open) {
|
122
|
+
dest[index++] = str[i];
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
dest[index] = '\0';
|
127
|
+
|
128
|
+
return rb_utf8_str_new_cstr(dest);
|
129
|
+
}
|
130
|
+
|
93
131
|
/*
|
94
132
|
* The external API for Berns.escape_html.
|
95
133
|
*
|
96
134
|
* string should be a string, anything else will raise an error.
|
97
135
|
*
|
98
136
|
*/
|
99
|
-
static VALUE external_escape_html(
|
137
|
+
static VALUE external_escape_html(RB_UNUSED_VAR(VALUE self), VALUE string) {
|
100
138
|
StringValue(string);
|
101
139
|
|
102
140
|
uint8_t *dest = NULL;
|
@@ -123,7 +161,6 @@ static VALUE external_escape_html(const VALUE self, VALUE string) {
|
|
123
161
|
static char * empty_value_to_attribute(const char *attr, const size_t attrlen) {
|
124
162
|
size_t total_size = attrlen + 1;
|
125
163
|
char *dest = malloc(total_size);
|
126
|
-
char *ptr = NULL;
|
127
164
|
char *end = dest + total_size;
|
128
165
|
|
129
166
|
stecpy(dest, attr, end);
|
@@ -140,7 +177,6 @@ static char * string_value_to_attribute(const char *attr, const size_t attrlen,
|
|
140
177
|
if (vallen == 0) {
|
141
178
|
size_t total_size = attrlen + 1;
|
142
179
|
char *dest = malloc(total_size);
|
143
|
-
char *ptr = NULL;
|
144
180
|
char *end = dest + total_size;
|
145
181
|
|
146
182
|
stecpy(dest, attr, end);
|
@@ -168,21 +204,21 @@ static char * string_value_to_attribute(const char *attr, const size_t attrlen,
|
|
168
204
|
}
|
169
205
|
}
|
170
206
|
|
171
|
-
static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE
|
172
|
-
if (TYPE(
|
173
|
-
return
|
207
|
+
static char * hash_value_to_attribute(const char *attr, const size_t attrlen, VALUE value) {
|
208
|
+
if (TYPE(value) == T_IMEMO) {
|
209
|
+
return strdup("");
|
174
210
|
}
|
175
211
|
|
176
|
-
Check_Type(
|
212
|
+
Check_Type(value, T_HASH);
|
177
213
|
|
178
|
-
if (rb_hash_size(
|
179
|
-
return
|
214
|
+
if (rb_hash_size(value) == 1) {
|
215
|
+
return strdup("");
|
180
216
|
}
|
181
217
|
|
182
218
|
VALUE subkey;
|
183
219
|
VALUE subvalue;
|
184
220
|
|
185
|
-
const VALUE keys = rb_funcall(
|
221
|
+
const VALUE keys = rb_funcall(value, rb_intern("keys"), 0);
|
186
222
|
const VALUE length = RARRAY_LEN(keys);
|
187
223
|
|
188
224
|
size_t allocated = 256;
|
@@ -194,7 +230,7 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
|
|
194
230
|
|
195
231
|
for (unsigned int i = 0; i < length; i++) {
|
196
232
|
subkey = rb_ary_entry(keys, i);
|
197
|
-
subvalue = rb_hash_aref(
|
233
|
+
subvalue = rb_hash_aref(value, subkey);
|
198
234
|
|
199
235
|
switch(TYPE(subkey)) {
|
200
236
|
case T_STRING:
|
@@ -224,27 +260,29 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
|
|
224
260
|
|
225
261
|
char subattr[subattr_len + 1];
|
226
262
|
char *ptr = subattr;
|
227
|
-
char *
|
263
|
+
char *subend = subattr + subattr_len + 1;
|
228
264
|
|
229
265
|
if (attrlen > 0) {
|
230
|
-
ptr = stecpy(ptr, attr,
|
266
|
+
ptr = stecpy(ptr, attr, subend);
|
231
267
|
}
|
232
268
|
|
233
269
|
if (attrlen > 0 && subkey_len > 0) {
|
234
|
-
ptr = stecpy(ptr, dash,
|
270
|
+
ptr = stecpy(ptr, dash, subend);
|
235
271
|
}
|
236
272
|
|
237
|
-
stecpy(ptr, RSTRING_PTR(subkey),
|
273
|
+
stecpy(ptr, RSTRING_PTR(subkey), subend);
|
238
274
|
|
239
275
|
char *combined;
|
240
276
|
|
241
277
|
switch(TYPE(subvalue)) {
|
242
278
|
case T_FALSE:
|
243
|
-
combined =
|
279
|
+
combined = strdup("");
|
244
280
|
break;
|
245
281
|
|
282
|
+
case T_NIL:
|
283
|
+
/* Fall through. */
|
246
284
|
case T_TRUE:
|
247
|
-
combined =
|
285
|
+
combined = empty_value_to_attribute(subattr, subattr_len);
|
248
286
|
break;
|
249
287
|
|
250
288
|
case T_STRING:
|
@@ -256,13 +294,8 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
|
|
256
294
|
combined = string_value_to_attribute(subattr, subattr_len, RSTRING_PTR(subvalue), RSTRING_LEN(subvalue));
|
257
295
|
break;
|
258
296
|
|
259
|
-
case T_NIL:
|
260
|
-
subvalue = rb_utf8_str_new_cstr("");
|
261
|
-
combined = string_value_to_attribute(subattr, subattr_len, RSTRING_PTR(subvalue), RSTRING_LEN(subvalue));
|
262
|
-
break;
|
263
|
-
|
264
297
|
case T_HASH:
|
265
|
-
combined = hash_value_to_attribute(subattr, subattr_len,
|
298
|
+
combined = hash_value_to_attribute(subattr, subattr_len, subvalue);
|
266
299
|
break;
|
267
300
|
|
268
301
|
default:
|
@@ -313,7 +346,7 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
|
|
313
346
|
/*
|
314
347
|
* Convert an attribute name and value into a string.
|
315
348
|
*/
|
316
|
-
static char * to_attribute(VALUE attr, VALUE
|
349
|
+
static char * to_attribute(VALUE attr, VALUE value) {
|
317
350
|
switch(TYPE(attr)) {
|
318
351
|
case T_SYMBOL:
|
319
352
|
attr = rb_sym2str(attr);
|
@@ -327,26 +360,27 @@ static char * to_attribute(VALUE attr, VALUE *value) {
|
|
327
360
|
char *val = NULL;
|
328
361
|
VALUE str;
|
329
362
|
|
330
|
-
switch(TYPE(
|
363
|
+
switch(TYPE(value)) {
|
331
364
|
case T_NIL:
|
365
|
+
/* Fall through. */
|
332
366
|
case T_TRUE:
|
333
367
|
val = empty_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr));
|
334
368
|
break;
|
335
369
|
case T_FALSE:
|
336
|
-
val =
|
370
|
+
val = strdup("");
|
337
371
|
break;
|
338
372
|
case T_HASH:
|
339
373
|
val = hash_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), value);
|
340
374
|
break;
|
341
375
|
case T_STRING:
|
342
|
-
val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(
|
376
|
+
val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(value), RSTRING_LEN(value));
|
343
377
|
break;
|
344
378
|
case T_SYMBOL:
|
345
|
-
str = rb_sym2str(
|
379
|
+
str = rb_sym2str(value);
|
346
380
|
val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(str), RSTRING_LEN(str));
|
347
381
|
break;
|
348
382
|
default:
|
349
|
-
str = rb_funcall(
|
383
|
+
str = rb_funcall(value, rb_intern("to_s"), 0);
|
350
384
|
val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(str), RSTRING_LEN(str));
|
351
385
|
break;
|
352
386
|
}
|
@@ -372,7 +406,7 @@ static VALUE external_to_attribute(RB_UNUSED_VAR(VALUE self), VALUE attr, VALUE
|
|
372
406
|
|
373
407
|
StringValue(attr);
|
374
408
|
|
375
|
-
char *val = to_attribute(attr,
|
409
|
+
char *val = to_attribute(attr, value);
|
376
410
|
VALUE rstring = rb_utf8_str_new_cstr(val);
|
377
411
|
free(val);
|
378
412
|
|
@@ -392,8 +426,8 @@ static VALUE external_to_attributes(RB_UNUSED_VAR(VALUE self), VALUE attributes)
|
|
392
426
|
return rb_utf8_str_new_cstr("");
|
393
427
|
}
|
394
428
|
|
395
|
-
char *empty = "";
|
396
|
-
char *attrs = hash_value_to_attribute(empty, 0,
|
429
|
+
const char *empty = "";
|
430
|
+
char *attrs = hash_value_to_attribute(empty, 0, attributes);
|
397
431
|
|
398
432
|
VALUE rstring = rb_utf8_str_new_cstr(attrs);
|
399
433
|
free(attrs);
|
@@ -401,9 +435,9 @@ static VALUE external_to_attributes(RB_UNUSED_VAR(VALUE self), VALUE attributes)
|
|
401
435
|
return rstring;
|
402
436
|
}
|
403
437
|
|
404
|
-
static char * void_element(char *tag, size_t tlen, VALUE
|
438
|
+
static char * void_element(const char *tag, size_t tlen, VALUE attributes) {
|
405
439
|
/* T_IMEMO is what we get if an optional argument was not passed. */
|
406
|
-
if (TYPE(
|
440
|
+
if (TYPE(attributes) == T_IMEMO) {
|
407
441
|
size_t total = tag_olen + tlen + tag_clen + 1;
|
408
442
|
char *string = malloc(total);
|
409
443
|
char *ptr;
|
@@ -415,7 +449,7 @@ static char * void_element(char *tag, size_t tlen, VALUE *attributes) {
|
|
415
449
|
|
416
450
|
return string;
|
417
451
|
} else {
|
418
|
-
char *empty = "";
|
452
|
+
const char *empty = "";
|
419
453
|
char *attrs = hash_value_to_attribute(empty, 0, attributes);
|
420
454
|
|
421
455
|
size_t total = tag_olen + tlen + splen + strlen(attrs) + tag_clen + 1;
|
@@ -454,7 +488,7 @@ static VALUE external_void_element(int argc, VALUE *arguments, RB_UNUSED_VAR(VAL
|
|
454
488
|
|
455
489
|
StringValue(tag);
|
456
490
|
|
457
|
-
char *string = void_element(RSTRING_PTR(tag), RSTRING_LEN(tag),
|
491
|
+
char *string = void_element(RSTRING_PTR(tag), RSTRING_LEN(tag), attributes);
|
458
492
|
VALUE rstring = rb_utf8_str_new_cstr(string);
|
459
493
|
|
460
494
|
free(string);
|
@@ -462,8 +496,8 @@ static VALUE external_void_element(int argc, VALUE *arguments, RB_UNUSED_VAR(VAL
|
|
462
496
|
return rstring;
|
463
497
|
}
|
464
498
|
|
465
|
-
static char * element(char *tag, size_t tlen, char *content, size_t conlen, VALUE
|
466
|
-
char *empty = "";
|
499
|
+
static char * element(const char *tag, size_t tlen, char *content, size_t conlen, VALUE attributes) {
|
500
|
+
const char *empty = "";
|
467
501
|
char *attrs = hash_value_to_attribute(empty, 0, attributes);
|
468
502
|
size_t alen = strlen(attrs);
|
469
503
|
|
@@ -529,129 +563,130 @@ static VALUE external_element(int argc, VALUE *arguments, RB_UNUSED_VAR(VALUE se
|
|
529
563
|
|
530
564
|
CONTENT_FROM_BLOCK;
|
531
565
|
|
532
|
-
char *string = element(RSTRING_PTR(tag), RSTRING_LEN(tag), RSTRING_PTR(content), RSTRING_LEN(content),
|
566
|
+
char *string = element(RSTRING_PTR(tag), RSTRING_LEN(tag), RSTRING_PTR(content), RSTRING_LEN(content), attributes);
|
533
567
|
VALUE rstring = rb_utf8_str_new_cstr(string);
|
534
568
|
free(string);
|
535
569
|
|
536
570
|
return rstring;
|
537
571
|
}
|
538
572
|
|
539
|
-
VOID_ELEMENT(area)
|
540
|
-
VOID_ELEMENT(base)
|
541
|
-
VOID_ELEMENT(br)
|
542
|
-
VOID_ELEMENT(col)
|
543
|
-
VOID_ELEMENT(embed)
|
544
|
-
VOID_ELEMENT(hr)
|
545
|
-
VOID_ELEMENT(img)
|
546
|
-
VOID_ELEMENT(input)
|
547
|
-
VOID_ELEMENT(link)
|
548
|
-
VOID_ELEMENT(menuitem)
|
549
|
-
VOID_ELEMENT(meta)
|
550
|
-
VOID_ELEMENT(param)
|
551
|
-
VOID_ELEMENT(source)
|
552
|
-
VOID_ELEMENT(track)
|
553
|
-
VOID_ELEMENT(wbr)
|
554
|
-
|
555
|
-
STANDARD_ELEMENT(a)
|
556
|
-
STANDARD_ELEMENT(abbr)
|
557
|
-
STANDARD_ELEMENT(address)
|
558
|
-
STANDARD_ELEMENT(article)
|
559
|
-
STANDARD_ELEMENT(aside)
|
560
|
-
STANDARD_ELEMENT(audio)
|
561
|
-
STANDARD_ELEMENT(b)
|
562
|
-
STANDARD_ELEMENT(bdi)
|
563
|
-
STANDARD_ELEMENT(bdo)
|
564
|
-
STANDARD_ELEMENT(blockquote)
|
565
|
-
STANDARD_ELEMENT(body)
|
566
|
-
STANDARD_ELEMENT(button)
|
567
|
-
STANDARD_ELEMENT(canvas)
|
568
|
-
STANDARD_ELEMENT(caption)
|
569
|
-
STANDARD_ELEMENT(cite)
|
570
|
-
STANDARD_ELEMENT(code)
|
571
|
-
STANDARD_ELEMENT(colgroup)
|
572
|
-
STANDARD_ELEMENT(datalist)
|
573
|
-
STANDARD_ELEMENT(dd)
|
574
|
-
STANDARD_ELEMENT(del)
|
575
|
-
STANDARD_ELEMENT(details)
|
576
|
-
STANDARD_ELEMENT(dfn)
|
577
|
-
STANDARD_ELEMENT(dialog)
|
578
|
-
STANDARD_ELEMENT(div)
|
579
|
-
STANDARD_ELEMENT(dl)
|
580
|
-
STANDARD_ELEMENT(dt)
|
581
|
-
STANDARD_ELEMENT(em)
|
582
|
-
STANDARD_ELEMENT(fieldset)
|
583
|
-
STANDARD_ELEMENT(figcaption)
|
584
|
-
STANDARD_ELEMENT(figure)
|
585
|
-
STANDARD_ELEMENT(footer)
|
586
|
-
STANDARD_ELEMENT(form)
|
587
|
-
STANDARD_ELEMENT(h1)
|
588
|
-
STANDARD_ELEMENT(h2)
|
589
|
-
STANDARD_ELEMENT(h3)
|
590
|
-
STANDARD_ELEMENT(h4)
|
591
|
-
STANDARD_ELEMENT(h5)
|
592
|
-
STANDARD_ELEMENT(h6)
|
593
|
-
STANDARD_ELEMENT(head)
|
594
|
-
STANDARD_ELEMENT(header)
|
595
|
-
STANDARD_ELEMENT(html)
|
596
|
-
STANDARD_ELEMENT(i)
|
597
|
-
STANDARD_ELEMENT(iframe)
|
598
|
-
STANDARD_ELEMENT(ins)
|
599
|
-
STANDARD_ELEMENT(kbd)
|
600
|
-
STANDARD_ELEMENT(label)
|
601
|
-
STANDARD_ELEMENT(legend)
|
602
|
-
STANDARD_ELEMENT(li)
|
603
|
-
STANDARD_ELEMENT(main)
|
604
|
-
STANDARD_ELEMENT(map)
|
605
|
-
STANDARD_ELEMENT(mark)
|
606
|
-
STANDARD_ELEMENT(menu)
|
607
|
-
STANDARD_ELEMENT(meter)
|
608
|
-
STANDARD_ELEMENT(nav)
|
609
|
-
STANDARD_ELEMENT(noscript)
|
610
|
-
STANDARD_ELEMENT(object)
|
611
|
-
STANDARD_ELEMENT(ol)
|
612
|
-
STANDARD_ELEMENT(optgroup)
|
613
|
-
STANDARD_ELEMENT(option)
|
614
|
-
STANDARD_ELEMENT(output)
|
615
|
-
STANDARD_ELEMENT(p)
|
616
|
-
STANDARD_ELEMENT(picture)
|
617
|
-
STANDARD_ELEMENT(pre)
|
618
|
-
STANDARD_ELEMENT(progress)
|
619
|
-
STANDARD_ELEMENT(q)
|
620
|
-
STANDARD_ELEMENT(rp)
|
621
|
-
STANDARD_ELEMENT(rt)
|
622
|
-
STANDARD_ELEMENT(ruby)
|
623
|
-
STANDARD_ELEMENT(s)
|
624
|
-
STANDARD_ELEMENT(samp)
|
625
|
-
STANDARD_ELEMENT(script)
|
626
|
-
STANDARD_ELEMENT(section)
|
627
|
-
STANDARD_ELEMENT(select)
|
628
|
-
STANDARD_ELEMENT(small)
|
629
|
-
STANDARD_ELEMENT(span)
|
630
|
-
STANDARD_ELEMENT(strong)
|
631
|
-
STANDARD_ELEMENT(style)
|
632
|
-
STANDARD_ELEMENT(sub)
|
633
|
-
STANDARD_ELEMENT(summary)
|
634
|
-
STANDARD_ELEMENT(table)
|
635
|
-
STANDARD_ELEMENT(tbody)
|
636
|
-
STANDARD_ELEMENT(td)
|
637
|
-
STANDARD_ELEMENT(template)
|
638
|
-
STANDARD_ELEMENT(textarea)
|
639
|
-
STANDARD_ELEMENT(tfoot)
|
640
|
-
STANDARD_ELEMENT(th)
|
641
|
-
STANDARD_ELEMENT(thead)
|
642
|
-
STANDARD_ELEMENT(time)
|
643
|
-
STANDARD_ELEMENT(title)
|
644
|
-
STANDARD_ELEMENT(tr)
|
645
|
-
STANDARD_ELEMENT(u)
|
646
|
-
STANDARD_ELEMENT(ul)
|
647
|
-
STANDARD_ELEMENT(var)
|
648
|
-
STANDARD_ELEMENT(video)
|
573
|
+
VOID_ELEMENT(area)
|
574
|
+
VOID_ELEMENT(base)
|
575
|
+
VOID_ELEMENT(br)
|
576
|
+
VOID_ELEMENT(col)
|
577
|
+
VOID_ELEMENT(embed)
|
578
|
+
VOID_ELEMENT(hr)
|
579
|
+
VOID_ELEMENT(img)
|
580
|
+
VOID_ELEMENT(input)
|
581
|
+
VOID_ELEMENT(link)
|
582
|
+
VOID_ELEMENT(menuitem)
|
583
|
+
VOID_ELEMENT(meta)
|
584
|
+
VOID_ELEMENT(param)
|
585
|
+
VOID_ELEMENT(source)
|
586
|
+
VOID_ELEMENT(track)
|
587
|
+
VOID_ELEMENT(wbr)
|
588
|
+
|
589
|
+
STANDARD_ELEMENT(a)
|
590
|
+
STANDARD_ELEMENT(abbr)
|
591
|
+
STANDARD_ELEMENT(address)
|
592
|
+
STANDARD_ELEMENT(article)
|
593
|
+
STANDARD_ELEMENT(aside)
|
594
|
+
STANDARD_ELEMENT(audio)
|
595
|
+
STANDARD_ELEMENT(b)
|
596
|
+
STANDARD_ELEMENT(bdi)
|
597
|
+
STANDARD_ELEMENT(bdo)
|
598
|
+
STANDARD_ELEMENT(blockquote)
|
599
|
+
STANDARD_ELEMENT(body)
|
600
|
+
STANDARD_ELEMENT(button)
|
601
|
+
STANDARD_ELEMENT(canvas)
|
602
|
+
STANDARD_ELEMENT(caption)
|
603
|
+
STANDARD_ELEMENT(cite)
|
604
|
+
STANDARD_ELEMENT(code)
|
605
|
+
STANDARD_ELEMENT(colgroup)
|
606
|
+
STANDARD_ELEMENT(datalist)
|
607
|
+
STANDARD_ELEMENT(dd)
|
608
|
+
STANDARD_ELEMENT(del)
|
609
|
+
STANDARD_ELEMENT(details)
|
610
|
+
STANDARD_ELEMENT(dfn)
|
611
|
+
STANDARD_ELEMENT(dialog)
|
612
|
+
STANDARD_ELEMENT(div)
|
613
|
+
STANDARD_ELEMENT(dl)
|
614
|
+
STANDARD_ELEMENT(dt)
|
615
|
+
STANDARD_ELEMENT(em)
|
616
|
+
STANDARD_ELEMENT(fieldset)
|
617
|
+
STANDARD_ELEMENT(figcaption)
|
618
|
+
STANDARD_ELEMENT(figure)
|
619
|
+
STANDARD_ELEMENT(footer)
|
620
|
+
STANDARD_ELEMENT(form)
|
621
|
+
STANDARD_ELEMENT(h1)
|
622
|
+
STANDARD_ELEMENT(h2)
|
623
|
+
STANDARD_ELEMENT(h3)
|
624
|
+
STANDARD_ELEMENT(h4)
|
625
|
+
STANDARD_ELEMENT(h5)
|
626
|
+
STANDARD_ELEMENT(h6)
|
627
|
+
STANDARD_ELEMENT(head)
|
628
|
+
STANDARD_ELEMENT(header)
|
629
|
+
STANDARD_ELEMENT(html)
|
630
|
+
STANDARD_ELEMENT(i)
|
631
|
+
STANDARD_ELEMENT(iframe)
|
632
|
+
STANDARD_ELEMENT(ins)
|
633
|
+
STANDARD_ELEMENT(kbd)
|
634
|
+
STANDARD_ELEMENT(label)
|
635
|
+
STANDARD_ELEMENT(legend)
|
636
|
+
STANDARD_ELEMENT(li)
|
637
|
+
STANDARD_ELEMENT(main)
|
638
|
+
STANDARD_ELEMENT(map)
|
639
|
+
STANDARD_ELEMENT(mark)
|
640
|
+
STANDARD_ELEMENT(menu)
|
641
|
+
STANDARD_ELEMENT(meter)
|
642
|
+
STANDARD_ELEMENT(nav)
|
643
|
+
STANDARD_ELEMENT(noscript)
|
644
|
+
STANDARD_ELEMENT(object)
|
645
|
+
STANDARD_ELEMENT(ol)
|
646
|
+
STANDARD_ELEMENT(optgroup)
|
647
|
+
STANDARD_ELEMENT(option)
|
648
|
+
STANDARD_ELEMENT(output)
|
649
|
+
STANDARD_ELEMENT(p)
|
650
|
+
STANDARD_ELEMENT(picture)
|
651
|
+
STANDARD_ELEMENT(pre)
|
652
|
+
STANDARD_ELEMENT(progress)
|
653
|
+
STANDARD_ELEMENT(q)
|
654
|
+
STANDARD_ELEMENT(rp)
|
655
|
+
STANDARD_ELEMENT(rt)
|
656
|
+
STANDARD_ELEMENT(ruby)
|
657
|
+
STANDARD_ELEMENT(s)
|
658
|
+
STANDARD_ELEMENT(samp)
|
659
|
+
STANDARD_ELEMENT(script)
|
660
|
+
STANDARD_ELEMENT(section)
|
661
|
+
STANDARD_ELEMENT(select)
|
662
|
+
STANDARD_ELEMENT(small)
|
663
|
+
STANDARD_ELEMENT(span)
|
664
|
+
STANDARD_ELEMENT(strong)
|
665
|
+
STANDARD_ELEMENT(style)
|
666
|
+
STANDARD_ELEMENT(sub)
|
667
|
+
STANDARD_ELEMENT(summary)
|
668
|
+
STANDARD_ELEMENT(table)
|
669
|
+
STANDARD_ELEMENT(tbody)
|
670
|
+
STANDARD_ELEMENT(td)
|
671
|
+
STANDARD_ELEMENT(template)
|
672
|
+
STANDARD_ELEMENT(textarea)
|
673
|
+
STANDARD_ELEMENT(tfoot)
|
674
|
+
STANDARD_ELEMENT(th)
|
675
|
+
STANDARD_ELEMENT(thead)
|
676
|
+
STANDARD_ELEMENT(time)
|
677
|
+
STANDARD_ELEMENT(title)
|
678
|
+
STANDARD_ELEMENT(tr)
|
679
|
+
STANDARD_ELEMENT(u)
|
680
|
+
STANDARD_ELEMENT(ul)
|
681
|
+
STANDARD_ELEMENT(var)
|
682
|
+
STANDARD_ELEMENT(video)
|
649
683
|
|
650
684
|
void Init_berns() {
|
651
685
|
VALUE Berns = rb_define_module("Berns");
|
652
686
|
|
653
687
|
rb_define_singleton_method(Berns, "element", external_element, -1);
|
654
688
|
rb_define_singleton_method(Berns, "escape_html", external_escape_html, 1);
|
689
|
+
rb_define_singleton_method(Berns, "sanitize", external_sanitize, 1);
|
655
690
|
rb_define_singleton_method(Berns, "to_attribute", external_to_attribute, 2);
|
656
691
|
rb_define_singleton_method(Berns, "to_attributes", external_to_attributes, 1);
|
657
692
|
rb_define_singleton_method(Berns, "void", external_void_element, -1);
|
data/ext/berns/extconf.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'mkmf'
|
3
3
|
|
4
|
-
|
4
|
+
dir_config 'berns'
|
5
|
+
|
6
|
+
append_cflags '-O3'
|
7
|
+
append_cflags '-Wshadow'
|
8
|
+
append_cflags '-Wstrict-overflow'
|
9
|
+
append_cflags '-flto'
|
10
|
+
append_cflags '-fno-strict-aliasing'
|
11
|
+
append_cflags '-msse4'
|
12
|
+
append_cflags '-std=c99'
|
5
13
|
|
6
|
-
dir_config('berns')
|
7
|
-
create_header
|
8
14
|
create_makefile 'berns/berns'
|
data/lib/berns.rb
CHANGED
@@ -1,25 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'berns/berns'
|
3
3
|
require 'berns/version'
|
4
|
-
|
5
|
-
module Berns # :nodoc:
|
6
|
-
class Error < StandardError; end
|
7
|
-
|
8
|
-
EMPTY = ''
|
9
|
-
|
10
|
-
# Regular expression for basic HTML tag sanitizing.
|
11
|
-
SANITIZE_REGEX = /<[^>]+>/.freeze
|
12
|
-
|
13
|
-
# Sanitize text input by stripping HTML tags.
|
14
|
-
#
|
15
|
-
# @example Sanitize some text, removing HTML elements.
|
16
|
-
# sanitize('This <span>should be clean</span>') # => "This should be clean"
|
17
|
-
#
|
18
|
-
# @param text [String]
|
19
|
-
# The string to sanitize.
|
20
|
-
# @return [nil, String]
|
21
|
-
# nil unless a string was passed in, otherwise the sanitized string.
|
22
|
-
def self.sanitize(string)
|
23
|
-
string&.gsub(SANITIZE_REGEX, EMPTY)
|
24
|
-
end
|
25
|
-
end
|
data/lib/berns/berns.so
CHANGED
Binary file
|
data/lib/berns/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taylor Beck
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-06-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: benchmark-ips
|