# frozen_string_literal: true module OoxmlParser # Class Header Footer classes class HeaderFooter < OOXMLDocumentObject # @return [Integer] id of header-footer attr_reader :id # @return [Array] list of elements if object attr_reader :elements # @return [Symbol] `:header` or `:footer` attr_reader :type # @return [String] suffix for object files attr_reader :path_suffix def initialize(type = :header, parent: nil) @type = type @elements = [] super(parent: parent) end # @return [String] string for search of xpath def xpath_for_search "//w:#{path_suffix}" end # @return [String] string with xml path def xml_path "word/#{path_suffix}s.xml" end # Parse type and path suffix by node type # @param [Nokogiri::XML:Node] node with HeaderFooter def parse_type(node) case node.name when 'footnoteReference' @path_suffix = 'footnote' @type = :header when 'endnoteReference' @path_suffix = 'endnote' @type = :footer end end # Parse HeaderFooter # @param [Nokogiri::XML:Node] node with HeaderFooter # @return [HeaderFooter] result of parsing def parse(node) node.attributes.each do |key, value| case key when 'id' @id = value.value.to_i end end parse_type(node) doc = parse_xml(root_object.unpacked_folder + xml_path) doc.search(xpath_for_search).each do |footnote| footnote_id = nil footnote.attributes.each do |key, value| case key when 'id' footnote_id = value.value.to_i end end next unless footnote_id == @id paragraph_number = 0 footnote.xpath('w:p').each do |paragraph| @elements << root_object.default_paragraph_style.dup.parse(paragraph, paragraph_number, root_object.default_run_style, parent: self) paragraph_number += 1 end end self end end end