duxml 0.8.8 → 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/bin/validate_xml +30 -30
  3. data/lib/duxml.rb +76 -76
  4. data/lib/duxml/doc.rb +108 -91
  5. data/lib/duxml/doc/element.rb +250 -250
  6. data/lib/duxml/doc/lazy_ox.rb +167 -167
  7. data/lib/duxml/doc/node_set.rb +38 -38
  8. data/lib/duxml/meta.rb +72 -72
  9. data/lib/duxml/meta/grammar.rb +133 -133
  10. data/lib/duxml/meta/grammar/pattern.rb +111 -111
  11. data/lib/duxml/meta/grammar/pattern/attr_name_pattern.rb +36 -36
  12. data/lib/duxml/meta/grammar/pattern/attr_val_pattern.rb +36 -36
  13. data/lib/duxml/meta/grammar/pattern/child_pattern.rb +60 -60
  14. data/lib/duxml/meta/grammar/pattern/text_pattern.rb +31 -31
  15. data/lib/duxml/meta/grammar/pattern_maker.rb +68 -68
  16. data/lib/duxml/meta/grammar/relax_ng.rb +39 -39
  17. data/lib/duxml/meta/grammar/relax_ng/attrs_rule.rb +58 -58
  18. data/lib/duxml/meta/grammar/relax_ng/children_rule.rb +82 -82
  19. data/lib/duxml/meta/grammar/relax_ng/value_rule.rb +44 -44
  20. data/lib/duxml/meta/grammar/rule.rb +58 -58
  21. data/lib/duxml/meta/grammar/rule/attrs_rule.rb +77 -77
  22. data/lib/duxml/meta/grammar/rule/children_rule.rb +135 -135
  23. data/lib/duxml/meta/grammar/rule/text_rule.rb +39 -39
  24. data/lib/duxml/meta/grammar/rule/value_rule.rb +110 -110
  25. data/lib/duxml/meta/grammar/spreadsheet.rb +34 -34
  26. data/lib/duxml/meta/history.rb +88 -88
  27. data/lib/duxml/meta/history/add.rb +30 -30
  28. data/lib/duxml/meta/history/change.rb +70 -70
  29. data/lib/duxml/meta/history/change_attr.rb +33 -33
  30. data/lib/duxml/meta/history/change_text.rb +32 -32
  31. data/lib/duxml/meta/history/error.rb +24 -24
  32. data/lib/duxml/meta/history/new_attr.rb +32 -32
  33. data/lib/duxml/meta/history/new_text.rb +36 -36
  34. data/lib/duxml/meta/history/qualify_error.rb +21 -21
  35. data/lib/duxml/meta/history/remove.rb +27 -27
  36. data/lib/duxml/meta/history/undo.rb +23 -23
  37. data/lib/duxml/meta/history/validate_error.rb +20 -20
  38. data/lib/duxml/reportable.rb +28 -28
  39. data/lib/duxml/ruby_ext/fixnum.rb +55 -55
  40. data/lib/duxml/ruby_ext/module.rb +11 -11
  41. data/lib/duxml/ruby_ext/object.rb +13 -13
  42. data/lib/duxml/ruby_ext/regexp.rb +19 -19
  43. data/lib/duxml/ruby_ext/string.rb +37 -37
  44. data/lib/duxml/saxer.rb +75 -75
  45. metadata +12 -12
@@ -1,40 +1,40 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/relax_ng/children_rule')
4
- require File.expand_path(File.dirname(__FILE__) + '/relax_ng/attrs_rule')
5
- require File.expand_path(File.dirname(__FILE__) + '/relax_ng/value_rule')
6
- require File.expand_path(File.dirname(__FILE__) + '/../../doc')
7
-
8
- module Duxml
9
- # contains methods to convert Rules into a valid RelaxNG schema file
10
- module RelaxNG
11
- include Duxml
12
- # @param output_path [String] optional, output path for .rng file
13
- # @return [Nokogiri::XML::RelaxNG] RelaxNG schema object
14
- def relaxng(output_path=nil)
15
- doc = Doc.new
16
- doc << Element.new('grammar')
17
- doc.grammar[:xmlns] = 'http://relaxng.org/ns/structure/1.0'
18
- doc.grammar[:datatypeLibrary] = 'http://www.w3.org/2001/XMLSchema-datatypes'
19
- start = Element.new('start')
20
- start[:combine] = 'choice'
21
- ref = Element.new('ref')
22
- ref[:name] = rules.first.subject
23
- start << ref
24
- doc.grammar << start
25
- rules.each do |rule|
26
- rule.relaxng doc.grammar
27
- end
28
-
29
- # fill in empty doc definitions to make them legal
30
- element_defs = doc.grammar.Define.collect do |d|
31
- d.element if d.nodes.first.name == 'element' and d.element.nodes.empty?
32
- end.compact
33
- element_defs.each do |element_def|
34
- element_def << Element.new('empty')
35
- end
36
- doc.write_to output_path if output_path
37
- doc
38
- end # def relaxng
39
- end # module RelaxNG
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/relax_ng/children_rule')
4
+ require File.expand_path(File.dirname(__FILE__) + '/relax_ng/attrs_rule')
5
+ require File.expand_path(File.dirname(__FILE__) + '/relax_ng/value_rule')
6
+ require File.expand_path(File.dirname(__FILE__) + '/../../doc')
7
+
8
+ module Duxml
9
+ # contains methods to convert Rules into a valid RelaxNG schema file
10
+ module RelaxNG
11
+ include Duxml
12
+ # @param output_path [String] optional, output path for .rng file
13
+ # @return [Nokogiri::XML::RelaxNG] RelaxNG schema object
14
+ def relaxng(output_path=nil)
15
+ doc = Doc.new
16
+ doc << Element.new('grammar')
17
+ doc.grammar[:xmlns] = 'http://relaxng.org/ns/structure/1.0'
18
+ doc.grammar[:datatypeLibrary] = 'http://www.w3.org/2001/XMLSchema-datatypes'
19
+ start = Element.new('start')
20
+ start[:combine] = 'choice'
21
+ ref = Element.new('ref')
22
+ ref[:name] = rules.first.subject
23
+ start << ref
24
+ doc.grammar << start
25
+ rules.each do |rule|
26
+ rule.relaxng doc.grammar
27
+ end
28
+
29
+ # fill in empty doc definitions to make them legal
30
+ element_defs = doc.grammar.Define.collect do |d|
31
+ d.element if d.nodes.first.name == 'element' and d.element.nodes.empty?
32
+ end.compact
33
+ element_defs.each do |element_def|
34
+ element_def << Element.new('empty')
35
+ end
36
+ doc.write_to output_path if output_path
37
+ doc
38
+ end # def relaxng
39
+ end # module RelaxNG
40
40
  end # module Duxml
@@ -1,58 +1,58 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../rule/attrs_rule')
4
- require File.expand_path(File.dirname(__FILE__) + '/../../../doc/lazy_ox')
5
- require 'ox'
6
-
7
- module Duxml
8
- module RngAttrsRule; end
9
-
10
- class AttrsRuleClass
11
- include RngAttrsRule
12
- end
13
-
14
- module RngAttrsRule
15
- include Duxml::LazyOx
16
- include Ox
17
-
18
- # @param parent [Nokogiri::XML::Node] should be <grammar>
19
- # @return [Nokogiri::XML::Node] parent, but with additions of <define><attribute> to parent if does not already exist and <ref> to respective <define><doc>
20
- def relaxng(parent)
21
- # TODO this is here just to skip generation from namespaced attributes - fix later!!!
22
- return parent if attr_name.include?(':')
23
- # TODO
24
-
25
- # if new attribute declaration needed
26
- unless parent.Define(name: attr_name).any?
27
- new_def = Element.new('define')
28
- new_def[:name] = attr_name
29
- new_attr_def = Element.new('attribute')
30
- new_attr_def[:name] = attr_name
31
- new_def << new_attr_def
32
- parent << new_def
33
- end
34
-
35
- # update doc with ref, updating previous <optional> if available
36
- parent.nodes.reverse.each do |define|
37
- if define[:name] == subject
38
- element_def = define.nodes.first
39
- if requirement == '#REQUIRED'
40
- cur_element = element_def
41
- else
42
- if element_def.nodes.any? and element_def.nodes.last.name == 'optional'
43
- cur_element = element_def.nodes.last
44
- else
45
- cur_element = Element.new('optional')
46
- element_def << cur_element
47
- end
48
- end # if self[:requirement]=='#REQUIRED'
49
- new_ref = Element.new('ref')
50
- new_ref[:name] = attr_name
51
- cur_element << new_ref
52
- break
53
- end # if define[:name] == subject
54
- end # parent.element_children.any?
55
- parent
56
- end # def relaxng(parent)
57
- end # module RngAttrsRule
58
- end # module Duxml
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../rule/attrs_rule')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../../../doc/lazy_ox')
5
+ require 'ox'
6
+
7
+ module Duxml
8
+ module RngAttrsRule; end
9
+
10
+ class AttrsRuleClass
11
+ include RngAttrsRule
12
+ end
13
+
14
+ module RngAttrsRule
15
+ include Duxml::LazyOx
16
+ include Ox
17
+
18
+ # @param parent [Nokogiri::XML::Node] should be <grammar>
19
+ # @return [Nokogiri::XML::Node] parent, but with additions of <define><attribute> to parent if does not already exist and <ref> to respective <define><doc>
20
+ def relaxng(parent)
21
+ # TODO this is here just to skip generation from namespaced attributes - fix later!!!
22
+ return parent if attr_name.include?(':')
23
+ # TODO
24
+
25
+ # if new attribute declaration needed
26
+ unless parent.Define(name: attr_name).any?
27
+ new_def = Element.new('define')
28
+ new_def[:name] = attr_name
29
+ new_attr_def = Element.new('attribute')
30
+ new_attr_def[:name] = attr_name
31
+ new_def << new_attr_def
32
+ parent << new_def
33
+ end
34
+
35
+ # update doc with ref, updating previous <optional> if available
36
+ parent.nodes.reverse.each do |define|
37
+ if define[:name] == subject
38
+ element_def = define.nodes.first
39
+ if requirement == '#REQUIRED'
40
+ cur_element = element_def
41
+ else
42
+ if element_def.nodes.any? and element_def.nodes.last.name == 'optional'
43
+ cur_element = element_def.nodes.last
44
+ else
45
+ cur_element = Element.new('optional')
46
+ element_def << cur_element
47
+ end
48
+ end # if self[:requirement]=='#REQUIRED'
49
+ new_ref = Element.new('ref')
50
+ new_ref[:name] = attr_name
51
+ cur_element << new_ref
52
+ break
53
+ end # if define[:name] == subject
54
+ end # parent.element_children.any?
55
+ parent
56
+ end # def relaxng(parent)
57
+ end # module RngAttrsRule
58
+ end # module Duxml
@@ -1,83 +1,83 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../rule/children_rule')
4
-
5
- module Duxml
6
- module RngChildrenRule; end
7
-
8
- class ChildrenRuleClass
9
- include RngChildrenRule
10
- end
11
-
12
- module RngChildrenRule
13
- include Duxml::LazyOx
14
- include Ox
15
-
16
- # @param parent [Ox::Element] parent from RelaxNG document under construction (should be <grammar/>)
17
- # @return [Ox::Element] same parent but with addition of <define><doc> with #statement converted into <ref>'s
18
- # these are wrapped as needed in <zeroOrMore>,<oneOrMore>, or <optional>
19
- def relaxng(parent)
20
- nodes = parent.Define(name: subject)
21
- raise Exception if nodes.size > 1
22
-
23
- if nodes.first.nil?
24
- element_def = Element.new('element')
25
- element_def[:name] = subject
26
- define = Element.new('define')
27
- define[:name] = subject
28
- define << element_def
29
- parent << define
30
- else
31
- element_def = nodes.first.nodes.first
32
- end
33
-
34
- # loop through child requirements
35
- get_scanners.each do |scanner|
36
- # wrap in requirement node if needed
37
- operator_name = case scanner[:operator]
38
- when '?' then :optional
39
- when '*' then :zeroOrMore
40
- when '+' then :oneOrMore
41
- else nil
42
- end
43
- if operator_name
44
- cur_element = Element.new(operator_name.to_s)
45
- element_def << cur_element
46
- else
47
- cur_element = element_def
48
- end
49
-
50
- # if child requirement has enumerated options, wrap in <choice>
51
- element_array = scanner[:match].source.gsub('\b','').scan(Regexp.nmtoken).flatten.keep_if do |e| !e.empty? end
52
- if element_array.size > 1
53
- choice_el = Element.new 'choice'
54
- cur_element << choice_el
55
- cur_element = choice_el
56
- end
57
-
58
- # adding enumerated options as new element defs if needed
59
- element_array.each do |element_name|
60
- existing_defs = parent.Define(name: element_name)
61
- raise Exception if existing_defs.size > 1
62
- if existing_defs.empty?
63
- new_def = Element.new('define')
64
- new_def[:name] = element_name
65
- child_el_def = Element.new('element')
66
- child_el_def[:name] = element_name
67
- new_def << child_el_def
68
- parent << new_def
69
- end
70
-
71
- if element_name == '#PCDATA'
72
- cur_element << Element.new('text')
73
- else
74
- ref_node = Element.new('ref')
75
- ref_node[:name] = element_name
76
- cur_element << ref_node
77
- end
78
- end # element_array.each
79
- end # get_scanners.each
80
- parent
81
- end # def relaxng
82
- end # module RngChildrenRule
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../rule/children_rule')
4
+
5
+ module Duxml
6
+ module RngChildrenRule; end
7
+
8
+ class ChildrenRuleClass
9
+ include RngChildrenRule
10
+ end
11
+
12
+ module RngChildrenRule
13
+ include Duxml::LazyOx
14
+ include Ox
15
+
16
+ # @param parent [Ox::Element] parent from RelaxNG document under construction (should be <grammar/>)
17
+ # @return [Ox::Element] same parent but with addition of <define><doc> with #statement converted into <ref>'s
18
+ # these are wrapped as needed in <zeroOrMore>,<oneOrMore>, or <optional>
19
+ def relaxng(parent)
20
+ nodes = parent.Define(name: subject)
21
+ raise Exception if nodes.size > 1
22
+
23
+ if nodes.first.nil?
24
+ element_def = Element.new('element')
25
+ element_def[:name] = subject
26
+ define = Element.new('define')
27
+ define[:name] = subject
28
+ define << element_def
29
+ parent << define
30
+ else
31
+ element_def = nodes.first.nodes.first
32
+ end
33
+
34
+ # loop through child requirements
35
+ get_scanners.each do |scanner|
36
+ # wrap in requirement node if needed
37
+ operator_name = case scanner[:operator]
38
+ when '?' then :optional
39
+ when '*' then :zeroOrMore
40
+ when '+' then :oneOrMore
41
+ else nil
42
+ end
43
+ if operator_name
44
+ cur_element = Element.new(operator_name.to_s)
45
+ element_def << cur_element
46
+ else
47
+ cur_element = element_def
48
+ end
49
+
50
+ # if child requirement has enumerated options, wrap in <choice>
51
+ element_array = scanner[:match].source.gsub('\b','').scan(Regexp.nmtoken).flatten.keep_if do |e| !e.empty? end
52
+ if element_array.size > 1
53
+ choice_el = Element.new 'choice'
54
+ cur_element << choice_el
55
+ cur_element = choice_el
56
+ end
57
+
58
+ # adding enumerated options as new element defs if needed
59
+ element_array.each do |element_name|
60
+ existing_defs = parent.Define(name: element_name)
61
+ raise Exception if existing_defs.size > 1
62
+ if existing_defs.empty?
63
+ new_def = Element.new('define')
64
+ new_def[:name] = element_name
65
+ child_el_def = Element.new('element')
66
+ child_el_def[:name] = element_name
67
+ new_def << child_el_def
68
+ parent << new_def
69
+ end
70
+
71
+ if element_name == '#PCDATA'
72
+ cur_element << Element.new('text')
73
+ else
74
+ ref_node = Element.new('ref')
75
+ ref_node[:name] = element_name
76
+ cur_element << ref_node
77
+ end
78
+ end # element_array.each
79
+ end # get_scanners.each
80
+ parent
81
+ end # def relaxng
82
+ end # module RngChildrenRule
83
83
  end # module Duxml
@@ -1,44 +1,44 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../rule/value_rule')
4
-
5
- module Duxml
6
- module RngValueRule; end
7
-
8
- class ValueRuleClass
9
- include RngValueRule
10
- end
11
-
12
- module RngValueRule
13
- include Duxml::LazyOx
14
- # @param parent [Nokogiri::XML::Node] <grammar> i.e. parent node in RelaxNG document, NOT this Rule's document
15
- # @return [Nokogiri::XML::Node] parent, but adds to corresponding <define><attribute> a child <data type="#{statement}">
16
- # where #statement can be 'CDATA', 'NMTOKEN', etc.
17
- def relaxng(parent)
18
- parent.Define.each do |define|
19
- if define[:name] == attr_name
20
- attr_def = define.nodes.first
21
- unless attr_def.nodes.any?
22
- data_type = statement == 'CDATA' ? 'string' : statement
23
- if data_type.include?('|')
24
- choice_node = Element.new('choice')
25
- attr_def << choice_node
26
- data_type.split(/[\(\|\)]/).each do |en_val|
27
- if !en_val.empty? && Regexp.nmtoken.match(en_val)
28
- value_def = Element.new('value')
29
- value_def << en_val
30
- choice_node << value_def
31
- end
32
- end
33
- else
34
- data_def = Element.new('data')
35
- data_def[:type] = data_type
36
- attr_def << data_def
37
- end
38
- end # unless attr_def.nodes.any?
39
- return parent
40
- end # if define[:name] == attr_name
41
- end # parent.nodes.each
42
- end # def relaxng
43
- end # module RngValuesRule
44
- end # module Duxml
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../rule/value_rule')
4
+
5
+ module Duxml
6
+ module RngValueRule; end
7
+
8
+ class ValueRuleClass
9
+ include RngValueRule
10
+ end
11
+
12
+ module RngValueRule
13
+ include Duxml::LazyOx
14
+ # @param parent [Nokogiri::XML::Node] <grammar> i.e. parent node in RelaxNG document, NOT this Rule's document
15
+ # @return [Nokogiri::XML::Node] parent, but adds to corresponding <define><attribute> a child <data type="#{statement}">
16
+ # where #statement can be 'CDATA', 'NMTOKEN', etc.
17
+ def relaxng(parent)
18
+ parent.Define.each do |define|
19
+ if define[:name] == attr_name
20
+ attr_def = define.nodes.first
21
+ unless attr_def.nodes.any?
22
+ data_type = statement == 'CDATA' ? 'string' : statement
23
+ if data_type.include?('|')
24
+ choice_node = Element.new('choice')
25
+ attr_def << choice_node
26
+ data_type.split(/[\(\|\)]/).each do |en_val|
27
+ if !en_val.empty? && Regexp.nmtoken.match(en_val)
28
+ value_def = Element.new('value')
29
+ value_def << en_val
30
+ choice_node << value_def
31
+ end
32
+ end
33
+ else
34
+ data_def = Element.new('data')
35
+ data_def[:type] = data_type
36
+ attr_def << data_def
37
+ end
38
+ end # unless attr_def.nodes.any?
39
+ return parent
40
+ end # if define[:name] == attr_name
41
+ end # parent.nodes.each
42
+ end # def relaxng
43
+ end # module RngValuesRule
44
+ end # module Duxml