class Sheng::MergeFieldSet

Attributes

errors[R]
key[R]
xml_document[R]
xml_fragment[R]

Public Class Methods

new(key, xml_fragment) click to toggle source
# 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

Public Instance Methods

add_errors_from_node(node) click to toggle source
# 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() click to toggle source
# 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() click to toggle source
# 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) click to toggle source
# 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() click to toggle source

Returns an array of nodes for interpolation, which can be a mix of MergeField, CheckBox, ConditionalBlock, and Sequence instances.

# 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) click to toggle source
# 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() click to toggle source
# 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