nokolexbor 0.2.3 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/nokolexbor/extconf.rb +12 -6
- data/ext/nokolexbor/memory.c +7 -0
- data/ext/nokolexbor/nl_document.c +23 -5
- data/ext/nokolexbor/nl_node.c +95 -64
- data/ext/nokolexbor/nl_node_set.c +57 -22
- data/ext/nokolexbor/nl_xpath_context.c +82 -17
- data/ext/nokolexbor/nokolexbor.h +2 -0
- data/ext/nokolexbor/xml_error.c +225 -27
- data/lib/nokolexbor/node.rb +2 -2
- data/lib/nokolexbor/node_set.rb +5 -1
- data/lib/nokolexbor/version.rb +1 -1
- data/lib/nokolexbor/xpath.rb +69 -0
- data/lib/nokolexbor.rb +1 -0
- data/patches/0003-lexbor-attach-template-content-to-self.patch +13 -0
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4f935c5e81aed7b5d964e7332a9abeaa1f44dec7e2532f01c89dfd17df14ded
|
4
|
+
data.tar.gz: 91c58aca5a9b16a3cfa7e2436dfb86feeb777daa3615b8b3a95b234981cc67d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af6ae7b07bde270ea275a5b21221c7e90923f195a6a62ed7b85174f1d9f31f017661dc50c7d8dd1c3d39096a5c1ecbb3469f4496f2e628a3b7026f82ca3994c5
|
7
|
+
data.tar.gz: eea3a38dcbd81cdb7c54996248d6eaa2d2c51b964d79d3131ba04594dd449a141b32b225bc7a879844c92418f3c04e6b63c77c9c6bef86f8ee619fa6a47b03a3
|
data/ext/nokolexbor/extconf.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
require 'timeout'
|
3
3
|
|
4
|
-
# For debugging
|
5
|
-
# CONFIG["optflags"] = "-O0"
|
6
|
-
# CONFIG["debugflags"] = "-ggdb3"
|
7
|
-
|
8
4
|
cmake_flags = [ ENV["CMAKE_FLAGS"] ]
|
9
5
|
cmake_flags << "-DLEXBOR_BUILD_TESTS_CPP=OFF"
|
10
6
|
cmake_flags << "-DLEXBOR_BUILD_SHARED=OFF"
|
11
7
|
cmake_flags << "-DLEXBOR_BUILD_STATIC=ON"
|
12
|
-
|
13
|
-
|
8
|
+
|
9
|
+
if ENV['NOKOLEXBOR_DEBUG'] || ENV['NOKOLEXBOR_ASAN']
|
10
|
+
CONFIG["optflags"] = "-O0"
|
11
|
+
CONFIG["debugflags"] = "-ggdb3"
|
12
|
+
cmake_flags << "-DLEXBOR_OPTIMIZATION_LEVEL='-O0 -g'"
|
13
|
+
end
|
14
|
+
|
15
|
+
if ENV['NOKOLEXBOR_ASAN']
|
16
|
+
$LDFLAGS << " -fsanitize=address"
|
17
|
+
$CFLAGS << " -fsanitize=address -DNOKOLEXBOR_ASAN"
|
18
|
+
cmake_flags << "-DLEXBOR_BUILD_WITH_ASAN=ON"
|
19
|
+
end
|
14
20
|
|
15
21
|
append_cflags("-DLEXBOR_STATIC")
|
16
22
|
append_cflags("-DLIBXML_STATIC")
|
data/ext/nokolexbor/memory.c
CHANGED
@@ -13,6 +13,11 @@
|
|
13
13
|
#include <ruby.h>
|
14
14
|
#include "lexbor/core/base.h"
|
15
15
|
|
16
|
+
// Disable using ruby memory functions when ASAN is enabled,
|
17
|
+
// otherwise memory leak info will be all about ruby which
|
18
|
+
// is useless.
|
19
|
+
#ifndef NOKOLEXBOR_ASAN
|
20
|
+
|
16
21
|
void *
|
17
22
|
lexbor_malloc(size_t size)
|
18
23
|
{
|
@@ -37,3 +42,5 @@ lexbor_free(void *dst)
|
|
37
42
|
ruby_xfree(dst);
|
38
43
|
return NULL;
|
39
44
|
}
|
45
|
+
|
46
|
+
#endif
|
@@ -5,7 +5,7 @@ extern VALUE cNokolexborNode;
|
|
5
5
|
VALUE cNokolexborDocument;
|
6
6
|
|
7
7
|
static void
|
8
|
-
free_nl_document(
|
8
|
+
free_nl_document(lxb_html_document_t *document)
|
9
9
|
{
|
10
10
|
lxb_html_document_destroy(document);
|
11
11
|
}
|
@@ -22,10 +22,20 @@ const rb_data_type_t nl_document_type = {
|
|
22
22
|
};
|
23
23
|
|
24
24
|
static VALUE
|
25
|
-
nl_document_parse(VALUE self, VALUE
|
25
|
+
nl_document_parse(VALUE self, VALUE rb_string_or_io)
|
26
26
|
{
|
27
|
+
VALUE id_read = rb_intern("read");
|
28
|
+
VALUE rb_html;
|
29
|
+
if (rb_respond_to(rb_string_or_io, id_read))
|
30
|
+
{
|
31
|
+
rb_html = rb_funcall(rb_string_or_io, id_read, 0);
|
32
|
+
}
|
33
|
+
else
|
34
|
+
{
|
35
|
+
rb_html = rb_string_or_io;
|
36
|
+
}
|
27
37
|
const char *html_c = StringValuePtr(rb_html);
|
28
|
-
|
38
|
+
size_t html_len = RSTRING_LEN(rb_html);
|
29
39
|
|
30
40
|
lxb_html_document_t *document;
|
31
41
|
|
@@ -35,13 +45,13 @@ nl_document_parse(VALUE self, VALUE rb_html)
|
|
35
45
|
rb_raise(rb_eRuntimeError, "Error creating document");
|
36
46
|
}
|
37
47
|
|
38
|
-
lxb_status_t status = lxb_html_document_parse(document, html_c, html_len);
|
48
|
+
lxb_status_t status = lxb_html_document_parse(document, (const lxb_char_t *)html_c, html_len);
|
39
49
|
if (status != LXB_STATUS_OK)
|
40
50
|
{
|
41
51
|
nl_raise_lexbor_error(status);
|
42
52
|
}
|
43
53
|
|
44
|
-
return TypedData_Wrap_Struct(cNokolexborDocument, &nl_document_type,
|
54
|
+
return TypedData_Wrap_Struct(cNokolexborDocument, &nl_document_type, document);
|
45
55
|
}
|
46
56
|
|
47
57
|
static VALUE
|
@@ -50,6 +60,14 @@ nl_document_new(VALUE self)
|
|
50
60
|
return nl_document_parse(self, rb_str_new("", 0));
|
51
61
|
}
|
52
62
|
|
63
|
+
lxb_dom_document_t *
|
64
|
+
nl_rb_document_unwrap(VALUE rb_doc)
|
65
|
+
{
|
66
|
+
lxb_dom_document_t *doc;
|
67
|
+
TypedData_Get_Struct(rb_doc, lxb_dom_document_t, &nl_document_type, doc);
|
68
|
+
return doc;
|
69
|
+
}
|
70
|
+
|
53
71
|
void Init_nl_document(void)
|
54
72
|
{
|
55
73
|
cNokolexborDocument = rb_define_class_under(mNokolexbor, "Document", cNokolexborNode);
|
data/ext/nokolexbor/nl_node.c
CHANGED
@@ -43,7 +43,7 @@ nl_rb_node_unwrap(VALUE rb_node)
|
|
43
43
|
lxb_dom_node_t *node;
|
44
44
|
if (rb_obj_class(rb_node) == cNokolexborDocument)
|
45
45
|
{
|
46
|
-
TypedData_Get_Struct(rb_node,
|
46
|
+
TypedData_Get_Struct(rb_node, lxb_dom_node_t, &nl_document_type, node);
|
47
47
|
}
|
48
48
|
else
|
49
49
|
{
|
@@ -56,7 +56,6 @@ static VALUE
|
|
56
56
|
nl_node_new(int argc, VALUE *argv, VALUE klass)
|
57
57
|
{
|
58
58
|
lxb_dom_document_t *document;
|
59
|
-
lxb_dom_node_t *node;
|
60
59
|
VALUE rb_name;
|
61
60
|
VALUE rb_document;
|
62
61
|
VALUE rest;
|
@@ -68,9 +67,9 @@ nl_node_new(int argc, VALUE *argv, VALUE klass)
|
|
68
67
|
rb_raise(rb_eArgError, "Document must be a Nokolexbor::Document");
|
69
68
|
}
|
70
69
|
|
71
|
-
|
70
|
+
document = nl_rb_document_unwrap(rb_document);
|
72
71
|
|
73
|
-
lxb_dom_element_t *element = lxb_dom_document_create_element(document, StringValueCStr(rb_name), RSTRING_LEN(rb_name), NULL);
|
72
|
+
lxb_dom_element_t *element = lxb_dom_document_create_element(document, (const lxb_char_t *)StringValueCStr(rb_name), RSTRING_LEN(rb_name), NULL);
|
74
73
|
if (element == NULL)
|
75
74
|
{
|
76
75
|
rb_raise(rb_eRuntimeError, "Error creating element");
|
@@ -97,7 +96,7 @@ nl_node_content(VALUE self)
|
|
97
96
|
{
|
98
97
|
return rb_str_new("", 0);
|
99
98
|
}
|
100
|
-
VALUE rb_str = rb_utf8_str_new(text, str_len);
|
99
|
+
VALUE rb_str = rb_utf8_str_new((char *)text, str_len);
|
101
100
|
lxb_dom_document_destroy_text(node->owner_document, text);
|
102
101
|
|
103
102
|
return rb_str;
|
@@ -115,19 +114,19 @@ nl_node_get_attr(VALUE self, VALUE rb_attr)
|
|
115
114
|
|
116
115
|
VALUE rb_attr_s = rb_String(rb_attr);
|
117
116
|
const char *attr_c = RSTRING_PTR(rb_attr_s);
|
118
|
-
|
117
|
+
size_t attr_len = RSTRING_LEN(rb_attr_s);
|
119
118
|
|
120
|
-
lxb_dom_element_t *element =
|
119
|
+
lxb_dom_element_t *element = lxb_dom_interface_element(node);
|
121
120
|
|
122
|
-
if (!lxb_dom_element_has_attribute(element, attr_c, attr_len))
|
121
|
+
if (!lxb_dom_element_has_attribute(element, (const lxb_char_t *)attr_c, attr_len))
|
123
122
|
{
|
124
123
|
return Qnil;
|
125
124
|
}
|
126
125
|
|
127
126
|
size_t attr_value_len;
|
128
|
-
|
127
|
+
const lxb_char_t *attr_value = lxb_dom_element_get_attribute(element, (const lxb_char_t *)attr_c, attr_len, &attr_value_len);
|
129
128
|
|
130
|
-
return rb_utf8_str_new(attr_value, attr_value_len);
|
129
|
+
return rb_utf8_str_new((const char *)attr_value, attr_value_len);
|
131
130
|
}
|
132
131
|
|
133
132
|
static VALUE
|
@@ -144,13 +143,13 @@ nl_node_set_attr(VALUE self, VALUE rb_attr, VALUE rb_value)
|
|
144
143
|
VALUE rb_value_s = rb_String(rb_value);
|
145
144
|
|
146
145
|
const char *attr_c = RSTRING_PTR(rb_attr_s);
|
147
|
-
|
146
|
+
size_t attr_len = RSTRING_LEN(rb_attr_s);
|
148
147
|
const char *value_c = RSTRING_PTR(rb_value_s);
|
149
|
-
|
148
|
+
size_t value_len = RSTRING_LEN(rb_value_s);
|
150
149
|
|
151
|
-
lxb_dom_element_t *element =
|
150
|
+
lxb_dom_element_t *element = lxb_dom_interface_element(node);
|
152
151
|
|
153
|
-
lxb_dom_element_set_attribute(element, attr_c, attr_len, value_c, value_len);
|
152
|
+
lxb_dom_element_set_attribute(element, (const lxb_char_t *)attr_c, attr_len, (const lxb_char_t *)value_c, value_len);
|
154
153
|
|
155
154
|
return rb_value;
|
156
155
|
}
|
@@ -168,14 +167,14 @@ nl_node_remove_attr(VALUE self, VALUE rb_attr)
|
|
168
167
|
VALUE rb_attr_s = rb_String(rb_attr);
|
169
168
|
|
170
169
|
const char *attr_c = RSTRING_PTR(rb_attr_s);
|
171
|
-
|
170
|
+
size_t attr_len = RSTRING_LEN(rb_attr_s);
|
172
171
|
|
173
|
-
lxb_dom_element_t *element =
|
172
|
+
lxb_dom_element_t *element = lxb_dom_interface_element(node);
|
174
173
|
|
175
|
-
return lxb_dom_element_remove_attribute(element, attr_c, attr_len) == LXB_STATUS_OK ? Qtrue : Qfalse;
|
174
|
+
return lxb_dom_element_remove_attribute(element, (const lxb_char_t *)attr_c, attr_len) == LXB_STATUS_OK ? Qtrue : Qfalse;
|
176
175
|
}
|
177
176
|
|
178
|
-
|
177
|
+
lxb_status_t
|
179
178
|
nl_node_at_css_callback(lxb_dom_node_t *node, lxb_css_selector_specificity_t *spec, void *ctx)
|
180
179
|
{
|
181
180
|
lexbor_array_t *array = (lexbor_array_t *)ctx;
|
@@ -188,7 +187,7 @@ nl_node_at_css_callback(lxb_dom_node_t *node, lxb_css_selector_specificity_t *sp
|
|
188
187
|
return LXB_STATUS_STOP;
|
189
188
|
}
|
190
189
|
|
191
|
-
|
190
|
+
lxb_status_t
|
192
191
|
nl_node_css_callback(lxb_dom_node_t *node, lxb_css_selector_specificity_t *spec, void *ctx)
|
193
192
|
{
|
194
193
|
lexbor_array_t *array = (lexbor_array_t *)ctx;
|
@@ -200,45 +199,52 @@ nl_node_css_callback(lxb_dom_node_t *node, lxb_css_selector_specificity_t *spec,
|
|
200
199
|
return LXB_STATUS_OK;
|
201
200
|
}
|
202
201
|
|
203
|
-
|
202
|
+
lxb_status_t
|
204
203
|
nl_node_find(VALUE self, VALUE selector, lxb_selectors_cb_f cb, void *ctx)
|
205
204
|
{
|
206
205
|
const char *selector_c = StringValuePtr(selector);
|
207
|
-
|
206
|
+
size_t selector_len = RSTRING_LEN(selector);
|
208
207
|
|
209
208
|
lxb_dom_node_t *node = nl_rb_node_unwrap(self);
|
210
209
|
|
210
|
+
lxb_status_t status;
|
211
|
+
lxb_css_parser_t *parser = NULL;
|
212
|
+
lxb_selectors_t *selectors = NULL;
|
213
|
+
lxb_css_selector_list_t *list = NULL;
|
214
|
+
|
211
215
|
/* Create CSS parser. */
|
212
|
-
|
213
|
-
|
216
|
+
parser = lxb_css_parser_create();
|
217
|
+
status = lxb_css_parser_init(parser, NULL, NULL);
|
214
218
|
if (status != LXB_STATUS_OK)
|
215
219
|
{
|
216
|
-
|
220
|
+
goto cleanup;
|
217
221
|
}
|
218
222
|
|
219
223
|
/* Selectors. */
|
220
|
-
|
224
|
+
selectors = lxb_selectors_create();
|
221
225
|
status = lxb_selectors_init(selectors);
|
222
226
|
if (status != LXB_STATUS_OK)
|
223
227
|
{
|
224
|
-
|
228
|
+
goto cleanup;
|
225
229
|
}
|
226
230
|
|
227
231
|
/* Parse and get the log. */
|
228
232
|
// TODO: Cache the list for reuse, improves performance
|
229
|
-
|
233
|
+
list = lxb_css_selectors_parse_relative_list(parser, (const lxb_char_t *)selector_c, selector_len);
|
230
234
|
if (parser->status != LXB_STATUS_OK)
|
231
235
|
{
|
232
|
-
|
236
|
+
status = parser->status;
|
237
|
+
goto cleanup;
|
233
238
|
}
|
234
239
|
|
235
240
|
/* Find HTML nodes by CSS Selectors. */
|
236
241
|
status = lxb_selectors_find(selectors, node, list, cb, ctx);
|
237
242
|
if (status != LXB_STATUS_OK)
|
238
243
|
{
|
239
|
-
|
244
|
+
goto cleanup;
|
240
245
|
}
|
241
246
|
|
247
|
+
cleanup:
|
242
248
|
/* Destroy Selectors object. */
|
243
249
|
(void)lxb_selectors_destroy(selectors, true);
|
244
250
|
|
@@ -247,20 +253,22 @@ nl_node_find(VALUE self, VALUE selector, lxb_selectors_cb_f cb, void *ctx)
|
|
247
253
|
|
248
254
|
/* Destroy all object for all CSS Selector List. */
|
249
255
|
lxb_css_selector_list_destroy_memory(list);
|
256
|
+
|
257
|
+
return status;
|
250
258
|
}
|
251
259
|
|
252
260
|
static void
|
253
261
|
mark_node_orders(lxb_dom_node_t *root)
|
254
262
|
{
|
255
|
-
|
256
|
-
root->user = count;
|
263
|
+
size_t count = 1;
|
264
|
+
root->user = (void *)count;
|
257
265
|
lxb_dom_node_t *node = root;
|
258
266
|
do
|
259
267
|
{
|
260
268
|
if (node->first_child != NULL)
|
261
269
|
{
|
262
270
|
node = node->first_child;
|
263
|
-
node->user = ++count;
|
271
|
+
node->user = (void *)++count;
|
264
272
|
}
|
265
273
|
else
|
266
274
|
{
|
@@ -275,7 +283,7 @@ mark_node_orders(lxb_dom_node_t *root)
|
|
275
283
|
}
|
276
284
|
|
277
285
|
node = node->next;
|
278
|
-
node->user = ++count;
|
286
|
+
node->user = (void *)++count;
|
279
287
|
}
|
280
288
|
|
281
289
|
} while (true);
|
@@ -290,7 +298,7 @@ void sort_nodes_if_necessary(VALUE selector, lxb_dom_document_t *doc, lexbor_arr
|
|
290
298
|
int need_order = 0;
|
291
299
|
// Check if we have already markded orders, note that
|
292
300
|
// we need to order again if new nodes are added to the document
|
293
|
-
for (
|
301
|
+
for (size_t i = 0; i < array->length; i++)
|
294
302
|
{
|
295
303
|
if (((lxb_dom_node_t *)array->list[i])->user == 0)
|
296
304
|
{
|
@@ -300,37 +308,53 @@ void sort_nodes_if_necessary(VALUE selector, lxb_dom_document_t *doc, lexbor_arr
|
|
300
308
|
}
|
301
309
|
if (need_order)
|
302
310
|
{
|
303
|
-
mark_node_orders(doc);
|
311
|
+
mark_node_orders(&doc->node);
|
304
312
|
}
|
305
|
-
css_result_tim_sort(&array->list[0], array->length);
|
313
|
+
css_result_tim_sort((lxb_dom_node_t **)&array->list[0], array->length);
|
306
314
|
}
|
307
315
|
}
|
308
316
|
|
309
|
-
VALUE
|
317
|
+
static VALUE
|
310
318
|
nl_node_at_css(VALUE self, VALUE selector)
|
311
319
|
{
|
312
320
|
lxb_dom_node_t *node = nl_rb_node_unwrap(self);
|
313
321
|
lexbor_array_t *array = lexbor_array_create();
|
314
322
|
|
315
|
-
nl_node_find(self, selector, nl_node_at_css_callback, array);
|
323
|
+
lxb_status_t status = nl_node_find(self, selector, nl_node_at_css_callback, array);
|
324
|
+
|
325
|
+
if (status != LXB_STATUS_OK)
|
326
|
+
{
|
327
|
+
lexbor_array_destroy(array, true);
|
328
|
+
nl_raise_lexbor_error(status);
|
329
|
+
}
|
316
330
|
|
317
331
|
if (array->length == 0)
|
318
332
|
{
|
333
|
+
lexbor_array_destroy(array, true);
|
319
334
|
return Qnil;
|
320
335
|
}
|
321
336
|
|
322
337
|
sort_nodes_if_necessary(selector, node->owner_document, array);
|
323
338
|
|
324
|
-
|
339
|
+
VALUE ret = nl_rb_node_create(array->list[0], nl_rb_document_get(self));
|
340
|
+
|
341
|
+
lexbor_array_destroy(array, true);
|
342
|
+
|
343
|
+
return ret;
|
325
344
|
}
|
326
345
|
|
327
|
-
VALUE
|
346
|
+
static VALUE
|
328
347
|
nl_node_css(VALUE self, VALUE selector)
|
329
348
|
{
|
330
349
|
lxb_dom_node_t *node = nl_rb_node_unwrap(self);
|
331
350
|
lexbor_array_t *array = lexbor_array_create();
|
332
351
|
|
333
|
-
nl_node_find(self, selector, nl_node_css_callback, array);
|
352
|
+
lxb_status_t status = nl_node_find(self, selector, nl_node_css_callback, array);
|
353
|
+
if (status != LXB_STATUS_OK)
|
354
|
+
{
|
355
|
+
lexbor_array_destroy(array, true);
|
356
|
+
nl_raise_lexbor_error(status);
|
357
|
+
}
|
334
358
|
|
335
359
|
sort_nodes_if_necessary(selector, node->owner_document, array);
|
336
360
|
|
@@ -354,7 +378,7 @@ nl_node_inner_html(VALUE self)
|
|
354
378
|
|
355
379
|
if (str.data != NULL)
|
356
380
|
{
|
357
|
-
VALUE ret = rb_utf8_str_new(str.data, str.length);
|
381
|
+
VALUE ret = rb_utf8_str_new((const char *)str.data, str.length);
|
358
382
|
lexbor_str_destroy(&str, node->owner_document->text, false);
|
359
383
|
return ret;
|
360
384
|
}
|
@@ -379,7 +403,7 @@ nl_node_outer_html(VALUE self)
|
|
379
403
|
|
380
404
|
if (str.data != NULL)
|
381
405
|
{
|
382
|
-
VALUE ret = rb_utf8_str_new(str.data, str.length);
|
406
|
+
VALUE ret = rb_utf8_str_new((const char *)str.data, str.length);
|
383
407
|
lexbor_str_destroy(&str, node->owner_document->text, false);
|
384
408
|
return ret;
|
385
409
|
}
|
@@ -399,11 +423,11 @@ nl_node_has_key(VALUE self, VALUE rb_attr)
|
|
399
423
|
|
400
424
|
VALUE rb_attr_s = rb_String(rb_attr);
|
401
425
|
const char *attr_c = RSTRING_PTR(rb_attr_s);
|
402
|
-
|
426
|
+
size_t attr_len = RSTRING_LEN(rb_attr_s);
|
403
427
|
|
404
|
-
lxb_dom_element_t *element =
|
428
|
+
lxb_dom_element_t *element = lxb_dom_interface_element(node);
|
405
429
|
|
406
|
-
return lxb_dom_element_has_attribute(element, attr_c, attr_len) ? Qtrue : Qfalse;
|
430
|
+
return lxb_dom_element_has_attribute(element, (const lxb_char_t *)attr_c, attr_len) ? Qtrue : Qfalse;
|
407
431
|
}
|
408
432
|
|
409
433
|
static VALUE
|
@@ -417,13 +441,13 @@ nl_node_keys(VALUE self)
|
|
417
441
|
return ary_keys;
|
418
442
|
}
|
419
443
|
|
420
|
-
lxb_dom_attr_t *attr = lxb_dom_element_first_attribute(
|
444
|
+
lxb_dom_attr_t *attr = lxb_dom_element_first_attribute(lxb_dom_interface_element(node));
|
421
445
|
|
422
446
|
while (attr != NULL)
|
423
447
|
{
|
424
448
|
size_t tmp_len;
|
425
|
-
lxb_char_t *tmp = lxb_dom_attr_qualified_name(attr, &tmp_len);
|
426
|
-
rb_ary_push(ary_keys, rb_utf8_str_new(tmp, tmp_len));
|
449
|
+
const lxb_char_t *tmp = lxb_dom_attr_qualified_name(attr, &tmp_len);
|
450
|
+
rb_ary_push(ary_keys, rb_utf8_str_new((const char *)tmp, tmp_len));
|
427
451
|
|
428
452
|
attr = lxb_dom_element_next_attribute(attr);
|
429
453
|
}
|
@@ -442,15 +466,19 @@ nl_node_values(VALUE self)
|
|
442
466
|
return ary_values;
|
443
467
|
}
|
444
468
|
|
445
|
-
lxb_dom_attr_t *attr = lxb_dom_element_first_attribute(
|
469
|
+
lxb_dom_attr_t *attr = lxb_dom_element_first_attribute(lxb_dom_interface_element(node));
|
446
470
|
|
447
471
|
while (attr != NULL)
|
448
472
|
{
|
449
473
|
size_t tmp_len;
|
450
|
-
lxb_char_t *tmp = lxb_dom_attr_value(attr, &tmp_len);
|
474
|
+
const lxb_char_t *tmp = lxb_dom_attr_value(attr, &tmp_len);
|
451
475
|
if (tmp != NULL)
|
452
476
|
{
|
453
|
-
rb_ary_push(ary_values, rb_utf8_str_new(tmp, tmp_len));
|
477
|
+
rb_ary_push(ary_values, rb_utf8_str_new((const char *)tmp, tmp_len));
|
478
|
+
}
|
479
|
+
else
|
480
|
+
{
|
481
|
+
rb_ary_push(ary_values, rb_str_new("", 0));
|
454
482
|
}
|
455
483
|
|
456
484
|
attr = lxb_dom_element_next_attribute(attr);
|
@@ -470,16 +498,16 @@ nl_node_attrs(VALUE self)
|
|
470
498
|
return rb_hash;
|
471
499
|
}
|
472
500
|
|
473
|
-
lxb_dom_attr_t *attr = lxb_dom_element_first_attribute(
|
501
|
+
lxb_dom_attr_t *attr = lxb_dom_element_first_attribute(lxb_dom_interface_element(node));
|
474
502
|
|
475
503
|
while (attr != NULL)
|
476
504
|
{
|
477
505
|
size_t tmp_len;
|
478
|
-
lxb_char_t *tmp = lxb_dom_attr_qualified_name(attr, &tmp_len);
|
479
|
-
VALUE rb_key = rb_utf8_str_new(tmp, tmp_len);
|
506
|
+
const lxb_char_t *tmp = lxb_dom_attr_qualified_name(attr, &tmp_len);
|
507
|
+
VALUE rb_key = rb_utf8_str_new((const char *)tmp, tmp_len);
|
480
508
|
|
481
509
|
tmp = lxb_dom_attr_value(attr, &tmp_len);
|
482
|
-
VALUE rb_value = tmp != NULL ? rb_utf8_str_new(tmp, tmp_len) :
|
510
|
+
VALUE rb_value = tmp != NULL ? rb_utf8_str_new((const char *)tmp, tmp_len) : rb_str_new("", 0);
|
483
511
|
|
484
512
|
rb_hash_aset(rb_hash, rb_key, rb_value);
|
485
513
|
|
@@ -604,15 +632,16 @@ nl_node_name(VALUE self)
|
|
604
632
|
{
|
605
633
|
lxb_dom_node_t *node = nl_rb_node_unwrap(self);
|
606
634
|
size_t len;
|
607
|
-
lxb_char_t *name = lxb_dom_node_name_qualified(node, &len);
|
608
|
-
return rb_utf8_str_new(name, len);
|
635
|
+
const lxb_char_t *name = lxb_dom_node_name_qualified(node, &len);
|
636
|
+
return rb_utf8_str_new((const char *)name, len);
|
609
637
|
}
|
610
638
|
|
611
639
|
static lxb_dom_node_t *
|
612
|
-
nl_node_parse_fragment(
|
640
|
+
nl_node_parse_fragment(lxb_dom_document_t *doc, lxb_char_t *html, size_t size)
|
613
641
|
{
|
614
642
|
size_t tag_name_len;
|
615
|
-
|
643
|
+
lxb_html_document_t *html_doc = lxb_html_interface_document(doc);
|
644
|
+
const lxb_char_t *tag_name = lxb_tag_name_by_id(lxb_html_document_tags(html_doc), LXB_TAG__UNDEF, &tag_name_len);
|
616
645
|
if (tag_name == NULL)
|
617
646
|
{
|
618
647
|
rb_raise(rb_eRuntimeError, "Error getting tag name");
|
@@ -622,7 +651,7 @@ nl_node_parse_fragment(lxb_html_document_t *doc, lxb_char_t *html, size_t size)
|
|
622
651
|
{
|
623
652
|
rb_raise(rb_eRuntimeError, "Error creating element");
|
624
653
|
}
|
625
|
-
lxb_dom_node_t *frag_root = lxb_html_document_parse_fragment(
|
654
|
+
lxb_dom_node_t *frag_root = lxb_html_document_parse_fragment(html_doc, element, html, size);
|
626
655
|
if (frag_root == NULL)
|
627
656
|
{
|
628
657
|
rb_raise(rb_eArgError, "Error parsing HTML");
|
@@ -637,7 +666,7 @@ nl_node_fragment(VALUE self, VALUE html)
|
|
637
666
|
lxb_dom_node_t *node = nl_rb_node_unwrap(self);
|
638
667
|
lxb_dom_document_t *doc = node->owner_document;
|
639
668
|
|
640
|
-
lxb_dom_node_t *frag_root = nl_node_parse_fragment(doc, RSTRING_PTR(html), RSTRING_LEN(html));
|
669
|
+
lxb_dom_node_t *frag_root = nl_node_parse_fragment(doc, (lxb_char_t *)RSTRING_PTR(html), RSTRING_LEN(html));
|
641
670
|
return nl_rb_node_create(frag_root, nl_rb_document_get(self));
|
642
671
|
}
|
643
672
|
|
@@ -663,7 +692,7 @@ nl_node_add_sibling(VALUE self, VALUE next_or_previous, VALUE new)
|
|
663
692
|
|
664
693
|
if (TYPE(new) == T_STRING)
|
665
694
|
{
|
666
|
-
lxb_dom_node_t *frag_root = nl_node_parse_fragment(doc, RSTRING_PTR(new), RSTRING_LEN(new));
|
695
|
+
lxb_dom_node_t *frag_root = nl_node_parse_fragment(doc, (lxb_char_t *)RSTRING_PTR(new), RSTRING_LEN(new));
|
667
696
|
|
668
697
|
while (frag_root->first_child != NULL)
|
669
698
|
{
|
@@ -694,7 +723,7 @@ nl_node_add_child(VALUE self, VALUE new)
|
|
694
723
|
|
695
724
|
if (TYPE(new) == T_STRING)
|
696
725
|
{
|
697
|
-
lxb_dom_node_t *frag_root = nl_node_parse_fragment(doc, RSTRING_PTR(new), RSTRING_LEN(new));
|
726
|
+
lxb_dom_node_t *frag_root = nl_node_parse_fragment(doc, (lxb_char_t *)RSTRING_PTR(new), RSTRING_LEN(new));
|
698
727
|
|
699
728
|
while (frag_root->first_child != NULL)
|
700
729
|
{
|
@@ -832,11 +861,13 @@ void Init_nl_node(void)
|
|
832
861
|
|
833
862
|
rb_define_alias(cNokolexborNode, "attr", "[]");
|
834
863
|
rb_define_alias(cNokolexborNode, "set_attr", "[]=");
|
864
|
+
rb_define_alias(cNokolexborNode, "delete", "remove_attr");
|
835
865
|
rb_define_alias(cNokolexborNode, "text", "content");
|
836
866
|
rb_define_alias(cNokolexborNode, "inner_text", "content");
|
837
867
|
rb_define_alias(cNokolexborNode, "to_str", "content");
|
838
868
|
rb_define_alias(cNokolexborNode, "to_html", "outer_html");
|
839
869
|
rb_define_alias(cNokolexborNode, "to_s", "outer_html");
|
870
|
+
rb_define_alias(cNokolexborNode, "unlink", "remove");
|
840
871
|
rb_define_alias(cNokolexborNode, "type", "node_type");
|
841
872
|
rb_define_alias(cNokolexborNode, "dup", "clone");
|
842
873
|
}
|