ruby_rnv 0.2.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rnv/extconf.rb +1 -1
- data/ext/rnv/ruby_rnv.c +187 -460
- data/ext/rnv/ruby_rnv.h +62 -0
- data/ext/rnv/ruby_rnv_err.c +545 -0
- data/ext/rnv/src/ary.c +1 -2
- data/ext/rnv/src/drv.c +75 -75
- data/ext/rnv/src/drv.h +12 -3
- data/ext/rnv/src/er.c +1 -1
- data/ext/rnv/src/er.h +1 -1
- data/ext/rnv/src/erbit.h +3 -0
- data/ext/rnv/src/rn.c +24 -26
- data/ext/rnv/src/rn.h +1 -1
- data/ext/rnv/src/rnc.c +28 -16
- data/ext/rnv/src/rnc.h +3 -23
- data/ext/rnv/src/rnd.c +24 -20
- data/ext/rnv/src/rnd.h +3 -2
- data/ext/rnv/src/rnl.c +24 -20
- data/ext/rnv/src/rnl.h +2 -3
- data/ext/rnv/src/rnv.c +20 -18
- data/ext/rnv/src/rnv.h +2 -2
- data/ext/rnv/src/rnx.c +15 -17
- data/ext/rnv/src/rnx.h +2 -3
- data/ext/rnv/src/rx.c +44 -32
- data/ext/rnv/src/rx.h +7 -8
- data/ext/rnv/src/sc.c +5 -0
- data/ext/rnv/src/sc.h +1 -0
- data/ext/rnv/src/type.h +53 -29
- data/ext/rnv/src/xcl.c +24 -27
- data/ext/rnv/src/xsd.c +10 -23
- data/ext/rnv/src/xsd.h +1 -2
- data/lib/rnv.rb +3 -0
- data/lib/rnv/data_type_library.rb +21 -0
- data/lib/rnv/error.rb +39 -0
- data/lib/rnv/pre_processor.rb +25 -0
- data/lib/rnv/validator.rb +18 -11
- metadata +9 -4
data/ext/rnv/src/xsd.c
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#include "type.h"
|
2
|
-
|
3
1
|
/* $Id: xsd.c,v 1.47 2005/01/06 21:04:06 dvd Exp $ */
|
4
2
|
|
5
3
|
#include <limits.h> /*INT_MAX*/
|
@@ -7,6 +5,9 @@
|
|
7
5
|
#include <string.h> /*strlen*/
|
8
6
|
#include <math.h> /*HUGE_VAL*/
|
9
7
|
#include <assert.h>
|
8
|
+
|
9
|
+
#include "type.h"
|
10
|
+
|
10
11
|
#include "u.h"
|
11
12
|
#include "xmlc.h"
|
12
13
|
#include "s.h"
|
@@ -16,11 +17,10 @@
|
|
16
17
|
#include "er.h"
|
17
18
|
#include "xsd.h"
|
18
19
|
|
19
|
-
#define err(msg) (*
|
20
|
-
void xsd_default_verror_handler(
|
21
|
-
(*er_printf)("XML Schema datatypes: ");
|
20
|
+
#define err(msg) (*handler)(data,erno|ERBIT_XSD,"XML Schema datatypes: "msg"\n",ap)
|
21
|
+
void xsd_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
|
22
22
|
if(erno&ERBIT_RX) {
|
23
|
-
rx_default_verror_handler(
|
23
|
+
rx_default_verror_handler(data, erno&~ERBIT_RX,handler,ap);
|
24
24
|
} else {
|
25
25
|
switch(erno) {
|
26
26
|
case XSD_ER_TYP: err("unknown type %s"); break;
|
@@ -36,24 +36,11 @@ void xsd_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
|
|
36
36
|
}
|
37
37
|
|
38
38
|
static void error_handler(rx_st_t *rx_st, int erno,...) {
|
39
|
-
va_list ap; va_start(ap,erno); (
|
39
|
+
va_list ap; va_start(ap,erno); xsd_default_verror_handler(rx_st->user_data,erno,rx_st->verror_handler,ap); va_end(ap);
|
40
40
|
}
|
41
41
|
|
42
|
-
static void verror_handler_rx(rnv_t *rnv, int erno,va_list ap) {xsd_default_verror_handler(rnv,erno|ERBIT_RX,ap);}
|
43
|
-
|
44
|
-
static void windup(void);
|
45
42
|
void xsd_init(rx_st_t *rx_st) {
|
46
|
-
rx_st->rnv->xsd_verror_handler = &xsd_default_verror_handler;
|
47
43
|
rx_init(rx_st);
|
48
|
-
rx_st->rnv->rx_verror_handler=&verror_handler_rx;
|
49
|
-
windup();
|
50
|
-
}
|
51
|
-
|
52
|
-
void xsd_clear(void) {
|
53
|
-
windup();
|
54
|
-
}
|
55
|
-
|
56
|
-
static void windup(void) {
|
57
44
|
}
|
58
45
|
|
59
46
|
#define FCT_ENUMERATION 0
|
@@ -81,7 +68,7 @@ static char *fcttab[NFCT]={
|
|
81
68
|
#define WS_REPLACE 1
|
82
69
|
#define WS_COLLAPSE 2
|
83
70
|
|
84
|
-
static int (*match[])(
|
71
|
+
static int (*match[])(rx_st_t *rx_st, char *r,char *s,int n)={&rx_match, &rx_rmatch,&rx_cmatch};
|
85
72
|
|
86
73
|
#define TYP_ENTITIES 0
|
87
74
|
#define TYP_ENTITY 1
|
@@ -327,7 +314,7 @@ struct facets {
|
|
327
314
|
#define PAT_MONTH0 "(0[1-9]|1[0-2])"
|
328
315
|
#define PAT_DAY0 "([0-2][0-9]|3[01])"
|
329
316
|
#define PAT_YEAR "-?"PAT_YEAR0 PAT_ZONE"?"
|
330
|
-
#define PAT_MONTH "--"PAT_MONTH0
|
317
|
+
#define PAT_MONTH "--"PAT_MONTH0 PAT_ZONE"?"
|
331
318
|
#define PAT_DAY "---"PAT_DAY0 PAT_ZONE"?"
|
332
319
|
#define PAT_YEAR_MONTH "-?"PAT_YEAR0"-"PAT_MONTH0 PAT_ZONE"?"
|
333
320
|
#define PAT_MONTH_DAY "--"PAT_MONTH0"-"PAT_DAY0 PAT_ZONE"?"
|
@@ -661,7 +648,7 @@ int xsd_allows(rx_st_t *rx_st, char *typ,char *ps,char *s,int n) {
|
|
661
648
|
default: assert(0);
|
662
649
|
}
|
663
650
|
|
664
|
-
while(fct.npat--) ok=ok&&match[fct.whiteSpace](rx_st
|
651
|
+
while(fct.npat--) ok=ok&&match[fct.whiteSpace](rx_st, fct.pattern[fct.npat],s,n);
|
665
652
|
|
666
653
|
if(fct.set&(1<<FCT_LENGTH)) ok=ok&&length==fct.length;
|
667
654
|
if(fct.set&(1<<FCT_MAX_LENGTH)) ok=ok&&length<=fct.maxLength;
|
data/ext/rnv/src/xsd.h
CHANGED
@@ -14,10 +14,9 @@
|
|
14
14
|
#define XSD_ER_WS 5
|
15
15
|
#define XSD_ER_ENUM 6
|
16
16
|
|
17
|
-
extern void xsd_default_verror_handler(
|
17
|
+
extern void xsd_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap);
|
18
18
|
|
19
19
|
extern void xsd_init(rx_st_t *rx_st);
|
20
|
-
extern void xsd_clear(void);
|
21
20
|
|
22
21
|
extern int xsd_allows(rx_st_t *rx_st, char *typ,char *ps,char *s,int n);
|
23
22
|
extern int xsd_equal(rx_st_t *rx_st, char *typ,char *val,char *s,int n);
|
data/lib/rnv.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module RNV
|
2
|
+
# Datatype library callback object
|
3
|
+
# @see https://www.oasis-open.org/committees/relax-ng/spec-20010811.html#IDA1I1R
|
4
|
+
class DataTypeLibrary
|
5
|
+
# @param [String] typ the data type
|
6
|
+
# @param [String] val
|
7
|
+
# @param [String] s
|
8
|
+
# @return [Boolean]
|
9
|
+
def equal(typ, val, s)
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param [String] typ the data type
|
14
|
+
# @param [String] ps
|
15
|
+
# @param [String] s the value
|
16
|
+
# @return [Boolean]
|
17
|
+
def allows(typ, ps, s)
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/rnv/error.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module RNV
|
2
|
+
class Error
|
3
|
+
def message
|
4
|
+
@original_message
|
5
|
+
end
|
6
|
+
|
7
|
+
def expected
|
8
|
+
@original_expected
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param [String] data original content
|
12
|
+
# @return [String] context
|
13
|
+
def contextualize(data, max_len = 60)
|
14
|
+
out = ""
|
15
|
+
if data and @line
|
16
|
+
err_data = data.split("\n")[@line - 1]
|
17
|
+
err_data.insert(@col - 1, "🢑")
|
18
|
+
|
19
|
+
start = 0
|
20
|
+
if @col > max_len
|
21
|
+
start = @col - max_len
|
22
|
+
end
|
23
|
+
out += (start > 0 ? "…" : "") + err_data[start..(@col + max_len)].strip + (@col + max_len < err_data.length ? "…" : "")
|
24
|
+
end
|
25
|
+
out
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [String]
|
29
|
+
def to_s
|
30
|
+
"#{@line}:#{@col}:error: #{self.message}\n#{self.expected}"
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [String]
|
34
|
+
def inspect
|
35
|
+
#"#<RNV::Error code: :#{@code}, message: '#{@message}', expected: '#{@expected}, line: #{@line}, column: #{@col}>"
|
36
|
+
"#<RNV::Error code: :#{@code}, message: '#{self.message}', expected: '#{self.expected}, line: #{@line}, column: #{@col}>"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RNV
|
2
|
+
# Object to modify data before validation (eg: HTML5 data-* attributes)
|
3
|
+
class PreProcessor
|
4
|
+
# replace attributes before validate
|
5
|
+
# @param [Array<Array<String>>] attrs
|
6
|
+
# @return [Array<Array<String>>]
|
7
|
+
def attributes(attrs)
|
8
|
+
attrs
|
9
|
+
end
|
10
|
+
|
11
|
+
# replace tag name before validate
|
12
|
+
# @param [String] tag
|
13
|
+
# @return [String]
|
14
|
+
def tag(tag)
|
15
|
+
tag
|
16
|
+
end
|
17
|
+
|
18
|
+
# replace content text before validate
|
19
|
+
# @param [String] txt
|
20
|
+
# @return [String]
|
21
|
+
def text(txt)
|
22
|
+
txt
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rnv/validator.rb
CHANGED
@@ -1,37 +1,38 @@
|
|
1
1
|
require 'nokogiri'
|
2
2
|
require 'rnv/rnv'
|
3
|
+
require 'rnv/pre_processor'
|
3
4
|
|
4
5
|
module RNV
|
5
6
|
# @!visibility private
|
6
7
|
class NokogiriSaxDocument < Nokogiri::XML::SAX::Document
|
7
8
|
# @return [Nokogiri::XML::SAX::ParserContext]
|
8
|
-
attr_accessor :ctx
|
9
|
+
attr_accessor :ctx, :pre_processor
|
9
10
|
# @param [RNV::Document] document
|
10
11
|
def initialize(document)
|
11
12
|
@document = document
|
12
13
|
end
|
13
14
|
|
14
15
|
def start_element_namespace(name, attrs = [], prefix = nil, uri = nil, ns = nil)
|
15
|
-
update_line_col
|
16
16
|
tag_attrs = attrs.map { |attr| [attr.uri ? "#{attr.uri}:#{attr.localname}" : attr.localname, attr.value] }
|
17
17
|
tag_name = uri ? "#{uri}:#{name}" : name
|
18
|
-
@document.start_tag(tag_name, tag_attrs
|
18
|
+
@document.start_tag(@pre_processor.tag(tag_name), @pre_processor.attributes(tag_attrs))
|
19
|
+
update_line_col
|
19
20
|
end
|
20
21
|
|
21
22
|
def end_element_namespace(name, prefix = nil, uri = nil)
|
22
|
-
update_line_col
|
23
23
|
tag_name = uri ? "#{uri}:#{name}" : name
|
24
|
-
@document.end_tag(tag_name)
|
24
|
+
@document.end_tag(@pre_processor.tag(tag_name))
|
25
|
+
update_line_col
|
25
26
|
end
|
26
27
|
|
27
28
|
def characters str
|
29
|
+
@document.characters(@pre_processor.text(str))
|
28
30
|
update_line_col
|
29
|
-
@document.characters(str)
|
30
31
|
end
|
31
32
|
|
32
33
|
def cdata_block str
|
34
|
+
@document.characters(@pre_processor.text(str))
|
33
35
|
update_line_col
|
34
|
-
@document.characters(str)
|
35
36
|
end
|
36
37
|
|
37
38
|
private
|
@@ -57,25 +58,29 @@ module RNV
|
|
57
58
|
end
|
58
59
|
|
59
60
|
# @param [String] str RNC schema buffer
|
61
|
+
# @return [Boolean] true if schema loaded successfuly
|
60
62
|
def load_schema_from_string(str)
|
61
63
|
@document.load_string(str)
|
62
64
|
end
|
63
65
|
|
64
66
|
# @param [String] file RNC schema filename
|
67
|
+
# @return [Boolean] true if schema loaded successfuly
|
65
68
|
def load_schema_from_file(file)
|
66
69
|
@document.load_file(file)
|
67
70
|
end
|
68
71
|
|
69
72
|
# parse and validate buffer
|
70
73
|
# @param [String] str XML buffer to parse
|
74
|
+
# @param [RNV::PreProcessor] pre_processor an optional pre-processor for tag and attributes data
|
71
75
|
# @return [Boolean] true if valid
|
72
|
-
def parse_string(str)
|
73
|
-
@document.errors = [] # reset errors
|
76
|
+
def parse_string(str, pre_processor = PreProcessor.new)
|
74
77
|
@document.start_document
|
75
78
|
rnv_doc = NokogiriSaxDocument.new(@document)
|
79
|
+
rnv_doc.pre_processor = pre_processor
|
76
80
|
|
77
81
|
parser = Nokogiri::XML::SAX::Parser.new(rnv_doc)
|
78
82
|
parser.parse_memory(str) do |ctx|
|
83
|
+
ctx.replace_entities = true
|
79
84
|
rnv_doc.ctx = ctx
|
80
85
|
end
|
81
86
|
|
@@ -84,16 +89,18 @@ module RNV
|
|
84
89
|
|
85
90
|
# parse and validate file
|
86
91
|
# @param [String, File] xml XML file to parse
|
92
|
+
# @param [RNV::PreProcessor] pre_processor an optional pre-processor for tag and attributes data
|
87
93
|
# @return [Boolean] true if valid
|
88
|
-
def parse_file(xml)
|
89
|
-
@document.errors = [] # reset errors
|
94
|
+
def parse_file(xml, pre_processor = PreProcessor.new)
|
90
95
|
@document.start_document
|
91
96
|
rnv_doc = NokogiriSaxDocument.new(@document)
|
97
|
+
rnv_doc.pre_processor = pre_processor
|
92
98
|
|
93
99
|
file = xml.is_a?(File) ? xml : File.open(xml)
|
94
100
|
|
95
101
|
parser = Nokogiri::XML::SAX::Parser.new(rnv_doc)
|
96
102
|
parser.parse(file) do |ctx|
|
103
|
+
ctx.replace_entities = true
|
97
104
|
rnv_doc.ctx = ctx
|
98
105
|
end
|
99
106
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_rnv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Boulnois
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -104,6 +104,8 @@ files:
|
|
104
104
|
- Gemfile
|
105
105
|
- ext/rnv/extconf.rb
|
106
106
|
- ext/rnv/ruby_rnv.c
|
107
|
+
- ext/rnv/ruby_rnv.h
|
108
|
+
- ext/rnv/ruby_rnv_err.c
|
107
109
|
- ext/rnv/src/ary.c
|
108
110
|
- ext/rnv/src/ary.h
|
109
111
|
- ext/rnv/src/drv.c
|
@@ -147,8 +149,11 @@ files:
|
|
147
149
|
- ext/rnv/src/xsd_tm.c
|
148
150
|
- ext/rnv/src/xsd_tm.h
|
149
151
|
- lib/rnv.rb
|
152
|
+
- lib/rnv/data_type_library.rb
|
153
|
+
- lib/rnv/error.rb
|
154
|
+
- lib/rnv/pre_processor.rb
|
150
155
|
- lib/rnv/validator.rb
|
151
|
-
homepage:
|
156
|
+
homepage: https://github.com/immateriel/ruby_rnv
|
152
157
|
licenses:
|
153
158
|
- MIT
|
154
159
|
metadata: {}
|
@@ -170,5 +175,5 @@ requirements: []
|
|
170
175
|
rubygems_version: 3.0.8
|
171
176
|
signing_key:
|
172
177
|
specification_version: 4
|
173
|
-
summary: RelaxNG compact syntax validator
|
178
|
+
summary: RelaxNG compact syntax validator for Ruby
|
174
179
|
test_files: []
|