class EPUB::Searcher::XHTML::Restricted

Public Instance Methods

search_text(word, element=nil) click to toggle source

@param element [REXML::Element, Oga::XML::Element, Nokogiri::XML::Element] @return [Array<Result>]

# File lib/epub/searcher/xhtml.rb, line 28
def search_text(word, element=nil)
  results = []

  elem_index = 0
  (element || @element).children.each do |child|
    if child.element?
      child_step = Result::Step.new(:element, elem_index, {:name => child.name, :id => child.attribute_with_prefix('id')})
      if child.name == 'img'
        if child.attribute_with_prefix('alt').index(word)
          results << Result.new([child_step], nil, nil)
        end
      else
        search_text(word, child).each do |sub_result|
          results << Result.new([child_step] + sub_result.parent_steps, sub_result.start_steps, sub_result.end_steps)
        end
      end
      elem_index += 1
    elsif child.text?
      text_index = elem_index
      char_index = 0
      text_step = Result::Step.new(:text, text_index)
      while char_index = child.text.index(word, char_index)
        results << Result.new([text_step], [Result::Step.new(:character, char_index)], [Result::Step.new(:character, char_index + word.length)])
        char_index += 1
      end
    end
  end

  results
end