Module: Hairaito::Nokogiri::XML::Document

Defined in:
lib/hairaito/nokogiri/xml/document.rb

Instance Method Summary collapse

Instance Method Details

#highlight(snippets, options = {}) ⇒ Nokogiri::XML::Document

Highlights text snippets in document

Parameters:

  • snippets (Array<String>)

    text variants to be highlighted

  • options (Hash) (defaults to: {})

    custom highlighting options

Returns:



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/hairaito/nokogiri/xml/document.rb', line 11

def highlight(snippets, options = {})
  highlighting_defaults(options)
  snippet_parts_to_wrap = []
  prepare_snippets(snippets).each do |snippet|
    highlighting_base.traverse_by_text(snippet, @hl_opts[:boundaries]) do |snippet_container, snippet_offset|
      start_node, start_inner_index = snippet_container.text_node_by_position(snippet_offset.first)
      start_range = start_node.text_range_by_index(start_inner_index, snippet.length)
      snippet_parts_to_wrap << {part: start_node, range: start_range, starting: true}

      # If start node contains only part of snippet
      if snippet.length > start_range.size
        end_node, end_inner_index = snippet_container.text_node_by_position(snippet_offset.last - 1)
        end_range = end_node.text_range_by_index(end_inner_index)
        snippet_parts_to_wrap += snippet_container.text_nodes_between(start_node, end_node).map do |node|
          {part: node, range: 0..(node.text.length - 1)}
        end
        snippet_parts_to_wrap << {part: end_node, range: end_range}
      end
    end
  end
  snippet_parts_to_wrap.group_by{|part_data| part_data[:part]}.each do |part, parts_collection|
    part.highlight_by_ranges(parts_collection.map{|p| p.except(:part)}, @hl_opts)
  end
  numerate_snippet_parts if @hl_opts[:numeration][:attr].present?
  self
end