Hatena::ブログ(Diary)

このブログは証明できない。

2010-07-21

[]Kindle用の目次を生成するスクリプトを書いた。

オライリーiPhoneアプリからepubを抜き出し、それをさらにKindle形式に変換。epubを抜き出すところまでは、dankogai先生がスクリプトを書いてくれました。


他にも自動化スクリプトを書いた人が。


問題は、目次。


私は目次用のHTMLが欲しかっただけなので、自分でスクリプトを書く事にしました。まったく手間じゃないし。スクリプトはこの記事の最後に載せておきます。Rubyで書きました。MacでもWindowsでもLinuxでも動くと思います。




toc.rbという名前でスクリプトを保存します。そうしたら、おもむろにスクリプトを実行。

% ruby toc.rb /path/to/toc.ncx > toc.html

toc.htmlをOEBPSディレクトリに入れます。


あとは、OEBPS/content.opfに2行足せばOKです。

<manifest>
  <item id="ncxtoc" media-type="application/x-dtbncx+xml" href="toc.ncx"/>
  <!-- 下の1行 -->
  <item id="toc" href="toc.html" media-type="application/xhtml+xml"/>
  <item media-type="text/css" id="css" href="core.css"/>
  <item id="cover" href="cover.html" media-type="application/xhtml+xml"/>
<guide>
  <reference href="cover.html" type="cover" title="Cover"/>
  <!-- 下の1行 -->
  <reference href="toc.html" type="toc" title="Table of Contents"/>
</guide>



KindleのメニューのTable of Contentsで目次を表示することができました。もちろん、目次からコンテンツにジャンプすることができます。

f:id:shunsuk:20100721161517j:image




最後に、スクリプトを。

require "rexml/document"
include REXML


def nav_point(element)
  label = element.elements['navLabel/text'].text
  src = element.elements['content'].attribute('src').value

  puts %Q{<li><a href="#{src}">#{label}</a></li>}

  puts "<ul>"

  element.elements.each('navPoint') do |e|
    nav_point(e) 
  end

  puts "</ul>"
end


exit if ARGV.size < 1
ncx = ARGV[0]

doc = Document.new File.new(ncx)

puts "<html><body><h1>Table of Contents</h1><ul>"

doc.elements.each('ncx/navMap/navPoint') do |element|
  nav_point(element) 
end

puts "</ul></body></html>"

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証