nokolexbor 0.3.7 → 0.4.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/ext/nokolexbor/nl_node.c +24 -0
- data/ext/nokolexbor/nl_node_set.c +60 -0
- data/lib/nokolexbor/node_set.rb +79 -0
- data/lib/nokolexbor/version.rb +1 -1
- data/patches/0004-lexbor-fix-template-clone.patch +24 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f60315f588c46f8ae2927633d3e34ee8f3aa3f6fb97575851bc967f306d216a5
|
4
|
+
data.tar.gz: 8e71ffb858e63f59284b94eee695b90808875c9af388175937a4e04cfbff715c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70c50097ea4a844399ee4c74e7d0413a833dbdfd878208a8b7054ad2d01c2d96c35897b62848b199555b675a409f897a30e9cf90d2dd8c3e74c2fdf8b501340f
|
7
|
+
data.tar.gz: 7c772720a861bde11b10c1ff23d4796738a58eaa07d32b43478975a4feaab6402ef5fe8819eb9081619b50b970a422a40b613ce405fa2940b54da4929e352bc8
|
data/ext/nokolexbor/nl_node.c
CHANGED
@@ -802,6 +802,28 @@ nl_node_children(VALUE self)
|
|
802
802
|
return nl_rb_node_set_create_with_data(array, nl_rb_document_get(self));
|
803
803
|
}
|
804
804
|
|
805
|
+
/**
|
806
|
+
* Get the element children of this node.
|
807
|
+
*
|
808
|
+
* @return [NodeSet] The set of this node's element children.
|
809
|
+
*/
|
810
|
+
static VALUE
|
811
|
+
nl_node_element_children(VALUE self)
|
812
|
+
{
|
813
|
+
lxb_dom_node_t *node = nl_rb_node_unwrap(self);
|
814
|
+
lxb_dom_node_t *child = node->first_child;
|
815
|
+
lexbor_array_t *array = lexbor_array_create();
|
816
|
+
|
817
|
+
while (child != NULL) {
|
818
|
+
if (child->type == LXB_DOM_NODE_TYPE_ELEMENT) {
|
819
|
+
lexbor_array_push(array, child);
|
820
|
+
}
|
821
|
+
child = child->next;
|
822
|
+
}
|
823
|
+
|
824
|
+
return nl_rb_node_set_create_with_data(array, nl_rb_document_get(self));
|
825
|
+
}
|
826
|
+
|
805
827
|
/**
|
806
828
|
* Get the first child of this node.
|
807
829
|
*
|
@@ -1164,6 +1186,7 @@ void Init_nl_node(void)
|
|
1164
1186
|
rb_define_method(cNokolexborNode, "next_element", nl_node_next_element, 0);
|
1165
1187
|
rb_define_method(cNokolexborNode, "children", nl_node_children, 0);
|
1166
1188
|
rb_define_method(cNokolexborNode, "child", nl_node_child, 0);
|
1189
|
+
rb_define_method(cNokolexborNode, "element_children", nl_node_element_children, 0);
|
1167
1190
|
rb_define_method(cNokolexborNode, "remove", nl_node_remove, 0);
|
1168
1191
|
rb_define_method(cNokolexborNode, "destroy", nl_node_destroy, 0);
|
1169
1192
|
rb_define_method(cNokolexborNode, "attrs", nl_node_attrs, 0);
|
@@ -1183,6 +1206,7 @@ void Init_nl_node(void)
|
|
1183
1206
|
rb_define_alias(cNokolexborNode, "set_attribute", "[]=");
|
1184
1207
|
rb_define_alias(cNokolexborNode, "has_attribute?", "key?");
|
1185
1208
|
rb_define_alias(cNokolexborNode, "delete", "remove_attr");
|
1209
|
+
rb_define_alias(cNokolexborNode, "elements", "element_children");
|
1186
1210
|
rb_define_alias(cNokolexborNode, "remove_attribute", "remove_attr");
|
1187
1211
|
rb_define_alias(cNokolexborNode, "text", "content");
|
1188
1212
|
rb_define_alias(cNokolexborNode, "inner_text", "content");
|
@@ -300,6 +300,64 @@ nl_node_set_union(VALUE self, VALUE other)
|
|
300
300
|
return nl_rb_node_set_create_with_data(new_array, nl_rb_document_get(self));
|
301
301
|
}
|
302
302
|
|
303
|
+
/**
|
304
|
+
* @return [NodeSet] A new NodeSet with the common nodes only.
|
305
|
+
*/
|
306
|
+
static VALUE
|
307
|
+
nl_node_set_intersection(VALUE self, VALUE other)
|
308
|
+
{
|
309
|
+
if (!rb_obj_is_kind_of(other, cNokolexborNodeSet)) {
|
310
|
+
rb_raise(rb_eArgError, "Parameter must be a Nokolexbor::NodeSet");
|
311
|
+
}
|
312
|
+
|
313
|
+
lexbor_array_t *self_array = nl_rb_node_set_unwrap(self);
|
314
|
+
lexbor_array_t *other_array = nl_rb_node_set_unwrap(other);
|
315
|
+
|
316
|
+
lexbor_array_t *new_array = lexbor_array_create();
|
317
|
+
|
318
|
+
for (size_t i = 0; i < self_array->length; i++) {
|
319
|
+
for (size_t j = 0; j < other_array->length; j++) {
|
320
|
+
if (self_array->list[i] == other_array->list[j]) {
|
321
|
+
lexbor_array_push(new_array, self_array->list[i]);
|
322
|
+
break;
|
323
|
+
}
|
324
|
+
}
|
325
|
+
}
|
326
|
+
|
327
|
+
return nl_rb_node_set_create_with_data(new_array, nl_rb_document_get(self));
|
328
|
+
}
|
329
|
+
|
330
|
+
/**
|
331
|
+
* @return [NodeSet] A new NodeSet with the nodes in this NodeSet that aren't in +other+
|
332
|
+
*/
|
333
|
+
static VALUE
|
334
|
+
nl_node_set_difference(VALUE self, VALUE other)
|
335
|
+
{
|
336
|
+
if (!rb_obj_is_kind_of(other, cNokolexborNodeSet)) {
|
337
|
+
rb_raise(rb_eArgError, "Parameter must be a Nokolexbor::NodeSet");
|
338
|
+
}
|
339
|
+
|
340
|
+
lexbor_array_t *self_array = nl_rb_node_set_unwrap(self);
|
341
|
+
lexbor_array_t *other_array = nl_rb_node_set_unwrap(other);
|
342
|
+
|
343
|
+
lexbor_array_t *new_array = lexbor_array_create();
|
344
|
+
|
345
|
+
for (size_t i = 0; i < self_array->length; i++) {
|
346
|
+
bool found = false;
|
347
|
+
for (size_t j = 0; j < other_array->length; j++) {
|
348
|
+
if (self_array->list[i] == other_array->list[j]) {
|
349
|
+
found = true;
|
350
|
+
break;
|
351
|
+
}
|
352
|
+
}
|
353
|
+
if (!found) {
|
354
|
+
lexbor_array_push(new_array, self_array->list[i]);
|
355
|
+
}
|
356
|
+
}
|
357
|
+
|
358
|
+
return nl_rb_node_set_create_with_data(new_array, nl_rb_document_get(self));
|
359
|
+
}
|
360
|
+
|
303
361
|
static lxb_status_t
|
304
362
|
nl_node_set_find(VALUE self, VALUE selector, lxb_selectors_cb_f cb, void *ctx)
|
305
363
|
{
|
@@ -410,6 +468,8 @@ void Init_nl_node_set(void)
|
|
410
468
|
rb_define_method(cNokolexborNodeSet, "[]", nl_node_set_slice, -1);
|
411
469
|
rb_define_method(cNokolexborNodeSet, "push", nl_node_set_push, 1);
|
412
470
|
rb_define_method(cNokolexborNodeSet, "|", nl_node_set_union, 1);
|
471
|
+
rb_define_method(cNokolexborNodeSet, "&", nl_node_set_intersection, 1);
|
472
|
+
rb_define_method(cNokolexborNodeSet, "-", nl_node_set_difference, 1);
|
413
473
|
rb_define_method(cNokolexborNodeSet, "to_a", nl_node_set_to_array, 0);
|
414
474
|
rb_define_method(cNokolexborNodeSet, "delete", nl_node_set_delete, 1);
|
415
475
|
rb_define_method(cNokolexborNodeSet, "include?", nl_node_set_is_include, 1);
|
data/lib/nokolexbor/node_set.rb
CHANGED
@@ -54,6 +54,16 @@ module Nokolexbor
|
|
54
54
|
length == 0
|
55
55
|
end
|
56
56
|
|
57
|
+
# Insert +node+ before the first Node in this NodeSet
|
58
|
+
def before(node)
|
59
|
+
first.before(node)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Insert +node+ after the last Node in this NodeSet
|
63
|
+
def after(node)
|
64
|
+
last.after(node)
|
65
|
+
end
|
66
|
+
|
57
67
|
# @return [Integer] The index of the first node in this NodeSet that is equal to +node+ or meets the given block. Returns nil if no match is found.
|
58
68
|
def index(node = nil)
|
59
69
|
if node
|
@@ -169,6 +179,75 @@ module Nokolexbor
|
|
169
179
|
self
|
170
180
|
end
|
171
181
|
|
182
|
+
# Add the class attribute +name+ to all containing nodes.
|
183
|
+
#
|
184
|
+
# @see Node#add_class
|
185
|
+
def add_class(name)
|
186
|
+
each do |el|
|
187
|
+
el.add_class(name)
|
188
|
+
end
|
189
|
+
self
|
190
|
+
end
|
191
|
+
|
192
|
+
# Append the class attribute +name+ to all containing nodes.
|
193
|
+
#
|
194
|
+
# @see Node#append_class
|
195
|
+
def append_class(name)
|
196
|
+
each do |el|
|
197
|
+
el.append_class(name)
|
198
|
+
end
|
199
|
+
self
|
200
|
+
end
|
201
|
+
|
202
|
+
# Remove the class attribute +name+ from all containing nodes.
|
203
|
+
#
|
204
|
+
# @see Node#remove_class
|
205
|
+
def remove_class(name = nil)
|
206
|
+
each do |el|
|
207
|
+
el.remove_class(name)
|
208
|
+
end
|
209
|
+
self
|
210
|
+
end
|
211
|
+
|
212
|
+
# Remove the attributed named +name+ from all containing nodes.
|
213
|
+
#
|
214
|
+
# @see Node#remove_attr
|
215
|
+
def remove_attr(name)
|
216
|
+
each { |el| el.delete(name) }
|
217
|
+
self
|
218
|
+
end
|
219
|
+
alias_method :remove_attribute, :remove_attr
|
220
|
+
|
221
|
+
# Set attributes on each Node in the NodeSet, or get an
|
222
|
+
# attribute from the first Node in the NodeSet.
|
223
|
+
#
|
224
|
+
# @example Get an attribute from the first Node in a NodeSet.
|
225
|
+
# node_set.attr("href")
|
226
|
+
#
|
227
|
+
# @example Set attributes on each node.
|
228
|
+
# node_set.attr("href" => "http://example.com", "class" => "a")
|
229
|
+
# node_set.attr("href", "http://example.com")
|
230
|
+
# node_set.attr("href") { |node| "http://example.com" }
|
231
|
+
#
|
232
|
+
# @return [NodeSet] +self+, to support chaining of calls.
|
233
|
+
def attr(key, value = nil, &block)
|
234
|
+
unless key.is_a?(Hash) || (key && (value || block))
|
235
|
+
return first&.attribute(key)
|
236
|
+
end
|
237
|
+
|
238
|
+
hash = key.is_a?(Hash) ? key : { key => value }
|
239
|
+
|
240
|
+
hash.each do |k, v|
|
241
|
+
each do |node|
|
242
|
+
node[k] = v || yield(node)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
self
|
247
|
+
end
|
248
|
+
alias_method :set, :attr
|
249
|
+
alias_method :attribute, :attr
|
250
|
+
|
172
251
|
# (see Node#xpath)
|
173
252
|
def xpath(*args)
|
174
253
|
paths, handler, ns, binds = extract_params(args)
|
data/lib/nokolexbor/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
diff --git a/source/lexbor/dom/interfaces/document.c b/source/lexbor/dom/interfaces/document.c
|
2
|
+
index a2153f4..8a9c69f 100755
|
3
|
+
--- a/source/lexbor/dom/interfaces/document.c
|
4
|
+
+++ b/source/lexbor/dom/interfaces/document.c
|
5
|
+
@@ -12,6 +12,7 @@
|
6
|
+
#include "lexbor/dom/interfaces/cdata_section.h"
|
7
|
+
#include "lexbor/dom/interfaces/cdata_section.h"
|
8
|
+
#include "lexbor/dom/interfaces/processing_instruction.h"
|
9
|
+
+#include "lexbor/html/interfaces/template_element.h"
|
10
|
+
|
11
|
+
|
12
|
+
lxb_dom_document_t *
|
13
|
+
@@ -449,6 +450,11 @@ lxb_dom_document_import_node(lxb_dom_document_t *doc, lxb_dom_node_t *node,
|
14
|
+
return NULL;
|
15
|
+
}
|
16
|
+
|
17
|
+
+ if (curr->local_name == LXB_TAG_TEMPLATE && curr->first_child != NULL && cnode->type == LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) {
|
18
|
+
+ lxb_dom_node_remove(curr->first_child);
|
19
|
+
+ lxb_html_interface_template(curr)->content = cnode;
|
20
|
+
+ }
|
21
|
+
+
|
22
|
+
lxb_dom_node_insert_child(curr, cnode);
|
23
|
+
|
24
|
+
if (node->first_child != NULL) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nokolexbor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yicheng Zhou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- patches/0001-lexbor-support-text-pseudo-element.patch
|
131
131
|
- patches/0002-lexbor-match-id-class-case-sensitive.patch
|
132
132
|
- patches/0003-lexbor-attach-template-content-to-self.patch
|
133
|
+
- patches/0004-lexbor-fix-template-clone.patch
|
133
134
|
- vendor/lexbor/CMakeLists.txt
|
134
135
|
- vendor/lexbor/config.cmake
|
135
136
|
- vendor/lexbor/feature.cmake
|