berns 3.1.3 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3f1a44554212d5fc783feab767f7926e7d55d0d12ad23ad876748a547a128c5
4
- data.tar.gz: 93f10d934d9f140d1604dbebbdd380f34997f0531abb5c1f8fe41249a22152df
3
+ metadata.gz: 74e861ab5e3bfb8359f063dc7637b4f9c8f30ed60722b3f6cfec7aaf432915af
4
+ data.tar.gz: 17e884c022d55c44ad4ff080ec485d82688664529aee4d656b95d1d93a129e31
5
5
  SHA512:
6
- metadata.gz: 459194492b7223b9e27a39f07009644f4b06a1b64cbcfdfc50b40b71ad51fbf2196f97bf1cb0f1212ded8a042b925b45dbfe2d98f61cc1fd0107ac0a432406c8
7
- data.tar.gz: 28dd92ab04e1fa8af37b5b90cc071b1b7f1093b2275fe6e356fe48205d25ae2cbc2fd61e67555aabf60f275d6fdbd14614fc34cf5158aee73e1384c126cf1e45
6
+ metadata.gz: 17166b6a903fba75f3cf3984710735e92206892eec6310bb2144ff5e088694089326426baf2c8e7c1246e681d4887559f01f7364635bfc29006878a908b9912f
7
+ data.tar.gz: 9472135003033d1fdc6db413e44cf7ab69be6fa947b9e2a452d2bd24f316f0708055d03d6157adf292c5b9644d73dd08cad261c1b4c45588be18b8069e5366e2
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* argv, RB_UNUSED_VAR(VALUE self)) { \
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), &argv[0]); \
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* argv, RB_UNUSED_VAR(VALUE self)) { \
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), &argv[0]); \
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,74 @@ 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 < end) {
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
+ int opened = 0;
116
+
117
+ for (unsigned int i = 0; i < slen; i++) {
118
+ if (str[i] == '<') {
119
+ open = 1;
120
+ opened = 1;
121
+ } else if (str[i] == '>') {
122
+ open = 0;
123
+ } else if (!open) {
124
+ dest[index++] = str[i];
125
+ }
126
+ }
127
+
128
+ dest[index] = '\0';
129
+
130
+ /*
131
+ * If a tag was never opened, return the original string, otherwise create a new
132
+ * string from our destination buffer.
133
+ */
134
+ if (opened) {
135
+ return rb_utf8_str_new_cstr(dest);
136
+ } else {
137
+ return string;
138
+ }
139
+ }
140
+
93
141
  /*
94
142
  * The external API for Berns.escape_html.
95
143
  *
96
144
  * string should be a string, anything else will raise an error.
97
145
  *
98
146
  */
99
- static VALUE external_escape_html(const VALUE self, VALUE string) {
147
+ static VALUE external_escape_html(RB_UNUSED_VAR(VALUE self), VALUE string) {
100
148
  StringValue(string);
101
149
 
102
150
  uint8_t *dest = NULL;
@@ -123,7 +171,6 @@ static VALUE external_escape_html(const VALUE self, VALUE string) {
123
171
  static char * empty_value_to_attribute(const char *attr, const size_t attrlen) {
124
172
  size_t total_size = attrlen + 1;
125
173
  char *dest = malloc(total_size);
126
- char *ptr = NULL;
127
174
  char *end = dest + total_size;
128
175
 
129
176
  stecpy(dest, attr, end);
@@ -140,7 +187,6 @@ static char * string_value_to_attribute(const char *attr, const size_t attrlen,
140
187
  if (vallen == 0) {
141
188
  size_t total_size = attrlen + 1;
142
189
  char *dest = malloc(total_size);
143
- char *ptr = NULL;
144
190
  char *end = dest + total_size;
145
191
 
146
192
  stecpy(dest, attr, end);
@@ -168,21 +214,21 @@ static char * string_value_to_attribute(const char *attr, const size_t attrlen,
168
214
  }
169
215
  }
170
216
 
171
- static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *value) {
172
- if (TYPE(*value) == T_IMEMO) {
217
+ static char * hash_value_to_attribute(const char *attr, const size_t attrlen, VALUE value) {
218
+ if (TYPE(value) == T_IMEMO) {
173
219
  return strdup("");
174
220
  }
175
221
 
176
- Check_Type(*value, T_HASH);
222
+ Check_Type(value, T_HASH);
177
223
 
178
- if (rb_hash_size(*value) == 1) {
224
+ if (rb_hash_size(value) == 1) {
179
225
  return strdup("");
180
226
  }
181
227
 
182
228
  VALUE subkey;
183
229
  VALUE subvalue;
184
230
 
185
- const VALUE keys = rb_funcall(*value, rb_intern("keys"), 0);
231
+ const VALUE keys = rb_funcall(value, rb_intern("keys"), 0);
186
232
  const VALUE length = RARRAY_LEN(keys);
187
233
 
188
234
  size_t allocated = 256;
@@ -194,7 +240,7 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
194
240
 
195
241
  for (unsigned int i = 0; i < length; i++) {
196
242
  subkey = rb_ary_entry(keys, i);
197
- subvalue = rb_hash_aref(*value, subkey);
243
+ subvalue = rb_hash_aref(value, subkey);
198
244
 
199
245
  switch(TYPE(subkey)) {
200
246
  case T_STRING:
@@ -224,17 +270,17 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
224
270
 
225
271
  char subattr[subattr_len + 1];
226
272
  char *ptr = subattr;
227
- char *end = subattr + sizeof(subattr);
273
+ char *subend = subattr + subattr_len + 1;
228
274
 
229
275
  if (attrlen > 0) {
230
- ptr = stecpy(ptr, attr, end);
276
+ ptr = stecpy(ptr, attr, subend);
231
277
  }
232
278
 
233
279
  if (attrlen > 0 && subkey_len > 0) {
234
- ptr = stecpy(ptr, dash, end);
280
+ ptr = stecpy(ptr, dash, subend);
235
281
  }
236
282
 
237
- stecpy(ptr, RSTRING_PTR(subkey), end);
283
+ stecpy(ptr, RSTRING_PTR(subkey), subend);
238
284
 
239
285
  char *combined;
240
286
 
@@ -243,8 +289,10 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
243
289
  combined = strdup("");
244
290
  break;
245
291
 
292
+ case T_NIL:
293
+ /* Fall through. */
246
294
  case T_TRUE:
247
- combined = string_value_to_attribute(subattr, subattr_len, "", 0);
295
+ combined = empty_value_to_attribute(subattr, subattr_len);
248
296
  break;
249
297
 
250
298
  case T_STRING:
@@ -256,13 +304,8 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
256
304
  combined = string_value_to_attribute(subattr, subattr_len, RSTRING_PTR(subvalue), RSTRING_LEN(subvalue));
257
305
  break;
258
306
 
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
307
  case T_HASH:
265
- combined = hash_value_to_attribute(subattr, subattr_len, &subvalue);
308
+ combined = hash_value_to_attribute(subattr, subattr_len, subvalue);
266
309
  break;
267
310
 
268
311
  default:
@@ -313,7 +356,7 @@ static char * hash_value_to_attribute(char *attr, const size_t attrlen, VALUE *v
313
356
  /*
314
357
  * Convert an attribute name and value into a string.
315
358
  */
316
- static char * to_attribute(VALUE attr, VALUE *value) {
359
+ static char * to_attribute(VALUE attr, VALUE value) {
317
360
  switch(TYPE(attr)) {
318
361
  case T_SYMBOL:
319
362
  attr = rb_sym2str(attr);
@@ -327,8 +370,9 @@ static char * to_attribute(VALUE attr, VALUE *value) {
327
370
  char *val = NULL;
328
371
  VALUE str;
329
372
 
330
- switch(TYPE(*value)) {
373
+ switch(TYPE(value)) {
331
374
  case T_NIL:
375
+ /* Fall through. */
332
376
  case T_TRUE:
333
377
  val = empty_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr));
334
378
  break;
@@ -339,14 +383,14 @@ static char * to_attribute(VALUE attr, VALUE *value) {
339
383
  val = hash_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), value);
340
384
  break;
341
385
  case T_STRING:
342
- val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(*value), RSTRING_LEN(*value));
386
+ val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(value), RSTRING_LEN(value));
343
387
  break;
344
388
  case T_SYMBOL:
345
- str = rb_sym2str(*value);
389
+ str = rb_sym2str(value);
346
390
  val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(str), RSTRING_LEN(str));
347
391
  break;
348
392
  default:
349
- str = rb_funcall(*value, rb_intern("to_s"), 0);
393
+ str = rb_funcall(value, rb_intern("to_s"), 0);
350
394
  val = string_value_to_attribute(RSTRING_PTR(attr), RSTRING_LEN(attr), RSTRING_PTR(str), RSTRING_LEN(str));
351
395
  break;
352
396
  }
@@ -372,7 +416,7 @@ static VALUE external_to_attribute(RB_UNUSED_VAR(VALUE self), VALUE attr, VALUE
372
416
 
373
417
  StringValue(attr);
374
418
 
375
- char *val = to_attribute(attr, &value);
419
+ char *val = to_attribute(attr, value);
376
420
  VALUE rstring = rb_utf8_str_new_cstr(val);
377
421
  free(val);
378
422
 
@@ -392,8 +436,8 @@ static VALUE external_to_attributes(RB_UNUSED_VAR(VALUE self), VALUE attributes)
392
436
  return rb_utf8_str_new_cstr("");
393
437
  }
394
438
 
395
- char *empty = "";
396
- char *attrs = hash_value_to_attribute(empty, 0, &attributes);
439
+ const char *empty = "";
440
+ char *attrs = hash_value_to_attribute(empty, 0, attributes);
397
441
 
398
442
  VALUE rstring = rb_utf8_str_new_cstr(attrs);
399
443
  free(attrs);
@@ -401,9 +445,9 @@ static VALUE external_to_attributes(RB_UNUSED_VAR(VALUE self), VALUE attributes)
401
445
  return rstring;
402
446
  }
403
447
 
404
- static char * void_element(char *tag, size_t tlen, VALUE *attributes) {
448
+ static char * void_element(const char *tag, size_t tlen, VALUE attributes) {
405
449
  /* T_IMEMO is what we get if an optional argument was not passed. */
406
- if (TYPE(*attributes) == T_IMEMO) {
450
+ if (TYPE(attributes) == T_IMEMO) {
407
451
  size_t total = tag_olen + tlen + tag_clen + 1;
408
452
  char *string = malloc(total);
409
453
  char *ptr;
@@ -415,7 +459,7 @@ static char * void_element(char *tag, size_t tlen, VALUE *attributes) {
415
459
 
416
460
  return string;
417
461
  } else {
418
- char *empty = "";
462
+ const char *empty = "";
419
463
  char *attrs = hash_value_to_attribute(empty, 0, attributes);
420
464
 
421
465
  size_t total = tag_olen + tlen + splen + strlen(attrs) + tag_clen + 1;
@@ -454,7 +498,7 @@ static VALUE external_void_element(int argc, VALUE *arguments, RB_UNUSED_VAR(VAL
454
498
 
455
499
  StringValue(tag);
456
500
 
457
- char *string = void_element(RSTRING_PTR(tag), RSTRING_LEN(tag), &attributes);
501
+ char *string = void_element(RSTRING_PTR(tag), RSTRING_LEN(tag), attributes);
458
502
  VALUE rstring = rb_utf8_str_new_cstr(string);
459
503
 
460
504
  free(string);
@@ -462,8 +506,8 @@ static VALUE external_void_element(int argc, VALUE *arguments, RB_UNUSED_VAR(VAL
462
506
  return rstring;
463
507
  }
464
508
 
465
- static char * element(char *tag, size_t tlen, char *content, size_t conlen, VALUE *attributes) {
466
- char *empty = "";
509
+ static char * element(const char *tag, size_t tlen, char *content, size_t conlen, VALUE attributes) {
510
+ const char *empty = "";
467
511
  char *attrs = hash_value_to_attribute(empty, 0, attributes);
468
512
  size_t alen = strlen(attrs);
469
513
 
@@ -529,129 +573,130 @@ static VALUE external_element(int argc, VALUE *arguments, RB_UNUSED_VAR(VALUE se
529
573
 
530
574
  CONTENT_FROM_BLOCK;
531
575
 
532
- char *string = element(RSTRING_PTR(tag), RSTRING_LEN(tag), RSTRING_PTR(content), RSTRING_LEN(content), &attributes);
576
+ char *string = element(RSTRING_PTR(tag), RSTRING_LEN(tag), RSTRING_PTR(content), RSTRING_LEN(content), attributes);
533
577
  VALUE rstring = rb_utf8_str_new_cstr(string);
534
578
  free(string);
535
579
 
536
580
  return rstring;
537
581
  }
538
582
 
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);
583
+ VOID_ELEMENT(area)
584
+ VOID_ELEMENT(base)
585
+ VOID_ELEMENT(br)
586
+ VOID_ELEMENT(col)
587
+ VOID_ELEMENT(embed)
588
+ VOID_ELEMENT(hr)
589
+ VOID_ELEMENT(img)
590
+ VOID_ELEMENT(input)
591
+ VOID_ELEMENT(link)
592
+ VOID_ELEMENT(menuitem)
593
+ VOID_ELEMENT(meta)
594
+ VOID_ELEMENT(param)
595
+ VOID_ELEMENT(source)
596
+ VOID_ELEMENT(track)
597
+ VOID_ELEMENT(wbr)
598
+
599
+ STANDARD_ELEMENT(a)
600
+ STANDARD_ELEMENT(abbr)
601
+ STANDARD_ELEMENT(address)
602
+ STANDARD_ELEMENT(article)
603
+ STANDARD_ELEMENT(aside)
604
+ STANDARD_ELEMENT(audio)
605
+ STANDARD_ELEMENT(b)
606
+ STANDARD_ELEMENT(bdi)
607
+ STANDARD_ELEMENT(bdo)
608
+ STANDARD_ELEMENT(blockquote)
609
+ STANDARD_ELEMENT(body)
610
+ STANDARD_ELEMENT(button)
611
+ STANDARD_ELEMENT(canvas)
612
+ STANDARD_ELEMENT(caption)
613
+ STANDARD_ELEMENT(cite)
614
+ STANDARD_ELEMENT(code)
615
+ STANDARD_ELEMENT(colgroup)
616
+ STANDARD_ELEMENT(datalist)
617
+ STANDARD_ELEMENT(dd)
618
+ STANDARD_ELEMENT(del)
619
+ STANDARD_ELEMENT(details)
620
+ STANDARD_ELEMENT(dfn)
621
+ STANDARD_ELEMENT(dialog)
622
+ STANDARD_ELEMENT(div)
623
+ STANDARD_ELEMENT(dl)
624
+ STANDARD_ELEMENT(dt)
625
+ STANDARD_ELEMENT(em)
626
+ STANDARD_ELEMENT(fieldset)
627
+ STANDARD_ELEMENT(figcaption)
628
+ STANDARD_ELEMENT(figure)
629
+ STANDARD_ELEMENT(footer)
630
+ STANDARD_ELEMENT(form)
631
+ STANDARD_ELEMENT(h1)
632
+ STANDARD_ELEMENT(h2)
633
+ STANDARD_ELEMENT(h3)
634
+ STANDARD_ELEMENT(h4)
635
+ STANDARD_ELEMENT(h5)
636
+ STANDARD_ELEMENT(h6)
637
+ STANDARD_ELEMENT(head)
638
+ STANDARD_ELEMENT(header)
639
+ STANDARD_ELEMENT(html)
640
+ STANDARD_ELEMENT(i)
641
+ STANDARD_ELEMENT(iframe)
642
+ STANDARD_ELEMENT(ins)
643
+ STANDARD_ELEMENT(kbd)
644
+ STANDARD_ELEMENT(label)
645
+ STANDARD_ELEMENT(legend)
646
+ STANDARD_ELEMENT(li)
647
+ STANDARD_ELEMENT(main)
648
+ STANDARD_ELEMENT(map)
649
+ STANDARD_ELEMENT(mark)
650
+ STANDARD_ELEMENT(menu)
651
+ STANDARD_ELEMENT(meter)
652
+ STANDARD_ELEMENT(nav)
653
+ STANDARD_ELEMENT(noscript)
654
+ STANDARD_ELEMENT(object)
655
+ STANDARD_ELEMENT(ol)
656
+ STANDARD_ELEMENT(optgroup)
657
+ STANDARD_ELEMENT(option)
658
+ STANDARD_ELEMENT(output)
659
+ STANDARD_ELEMENT(p)
660
+ STANDARD_ELEMENT(picture)
661
+ STANDARD_ELEMENT(pre)
662
+ STANDARD_ELEMENT(progress)
663
+ STANDARD_ELEMENT(q)
664
+ STANDARD_ELEMENT(rp)
665
+ STANDARD_ELEMENT(rt)
666
+ STANDARD_ELEMENT(ruby)
667
+ STANDARD_ELEMENT(s)
668
+ STANDARD_ELEMENT(samp)
669
+ STANDARD_ELEMENT(script)
670
+ STANDARD_ELEMENT(section)
671
+ STANDARD_ELEMENT(select)
672
+ STANDARD_ELEMENT(small)
673
+ STANDARD_ELEMENT(span)
674
+ STANDARD_ELEMENT(strong)
675
+ STANDARD_ELEMENT(style)
676
+ STANDARD_ELEMENT(sub)
677
+ STANDARD_ELEMENT(summary)
678
+ STANDARD_ELEMENT(table)
679
+ STANDARD_ELEMENT(tbody)
680
+ STANDARD_ELEMENT(td)
681
+ STANDARD_ELEMENT(template)
682
+ STANDARD_ELEMENT(textarea)
683
+ STANDARD_ELEMENT(tfoot)
684
+ STANDARD_ELEMENT(th)
685
+ STANDARD_ELEMENT(thead)
686
+ STANDARD_ELEMENT(time)
687
+ STANDARD_ELEMENT(title)
688
+ STANDARD_ELEMENT(tr)
689
+ STANDARD_ELEMENT(u)
690
+ STANDARD_ELEMENT(ul)
691
+ STANDARD_ELEMENT(var)
692
+ STANDARD_ELEMENT(video)
649
693
 
650
694
  void Init_berns() {
651
695
  VALUE Berns = rb_define_module("Berns");
652
696
 
653
697
  rb_define_singleton_method(Berns, "element", external_element, -1);
654
698
  rb_define_singleton_method(Berns, "escape_html", external_escape_html, 1);
699
+ rb_define_singleton_method(Berns, "sanitize", external_sanitize, 1);
655
700
  rb_define_singleton_method(Berns, "to_attribute", external_to_attribute, 2);
656
701
  rb_define_singleton_method(Berns, "to_attributes", external_to_attributes, 1);
657
702
  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
- $CFLAGS = '-O3 -msse4' # rubocop:disable Style/GlobalVars
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
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Berns
3
- VERSION = '3.1.3'
3
+ VERSION = '3.2.1'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: berns
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.3
4
+ version: 3.2.1
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-05-14 00:00:00.000000000 Z
12
+ date: 2021-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: benchmark-ips