duxml 0.8.8 → 0.8.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/validate_xml +30 -30
- data/lib/duxml.rb +76 -76
- data/lib/duxml/doc.rb +108 -91
- data/lib/duxml/doc/element.rb +250 -250
- data/lib/duxml/doc/lazy_ox.rb +167 -167
- data/lib/duxml/doc/node_set.rb +38 -38
- data/lib/duxml/meta.rb +72 -72
- data/lib/duxml/meta/grammar.rb +133 -133
- data/lib/duxml/meta/grammar/pattern.rb +111 -111
- data/lib/duxml/meta/grammar/pattern/attr_name_pattern.rb +36 -36
- data/lib/duxml/meta/grammar/pattern/attr_val_pattern.rb +36 -36
- data/lib/duxml/meta/grammar/pattern/child_pattern.rb +60 -60
- data/lib/duxml/meta/grammar/pattern/text_pattern.rb +31 -31
- data/lib/duxml/meta/grammar/pattern_maker.rb +68 -68
- data/lib/duxml/meta/grammar/relax_ng.rb +39 -39
- data/lib/duxml/meta/grammar/relax_ng/attrs_rule.rb +58 -58
- data/lib/duxml/meta/grammar/relax_ng/children_rule.rb +82 -82
- data/lib/duxml/meta/grammar/relax_ng/value_rule.rb +44 -44
- data/lib/duxml/meta/grammar/rule.rb +58 -58
- data/lib/duxml/meta/grammar/rule/attrs_rule.rb +77 -77
- data/lib/duxml/meta/grammar/rule/children_rule.rb +135 -135
- data/lib/duxml/meta/grammar/rule/text_rule.rb +39 -39
- data/lib/duxml/meta/grammar/rule/value_rule.rb +110 -110
- data/lib/duxml/meta/grammar/spreadsheet.rb +34 -34
- data/lib/duxml/meta/history.rb +88 -88
- data/lib/duxml/meta/history/add.rb +30 -30
- data/lib/duxml/meta/history/change.rb +70 -70
- data/lib/duxml/meta/history/change_attr.rb +33 -33
- data/lib/duxml/meta/history/change_text.rb +32 -32
- data/lib/duxml/meta/history/error.rb +24 -24
- data/lib/duxml/meta/history/new_attr.rb +32 -32
- data/lib/duxml/meta/history/new_text.rb +36 -36
- data/lib/duxml/meta/history/qualify_error.rb +21 -21
- data/lib/duxml/meta/history/remove.rb +27 -27
- data/lib/duxml/meta/history/undo.rb +23 -23
- data/lib/duxml/meta/history/validate_error.rb +20 -20
- data/lib/duxml/reportable.rb +28 -28
- data/lib/duxml/ruby_ext/fixnum.rb +55 -55
- data/lib/duxml/ruby_ext/module.rb +11 -11
- data/lib/duxml/ruby_ext/object.rb +13 -13
- data/lib/duxml/ruby_ext/regexp.rb +19 -19
- data/lib/duxml/ruby_ext/string.rb +37 -37
- data/lib/duxml/saxer.rb +75 -75
- metadata +12 -12
@@ -1,36 +1,36 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
-
|
5
|
-
module Duxml
|
6
|
-
module AttrNamePattern; end
|
7
|
-
# pattern representing relationship between an object and one of its attributes
|
8
|
-
class AttrNamePatternClass < PatternClass
|
9
|
-
include AttrNamePattern
|
10
|
-
|
11
|
-
# @param _subject [Duxml::Element] subject doc
|
12
|
-
# @param _attr_name [String] name of attribute
|
13
|
-
def initialize(_subject, _attr_name)
|
14
|
-
@attr_name = _attr_name
|
15
|
-
super _subject
|
16
|
-
end
|
17
|
-
|
18
|
-
attr_reader :attr_name
|
19
|
-
end
|
20
|
-
|
21
|
-
module AttrNamePattern
|
22
|
-
def relationship
|
23
|
-
'attribute'
|
24
|
-
end
|
25
|
-
|
26
|
-
# @return [Boolean] true if subject does not have the attr_name; false otherwise
|
27
|
-
def abstract?
|
28
|
-
subject[attr_name].nil?
|
29
|
-
end
|
30
|
-
|
31
|
-
def description
|
32
|
-
abstract? ? "#{subject.description} does not have #{relationship} [#{attr_name}]" :
|
33
|
-
"#{subject.description}'s #{relationship} [#{attr_name}]"
|
34
|
-
end
|
35
|
-
end # class AttrNamePattern
|
36
|
-
end # module Duxml
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
+
|
5
|
+
module Duxml
|
6
|
+
module AttrNamePattern; end
|
7
|
+
# pattern representing relationship between an object and one of its attributes
|
8
|
+
class AttrNamePatternClass < PatternClass
|
9
|
+
include AttrNamePattern
|
10
|
+
|
11
|
+
# @param _subject [Duxml::Element] subject doc
|
12
|
+
# @param _attr_name [String] name of attribute
|
13
|
+
def initialize(_subject, _attr_name)
|
14
|
+
@attr_name = _attr_name
|
15
|
+
super _subject
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :attr_name
|
19
|
+
end
|
20
|
+
|
21
|
+
module AttrNamePattern
|
22
|
+
def relationship
|
23
|
+
'attribute'
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Boolean] true if subject does not have the attr_name; false otherwise
|
27
|
+
def abstract?
|
28
|
+
subject[attr_name].nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
def description
|
32
|
+
abstract? ? "#{subject.description} does not have #{relationship} [#{attr_name}]" :
|
33
|
+
"#{subject.description}'s #{relationship} [#{attr_name}]"
|
34
|
+
end
|
35
|
+
end # class AttrNamePattern
|
36
|
+
end # module Duxml
|
@@ -1,36 +1,36 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
-
|
5
|
-
module Duxml
|
6
|
-
module AttrValPattern; end
|
7
|
-
|
8
|
-
# pattern representing relationship between an object's attribute and its value
|
9
|
-
class AttrValPatternClass < PatternClass
|
10
|
-
include AttrValPattern
|
11
|
-
|
12
|
-
# @param _subject [Element] subject element
|
13
|
-
# @param _attr_name [String] name of attribute whose value is the object of this pattern
|
14
|
-
def initialize(_subject, _attr_name)
|
15
|
-
@attr_name = _attr_name
|
16
|
-
super _subject
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_reader :subject, :attr_name
|
20
|
-
end
|
21
|
-
|
22
|
-
module AttrValPattern
|
23
|
-
def relationship
|
24
|
-
'value'
|
25
|
-
end
|
26
|
-
|
27
|
-
def description
|
28
|
-
"#{subject.description}'s @#{attr_name} #{relationship} of '#{value}'"
|
29
|
-
end
|
30
|
-
|
31
|
-
# current value of this attribute
|
32
|
-
def value
|
33
|
-
subject[attr_name]
|
34
|
-
end
|
35
|
-
end # class AttrValPattern
|
36
|
-
end # module Duxml
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
+
|
5
|
+
module Duxml
|
6
|
+
module AttrValPattern; end
|
7
|
+
|
8
|
+
# pattern representing relationship between an object's attribute and its value
|
9
|
+
class AttrValPatternClass < PatternClass
|
10
|
+
include AttrValPattern
|
11
|
+
|
12
|
+
# @param _subject [Element] subject element
|
13
|
+
# @param _attr_name [String] name of attribute whose value is the object of this pattern
|
14
|
+
def initialize(_subject, _attr_name)
|
15
|
+
@attr_name = _attr_name
|
16
|
+
super _subject
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :subject, :attr_name
|
20
|
+
end
|
21
|
+
|
22
|
+
module AttrValPattern
|
23
|
+
def relationship
|
24
|
+
'value'
|
25
|
+
end
|
26
|
+
|
27
|
+
def description
|
28
|
+
"#{subject.description}'s @#{attr_name} #{relationship} of '#{value}'"
|
29
|
+
end
|
30
|
+
|
31
|
+
# current value of this attribute
|
32
|
+
def value
|
33
|
+
subject[attr_name]
|
34
|
+
end
|
35
|
+
end # class AttrValPattern
|
36
|
+
end # module Duxml
|
@@ -1,60 +1,60 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../ruby_ext/fixnum')
|
5
|
-
|
6
|
-
module Duxml
|
7
|
-
module ChildPattern; end
|
8
|
-
# pattern representing relationship between an object and its child
|
9
|
-
class ChildPatternClass < PatternClass
|
10
|
-
include ChildPattern
|
11
|
-
|
12
|
-
# @param _subject [Duxml::Element] parent element
|
13
|
-
# @param _child [Fixnum] child node
|
14
|
-
def initialize(_subject, _child, _index)
|
15
|
-
@child, @index = _child, _index
|
16
|
-
super _subject
|
17
|
-
end
|
18
|
-
|
19
|
-
alias_method :parent, :subject
|
20
|
-
attr_reader :child, :index
|
21
|
-
end # class ChildPatternClass
|
22
|
-
|
23
|
-
# null child patterns represent and parent child relationship where the child
|
24
|
-
# is required by the Grammar but the element is missing that child
|
25
|
-
class NullChildPatternClass < PatternClass
|
26
|
-
include ChildPattern
|
27
|
-
|
28
|
-
# @param _subject [Element] parent element
|
29
|
-
# @param _missing_child [String] nmtoken for missing child element
|
30
|
-
def initialize(_subject, _missing_child, _index=-1)
|
31
|
-
@missing_child, @index = _missing_child, _index
|
32
|
-
super _subject
|
33
|
-
end
|
34
|
-
|
35
|
-
def relationship
|
36
|
-
'missing child'
|
37
|
-
end
|
38
|
-
|
39
|
-
# @return [String] description of this child pattern
|
40
|
-
def description
|
41
|
-
"#{subject.description} #{relationship} <#{child}>"
|
42
|
-
end
|
43
|
-
|
44
|
-
attr_reader :missing_child, :index
|
45
|
-
alias_method :child, :missing_child
|
46
|
-
alias_method :parent, :subject
|
47
|
-
end
|
48
|
-
|
49
|
-
module ChildPattern
|
50
|
-
# @return [String] describes relationship between parent and child
|
51
|
-
def relationship
|
52
|
-
"#{(index+1).ordinal_name} #{super}"
|
53
|
-
end
|
54
|
-
|
55
|
-
# @return [String] description of this child pattern
|
56
|
-
def description
|
57
|
-
"#{subject.description}'s #{relationship} #{child.description}"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end # module Duxml
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../ruby_ext/fixnum')
|
5
|
+
|
6
|
+
module Duxml
|
7
|
+
module ChildPattern; end
|
8
|
+
# pattern representing relationship between an object and its child
|
9
|
+
class ChildPatternClass < PatternClass
|
10
|
+
include ChildPattern
|
11
|
+
|
12
|
+
# @param _subject [Duxml::Element] parent element
|
13
|
+
# @param _child [Fixnum] child node
|
14
|
+
def initialize(_subject, _child, _index)
|
15
|
+
@child, @index = _child, _index
|
16
|
+
super _subject
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :parent, :subject
|
20
|
+
attr_reader :child, :index
|
21
|
+
end # class ChildPatternClass
|
22
|
+
|
23
|
+
# null child patterns represent and parent child relationship where the child
|
24
|
+
# is required by the Grammar but the element is missing that child
|
25
|
+
class NullChildPatternClass < PatternClass
|
26
|
+
include ChildPattern
|
27
|
+
|
28
|
+
# @param _subject [Element] parent element
|
29
|
+
# @param _missing_child [String] nmtoken for missing child element
|
30
|
+
def initialize(_subject, _missing_child, _index=-1)
|
31
|
+
@missing_child, @index = _missing_child, _index
|
32
|
+
super _subject
|
33
|
+
end
|
34
|
+
|
35
|
+
def relationship
|
36
|
+
'missing child'
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [String] description of this child pattern
|
40
|
+
def description
|
41
|
+
"#{subject.description} #{relationship} <#{child}>"
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :missing_child, :index
|
45
|
+
alias_method :child, :missing_child
|
46
|
+
alias_method :parent, :subject
|
47
|
+
end
|
48
|
+
|
49
|
+
module ChildPattern
|
50
|
+
# @return [String] describes relationship between parent and child
|
51
|
+
def relationship
|
52
|
+
"#{(index+1).ordinal_name} #{super}"
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [String] description of this child pattern
|
56
|
+
def description
|
57
|
+
"#{subject.description}'s #{relationship} #{child.description}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end # module Duxml
|
@@ -1,31 +1,31 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
-
|
5
|
-
module Duxml
|
6
|
-
module TextPattern; end
|
7
|
-
# pattern representing relationship between an object and its text-only child
|
8
|
-
class TextPatternClass < PatternClass
|
9
|
-
include TextPattern
|
10
|
-
|
11
|
-
# @param _subject [Ox::Element] parent of text node
|
12
|
-
# @param _index [Fixnum] index of text node
|
13
|
-
def initialize(_subject, _str, _index)
|
14
|
-
@index = _index
|
15
|
-
@string = _str
|
16
|
-
super _subject
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_reader :subject, :index, :str
|
20
|
-
end
|
21
|
-
|
22
|
-
module TextPattern
|
23
|
-
def text
|
24
|
-
subject.nodes[index]
|
25
|
-
end
|
26
|
-
|
27
|
-
def description
|
28
|
-
"#{subject.description}'s #{relationship} is '#{text}'"
|
29
|
-
end
|
30
|
-
end # class ContentPattern
|
31
|
-
end # module Duxml
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../grammar/pattern')
|
4
|
+
|
5
|
+
module Duxml
|
6
|
+
module TextPattern; end
|
7
|
+
# pattern representing relationship between an object and its text-only child
|
8
|
+
class TextPatternClass < PatternClass
|
9
|
+
include TextPattern
|
10
|
+
|
11
|
+
# @param _subject [Ox::Element] parent of text node
|
12
|
+
# @param _index [Fixnum] index of text node
|
13
|
+
def initialize(_subject, _str, _index)
|
14
|
+
@index = _index
|
15
|
+
@string = _str
|
16
|
+
super _subject
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :subject, :index, :str
|
20
|
+
end
|
21
|
+
|
22
|
+
module TextPattern
|
23
|
+
def text
|
24
|
+
subject.nodes[index]
|
25
|
+
end
|
26
|
+
|
27
|
+
def description
|
28
|
+
"#{subject.description}'s #{relationship} is '#{text}'"
|
29
|
+
end
|
30
|
+
end # class ContentPattern
|
31
|
+
end # module Duxml
|
@@ -1,69 +1,69 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/pattern/child_pattern')
|
4
|
-
require File.expand_path(File.dirname(__FILE__) + '/pattern/text_pattern')
|
5
|
-
require File.expand_path(File.dirname(__FILE__) + '/pattern/attr_name_pattern')
|
6
|
-
require File.expand_path(File.dirname(__FILE__) + '/pattern/attr_val_pattern')
|
7
|
-
|
8
|
-
module Duxml
|
9
|
-
# helper methods to create Patterns from a given Element's relationships with its members
|
10
|
-
module PatternMaker
|
11
|
-
include Duxml
|
12
|
-
# @param node [Duxml::Element] doc whose relationships are to be made into patterns
|
13
|
-
# @return [Array[Duxml::Pattern]] array of patterns representing every relationship of this XMl node and its members
|
14
|
-
def get_relationships(node)
|
15
|
-
[get_child_patterns(node),
|
16
|
-
get_null_child_patterns(node),
|
17
|
-
get_existing_attr_patterns(node),
|
18
|
-
get_null_attr_patterns(node)].flatten
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param node [Duxml::Element] doc whose relationships are to be made into patterns
|
22
|
-
# @return [Array[Duxml::AttrNamePattern, Duxml::AttrValPattern]] one pattern for each existing attribute
|
23
|
-
def get_existing_attr_patterns(node)
|
24
|
-
# check existing attributes
|
25
|
-
node.attributes.collect do |k, v|
|
26
|
-
[AttrNamePatternClass.new(node, k), AttrValPatternClass.new(node, k)]
|
27
|
-
end.flatten
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param node [Element] doc whose relationships are to be made into patterns
|
31
|
-
# @return [Array[AttrNamePattern]] one pattern for each attribute that should but does not exist
|
32
|
-
def get_null_attr_patterns(node)
|
33
|
-
self.AttrsRuleClass.collect do |attr_rule|
|
34
|
-
if attr_rule.required? && node.name == attr_rule.subject
|
35
|
-
AttrNamePatternClass.new(node, attr_rule.attr_name) unless node[attr_rule.attr_name]
|
36
|
-
end
|
37
|
-
end.compact
|
38
|
-
end
|
39
|
-
|
40
|
-
# @param node [Duxml::Element] doc whose relationships are to be made into patterns
|
41
|
-
# @return [Array[ChildPattern]] one pattern for each child that should be there but isn't
|
42
|
-
def get_null_child_patterns(node)
|
43
|
-
self.ChildrenRuleClass.each do |child_rule|
|
44
|
-
if node.name == child_rule.subject
|
45
|
-
return child_rule.required_children.collect do |required_child_type|
|
46
|
-
unless node.nodes.any? do |n| n.name == required_child_type end
|
47
|
-
NullChildPatternClass.new(node, required_child_type, -1)
|
48
|
-
end
|
49
|
-
end.compact
|
50
|
-
end
|
51
|
-
end
|
52
|
-
[]
|
53
|
-
end
|
54
|
-
|
55
|
-
# @param node [Duxml::Element] object whose relationships are to be made into patterns
|
56
|
-
# @return [Array[Duxml::ChildPattern, Duxml::ContentPattern]] one pattern for each child that exists
|
57
|
-
def get_child_patterns(node)
|
58
|
-
i = -1
|
59
|
-
node.nodes.collect do |child|
|
60
|
-
i += 1
|
61
|
-
if child.is_a?(String)
|
62
|
-
TextPatternClass.new(node, child, i)
|
63
|
-
else
|
64
|
-
ChildPatternClass.new(node, child, i)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end # def get_child_patterns
|
68
|
-
end # module PatternMaker
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/pattern/child_pattern')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/pattern/text_pattern')
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/pattern/attr_name_pattern')
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/pattern/attr_val_pattern')
|
7
|
+
|
8
|
+
module Duxml
|
9
|
+
# helper methods to create Patterns from a given Element's relationships with its members
|
10
|
+
module PatternMaker
|
11
|
+
include Duxml
|
12
|
+
# @param node [Duxml::Element] doc whose relationships are to be made into patterns
|
13
|
+
# @return [Array[Duxml::Pattern]] array of patterns representing every relationship of this XMl node and its members
|
14
|
+
def get_relationships(node)
|
15
|
+
[get_child_patterns(node),
|
16
|
+
get_null_child_patterns(node),
|
17
|
+
get_existing_attr_patterns(node),
|
18
|
+
get_null_attr_patterns(node)].flatten
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param node [Duxml::Element] doc whose relationships are to be made into patterns
|
22
|
+
# @return [Array[Duxml::AttrNamePattern, Duxml::AttrValPattern]] one pattern for each existing attribute
|
23
|
+
def get_existing_attr_patterns(node)
|
24
|
+
# check existing attributes
|
25
|
+
node.attributes.collect do |k, v|
|
26
|
+
[AttrNamePatternClass.new(node, k), AttrValPatternClass.new(node, k)]
|
27
|
+
end.flatten
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param node [Element] doc whose relationships are to be made into patterns
|
31
|
+
# @return [Array[AttrNamePattern]] one pattern for each attribute that should but does not exist
|
32
|
+
def get_null_attr_patterns(node)
|
33
|
+
self.AttrsRuleClass.collect do |attr_rule|
|
34
|
+
if attr_rule.required? && node.name == attr_rule.subject
|
35
|
+
AttrNamePatternClass.new(node, attr_rule.attr_name) unless node[attr_rule.attr_name]
|
36
|
+
end
|
37
|
+
end.compact
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param node [Duxml::Element] doc whose relationships are to be made into patterns
|
41
|
+
# @return [Array[ChildPattern]] one pattern for each child that should be there but isn't
|
42
|
+
def get_null_child_patterns(node)
|
43
|
+
self.ChildrenRuleClass.each do |child_rule|
|
44
|
+
if node.name == child_rule.subject
|
45
|
+
return child_rule.required_children.collect do |required_child_type|
|
46
|
+
unless node.nodes.any? do |n| n.name == required_child_type end
|
47
|
+
NullChildPatternClass.new(node, required_child_type, -1)
|
48
|
+
end
|
49
|
+
end.compact
|
50
|
+
end
|
51
|
+
end
|
52
|
+
[]
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param node [Duxml::Element] object whose relationships are to be made into patterns
|
56
|
+
# @return [Array[Duxml::ChildPattern, Duxml::ContentPattern]] one pattern for each child that exists
|
57
|
+
def get_child_patterns(node)
|
58
|
+
i = -1
|
59
|
+
node.nodes.collect do |child|
|
60
|
+
i += 1
|
61
|
+
if child.is_a?(String)
|
62
|
+
TextPatternClass.new(node, child, i)
|
63
|
+
else
|
64
|
+
ChildPatternClass.new(node, child, i)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end # def get_child_patterns
|
68
|
+
end # module PatternMaker
|
69
69
|
end # module Duxml
|