ox 2.4.0 → 2.4.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ox might be problematic. Click here for more details.
- data/README.md +25 -0
- data/ext/ox/dump.c +4 -4
- data/ext/ox/ox.c +200 -7
- data/ext/ox/ox.h +22 -20
- data/ext/ox/sax.c +200 -156
- data/ext/ox/sax.h +5 -1
- data/ext/ox/sax_hint.c +144 -121
- data/ext/ox/sax_hint.h +13 -0
- data/lib/ox/element.rb +8 -1
- data/lib/ox/sax.rb +4 -0
- data/lib/ox/version.rb +1 -1
- metadata +2 -2
data/ext/ox/sax.h
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
#ifndef __OX_SAX_H__
|
7
7
|
#define __OX_SAX_H__
|
8
8
|
|
9
|
+
#include <stdbool.h>
|
10
|
+
|
9
11
|
#include "sax_buf.h"
|
10
12
|
#include "sax_has.h"
|
11
13
|
#include "sax_stack.h"
|
@@ -18,6 +20,7 @@ typedef struct _SaxOptions {
|
|
18
20
|
int smart;
|
19
21
|
SkipMode skip;
|
20
22
|
char strip_ns[64];
|
23
|
+
Hints hints;
|
21
24
|
} *SaxOptions;
|
22
25
|
|
23
26
|
typedef struct _SaxDrive {
|
@@ -27,8 +30,9 @@ typedef struct _SaxDrive {
|
|
27
30
|
VALUE value_obj;
|
28
31
|
struct _SaxOptions options;
|
29
32
|
int err;
|
33
|
+
int blocked;
|
34
|
+
bool abort;
|
30
35
|
struct _Has has;
|
31
|
-
Hints hints;
|
32
36
|
#if HAS_ENCODING_SUPPORT
|
33
37
|
rb_encoding *encoding;
|
34
38
|
#elif HAS_PRIVATE_ENCODING
|
data/ext/ox/sax_hint.c
CHANGED
@@ -5,6 +5,9 @@
|
|
5
5
|
|
6
6
|
#include <string.h>
|
7
7
|
#include <stdio.h>
|
8
|
+
#include <stdbool.h>
|
9
|
+
|
10
|
+
#include <ruby.h>
|
8
11
|
|
9
12
|
#include "sax_hint.h"
|
10
13
|
|
@@ -26,127 +29,127 @@ static const char *table_0[] = { "table", 0 };
|
|
26
29
|
static const char *tr_0[] = { "tr", 0 };
|
27
30
|
|
28
31
|
static struct _Hint html_hint_array[] = {
|
29
|
-
{ "a",
|
30
|
-
{ "abbr",
|
31
|
-
{ "acronym",
|
32
|
-
{ "address",
|
33
|
-
{ "applet",
|
34
|
-
{ "area",
|
35
|
-
{ "article",
|
36
|
-
{ "aside",
|
37
|
-
{ "audio",
|
38
|
-
{ "b",
|
39
|
-
{ "base",
|
40
|
-
{ "basefont",
|
41
|
-
{ "bdi",
|
42
|
-
{ "bdo",
|
43
|
-
{ "big",
|
44
|
-
{ "blockquote",
|
45
|
-
{ "body",
|
46
|
-
{ "br",
|
47
|
-
{ "button",
|
48
|
-
{ "canvas",
|
49
|
-
{ "caption",
|
50
|
-
{ "center",
|
51
|
-
{ "cite",
|
52
|
-
{ "code",
|
53
|
-
{ "col",
|
54
|
-
{ "colgroup",
|
55
|
-
{ "command",
|
56
|
-
{ "datalist",
|
57
|
-
{ "dd",
|
58
|
-
{ "del",
|
59
|
-
{ "details",
|
60
|
-
{ "dfn",
|
61
|
-
{ "dialog",
|
62
|
-
{ "dir",
|
63
|
-
{ "div",
|
64
|
-
{ "dl",
|
65
|
-
{ "dt",
|
66
|
-
{ "em",
|
67
|
-
{ "embed",
|
68
|
-
{ "fieldset",
|
69
|
-
{ "figcaption",
|
70
|
-
{ "figure",
|
71
|
-
{ "font",
|
72
|
-
{ "footer",
|
73
|
-
{ "form",
|
74
|
-
{ "frame",
|
75
|
-
{ "frameset",
|
76
|
-
{ "h1",
|
77
|
-
{ "h2",
|
78
|
-
{ "h3",
|
79
|
-
{ "h4",
|
80
|
-
{ "h5",
|
81
|
-
{ "h6",
|
82
|
-
{ "head",
|
83
|
-
{ "header",
|
84
|
-
{ "hgroup",
|
85
|
-
{ "hr",
|
86
|
-
{ "html",
|
87
|
-
{ "i",
|
88
|
-
{ "iframe",
|
89
|
-
{ "img",
|
90
|
-
{ "input",
|
91
|
-
{ "ins",
|
92
|
-
{ "kbd",
|
93
|
-
{ "keygen",
|
94
|
-
{ "label",
|
95
|
-
{ "legend",
|
96
|
-
{ "li",
|
97
|
-
{ "link",
|
98
|
-
{ "map",
|
99
|
-
{ "mark",
|
100
|
-
{ "menu",
|
101
|
-
{ "meta",
|
102
|
-
{ "meter",
|
103
|
-
{ "nav",
|
104
|
-
{ "noframes",
|
105
|
-
{ "noscript",
|
106
|
-
{ "object",
|
107
|
-
{ "ol",
|
108
|
-
{ "optgroup",
|
109
|
-
{ "option",
|
110
|
-
{ "output",
|
111
|
-
{ "p",
|
112
|
-
{ "param",
|
113
|
-
{ "pre",
|
114
|
-
{ "progress",
|
115
|
-
{ "q",
|
116
|
-
{ "rp",
|
117
|
-
{ "rt",
|
118
|
-
{ "ruby",
|
119
|
-
{ "s",
|
120
|
-
{ "samp",
|
121
|
-
{ "script",
|
122
|
-
{ "section",
|
123
|
-
{ "select",
|
124
|
-
{ "small",
|
125
|
-
{ "source",
|
126
|
-
{ "span",
|
127
|
-
{ "strike",
|
128
|
-
{ "strong",
|
129
|
-
{ "style",
|
130
|
-
{ "sub",
|
131
|
-
{ "summary",
|
132
|
-
{ "sup",
|
133
|
-
{ "table",
|
134
|
-
{ "tbody",
|
135
|
-
{ "td",
|
136
|
-
{ "textarea",
|
137
|
-
{ "tfoot",
|
138
|
-
{ "th",
|
139
|
-
{ "thead",
|
140
|
-
{ "time",
|
141
|
-
{ "title",
|
142
|
-
{ "tr",
|
143
|
-
{ "track",
|
144
|
-
{ "tt",
|
145
|
-
{ "u",
|
146
|
-
{ "ul",
|
147
|
-
{ "var",
|
148
|
-
{ "video",
|
149
|
-
{ "wbr",
|
32
|
+
{ "a", false, false, false, ActiveOverlay, NULL },
|
33
|
+
{ "abbr", false, false, false, ActiveOverlay, NULL },
|
34
|
+
{ "acronym", false, false, false, ActiveOverlay, NULL },
|
35
|
+
{ "address", false, false, false, ActiveOverlay, NULL },
|
36
|
+
{ "applet", false, false, false, ActiveOverlay, NULL },
|
37
|
+
{ "area", true, false, false, ActiveOverlay, map_0 },
|
38
|
+
{ "article", false, false, false, ActiveOverlay, NULL },
|
39
|
+
{ "aside", false, false, false, ActiveOverlay, NULL },
|
40
|
+
{ "audio", false, false, false, ActiveOverlay, NULL },
|
41
|
+
{ "b", false, false, false, ActiveOverlay, NULL },
|
42
|
+
{ "base", true, false, false, ActiveOverlay, head_0 },
|
43
|
+
{ "basefont", true, false, false, ActiveOverlay, head_0 },
|
44
|
+
{ "bdi", false, false, false, ActiveOverlay, NULL },
|
45
|
+
{ "bdo", false, true, false, ActiveOverlay, NULL },
|
46
|
+
{ "big", false, false, false, ActiveOverlay, NULL },
|
47
|
+
{ "blockquote", false, false, false, ActiveOverlay, NULL },
|
48
|
+
{ "body", false, false, false, ActiveOverlay, html_0 },
|
49
|
+
{ "br", true, false, false, ActiveOverlay, NULL },
|
50
|
+
{ "button", false, false, false, ActiveOverlay, NULL },
|
51
|
+
{ "canvas", false, false, false, ActiveOverlay, NULL },
|
52
|
+
{ "caption", false, false, false, ActiveOverlay, table_0 },
|
53
|
+
{ "center", false, false, false, ActiveOverlay, NULL },
|
54
|
+
{ "cite", false, false, false, ActiveOverlay, NULL },
|
55
|
+
{ "code", false, false, false, ActiveOverlay, NULL },
|
56
|
+
{ "col", true, false, false, ActiveOverlay, colgroup_0 },
|
57
|
+
{ "colgroup", false, false, false, ActiveOverlay, NULL },
|
58
|
+
{ "command", true, false, false, ActiveOverlay, NULL },
|
59
|
+
{ "datalist", false, false, false, ActiveOverlay, NULL },
|
60
|
+
{ "dd", false, false, false, ActiveOverlay, dl_0 },
|
61
|
+
{ "del", false, false, false, ActiveOverlay, NULL },
|
62
|
+
{ "details", false, false, false, ActiveOverlay, NULL },
|
63
|
+
{ "dfn", false, false, false, ActiveOverlay, NULL },
|
64
|
+
{ "dialog", false, false, false, ActiveOverlay, dt_th_0 },
|
65
|
+
{ "dir", false, false, false, ActiveOverlay, NULL },
|
66
|
+
{ "div", false, true, false, ActiveOverlay, NULL },
|
67
|
+
{ "dl", false, false, false, ActiveOverlay, NULL },
|
68
|
+
{ "dt", false, true, false, ActiveOverlay, dl_0 },
|
69
|
+
{ "em", false, false, false, ActiveOverlay, NULL },
|
70
|
+
{ "embed", true, false, false, ActiveOverlay, NULL },
|
71
|
+
{ "fieldset", false, false, false, ActiveOverlay, NULL },
|
72
|
+
{ "figcaption", false, false, false, ActiveOverlay, figure_0 },
|
73
|
+
{ "figure", false, false, false, ActiveOverlay, NULL },
|
74
|
+
{ "font", false, true, false, ActiveOverlay, NULL },
|
75
|
+
{ "footer", false, false, false, ActiveOverlay, NULL },
|
76
|
+
{ "form", false, false, false, ActiveOverlay, NULL },
|
77
|
+
{ "frame", true, false, false, ActiveOverlay, frameset_0 },
|
78
|
+
{ "frameset", false, false, false, ActiveOverlay, NULL },
|
79
|
+
{ "h1", false, false, false, ActiveOverlay, NULL },
|
80
|
+
{ "h2", false, false, false, ActiveOverlay, NULL },
|
81
|
+
{ "h3", false, false, false, ActiveOverlay, NULL },
|
82
|
+
{ "h4", false, false, false, ActiveOverlay, NULL },
|
83
|
+
{ "h5", false, false, false, ActiveOverlay, NULL },
|
84
|
+
{ "h6", false, false, false, ActiveOverlay, NULL },
|
85
|
+
{ "head", false, false, false, ActiveOverlay, html_0 },
|
86
|
+
{ "header", false, false, false, ActiveOverlay, NULL },
|
87
|
+
{ "hgroup", false, false, false, ActiveOverlay, NULL },
|
88
|
+
{ "hr", true, false, false, ActiveOverlay, NULL },
|
89
|
+
{ "html", false, false, false, ActiveOverlay, NULL },
|
90
|
+
{ "i", false, false, false, ActiveOverlay, NULL },
|
91
|
+
{ "iframe", true, false, false, ActiveOverlay, NULL },
|
92
|
+
{ "img", true, false, false, ActiveOverlay, NULL },
|
93
|
+
{ "input", true, false, false, ActiveOverlay, NULL }, // somewhere under a form_0
|
94
|
+
{ "ins", false, false, false, ActiveOverlay, NULL },
|
95
|
+
{ "kbd", false, false, false, ActiveOverlay, NULL },
|
96
|
+
{ "keygen", true, false, false, ActiveOverlay, NULL },
|
97
|
+
{ "label", false, false, false, ActiveOverlay, NULL }, // somewhere under a form_0
|
98
|
+
{ "legend", false, false, false, ActiveOverlay, fieldset_0 },
|
99
|
+
{ "li", false, false, false, ActiveOverlay, ol_ul_menu_0 },
|
100
|
+
{ "link", true, false, false, ActiveOverlay, head_0 },
|
101
|
+
{ "map", false, false, false, ActiveOverlay, NULL },
|
102
|
+
{ "mark", false, false, false, ActiveOverlay, NULL },
|
103
|
+
{ "menu", false, false, false, ActiveOverlay, NULL },
|
104
|
+
{ "meta", true, false, false, ActiveOverlay, head_0 },
|
105
|
+
{ "meter", false, false, false, ActiveOverlay, NULL },
|
106
|
+
{ "nav", false, false, false, ActiveOverlay, NULL },
|
107
|
+
{ "noframes", false, false, false, ActiveOverlay, NULL },
|
108
|
+
{ "noscript", false, false, false, ActiveOverlay, NULL },
|
109
|
+
{ "object", false, false, false, ActiveOverlay, NULL },
|
110
|
+
{ "ol", false, true, false, ActiveOverlay, NULL },
|
111
|
+
{ "optgroup", false, false, false, ActiveOverlay, NULL },
|
112
|
+
{ "option", false, false, false, ActiveOverlay, optgroup_select_datalist_0 },
|
113
|
+
{ "output", false, false, false, ActiveOverlay, NULL },
|
114
|
+
{ "p", false, false, false, ActiveOverlay, NULL },
|
115
|
+
{ "param", true, false, false, ActiveOverlay, NULL },
|
116
|
+
{ "pre", false, false, false, ActiveOverlay, NULL },
|
117
|
+
{ "progress", false, false, false, ActiveOverlay, NULL },
|
118
|
+
{ "q", false, false, false, ActiveOverlay, NULL },
|
119
|
+
{ "rp", false, false, false, ActiveOverlay, ruby_0 },
|
120
|
+
{ "rt", false, false, false, ActiveOverlay, ruby_0 },
|
121
|
+
{ "ruby", false, false, false, ActiveOverlay, NULL },
|
122
|
+
{ "s", false, false, false, ActiveOverlay, NULL },
|
123
|
+
{ "samp", false, false, false, ActiveOverlay, NULL },
|
124
|
+
{ "script", false, false, true, ActiveOverlay, NULL },
|
125
|
+
{ "section", false, true, false, ActiveOverlay, NULL },
|
126
|
+
{ "select", false, false, false, ActiveOverlay, NULL },
|
127
|
+
{ "small", false, false, false, ActiveOverlay, NULL },
|
128
|
+
{ "source", false, false, false, ActiveOverlay, audio_video_0 },
|
129
|
+
{ "span", false, true, false, ActiveOverlay, NULL },
|
130
|
+
{ "strike", false, false, false, ActiveOverlay, NULL },
|
131
|
+
{ "strong", false, false, false, ActiveOverlay, NULL },
|
132
|
+
{ "style", false, false, false, ActiveOverlay, NULL },
|
133
|
+
{ "sub", false, false, false, ActiveOverlay, NULL },
|
134
|
+
{ "summary", false, false, false, ActiveOverlay, details_0 },
|
135
|
+
{ "sup", false, false, false, ActiveOverlay, NULL },
|
136
|
+
{ "table", false, false, false, ActiveOverlay, NULL },
|
137
|
+
{ "tbody", false, false, false, ActiveOverlay, table_0 },
|
138
|
+
{ "td", false, false, false, ActiveOverlay, tr_0 },
|
139
|
+
{ "textarea", false, false, false, ActiveOverlay, NULL },
|
140
|
+
{ "tfoot", false, false, false, ActiveOverlay, table_0 },
|
141
|
+
{ "th", false, false, false, ActiveOverlay, tr_0 },
|
142
|
+
{ "thead", false, false, false, ActiveOverlay, table_0 },
|
143
|
+
{ "time", false, false, false, ActiveOverlay, NULL },
|
144
|
+
{ "title", false, false, false, ActiveOverlay, head_0 },
|
145
|
+
{ "tr", false, false, false, ActiveOverlay, table_0 },
|
146
|
+
{ "track", true, false, false, ActiveOverlay, audio_video_0 },
|
147
|
+
{ "tt", false, false, false, ActiveOverlay, NULL },
|
148
|
+
{ "u", false, false, false, ActiveOverlay, NULL },
|
149
|
+
{ "ul", false, false, false, ActiveOverlay, NULL },
|
150
|
+
{ "var", false, false, false, ActiveOverlay, NULL },
|
151
|
+
{ "video", false, false, false, ActiveOverlay, NULL },
|
152
|
+
{ "wbr", true, false, false, ActiveOverlay, NULL },
|
150
153
|
};
|
151
154
|
static struct _Hints html_hints = {
|
152
155
|
"HTML",
|
@@ -159,6 +162,26 @@ ox_hints_html() {
|
|
159
162
|
return &html_hints;
|
160
163
|
}
|
161
164
|
|
165
|
+
Hints
|
166
|
+
ox_hints_dup(Hints h) {
|
167
|
+
Hints nh = ALLOC(struct _Hints);
|
168
|
+
|
169
|
+
nh->hints = ALLOC_N(struct _Hint, h->size);
|
170
|
+
memcpy(nh->hints, h->hints, sizeof(struct _Hint) * h->size);
|
171
|
+
nh->size = h->size;
|
172
|
+
nh->name = h->name;
|
173
|
+
|
174
|
+
return nh;
|
175
|
+
}
|
176
|
+
|
177
|
+
void
|
178
|
+
ox_hints_destroy(Hints h) {
|
179
|
+
if (NULL != h && &html_hints != h) {
|
180
|
+
xfree(h->hints);
|
181
|
+
xfree(h);
|
182
|
+
}
|
183
|
+
}
|
184
|
+
|
162
185
|
Hint
|
163
186
|
ox_hint_find(Hints hints, const char *name) {
|
164
187
|
if (0 != hints) {
|
data/ext/ox/sax_hint.h
CHANGED
@@ -6,11 +6,22 @@
|
|
6
6
|
#ifndef __OX_HINT_H__
|
7
7
|
#define __OX_HINT_H__
|
8
8
|
|
9
|
+
#include <stdbool.h>
|
10
|
+
|
11
|
+
typedef enum {
|
12
|
+
ActiveOverlay = 0,
|
13
|
+
InactiveOverlay = 'i',
|
14
|
+
BlockOverlay = 'b',
|
15
|
+
OffOverlay = 'o',
|
16
|
+
AbortOverlay = 'a',
|
17
|
+
} Overlay;
|
18
|
+
|
9
19
|
typedef struct _Hint {
|
10
20
|
const char *name;
|
11
21
|
char empty; // must be closed or close auto it, not error
|
12
22
|
char nest; // nesting allowed
|
13
23
|
char jump; // jump to end <script> ... </script>
|
24
|
+
char overlay;// Overlay
|
14
25
|
const char **parents;
|
15
26
|
} *Hint;
|
16
27
|
|
@@ -22,5 +33,7 @@ typedef struct _Hints {
|
|
22
33
|
|
23
34
|
extern Hints ox_hints_html(void);
|
24
35
|
extern Hint ox_hint_find(Hints hints, const char *name);
|
36
|
+
extern Hints ox_hints_dup(Hints h);
|
37
|
+
extern void ox_hints_destroy(Hints h);
|
25
38
|
|
26
39
|
#endif /* __OX_HINT_H__ */
|
data/lib/ox/element.rb
CHANGED
@@ -132,7 +132,14 @@ module Ox
|
|
132
132
|
return [self] if path.nil?
|
133
133
|
found = []
|
134
134
|
pa = path.split('/')
|
135
|
-
|
135
|
+
if '*' == path[0]
|
136
|
+
# a bit of a hack but it allows self to be checked as well
|
137
|
+
e = Element.new('')
|
138
|
+
e << self
|
139
|
+
e.alocate(pa, found)
|
140
|
+
else
|
141
|
+
alocate(pa, found)
|
142
|
+
end
|
136
143
|
found
|
137
144
|
end
|
138
145
|
|
data/lib/ox/sax.rb
CHANGED
@@ -46,6 +46,7 @@ module Ox
|
|
46
46
|
# def value(value); end
|
47
47
|
# def start_element(name); end
|
48
48
|
# def end_element(name); end
|
49
|
+
# def abort(name); end
|
49
50
|
#
|
50
51
|
# Initializing _line_ attribute in the initializer will cause that variable to
|
51
52
|
# be updated before each callback with the XML line number. The same is true
|
@@ -103,6 +104,9 @@ module Ox
|
|
103
104
|
|
104
105
|
def error(message, line, column)
|
105
106
|
end
|
107
|
+
|
108
|
+
def abort(name)
|
109
|
+
end
|
106
110
|
|
107
111
|
end # Sax
|
108
112
|
end # Ox
|
data/lib/ox/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-04-
|
12
|
+
date: 2016-04-30 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! "A fast XML parser and object serializer that uses only standard C
|
15
15
|
lib.\n \nOptimized XML (Ox), as the name implies was written to provide
|