require 'English' require 'epub/parser' require 'epub/cfi' require 'nokogiri' def usage <<EOS USAGE: ruby #{$PROGRAM_NAME} ELEMENT EPUB EOS end def main(argv) elem_name = argv.shift epub_path = argv.shift if elem_name.nil? or epub_path.nil? abort usage end spine_step = EPUB::CFI::Step.new(6) epub = EPUB::Parser.parse(epub_path) epub.package.spine.each_itemref.with_index do |itemref, i| assertion = itemref.id ? EPUB::CFI::IDAssertion.new(itemref.id) : nil itemref_step = EPUB::CFI::Step.new((i + 1) * 2, assertion) path_to_itemref = EPUB::CFI::Path.new([spine_step, itemref_step]) itemref.item.content_document.nokogiri.search(elem_name).each do |elem| path = find_path(elem) location = EPUB::CFI::Location.new([path_to_itemref, path]) puts puts location puts elem end end end def find_path(elem) steps = [] until elem.parent.document? index = elem.parent.element_children.index(elem) assertion = elem["id"] ? EPUB::CFI::IDAssertion.new(elem["id"]) : nil steps.unshift EPUB::CFI::Step.new((index + 1) * 2, assertion) elem = elem.parent end EPUB::CFI::Path.new(steps) end main ARGV