ox 2.13.4 → 2.14.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -1
- data/README.md +2 -7
- data/ext/ox/dump.c +1 -1
- data/ext/ox/gen_load.c +2 -2
- data/ext/ox/hash_load.c +37 -2
- data/ext/ox/obj_load.c +21 -18
- data/ext/ox/ox.c +26 -2
- data/ext/ox/ox.h +1 -0
- data/lib/ox/element.rb +20 -11
- data/lib/ox/hasattrs.rb +9 -2
- data/lib/ox/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bef5b070b17c09cb705e4a6f9b89f7de94c32d426057261cc2c763f10217fa8
|
4
|
+
data.tar.gz: e79898f9f7100fe30c99bbb111d52098316e19422afe47f91721f1de36aa5c0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1079d0bd17806632a2eea08ec38e78baba5262af6b5ec58c434bf1bc2520fad6850680a6cb53a1e1dac67b175de3487f639d75e19b76cbeb9960bdd1db5e4b9
|
7
|
+
data.tar.gz: 941904c648314466f078c72a8004cb0f5da2e39ca5883485f1af8b4daf698d6bf528f38e4c84bc056ad01e7fa6c5333ff26a8665acf3af932c51ede5ef40c0f6
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,36 @@
|
|
2
2
|
|
3
3
|
All changes to the Ox gem are documented here. Releases follow semantic versioning.
|
4
4
|
|
5
|
-
## [
|
5
|
+
## [2.14.4] - 2021-03-19
|
6
|
+
|
7
|
+
### Fixed
|
8
|
+
|
9
|
+
- Really fixed code issue around HAVE_RB_ENC_ASSOCIATE.
|
10
|
+
|
11
|
+
## [2.14.3] - 2021-03-12
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
|
15
|
+
- Code issue around HAVE_RB_ENC_ASSOCIATE fixed.
|
16
|
+
|
17
|
+
## [2.14.2] - 2021-03-07
|
18
|
+
|
19
|
+
### Fixed
|
20
|
+
|
21
|
+
- Attribute keys for setting attributes no longer create seemily
|
22
|
+
duplicates if symbol and string keys are mixed.
|
23
|
+
|
24
|
+
## [2.14.1] - 2021-01-11
|
25
|
+
|
26
|
+
### Fixed
|
27
|
+
|
28
|
+
- In Ruby 3.0 Range objects are frozen. This version allows Ranges to be created on load.
|
29
|
+
|
30
|
+
## [2.14.0] - 2020-12-15
|
31
|
+
|
32
|
+
### Added
|
33
|
+
|
34
|
+
- The `:with_cdata` option added for the hash_load() function.
|
6
35
|
|
7
36
|
## [2.13.4] - 2020-09-11
|
8
37
|
|
data/README.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# Ox gem
|
2
2
|
A fast XML parser and Object marshaller as a Ruby gem.
|
3
3
|
|
4
|
-
[![Build
|
5
|
-
[![Financial Contributors on Open Collective](https://opencollective.com/ohler/all/badge.svg?label=financial+contributors)](https://opencollective.com/ohler)
|
4
|
+
[![Build status](https://ci.appveyor.com/api/projects/status/pg2w4wspbrflbi8c?svg=true)](https://ci.appveyor.com/project/ohler55/ox)
|
6
5
|
|
7
6
|
## Installation
|
8
7
|
gem install ox
|
@@ -17,10 +16,6 @@ A fast XML parser and Object marshaller as a Ruby gem.
|
|
17
16
|
|
18
17
|
*RubyGems* *repo*: https://rubygems.org/gems/ox
|
19
18
|
|
20
|
-
## Follow @oxgem on Twitter
|
21
|
-
|
22
|
-
[Follow @peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the Ox gem.
|
23
|
-
|
24
19
|
## Support
|
25
20
|
|
26
21
|
[Get supported Ox with a Tidelift Subscription.](https://tidelift.com/subscription/pkg/rubygems-ox?utm_source=rubygems-ox&utm_medium=referral&utm_campaign=readme) Security updates are [supported](https://tidelift.com/security).
|
@@ -79,7 +74,7 @@ callbacks. Unlike Nokogiri and LibXML, Ox can be tuned to use only the SAX
|
|
79
74
|
callbacks that are of interest to the caller. (See the perf_sax.rb file for an
|
80
75
|
example.)
|
81
76
|
|
82
|
-
Ox is compatible with Ruby
|
77
|
+
Ox is compatible with Ruby 2.3, 2.4, 2.5, 2.6, 2.7, 3.0.
|
83
78
|
|
84
79
|
### Object Dump Sample:
|
85
80
|
|
data/ext/ox/dump.c
CHANGED
@@ -838,7 +838,7 @@ dump_obj(ID aid, VALUE obj, int depth, Out out) {
|
|
838
838
|
out->w_start(out, &e);
|
839
839
|
|
840
840
|
for (i = 0; i < cnt; i++) {
|
841
|
-
VALUE v = RSTRUCT_GET(obj, i);
|
841
|
+
VALUE v = RSTRUCT_GET(obj, (int)(i));
|
842
842
|
dump_obj(rb_intern(ulong2str(i, num_buf + sizeof(num_buf) - 1)), v, d2, out);
|
843
843
|
}
|
844
844
|
out->w_end(out, &e);
|
data/ext/ox/gen_load.c
CHANGED
@@ -116,18 +116,18 @@ create_prolog_doc(PInfo pi, const char *target, Attr attrs) {
|
|
116
116
|
#endif
|
117
117
|
rb_hash_aset(ah, sym, rb_str_new2(attrs->value));
|
118
118
|
} else {
|
119
|
+
#if HAVE_RB_ENC_ASSOCIATE
|
119
120
|
volatile VALUE rstr = rb_str_new2(attrs->name);
|
120
121
|
|
121
|
-
#if HAVE_RB_ENC_ASSOCIATE
|
122
122
|
if (0 != pi->options->rb_enc) {
|
123
123
|
rb_enc_associate(rstr, pi->options->rb_enc);
|
124
124
|
}
|
125
125
|
rb_hash_aset(ah, rstr, rb_str_new2(attrs->value));
|
126
|
+
#endif
|
126
127
|
}
|
127
128
|
if (0 == strcmp("encoding", attrs->name)) {
|
128
129
|
pi->options->rb_enc = rb_enc_find(attrs->value);
|
129
130
|
}
|
130
|
-
#endif
|
131
131
|
}
|
132
132
|
nodes = rb_ary_new();
|
133
133
|
rb_ivar_set(doc, ox_attributes_id, ah);
|
data/ext/ox/hash_load.c
CHANGED
@@ -74,9 +74,8 @@ unmark(PInfo pi, VALUE val) {
|
|
74
74
|
}
|
75
75
|
|
76
76
|
static void
|
77
|
-
|
77
|
+
add_str(PInfo pi, VALUE s) {
|
78
78
|
Helper parent = helper_stack_peek(&pi->helpers);
|
79
|
-
volatile VALUE s = rb_str_new2(text);
|
80
79
|
volatile VALUE a;
|
81
80
|
|
82
81
|
#if HAVE_RB_ENC_ASSOCIATE
|
@@ -102,6 +101,16 @@ add_text(PInfo pi, char *text, int closed) {
|
|
102
101
|
}
|
103
102
|
}
|
104
103
|
|
104
|
+
static void
|
105
|
+
add_text(PInfo pi, char *text, int closed) {
|
106
|
+
add_str(pi, rb_str_new2(text));
|
107
|
+
}
|
108
|
+
|
109
|
+
static void
|
110
|
+
add_cdata(PInfo pi, const char *text, size_t len) {
|
111
|
+
add_str(pi, rb_str_new(text, len));
|
112
|
+
}
|
113
|
+
|
105
114
|
static void
|
106
115
|
add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
107
116
|
if (helper_stack_empty(&pi->helpers)) {
|
@@ -250,6 +259,19 @@ struct _parseCallbacks _ox_hash_callbacks = {
|
|
250
259
|
|
251
260
|
ParseCallbacks ox_hash_callbacks = &_ox_hash_callbacks;
|
252
261
|
|
262
|
+
struct _parseCallbacks _ox_hash_cdata_callbacks = {
|
263
|
+
NULL,
|
264
|
+
NULL,
|
265
|
+
NULL,
|
266
|
+
add_cdata,
|
267
|
+
add_text,
|
268
|
+
add_element,
|
269
|
+
end_element,
|
270
|
+
finish,
|
271
|
+
};
|
272
|
+
|
273
|
+
ParseCallbacks ox_hash_cdata_callbacks = &_ox_hash_cdata_callbacks;
|
274
|
+
|
253
275
|
struct _parseCallbacks _ox_hash_no_attrs_callbacks = {
|
254
276
|
NULL,
|
255
277
|
NULL,
|
@@ -262,3 +284,16 @@ struct _parseCallbacks _ox_hash_no_attrs_callbacks = {
|
|
262
284
|
};
|
263
285
|
|
264
286
|
ParseCallbacks ox_hash_no_attrs_callbacks = &_ox_hash_no_attrs_callbacks;
|
287
|
+
|
288
|
+
struct _parseCallbacks _ox_hash_no_attrs_cdata_callbacks = {
|
289
|
+
NULL,
|
290
|
+
NULL,
|
291
|
+
NULL,
|
292
|
+
add_cdata,
|
293
|
+
add_text,
|
294
|
+
add_element_no_attrs,
|
295
|
+
end_element_no_attrs,
|
296
|
+
NULL,
|
297
|
+
};
|
298
|
+
|
299
|
+
ParseCallbacks ox_hash_no_attrs_cdata_callbacks = &_ox_hash_no_attrs_cdata_callbacks;
|
data/ext/ox/obj_load.c
CHANGED
@@ -42,10 +42,10 @@ static void fill_indent(PInfo pi, char *buf, size_t size);
|
|
42
42
|
|
43
43
|
|
44
44
|
struct _parseCallbacks _ox_obj_callbacks = {
|
45
|
-
instruct,
|
46
|
-
0,
|
47
|
-
0,
|
48
|
-
0,
|
45
|
+
instruct, // instruct,
|
46
|
+
0, // add_doctype,
|
47
|
+
0, // add_comment,
|
48
|
+
0, // add_cdata,
|
49
49
|
add_text,
|
50
50
|
add_element,
|
51
51
|
end_element,
|
@@ -128,7 +128,7 @@ resolve_classname(VALUE mod, const char *class_name, Effort effort, VALUE base_c
|
|
128
128
|
break;
|
129
129
|
case StrictEffort:
|
130
130
|
default:
|
131
|
-
|
131
|
+
// raise an error if name is not defined
|
132
132
|
clas = rb_const_get_at(mod, ci);
|
133
133
|
break;
|
134
134
|
}
|
@@ -183,7 +183,7 @@ parse_ulong(const char *s, PInfo pi) {
|
|
183
183
|
return ULONG2NUM(n);
|
184
184
|
}
|
185
185
|
|
186
|
-
|
186
|
+
// 2010-07-09T10:47:45.895826162+09:00
|
187
187
|
inline static VALUE
|
188
188
|
parse_time(const char *text, VALUE clas) {
|
189
189
|
VALUE t;
|
@@ -559,7 +559,7 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
|
559
559
|
printf("%s%s\n", indent, buf);
|
560
560
|
}
|
561
561
|
}
|
562
|
-
if (helper_stack_empty(&pi->helpers)) {
|
562
|
+
if (helper_stack_empty(&pi->helpers)) { // top level object
|
563
563
|
if (0 != (id = get_id_from_attrs(pi, attrs))) {
|
564
564
|
pi->circ_array = circ_array_new();
|
565
565
|
}
|
@@ -580,7 +580,7 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
|
580
580
|
h->obj = Qfalse;
|
581
581
|
break;
|
582
582
|
case StringCode:
|
583
|
-
|
583
|
+
// h->obj will be replaced by add_text if it is called
|
584
584
|
h->obj = ox_empty_string;
|
585
585
|
if (0 != pi->circ_array) {
|
586
586
|
pi->id = get_id_from_attrs(pi, attrs);
|
@@ -597,8 +597,8 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
|
597
597
|
case ComplexCode:
|
598
598
|
case DateCode:
|
599
599
|
case TimeCode:
|
600
|
-
case RationalCode:
|
601
|
-
|
600
|
+
case RationalCode: // sub elements read next
|
601
|
+
// value will be read in the following add_text
|
602
602
|
h->obj = Qundef;
|
603
603
|
break;
|
604
604
|
case String64Code:
|
@@ -620,7 +620,7 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
|
620
620
|
}
|
621
621
|
break;
|
622
622
|
case RangeCode:
|
623
|
-
h->obj =
|
623
|
+
h->obj = rb_ary_new_from_args(3, Qnil, Qnil, Qfalse);
|
624
624
|
break;
|
625
625
|
case RawCode:
|
626
626
|
if (hasChildren) {
|
@@ -700,12 +700,15 @@ end_element(PInfo pi, const char *ename) {
|
|
700
700
|
Helper ph = helper_stack_peek(&pi->helpers);
|
701
701
|
|
702
702
|
if (ox_empty_string == h->obj) {
|
703
|
-
|
703
|
+
// special catch for empty strings
|
704
704
|
h->obj = rb_str_new2("");
|
705
|
-
}
|
706
|
-
if (Qundef == h->obj) {
|
705
|
+
} else if (Qundef == h->obj) {
|
707
706
|
set_error(&pi->err, "Invalid element for object mode", pi->str, pi->s);
|
708
707
|
return;
|
708
|
+
} else if (RangeCode == h->type) { // Expect an array of 3 elements.
|
709
|
+
const VALUE *ap = RARRAY_PTR(h->obj);
|
710
|
+
|
711
|
+
h->obj = rb_range_new(*ap, *(ap + 1), Qtrue == *(ap + 2));
|
709
712
|
}
|
710
713
|
pi->obj = h->obj;
|
711
714
|
if (0 != ph) {
|
@@ -740,11 +743,11 @@ end_element(PInfo pi, const char *ename) {
|
|
740
743
|
break;
|
741
744
|
case RangeCode:
|
742
745
|
if (ox_beg_id == h->var) {
|
743
|
-
|
746
|
+
rb_ary_store(ph->obj, 0, h->obj);
|
744
747
|
} else if (ox_end_id == h->var) {
|
745
|
-
|
748
|
+
rb_ary_store(ph->obj, 1, h->obj);
|
746
749
|
} else if (ox_excl_id == h->var) {
|
747
|
-
|
750
|
+
rb_ary_store(ph->obj, 2, h->obj);
|
748
751
|
} else {
|
749
752
|
set_error(&pi->err, "Invalid range attribute", pi->str, pi->s);
|
750
753
|
return;
|
@@ -903,7 +906,7 @@ parse_xsd_time(const char *text, VALUE clas) {
|
|
903
906
|
#endif
|
904
907
|
}
|
905
908
|
|
906
|
-
|
909
|
+
// debug functions
|
907
910
|
static void
|
908
911
|
fill_indent(PInfo pi, char *buf, size_t size) {
|
909
912
|
size_t cnt;
|
data/ext/ox/ox.c
CHANGED
@@ -145,6 +145,7 @@ static VALUE symbolize_keys_sym;
|
|
145
145
|
static VALUE symbolize_sym;
|
146
146
|
static VALUE tolerant_sym;
|
147
147
|
static VALUE trace_sym;
|
148
|
+
static VALUE with_cdata_sym;
|
148
149
|
static VALUE with_dtd_sym;
|
149
150
|
static VALUE with_instruct_sym;
|
150
151
|
static VALUE with_xml_sym;
|
@@ -179,6 +180,7 @@ struct _options ox_default_options = {
|
|
179
180
|
true, // convert_special
|
180
181
|
No, // allow_invalid
|
181
182
|
false, // no_empty
|
183
|
+
false, // with_cdata
|
182
184
|
{ '\0' }, // inv_repl
|
183
185
|
{ '\0' }, // strip_ns
|
184
186
|
NULL, // html_hints
|
@@ -192,7 +194,9 @@ extern ParseCallbacks ox_gen_callbacks;
|
|
192
194
|
extern ParseCallbacks ox_limited_callbacks;
|
193
195
|
extern ParseCallbacks ox_nomode_callbacks;
|
194
196
|
extern ParseCallbacks ox_hash_callbacks;
|
197
|
+
extern ParseCallbacks ox_hash_cdata_callbacks;
|
195
198
|
extern ParseCallbacks ox_hash_no_attrs_callbacks;
|
199
|
+
extern ParseCallbacks ox_hash_no_attrs_cdata_callbacks;
|
196
200
|
|
197
201
|
static void parse_dump_options(VALUE ropts, Options copts);
|
198
202
|
|
@@ -290,6 +294,7 @@ hints_to_overlay(Hints hints) {
|
|
290
294
|
* - _:convert_special_ [true|false|nil] flag indicating special characters like < are converted with the SAX parser
|
291
295
|
* - _:invalid_replace_ [nil|String] replacement string for invalid XML characters on dump. nil indicates include anyway as hex. A string, limited to 10 characters will replace the invalid character with the replace.
|
292
296
|
* - _:no_empty_ [true|false|nil] flag indicating there should be no empty elements in a dump
|
297
|
+
* - _:with_cdata_ [true|false] includes cdata in hash_load results
|
293
298
|
* - _:strip_namespace_ [String|true|false] false or "" results in no namespace stripping. A string of "*" or true will strip all namespaces. Any other non-empty string indicates that matching namespaces will be stripped.
|
294
299
|
* - _:overlay_ [Hash] a Hash of keys that match html element names and values that are one of
|
295
300
|
* - _:active_ - make the normal callback for the element
|
@@ -324,6 +329,7 @@ get_def_opts(VALUE self) {
|
|
324
329
|
rb_hash_aset(opts, smart_sym, (Yes == ox_default_options.smart) ? Qtrue : ((No == ox_default_options.smart) ? Qfalse : Qnil));
|
325
330
|
rb_hash_aset(opts, convert_special_sym, (ox_default_options.convert_special) ? Qtrue : Qfalse);
|
326
331
|
rb_hash_aset(opts, no_empty_sym, (ox_default_options.no_empty) ? Qtrue : Qfalse);
|
332
|
+
rb_hash_aset(opts, with_cdata_sym, (ox_default_options.with_cdata) ? Qtrue : Qfalse);
|
327
333
|
switch (ox_default_options.mode) {
|
328
334
|
case ObjMode: rb_hash_aset(opts, mode_sym, object_sym); break;
|
329
335
|
case GenMode: rb_hash_aset(opts, mode_sym, generic_sym); break;
|
@@ -431,6 +437,7 @@ sax_html_overlay(VALUE self) {
|
|
431
437
|
* - _:smart_ [true|false|nil] flag indicating the SAX parser uses hints if available (use with html)
|
432
438
|
* - _:invalid_replace_ [nil|String] replacement string for invalid XML characters on dump. nil indicates include anyway as hex. A string, limited to 10 characters will replace the invalid character with the replace.
|
433
439
|
* - _:strip_namespace_ [nil|String|true|false] "" or false result in no namespace stripping. A string of "*" or true will strip all namespaces. Any other non-empty string indicates that matching namespaces will be stripped.
|
440
|
+
* - _:with_cdata_ [true|false] includes cdata in hash_load results
|
434
441
|
* - _:overlay_ [Hash] a Hash of keys that match html element names and values that are one of
|
435
442
|
* - _:active_ - make the normal callback for the element
|
436
443
|
* - _:nest_ok_ - active but ignore nest check
|
@@ -630,6 +637,10 @@ set_def_opts(VALUE self, VALUE opts) {
|
|
630
637
|
rb_hash_foreach(v, set_overlay, (VALUE)ox_default_options.html_hints);
|
631
638
|
}
|
632
639
|
}
|
640
|
+
if (Qnil != (v = rb_hash_lookup(opts, with_cdata_sym))) {
|
641
|
+
ox_default_options.with_cdata = (Qtrue == v);
|
642
|
+
}
|
643
|
+
|
633
644
|
ox_default_options.element_key_mod = rb_hash_lookup2(opts, element_key_mod_sym, ox_default_options.element_key_mod);
|
634
645
|
ox_default_options.attr_key_mod = rb_hash_lookup2(opts, attr_key_mod_sym, ox_default_options.attr_key_mod);
|
635
646
|
|
@@ -838,6 +849,9 @@ load(char *xml, size_t len, int argc, VALUE *argv, VALUE self, VALUE encoding, E
|
|
838
849
|
options.margin[sizeof(options.margin) - 1] = '\0';
|
839
850
|
options.margin_len = strlen(options.margin);
|
840
851
|
}
|
852
|
+
if (Qnil != (v = rb_hash_lookup(h, with_cdata_sym))) {
|
853
|
+
options.with_cdata = (Qtrue == v);
|
854
|
+
}
|
841
855
|
}
|
842
856
|
#if HAVE_RB_ENC_FIND
|
843
857
|
if ('\0' == *options.encoding) {
|
@@ -869,10 +883,18 @@ load(char *xml, size_t len, int argc, VALUE *argv, VALUE self, VALUE encoding, E
|
|
869
883
|
obj = ox_parse(xml, len, ox_limited_callbacks, 0, &options, err);
|
870
884
|
break;
|
871
885
|
case HashMode:
|
872
|
-
|
886
|
+
if (options.with_cdata) {
|
887
|
+
obj = ox_parse(xml, len, ox_hash_cdata_callbacks, 0, &options, err);
|
888
|
+
} else {
|
889
|
+
obj = ox_parse(xml, len, ox_hash_callbacks, 0, &options, err);
|
890
|
+
}
|
873
891
|
break;
|
874
892
|
case HashNoAttrMode:
|
875
|
-
|
893
|
+
if (options.with_cdata) {
|
894
|
+
obj = ox_parse(xml, len, ox_hash_no_attrs_cdata_callbacks, 0, &options, err);
|
895
|
+
} else {
|
896
|
+
obj = ox_parse(xml, len, ox_hash_no_attrs_callbacks, 0, &options, err);
|
897
|
+
}
|
876
898
|
break;
|
877
899
|
case NoMode:
|
878
900
|
obj = ox_parse(xml, len, ox_nomode_callbacks, 0, &options, err);
|
@@ -908,6 +930,7 @@ load(char *xml, size_t len, int argc, VALUE *argv, VALUE self, VALUE encoding, E
|
|
908
930
|
* - *:symbolize_keys* [true|false|nil] symbolize element attribute keys or leave as Strings
|
909
931
|
* - *:invalid_replace* [nil|String] replacement string for invalid XML characters on dump. nil indicates include anyway as hex. A string, limited to 10 characters will replace the invalid character with the replace.
|
910
932
|
* - *:strip_namespace* [String|true|false] "" or false result in no namespace stripping. A string of "*" or true will strip all namespaces. Any other non-empty string indicates that matching namespaces will be stripped.
|
933
|
+
* - *:with_cdata* [true|false] if true cdata is included in hash_load output otherwise it is not.
|
911
934
|
*/
|
912
935
|
static VALUE
|
913
936
|
load_str(int argc, VALUE *argv, VALUE self) {
|
@@ -1516,6 +1539,7 @@ void Init_ox() {
|
|
1516
1539
|
symbolize_sym = ID2SYM(rb_intern("symbolize")); rb_gc_register_address(&symbolize_sym);
|
1517
1540
|
tolerant_sym = ID2SYM(rb_intern("tolerant")); rb_gc_register_address(&tolerant_sym);
|
1518
1541
|
trace_sym = ID2SYM(rb_intern("trace")); rb_gc_register_address(&trace_sym);
|
1542
|
+
with_cdata_sym = ID2SYM(rb_intern("with_cdata")); rb_gc_register_address(&with_cdata_sym);
|
1519
1543
|
with_dtd_sym = ID2SYM(rb_intern("with_dtd")); rb_gc_register_address(&with_dtd_sym);
|
1520
1544
|
with_instruct_sym = ID2SYM(rb_intern("with_instructions")); rb_gc_register_address(&with_instruct_sym);
|
1521
1545
|
with_xml_sym = ID2SYM(rb_intern("with_xml")); rb_gc_register_address(&with_xml_sym);
|
data/ext/ox/ox.h
CHANGED
@@ -136,6 +136,7 @@ typedef struct _options {
|
|
136
136
|
char convert_special;// boolean true or false
|
137
137
|
char allow_invalid; // YesNo
|
138
138
|
char no_empty; // boolean - no empty elements when dumping
|
139
|
+
char with_cdata; // boolean - hash_load should include cdata
|
139
140
|
char inv_repl[12]; // max 10 valid characters, first character is the length
|
140
141
|
char strip_ns[64]; // namespace to strip, \0 is no-strip, \* is all, else only matches
|
141
142
|
struct _hints *html_hints; // html hints
|
data/lib/ox/element.rb
CHANGED
@@ -115,17 +115,8 @@ module Ox
|
|
115
115
|
# matching name will be yielded to. If the cond is a Hash then the
|
116
116
|
# keys-value pairs in the cond must match the child attribute values with
|
117
117
|
# the same keys. Any other cond type will yield to nothing.
|
118
|
-
def each(cond=nil)
|
119
|
-
|
120
|
-
nodes.each { |n| yield(n) }
|
121
|
-
else
|
122
|
-
cond = cond.to_s if cond.is_a?(Symbol)
|
123
|
-
if cond.is_a?(String)
|
124
|
-
nodes.each { |n| yield(n) if n.is_a?(Element) && cond == n.name }
|
125
|
-
elsif cond.is_a?(Hash)
|
126
|
-
nodes.each { |n| yield(n) if n.is_a?(Element) && n.attr_match(cond) }
|
127
|
-
end
|
128
|
-
end
|
118
|
+
def each(cond=nil, &block)
|
119
|
+
build_enumerator(cond).each(&block)
|
129
120
|
end
|
130
121
|
|
131
122
|
# Returns an array of Nodes or Strings that correspond to the locations
|
@@ -413,6 +404,24 @@ module Ox
|
|
413
404
|
|
414
405
|
private
|
415
406
|
|
407
|
+
# Builds an enumerator for use in `#each` call
|
408
|
+
#
|
409
|
+
# - +cond+ [Hash, String, nil] an element filter
|
410
|
+
def build_enumerator(cond)
|
411
|
+
if cond.nil?
|
412
|
+
nodes.each
|
413
|
+
else
|
414
|
+
cond = cond.to_s if cond.is_a?(Symbol)
|
415
|
+
Enumerator.new do |yielder|
|
416
|
+
if cond.is_a?(String)
|
417
|
+
nodes.each { |n| yielder.yield(n) if n.is_a?(Element) && cond == n.name }
|
418
|
+
elsif cond.is_a?(Hash)
|
419
|
+
nodes.each { |n| yielder.yield(n) if n.is_a?(Element) && n.attr_match(cond) }
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
416
425
|
# Removes recursively children for nodes and sub_nodes
|
417
426
|
#
|
418
427
|
# - +found+ [Array] An array of Ox::Element
|
data/lib/ox/hasattrs.rb
CHANGED
@@ -13,7 +13,7 @@ module Ox
|
|
13
13
|
@attributes = { } if !instance_variable_defined?(:@attributes) or @attributes.nil?
|
14
14
|
@attributes
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Returns the value of an attribute.
|
18
18
|
# - +attr+ [Symbol|String] attribute name or key to return the value for
|
19
19
|
def [](attr)
|
@@ -27,9 +27,16 @@ module Ox
|
|
27
27
|
def []=(attr, value)
|
28
28
|
raise "argument to [] must be a Symbol or a String." unless attr.is_a?(Symbol) or attr.is_a?(String)
|
29
29
|
@attributes = { } if !instance_variable_defined?(:@attributes) or @attributes.nil?
|
30
|
+
a_str = attr.to_s
|
31
|
+
a_sym = attr.to_sym
|
32
|
+
if @attributes.has_key?(a_str)
|
33
|
+
attr = a_str
|
34
|
+
elsif @attributes.has_key?(a_sym)
|
35
|
+
attr = a_sym
|
36
|
+
end
|
30
37
|
@attributes[attr] = value.to_s
|
31
38
|
end
|
32
|
-
|
39
|
+
|
33
40
|
# Handles the 'easy' API that allows navigating a simple XML by
|
34
41
|
# referencing attributes by name.
|
35
42
|
# - +id+ [Symbol] element or attribute name
|
data/lib/ox/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.14.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: "A fast XML parser and object serializer that uses only standard C lib.\n\nOptimized
|
14
14
|
XML (Ox), as the name implies was written to provide speed optimized\nXML handling.
|
@@ -76,7 +76,7 @@ homepage: http://www.ohler.com/ox
|
|
76
76
|
licenses:
|
77
77
|
- MIT
|
78
78
|
metadata: {}
|
79
|
-
post_install_message:
|
79
|
+
post_install_message:
|
80
80
|
rdoc_options:
|
81
81
|
- "--main"
|
82
82
|
- README.md
|
@@ -98,8 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '0'
|
100
100
|
requirements: []
|
101
|
-
rubygems_version: 3.
|
102
|
-
signing_key:
|
101
|
+
rubygems_version: 3.2.3
|
102
|
+
signing_key:
|
103
103
|
specification_version: 4
|
104
104
|
summary: A fast XML parser and object serializer.
|
105
105
|
test_files: []
|