ox 2.9.4 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c220a3c8bc6e3606d936684b2cdde97146131cdee936c9a66bc8c4ce0473b90
4
- data.tar.gz: 96e146a36eff4184918913f27cffb23a81de87835b14c4b30be612d13fb385b8
3
+ metadata.gz: e1967ed8377e3a3e7ccdb8b6e14a21e5dbd0c7f435b87474c422cf3572d639a9
4
+ data.tar.gz: cdb5712d31fd0641c9f444e8ea205fb18c3ccb246ba651d31b8dbd34db7ba579
5
5
  SHA512:
6
- metadata.gz: 1b61e28ecced2336af416e61907c9f4b279c6f7b37df75a8d73a449fda4aac7ba62583255ba2b136f05286f69f840734d5bdd8573da5f11393106c3e6bd082c2
7
- data.tar.gz: 703e1df77bb2da424be80c9f0491f57bf021ee312add658062c0c6fe736429fab3fe589a273cf32646ca331ec4e21c435fa51d4bfa2c8cedbc560f7e1b9f69ed
6
+ metadata.gz: 52f78021c4525f0c88548c2ce87a2a660d0ce60ea72ffef159611a4b39b883ce497adebf3a13c22f3c744325f4c463c4493ab66b3efbda7c975e99b0d46e7c71
7
+ data.tar.gz: b505855a76c09de2bb9c07b821b509e1d8d58ee3ce45816db6612086b10bb748dfe1c9ca07da8baab077a5ffdbc33cd3ed773fbd14f9cb7e8c2108b2e935797e
@@ -1,4 +1,9 @@
1
1
 
2
+ ## 2.10.0 - August 26, 2018
3
+
4
+ - `:element_key_mod` and `:attr_key_mod` options were added to allow keys to
5
+ be modified when loading.
6
+
2
7
  ## 2.9.4 - July 16, 2018
3
8
 
4
9
  - Fixed issue with malformed object mode input.
@@ -84,10 +84,10 @@ create_doc(PInfo pi) {
84
84
 
85
85
  static void
86
86
  create_prolog_doc(PInfo pi, const char *target, Attr attrs) {
87
- VALUE doc;
88
- VALUE ah;
89
- VALUE nodes;
90
- VALUE sym;
87
+ volatile VALUE doc;
88
+ volatile VALUE ah;
89
+ volatile VALUE nodes;
90
+ volatile VALUE sym;
91
91
 
92
92
  if (!helper_stack_empty(&pi->helpers)) { /* top level object */
93
93
  ox_err_set(&pi->err, rb_eSyntaxError, "Prolog must be the first element in an XML document.\n");
@@ -96,7 +96,10 @@ create_prolog_doc(PInfo pi, const char *target, Attr attrs) {
96
96
  doc = rb_obj_alloc(ox_document_clas);
97
97
  ah = rb_hash_new();
98
98
  for (; 0 != attrs->name; attrs++) {
99
- if (Yes == pi->options->sym_keys) {
99
+ if (Qnil != pi->options->attr_key_mod) {
100
+ sym = rb_funcall(pi->options->attr_key_mod, ox_call_id, 1, rb_str_new2(attrs->name));
101
+ rb_hash_aset(ah, sym, rb_str_new2(attrs->value));
102
+ } else if (Yes == pi->options->sym_keys) {
100
103
  #if HAS_ENCODING_SUPPORT
101
104
  if (0 != pi->options->rb_enc) {
102
105
  VALUE rstr = rb_str_new2(attrs->name);
@@ -120,7 +123,7 @@ create_prolog_doc(PInfo pi, const char *target, Attr attrs) {
120
123
  #endif
121
124
  rb_hash_aset(ah, sym, rb_str_new2(attrs->value));
122
125
  } else {
123
- VALUE rstr = rb_str_new2(attrs->name);
126
+ volatile VALUE rstr = rb_str_new2(attrs->name);
124
127
 
125
128
  #if HAS_ENCODING_SUPPORT
126
129
  if (0 != pi->options->rb_enc) {
@@ -291,6 +294,9 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
291
294
  VALUE e;
292
295
  VALUE s = rb_str_new2(ename);
293
296
 
297
+ if (Qnil != pi->options->element_key_mod) {
298
+ s = rb_funcall(pi->options->element_key_mod, ox_call_id, 1, s);
299
+ }
294
300
  #if HAS_ENCODING_SUPPORT
295
301
  if (0 != pi->options->rb_enc) {
296
302
  rb_enc_associate(s, pi->options->rb_enc);
@@ -308,7 +314,9 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
308
314
  for (; 0 != attrs->name; attrs++) {
309
315
  volatile VALUE sym;
310
316
 
311
- if (Yes == pi->options->sym_keys) {
317
+ if (Qnil != pi->options->attr_key_mod) {
318
+ sym = rb_funcall(pi->options->attr_key_mod, ox_call_id, 1, rb_str_new2(attrs->name));
319
+ } else if (Yes == pi->options->sym_keys) {
312
320
  VALUE *slot;
313
321
 
314
322
  if (Qundef == (sym = ox_cache_get(ox_symbol_cache, attrs->name, &slot, 0))) {
@@ -415,13 +423,15 @@ add_instruct(PInfo pi, const char *name, Attr attrs, const char *content) {
415
423
  if (0 != content) {
416
424
  rb_ivar_set(inst, ox_at_content_id, c);
417
425
  } else if (0 != attrs->name) {
418
- VALUE ah = rb_hash_new();
426
+ volatile VALUE ah = rb_hash_new();
419
427
 
420
428
  for (; 0 != attrs->name; attrs++) {
421
- VALUE sym;
422
- VALUE *slot;
429
+ volatile VALUE sym;
430
+ VALUE *slot;
423
431
 
424
- if (Yes == pi->options->sym_keys) {
432
+ if (Qnil != pi->options->attr_key_mod) {
433
+ sym = rb_funcall(pi->options->attr_key_mod, ox_call_id, 1, rb_str_new2(attrs->name));
434
+ } else if (Yes == pi->options->sym_keys) {
425
435
  if (Qundef == (sym = ox_cache_get(ox_symbol_cache, attrs->name, &slot, 0))) {
426
436
  #if HAS_ENCODING_SUPPORT
427
437
  if (0 != pi->options->rb_enc) {
@@ -71,7 +71,9 @@ add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
71
71
  volatile VALUE a;
72
72
 
73
73
  for (; 0 != attrs->name; attrs++) {
74
- if (Yes == pi->options->sym_keys) {
74
+ if (Qnil != pi->options->attr_key_mod) {
75
+ key = rb_funcall(pi->options->attr_key_mod, ox_call_id, 1, rb_str_new2(attrs->name));
76
+ } else if (Yes == pi->options->sym_keys) {
75
77
  key = rb_id2sym(rb_intern(attrs->name));
76
78
  } else {
77
79
  key = rb_str_new2(attrs->name);
@@ -125,7 +127,9 @@ end_element_core(PInfo pi, const char *ename, bool check_taint) {
125
127
  if (NoCode == e->type) {
126
128
  e->obj = Qnil;
127
129
  }
128
- if (Yes == pi->options->sym_keys) {
130
+ if (Qnil != pi->options->element_key_mod) {
131
+ key = rb_funcall(pi->options->element_key_mod, ox_call_id, 1, rb_id2str(e->var));
132
+ } else if (Yes == pi->options->sym_keys) {
129
133
  key = rb_id2sym(e->var);
130
134
  } else {
131
135
  key = rb_id2str(e->var);
@@ -40,6 +40,7 @@ ID ox_attributes_id;
40
40
  ID ox_attrs_done_id;
41
41
  ID ox_beg_id;
42
42
  ID ox_bigdecimal_id;
43
+ ID ox_call_id;
43
44
  ID ox_cdata_id;
44
45
  ID ox_comment_id;
45
46
  ID ox_den_id;
@@ -109,6 +110,7 @@ Cache ox_attr_cache = 0;
109
110
 
110
111
  static VALUE abort_sym;
111
112
  static VALUE active_sym;
113
+ static VALUE attr_key_mod_sym;
112
114
  static VALUE auto_define_sym;
113
115
  static VALUE auto_sym;
114
116
  static VALUE block_sym;
@@ -145,6 +147,7 @@ static VALUE with_dtd_sym;
145
147
  static VALUE with_instruct_sym;
146
148
  static VALUE with_xml_sym;
147
149
  static VALUE xsd_date_sym;
150
+ static VALUE element_key_mod_sym;
148
151
 
149
152
  static ID encoding_id;
150
153
  static ID has_key_id;
@@ -158,30 +161,32 @@ void *ox_utf8_encoding = 0;
158
161
  #endif
159
162
 
160
163
  struct _Options ox_default_options = {
161
- { '\0' }, /* encoding */
162
- { '\0' }, /* margin */
163
- 2, /* indent */
164
- 0, /* trace */
165
- 0, /* margin_len */
166
- No, /* with_dtd */
167
- No, /* with_xml */
168
- No, /* with_instruct */
169
- No, /* circular */
170
- No, /* xsd_date */
171
- NoMode, /* mode */
172
- StrictEffort, /* effort */
173
- Yes, /* sym_keys */
174
- SpcSkip, /* skip */
175
- No, /* smart */
176
- 1, /* convert_special */
177
- No, /* allow_invalid */
178
- { '\0' }, /* inv_repl */
179
- { '\0' }, /* strip_ns */
180
- NULL, /* html_hints */
164
+ { '\0' }, // encoding
165
+ { '\0' }, // margin
166
+ 2, // indent
167
+ 0, // trace
168
+ 0, // margin_len
169
+ No, // with_dtd
170
+ No, // with_xml
171
+ No, // with_instruct
172
+ No, // circular
173
+ No, // xsd_date
174
+ NoMode, // mode
175
+ StrictEffort, // effort
176
+ Yes, // sym_keys
177
+ SpcSkip, // skip
178
+ No, // smart
179
+ 1, // convert_special
180
+ No, // allow_invalid
181
+ { '\0' }, // inv_repl
182
+ { '\0' }, // strip_ns
183
+ NULL, // html_hints
184
+ Qnil, // attr_key_mod;
185
+ Qnil, // element_key_mod;
181
186
  #if HAS_PRIVATE_ENCODING
182
- Qnil /* rb_enc */
187
+ Qnil // rb_enc
183
188
  #else
184
- 0 /* rb_enc */
189
+ 0 // rb_enc
185
190
  #endif
186
191
  };
187
192
 
@@ -197,7 +202,7 @@ static void parse_dump_options(VALUE ropts, Options copts);
197
202
  static char*
198
203
  defuse_bom(char *xml, Options options) {
199
204
  switch ((uint8_t)*xml) {
200
- case 0xEF: /* UTF-8 */
205
+ case 0xEF: // UTF-8
201
206
  if (0xBB == (uint8_t)xml[1] && 0xBF == (uint8_t)xml[2]) {
202
207
  options->rb_enc = ox_utf8_encoding;
203
208
  xml += 3;
@@ -206,7 +211,7 @@ defuse_bom(char *xml, Options options) {
206
211
  }
207
212
  break;
208
213
  #if 0
209
- case 0xFE: /* UTF-16BE */
214
+ case 0xFE: // UTF-16BE
210
215
  if (0xFF == (uint8_t)xml[1]) {
211
216
  options->rb_enc = ox_utf16be_encoding;
212
217
  xml += 2;
@@ -214,7 +219,7 @@ defuse_bom(char *xml, Options options) {
214
219
  rb_raise(ox_parse_error_class, "Invalid BOM in XML string.\n");
215
220
  }
216
221
  break;
217
- case 0xFF: /* UTF-16LE or UTF-32LE */
222
+ case 0xFF: // UTF-16LE or UTF-32LE
218
223
  if (0xFE == (uint8_t)xml[1]) {
219
224
  if (0x00 == (uint8_t)xml[2] && 0x00 == (uint8_t)xml[3]) {
220
225
  options->rb_enc = ox_utf32le_encoding;
@@ -227,7 +232,7 @@ defuse_bom(char *xml, Options options) {
227
232
  rb_raise(ox_parse_error_class, "Invalid BOM in XML string.\n");
228
233
  }
229
234
  break;
230
- case 0x00: /* UTF-32BE */
235
+ case 0x00: // UTF-32BE
231
236
  if (0x00 == (uint8_t)xml[1] && 0xFE == (uint8_t)xml[2] && 0xFF == (uint8_t)xml[3]) {
232
237
  options->rb_enc = ox_utf32be_encoding;
233
238
  xml += 4;
@@ -237,7 +242,8 @@ defuse_bom(char *xml, Options options) {
237
242
  break;
238
243
  #endif
239
244
  default:
240
- /* Let it fail if there is a BOM that is not UTF-8. Other BOM options are not ASCII compatible. */
245
+ // Let it fail if there is a BOM that is not UTF-8. Other BOM options
246
+ // are not ASCII compatible.
241
247
  break;
242
248
  }
243
249
  return xml;
@@ -280,6 +286,8 @@ hints_to_overlay(Hints hints) {
280
286
  * - _:mode_ [:object|:generic|:limited|:hash|:hash_no_attrs|nil] load method to use for XML
281
287
  * - _:effort_ [:strict|:tolerant|:auto_define] set the tolerance level for loading
282
288
  * - _:symbolize_keys_ [true|false|nil] symbolize element attribute keys or leave as Strings
289
+ * - _:element_key_mod_ [Proc|nil] converts element keys on parse if not nil
290
+ * - _:attr_key_mod_ [Proc|nil] converts attribute keys on parse if not nil
283
291
  * - _:skip_ [:skip_none|:skip_return|:skip_white|:skip_off] determines how to handle white space in text
284
292
  * - _:smart_ [true|false|nil] flag indicating the SAX parser uses hints if available (use with html)
285
293
  * - _:convert_special_ [true|false|nil] flag indicating special characters like < are converted with the SAX parser
@@ -313,6 +321,8 @@ get_def_opts(VALUE self) {
313
321
  rb_hash_aset(opts, circular_sym, (Yes == ox_default_options.circular) ? Qtrue : ((No == ox_default_options.circular) ? Qfalse : Qnil));
314
322
  rb_hash_aset(opts, xsd_date_sym, (Yes == ox_default_options.xsd_date) ? Qtrue : ((No == ox_default_options.xsd_date) ? Qfalse : Qnil));
315
323
  rb_hash_aset(opts, symbolize_keys_sym, (Yes == ox_default_options.sym_keys) ? Qtrue : ((No == ox_default_options.sym_keys) ? Qfalse : Qnil));
324
+ rb_hash_aset(opts, attr_key_mod_sym, ox_default_options.attr_key_mod);
325
+ rb_hash_aset(opts, element_key_mod_sym, ox_default_options.element_key_mod);
316
326
  rb_hash_aset(opts, smart_sym, (Yes == ox_default_options.smart) ? Qtrue : ((No == ox_default_options.smart) ? Qfalse : Qnil));
317
327
  rb_hash_aset(opts, convert_special_sym, (ox_default_options.convert_special) ? Qtrue : Qfalse);
318
328
  switch (ox_default_options.mode) {
@@ -416,6 +426,8 @@ sax_html_overlay(VALUE self) {
416
426
  * - _:mode_ [:object|:generic|:limited|:hash|:hash_no_attrs|nil] load method to use for XML
417
427
  * - _:effort_ [:strict|:tolerant|:auto_define] set the tolerance level for loading
418
428
  * - _:symbolize_keys_ [true|false|nil] symbolize element attribute keys or leave as Strings
429
+ * - _:element_key_mod_ [Proc|nil] converts element keys on parse if not nil
430
+ * - _:attr_key_mod_ [Proc|nil] converts attribute keys on parse if not nil
419
431
  * - _:skip_ [:skip_none|:skip_return|:skip_white|:skip_off] determines how to handle white space in text
420
432
  * - _:smart_ [true|false|nil] flag indicating the SAX parser uses hints if available (use with html)
421
433
  * - _: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.
@@ -611,6 +623,9 @@ set_def_opts(VALUE self, VALUE opts) {
611
623
  rb_hash_foreach(v, set_overlay, (VALUE)ox_default_options.html_hints);
612
624
  }
613
625
  }
626
+ ox_default_options.element_key_mod = rb_hash_lookup2(opts, element_key_mod_sym, ox_default_options.element_key_mod);
627
+ ox_default_options.attr_key_mod = rb_hash_lookup2(opts, attr_key_mod_sym, ox_default_options.attr_key_mod);
628
+
614
629
  return Qnil;
615
630
  }
616
631
 
@@ -755,6 +770,9 @@ load(char *xml, size_t len, int argc, VALUE *argv, VALUE self, VALUE encoding, E
755
770
  if (Qnil != (v = rb_hash_lookup(h, symbolize_keys_sym))) {
756
771
  options.sym_keys = (Qfalse == v) ? No : Yes;
757
772
  }
773
+ options.element_key_mod = rb_hash_lookup2(h, element_key_mod_sym, options.element_key_mod);
774
+ options.attr_key_mod = rb_hash_lookup2(h, attr_key_mod_sym, options.attr_key_mod);
775
+
758
776
  if (Qnil != (v = rb_hash_lookup(h, convert_special_sym))) {
759
777
  options.convert_special = (Qfalse != v);
760
778
  }
@@ -1379,6 +1397,7 @@ void Init_ox() {
1379
1397
  ox_attrs_done_id = rb_intern("attrs_done");
1380
1398
  ox_beg_id = rb_intern("@beg");
1381
1399
  ox_bigdecimal_id = rb_intern("BigDecimal");
1400
+ ox_call_id = rb_intern("call");
1382
1401
  ox_cdata_id = rb_intern("cdata");
1383
1402
  ox_comment_id = rb_intern("comment");
1384
1403
  ox_den_id = rb_intern("@den");
@@ -1442,12 +1461,14 @@ void Init_ox() {
1442
1461
 
1443
1462
  abort_sym = ID2SYM(rb_intern("abort")); rb_gc_register_address(&abort_sym);
1444
1463
  active_sym = ID2SYM(rb_intern("active")); rb_gc_register_address(&active_sym);
1464
+ attr_key_mod_sym = ID2SYM(rb_intern("attr_key_mod")); rb_gc_register_address(&attr_key_mod_sym);
1445
1465
  auto_define_sym = ID2SYM(rb_intern("auto_define")); rb_gc_register_address(&auto_define_sym);
1446
1466
  auto_sym = ID2SYM(rb_intern("auto")); rb_gc_register_address(&auto_sym);
1447
1467
  block_sym = ID2SYM(rb_intern("block")); rb_gc_register_address(&block_sym);
1448
1468
  circular_sym = ID2SYM(rb_intern("circular")); rb_gc_register_address(&circular_sym);
1449
1469
  convert_special_sym = ID2SYM(rb_intern("convert_special")); rb_gc_register_address(&convert_special_sym);
1450
1470
  effort_sym = ID2SYM(rb_intern("effort")); rb_gc_register_address(&effort_sym);
1471
+ element_key_mod_sym = ID2SYM(rb_intern("element_key_mod")); rb_gc_register_address(&element_key_mod_sym);
1451
1472
  generic_sym = ID2SYM(rb_intern("generic")); rb_gc_register_address(&generic_sym);
1452
1473
  hash_no_attrs_sym = ID2SYM(rb_intern("hash_no_attrs")); rb_gc_register_address(&hash_no_attrs_sym);
1453
1474
  hash_sym = ID2SYM(rb_intern("hash")); rb_gc_register_address(&hash_sym);
@@ -143,6 +143,8 @@ typedef struct _Options {
143
143
  char inv_repl[12]; /* max 10 valid characters, first character is the length */
144
144
  char strip_ns[64]; /* namespace to strip, \0 is no-strip, \* is all, else only matches */
145
145
  struct _Hints *html_hints; /* html hints */
146
+ VALUE attr_key_mod;
147
+ VALUE element_key_mod;
146
148
  #if HAS_ENCODING_SUPPORT
147
149
  rb_encoding *rb_enc;
148
150
  #elif HAS_PRIVATE_ENCODING
@@ -192,6 +194,7 @@ extern ID ox_attrs_done_id;
192
194
  extern ID ox_attributes_id;
193
195
  extern ID ox_beg_id;
194
196
  extern ID ox_bigdecimal_id;
197
+ extern ID ox_call_id;
195
198
  extern ID ox_cdata_id;
196
199
  extern ID ox_comment_id;
197
200
  extern ID ox_den_id;
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Ox
3
3
  # Current version of the module.
4
- VERSION = '2.9.4'
4
+ VERSION = '2.10.0'
5
5
  end
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.9.4
4
+ version: 2.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-16 00:00:00.000000000 Z
11
+ date: 2018-09-03 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
14
14
  \ \nOptimized XML (Ox), as the name implies was written to provide speed
@@ -35,7 +35,6 @@ files:
35
35
  - ext/ox/cache8.c
36
36
  - ext/ox/cache8.h
37
37
  - ext/ox/dump.c
38
- - ext/ox/encode.h
39
38
  - ext/ox/err.c
40
39
  - ext/ox/err.h
41
40
  - ext/ox/extconf.rb
@@ -100,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
99
  version: '0'
101
100
  requirements: []
102
101
  rubyforge_project: ox
103
- rubygems_version: 2.7.3
102
+ rubygems_version: 2.7.6
104
103
  signing_key:
105
104
  specification_version: 4
106
105
  summary: A fast XML parser and object serializer.
@@ -1,26 +0,0 @@
1
- /* encode.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- */
5
-
6
- #ifndef __OX_ENCODE_H__
7
- #define __OX_ENCODE_H__
8
-
9
- #include "ruby.h"
10
- #if HAS_ENCODING_SUPPORT
11
- #include "ruby/encoding.h"
12
- #endif
13
-
14
- static inline VALUE
15
- ox_encode(VALUE rstr) {
16
- #if HAS_ENCODING_SUPPORT
17
- rb_enc_associate(rstr, ox_utf8_encoding);
18
- #else
19
- if (Qnil != ox_utf8_encoding) {
20
- rstr = rb_funcall(ox_utf8_encoding, ox_iconv_id, 1, rstr);
21
- }
22
- #endif
23
- return rstr;
24
- }
25
-
26
- #endif /* __OX_ENCODE_H__ */