class DocTemplate::Tables::Target
Constants
- HEADER_LABEL_PIECE
- TEMPLATE
Public Instance Methods
parse(fragment, *_args)
click to toggle source
# File lib/doc_template/tables/target.rb, line 9 def parse(fragment, *_args) path = ".//table/*/tr[1]/td[1][case_insensitive_contains(.//*/text(), '#{HEADER_LABEL_PIECE}')]" return unless (element = fragment.at_xpath path, XpathFunctions.new) return unless (table = element.ancestors('table').first) @target_data = fetch table template = File.read DocTemplate::Tags::BaseTag.template_path_for(TEMPLATE) content = ERB.new(template).result(binding).squish content = DocTemplate::Document.parse Nokogiri::HTML.fragment(content) # remove next element if it's empty paragraph # (quick fix before refactoring at https://github.com/learningtapestry/unbounded/issues/780) el_next = table.next_element el_next.remove if el_next&.name == 'p' && el_next.content.blank? table.replace content&.render content end
Private Instance Methods
fetch(table)
click to toggle source
# File lib/doc_template/tables/target.rb, line 31 def fetch(table) data = {}.tap do |result| # Need to handle every `p` and `ul` elements result[:long_term_title] = table.xpath('*//tr[1]/td').map(&:content).join(' ') result[:long_term] = table.xpath('*//tr[2]/td/p').map(&:content).join('; ') result[:long_term] += table.xpath('*//tr[3]/td/ul/li').map(&:content).join('; ') result[:short_term] = table.xpath('*//tr[4]/td[1]/p').map(&:content).join('; ') result[:short_term] += table.xpath('*//tr[4]/td[1]/ul/li').map(&:content).join('; ') result[:assessment] = table.xpath('*//tr[4]/td[2]/p').map(&:content).join('; ') result[:assessment] += table.xpath('*//tr[4]/td[2]/ul/li').map(&:content).join('; ') end # Wraps all tags into spans to keep consistence with the parser data.each_key { |key| data[key] = data[key].gsub('[', '<span>[').gsub(']', ']</span>') } data end