duxml 0.8.8 → 0.8.9

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.
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