xrb 0.1 → 0.3.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 +7 -0
- checksums.yaml.gz.sig +1 -0
- data/bake/xrb/entities.rb +60 -0
- data/bake/xrb/parsers.rb +66 -0
- data/ext/Makefile +270 -0
- data/ext/XRB_Extension.bundle +0 -0
- data/ext/escape.o +0 -0
- data/ext/extconf.h +5 -0
- data/ext/extconf.rb +21 -0
- data/ext/markup.o +0 -0
- data/ext/mkmf.log +122 -0
- data/ext/query.o +0 -0
- data/ext/tag.o +0 -0
- data/ext/template.o +0 -0
- data/ext/xrb/escape.c +152 -0
- data/ext/xrb/escape.h +15 -0
- data/ext/xrb/markup.c +1949 -0
- data/ext/xrb/markup.h +6 -0
- data/ext/xrb/markup.rl +226 -0
- data/ext/xrb/query.c +619 -0
- data/ext/xrb/query.h +6 -0
- data/ext/xrb/query.rl +82 -0
- data/ext/xrb/tag.c +204 -0
- data/ext/xrb/tag.h +21 -0
- data/ext/xrb/template.c +1114 -0
- data/ext/xrb/template.h +6 -0
- data/ext/xrb/template.rl +77 -0
- data/ext/xrb/xrb.c +72 -0
- data/ext/xrb/xrb.h +132 -0
- data/ext/xrb.o +0 -0
- data/lib/xrb/buffer.rb +103 -0
- data/lib/xrb/builder.rb +229 -0
- data/lib/xrb/entities.rb +2137 -0
- data/lib/xrb/entities.xrb +15 -0
- data/lib/xrb/error.rb +81 -0
- data/lib/xrb/fallback/markup.rb +1657 -0
- data/lib/xrb/fallback/markup.rl +227 -0
- data/lib/xrb/fallback/query.rb +548 -0
- data/lib/xrb/fallback/query.rl +88 -0
- data/lib/xrb/fallback/template.rb +829 -0
- data/lib/xrb/fallback/template.rl +80 -0
- data/lib/xrb/markup.rb +56 -0
- data/lib/xrb/native.rb +15 -0
- data/lib/xrb/parsers.rb +16 -0
- data/lib/xrb/query.rb +80 -0
- data/lib/xrb/reference.rb +108 -0
- data/lib/xrb/strings.rb +47 -0
- data/lib/xrb/tag.rb +115 -0
- data/lib/xrb/template.rb +128 -0
- data/lib/xrb/uri.rb +100 -0
- data/lib/xrb/version.rb +8 -0
- data/lib/xrb.rb +11 -0
- data/license.md +23 -0
- data/readme.md +34 -0
- data.tar.gz.sig +0 -0
- metadata +118 -58
- metadata.gz.sig +2 -0
- data/README +0 -60
- data/app/helpers/ui_helper.rb +0 -80
- data/app/models/xrb/element.rb +0 -9
- data/lib/xrb/engine.rb +0 -4
- data/rails/init.rb +0 -1
- data/xrb.gemspec +0 -12
data/ext/xrb/escape.c
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
|
2
|
+
#include "escape.h"
|
3
|
+
#include <assert.h>
|
4
|
+
|
5
|
+
inline static int XRB_Markup_is_markup(VALUE value) {
|
6
|
+
if (RB_IMMEDIATE_P(value))
|
7
|
+
return 0;
|
8
|
+
|
9
|
+
// This is a short-cut:
|
10
|
+
if (rb_class_of(value) == rb_XRB_MarkupString) {
|
11
|
+
return 1;
|
12
|
+
}
|
13
|
+
|
14
|
+
return rb_funcall(value, id_is_a, 1, rb_XRB_Markup) == Qtrue;
|
15
|
+
}
|
16
|
+
|
17
|
+
VALUE XRB_MarkupString_raw(VALUE self, VALUE string) {
|
18
|
+
string = rb_str_dup(string);
|
19
|
+
|
20
|
+
rb_obj_reveal(string, rb_XRB_MarkupString);
|
21
|
+
|
22
|
+
return string;
|
23
|
+
}
|
24
|
+
|
25
|
+
// => [["<", 60, "3c"], [">", 62, "3e"], ["\"", 34, "22"], ["&", 38, "26"]]
|
26
|
+
// static const uint32_t MASK = 0x3e3e3e3e;
|
27
|
+
//
|
28
|
+
// static const uint32_t MASK_LT = 0x3c3c3c3c;
|
29
|
+
// static const uint32_t MASK_GT = 0x3e3e3e3e;
|
30
|
+
// static const uint32_t MASK_QUOT = 0x22222222;
|
31
|
+
// static const uint32_t MASK_AMP = 0x26262626;
|
32
|
+
|
33
|
+
static inline const char * XRB_Markup_index_symbol(const char * begin, const char * end) {
|
34
|
+
const char * p = begin;
|
35
|
+
|
36
|
+
while (p < end) {
|
37
|
+
// if ((end - p) >= 4) {
|
38
|
+
// // Do the next 4 characters contain anything we are interested in?
|
39
|
+
// if ((*(const uint32_t *)p) & MASK_LT) {
|
40
|
+
// p += 4;
|
41
|
+
//
|
42
|
+
// continue;
|
43
|
+
// }
|
44
|
+
// }
|
45
|
+
|
46
|
+
switch (*p) {
|
47
|
+
case '<':
|
48
|
+
case '>':
|
49
|
+
case '"':
|
50
|
+
case '&':
|
51
|
+
return p;
|
52
|
+
}
|
53
|
+
|
54
|
+
p += 1;
|
55
|
+
}
|
56
|
+
|
57
|
+
return end;
|
58
|
+
}
|
59
|
+
|
60
|
+
static inline void XRB_Markup_append_entity(const char * p, VALUE buffer) {
|
61
|
+
// What symbol are we looking at?
|
62
|
+
switch (*p) {
|
63
|
+
case '<':
|
64
|
+
rb_str_cat_cstr(buffer, "<");
|
65
|
+
break;
|
66
|
+
case '>':
|
67
|
+
rb_str_cat_cstr(buffer, ">");
|
68
|
+
break;
|
69
|
+
case '"':
|
70
|
+
rb_str_cat_cstr(buffer, """);
|
71
|
+
break;
|
72
|
+
case '&':
|
73
|
+
rb_str_cat_cstr(buffer, "&");
|
74
|
+
break;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
static inline VALUE XRB_Markup_append_buffer(VALUE buffer, const char * s, const char * p, const char * end) {
|
79
|
+
while (1) {
|
80
|
+
// Append the non-symbol part:
|
81
|
+
rb_str_buf_cat(buffer, s, p - s);
|
82
|
+
|
83
|
+
// We escape early if there were no changes to be made:
|
84
|
+
if (p == end) return buffer;
|
85
|
+
|
86
|
+
XRB_Markup_append_entity(p, buffer);
|
87
|
+
|
88
|
+
s = p + 1;
|
89
|
+
p = XRB_Markup_index_symbol(s, end);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
// Escape and append a string to the output buffer.
|
94
|
+
VALUE XRB_Markup_append_string(VALUE buffer, VALUE string) {
|
95
|
+
const char * begin = RSTRING_PTR(string);
|
96
|
+
const char * end = begin + RSTRING_LEN(string);
|
97
|
+
|
98
|
+
const char * s = begin;
|
99
|
+
|
100
|
+
// There are two outcomes, either p is at end, or p points to a symbol:
|
101
|
+
const char * p = XRB_Markup_index_symbol(s, end);
|
102
|
+
|
103
|
+
return XRB_Markup_append_buffer(buffer, s, p, end);
|
104
|
+
}
|
105
|
+
|
106
|
+
VALUE XRB_Markup_append(VALUE self, VALUE buffer, VALUE value) {
|
107
|
+
if (value == Qnil) return Qnil;
|
108
|
+
|
109
|
+
if (XRB_Markup_is_markup(value)) {
|
110
|
+
rb_str_append(buffer, value);
|
111
|
+
} else {
|
112
|
+
if (rb_type(value) != T_STRING) {
|
113
|
+
value = rb_funcall(value, id_to_s, 0);
|
114
|
+
}
|
115
|
+
|
116
|
+
XRB_Markup_append_string(buffer, value);
|
117
|
+
}
|
118
|
+
|
119
|
+
return buffer;
|
120
|
+
}
|
121
|
+
|
122
|
+
// Convert markup special characters to entities. May return the original string if no changes were made.
|
123
|
+
VALUE XRB_Markup_escape_string(VALUE self, VALUE string) {
|
124
|
+
const char * begin = RSTRING_PTR(string);
|
125
|
+
const char * end = begin + RSTRING_LEN(string);
|
126
|
+
|
127
|
+
const char * s = begin;
|
128
|
+
|
129
|
+
// There are two outcomes, either p is at end, or p points to a symbol:
|
130
|
+
const char * p = XRB_Markup_index_symbol(s, end);
|
131
|
+
|
132
|
+
// We escape early if there were no changes to be made:
|
133
|
+
if (p == end) return string;
|
134
|
+
|
135
|
+
return XRB_Markup_append_buffer(XRB_buffer_for(string), s, p, end);
|
136
|
+
}
|
137
|
+
|
138
|
+
void Init_xrb_escape() {
|
139
|
+
rb_XRB_MarkupString = rb_define_class_under(rb_XRB, "MarkupString", rb_cString);
|
140
|
+
rb_gc_register_mark_object(rb_XRB_MarkupString);
|
141
|
+
|
142
|
+
rb_include_module(rb_XRB_MarkupString, rb_XRB_Markup);
|
143
|
+
|
144
|
+
rb_undef_method(rb_class_of(rb_XRB_Markup), "escape_string");
|
145
|
+
rb_define_singleton_method(rb_XRB_Markup, "escape_string", XRB_Markup_escape_string, 1);
|
146
|
+
|
147
|
+
rb_undef_method(rb_class_of(rb_XRB_Markup), "append");
|
148
|
+
rb_define_singleton_method(rb_XRB_Markup, "append", XRB_Markup_append, 2);
|
149
|
+
|
150
|
+
rb_undef_method(rb_class_of(rb_XRB_Markup), "raw");
|
151
|
+
rb_define_singleton_method(rb_XRB_Markup, "raw", XRB_MarkupString_raw, 1);
|
152
|
+
}
|
data/ext/xrb/escape.h
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
#pragma once
|
3
|
+
|
4
|
+
#include "xrb.h"
|
5
|
+
|
6
|
+
void Init_xrb_escape();
|
7
|
+
|
8
|
+
// Given a string, replace it's class with XRB::MarkupString so that it would be output as is.
|
9
|
+
VALUE XRB_MarkupString_raw(VALUE self, VALUE string);
|
10
|
+
|
11
|
+
// Append any value to the output buffer efficiently, escaping entities as needed.
|
12
|
+
VALUE XRB_Markup_append(VALUE self, VALUE buffer, VALUE value);
|
13
|
+
|
14
|
+
// Escape any entities in the given string. If no entities were found, might return the original string.
|
15
|
+
VALUE XRB_Markup_escape_string(VALUE self, VALUE string);
|