Class: Sheng::Block
- Inherits:
-
MergeFieldSet
- Object
- MergeFieldSet
- Sheng::Block
- Defined in:
- lib/sheng/block.rb
Direct Known Subclasses
Defined Under Namespace
Classes: ImproperNesting, MissingEndTag
Instance Attribute Summary
Attributes inherited from MergeFieldSet
#errors, #key, #xml_document, #xml_fragment
Instance Method Summary collapse
- #extract_mergefields(fragment) ⇒ Object
- #get_node_set_and_end_field ⇒ Object
-
#initialize(merge_field) ⇒ Block
constructor
A new instance of Block.
- #raw_key ⇒ Object
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_field ⇒ Object
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 = [@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? .push mergefield elsif mergefield.is_end? last_start = .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 .empty? end_field = mergefield end end end unless end_field node_set << next_node end end [node_set, end_field] end |
#raw_key ⇒ Object
13 14 15 |
# File 'lib/sheng/block.rb', line 13 def raw_key @start_field.raw_key end |