Monday, July 06, 2015

名著「cプログラミング診断室」のkindle本を作成する


昔のcプログラマのみなさんによく読まれていた、
「cプログラミング診断室」(現在絶版)の全内容がhtml形式で公開されています。
実は紙の本は持っているのですが、kindleで読めた方が便利なので作ってみます。
今回はMac OSXかLinuxでの操作方法のみです...windowsはわかりません...
また、全てTerminal使った操作になりますのでご了承ください。

1. htmlソースをダウンロードする
~/work 等のディレクトリを作成し、そちらに全ページのhtmlファイルを保存します。
OSXではcurl, Linuxではwgetを使ってください。
まずindex.html
curl -O http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html

次にindex.htmlにあるリンク先のhtmlをダウンロードします。
for i in `seq 1 11`; do curl -O http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.0.${i}.html;done

みたいにやると0章がゲットできますね!
このような感じで全ての章...「正誤表」までを ~/workに保存します

2. index.htmlを編集する
vimを使ったりしてindex.htmlを編集します。
丁寧に編集しないと、手順3のスクリプトがエラーになってしまいます...
1でダウンロードしたファイルではない、<A HREF="のリンクの行を全て削除します
(地味ですが重要な作業です)
また、簡単のため以下行も消しましょう(ものすごく長いソースコードのため)
<A HREF="cdiag.10.1.list">リスト10-1 最長不倒関数</A>/

3. htmlをまとめる
@miyagawa さんが作成されました、Ruby hacking Guideという本のhtmlファイルをまとめるスクリプトを改造させて頂いて使います。
https://gist.github.com/miyagawa/7064346
ちなみに私はrubyを全く知りませんので、改変も最小限になっております。


#!/usr/bin/env ruby

file = File.open("index.html")
content = file.read

all_html = <<HTML
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Author" content="Hirofumi Fujiwara">
<title>C programming clinic</title>
</head>
<body>
HTML

content.scan(%r[<A HREF="(.*?)">(.*?)</A>]) do |filename, title|
  chap = File.open(filename)
  html = chap.read
  html.sub!(/^.+?<H1>/m, %q[<h2 class="chapter">])
  html.gsub!("<H1>", "<h2>")
  html.gsub!("</H1>", "</h2>")
  html.gsub!("<p>", '')
  html.gsub!("</p>", '')
  html.sub!(%r[</BODY>.*]m, '')
  all_html << html
end

all_html << '</body></html>'

puts all_html


上記内容を ~/work にtemp.rb などどいう名前で保存して、
ruby temp.rb > all.html
とします。
またkindleでの表示をまともにするために以下コマンドでoutput.htmlを作成します。
grep -v -e '<a href' -e '<img src'  -e '<TABLE' -e '</TABLE>'  -e '<table' -e '</table>' -e "<br/>" -e "『Cプログラミング診断室』<A HREF=" -e ">次" -e "3/14発売" all.html > output.html
(本当はこの操作も上記rubyに入れたかったのだけど力量不足につき...)

4. Calibreでmobi形式に変換する
Calibreを使ってhtmlファイルをmobi形式に変換します。
ここでは説明は割愛しますがgoogle検索して、
などを参照なさってください。


No comments: