Class: Sheng::MergeFieldSet
- Inherits:
-
Object
- Object
- Sheng::MergeFieldSet
- Includes:
- PathHelpers
- Defined in:
- lib/sheng/merge_field_set.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#errors ⇒ Object
readonly
Returns the value of attribute errors.
-
#key ⇒ Object
readonly
Returns the value of attribute key.
-
#xml_document ⇒ Object
readonly
Returns the value of attribute xml_document.
-
#xml_fragment ⇒ Object
readonly
Returns the value of attribute xml_fragment.
Instance Method Summary collapse
- #add_errors_from_node(node) ⇒ Object
- #basic_node_elements ⇒ Object
- #basic_nodes ⇒ Object
-
#initialize(key, xml_fragment) ⇒ MergeFieldSet
constructor
A new instance of MergeFieldSet.
- #interpolate(data_set) ⇒ Object
-
#nodes ⇒ Object
Returns an array of nodes for interpolation, which can be a mix of MergeField, CheckBox, ConditionalBlock, and Sequence instances.
- #required_hash(placeholder = nil) ⇒ Object
- #to_tree ⇒ Object
Methods included from PathHelpers
#checkbox_element_path, #mergefield_element_path, #new_mergefield_element_path
Constructor Details
#initialize(key, xml_fragment) ⇒ MergeFieldSet
Returns a new instance of MergeFieldSet.
9 10 11 12 13 14 |
# File 'lib/sheng/merge_field_set.rb', line 9 def initialize(key, xml_fragment) @key = key @xml_fragment = xml_fragment @xml_document = xml_fragment.document @errors = {} end |
Instance Attribute Details
#errors ⇒ Object (readonly)
Returns the value of attribute errors.
7 8 9 |
# File 'lib/sheng/merge_field_set.rb', line 7 def errors @errors end |
#key ⇒ Object (readonly)
Returns the value of attribute key.
7 8 9 |
# File 'lib/sheng/merge_field_set.rb', line 7 def key @key end |
#xml_document ⇒ Object (readonly)
Returns the value of attribute xml_document.
7 8 9 |
# File 'lib/sheng/merge_field_set.rb', line 7 def xml_document @xml_document end |
#xml_fragment ⇒ Object (readonly)
Returns the value of attribute xml_fragment.
7 8 9 |
# File 'lib/sheng/merge_field_set.rb', line 7 def xml_fragment @xml_fragment end |
Instance Method Details
#add_errors_from_node(node) ⇒ Object
23 24 25 26 27 |
# File 'lib/sheng/merge_field_set.rb', line 23 def add_errors_from_node(node) if node.errors.present? errors[node.raw_key] = node.errors end end |
#basic_node_elements ⇒ Object
94 95 96 97 98 |
# File 'lib/sheng/merge_field_set.rb', line 94 def basic_node_elements child_nodes = xml_fragment.xpath(".//#{mergefield_element_path}|.//#{new_mergefield_element_path}|.//#{checkbox_element_path}").to_a child_nodes += xml_fragment.select { |element| element.name == "fldSimple" } child_nodes end |
#basic_nodes ⇒ Object
84 85 86 87 88 89 90 91 92 |
# File 'lib/sheng/merge_field_set.rb', line 84 def basic_nodes basic_node_elements.map { |element| if element.xpath('.//w:checkBox').first CheckBox.from_element(element) else MergeField.from_element(element) end }.compact end |
#interpolate(data_set) ⇒ Object
16 17 18 19 20 21 |
# File 'lib/sheng/merge_field_set.rb', line 16 def interpolate(data_set) nodes.each do |node| node.interpolate(data_set) add_errors_from_node(node) end end |
#nodes ⇒ Object
Returns an array of nodes for interpolation, which can be a mix of MergeField, CheckBox, ConditionalBlock, and Sequence instances.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/sheng/merge_field_set.rb', line 63 def nodes @nodes ||= begin current_block_key = nil basic_nodes.map do |node| next if node.is_a?(CheckBox) && current_block_key if node.is_a? MergeField if current_block_key if node.is_end? && node.start_key == current_block_key current_block_key = nil end next elsif node.is_start? current_block_key = node.start_key node = node.block_type.new(node) end end node end.compact end end |
#required_hash(placeholder = nil) ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/sheng/merge_field_set.rb', line 42 def required_hash(placeholder = nil) return nil if is_a?(Sequence) && array_of_primitives_expected? nodes.inject({}) do |node_list, node| hsh = if node.is_a?(ConditionalBlock) node.required_hash(placeholder) elsif node.is_a?(MergeField) node.required_hash(placeholder: placeholder) else value = node.is_a?(Block) ? [node.required_hash(placeholder)].compact : placeholder key_parts = node.key.split(/\./) last_key = key_parts.pop key_parts.reverse.inject(last_key => value) do |memo, key| memo = { key => memo }; memo end end Sheng::Support.merge_required_hashes(node_list, hsh) end end |
#to_tree ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/sheng/merge_field_set.rb', line 29 def to_tree nodes.map do |node| hsh = { :type => node.class.name.underscore.gsub(/^sheng\//, ''), :key => node.raw_key } if node.is_a? MergeFieldSet hsh[:nodes] = node.to_tree end hsh end end |