Class: Sheng::MergeFieldSet

Inherits:
Object
  • Object
show all
Includes:
PathHelpers
Defined in:
lib/sheng/merge_field_set.rb

Direct Known Subclasses

Block

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#errorsObject (readonly)

Returns the value of attribute errors.



7
8
9
# File 'lib/sheng/merge_field_set.rb', line 7

def errors
  @errors
end

#keyObject (readonly)

Returns the value of attribute key.



7
8
9
# File 'lib/sheng/merge_field_set.rb', line 7

def key
  @key
end

#xml_documentObject (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_fragmentObject (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_elementsObject



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_nodesObject



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

#nodesObject

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_treeObject



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