class Sheng::Block

Public Class Methods

new(merge_field) click to toggle source
# File lib/sheng/block.rb, line 6
def initialize(merge_field)
  @start_field = merge_field
  @key = merge_field.key
  @xml_document = merge_field.xml_document
  @xml_fragment, @end_field = get_node_set_and_end_field
end

Public Instance Methods

extract_mergefields(fragment) click to toggle source
# File lib/sheng/block.rb, line 17
def extract_mergefields(fragment)
  if fragment.name == "fldSimple"
    return [MergeField.from_element(fragment)].compact
  end
  fragment.xpath(".//#{mergefield_element_path}|.//#{new_mergefield_element_path}").map do |field_simple|
    unless field_simple.at('.//w:checkBox')
      MergeField.from_element(field_simple)
    end
  end.compact
end
get_node_set_and_end_field() click to toggle source
# File lib/sheng/block.rb, line 28
def get_node_set_and_end_field
  node_set = Nokogiri::XML::NodeSet.new(@start_field.xml_document)
  next_node, end_field = @start_field, nil
  embedded_starts = [@start_field]
  while !end_field
    next_node = next_node.next_element

    if next_node.nil?
      raise MissingEndTag, "no end tag for #{@start_field.block_prefix}:#{key}"
    end

    extract_mergefields(next_node).each do |mergefield|
      if mergefield.is_start?
        embedded_starts.push mergefield
      elsif mergefield.is_end?
        last_start = embedded_starts.pop
        if last_start.key != mergefield.key
          raise ImproperNesting, "expected end tag for #{last_start.block_prefix}:#{last_start.key}, got #{mergefield.block_prefix}:#{mergefield.key}"
        elsif embedded_starts.empty?
          end_field = mergefield
        end
      end
    end

    unless end_field
      node_set << next_node
    end
  end
  [node_set, end_field]
end
raw_key() click to toggle source
# File lib/sheng/block.rb, line 13
def raw_key
  @start_field.raw_key
end