Class: Sheng::Block

Inherits:
MergeFieldSet show all
Defined in:
lib/sheng/block.rb

Direct Known Subclasses

ConditionalBlock, Sequence

Defined Under Namespace

Classes: ImproperNesting, MissingEndTag

Instance Attribute Summary

Attributes inherited from MergeFieldSet

#errors, #key, #xml_document, #xml_fragment

Instance Method Summary collapse

Methods inherited from MergeFieldSet

#add_errors_from_node, #basic_node_elements, #basic_nodes, #interpolate, #nodes, #required_hash, #to_tree

Methods included from PathHelpers

#checkbox_element_path, #mergefield_element_path, #new_mergefield_element_path

Constructor Details

#initialize(merge_field) ⇒ Block

Returns a new instance of Block.



6
7
8
9
10
11
# 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

Instance Method Details

#extract_mergefields(fragment) ⇒ Object



17
18
19
20
21
22
23
24
25
26
# 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_fieldObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 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_keyObject



13
14
15
# File 'lib/sheng/block.rb', line 13

def raw_key
  @start_field.raw_key
end