読者です 読者をやめる 読者になる 読者になる

ゆーすけべー日記

はてなBlogってどーなの!?

Markdown文章をお手軽にKindleで見る

Technologies Kindle Markdown

いつの間にか手元にある「Kindle Touch」。ぐふふ。

IMG_1882.JPG IMG_1884.JPG

ページめくりがもっさりしているのが気になるけど、軽くて手頃なサイズ感がいい。 今なら円高なんで安く買えるし。 ただ、Kindle Storeで購入する書籍も含めて英語だとなんとなく実感がわかないので、 日本語の文章を読んでみたかった。 というか、自分が最近書いている文章のプレビュー用として使いたかった。

Markdownで文章を書いているのでMarkdownを変換してKindleに転送して読めばよい。 実は後から知ったんだけどKindleってePubにまだ対応してないのね... ということで色々調べてみると以下の方法がすごくお手軽。

  • Markdownを簡単な構造のHTMLに変換する
  • KindleGenを使って.mobi形式に変換する
  • Kindleを繋げてフォルダにぶっこむ

KindleGenっていうのはAmazonがオフィシャルに配布しているePubやHTMLを結構かしこくKindleで読める形式=.mobiに変換してくれるコマンドラインソフト。

これにMarkdownからおこしたHTMLをかませればいいということになる。 適当なHTMLを指定しKindleGenを実行するいろいろと警告や情報を出してくれるのでHTMLを作る参考になります。

気をつけるのは以下の点でした。

  • html、bodyタグ等はしっかりつける
  • head内のmeta要素でcharset=utf8とかしないと日本語が文字化ける
  • 画像はローカルにないといけない
  • デフォルトだと特有のCSSが適応されるので簡単なCSSを書く
  • .cssファイルを外部から読み込んでも考慮される

MarkdownをHTML化するために使ったスクリプトはこちら。Markdownファイルを引数に渡すと、 HTML内の画像をtempファイルに置きつつsrc属性を変更、最終的に出来たHTMLを標準出力に吐いてくれる。

use strict;
use warnings;
use Text::Markdown qw/markdown/;
use Path::Class qw/file/;
use Data::Section::Simple qw/get_data_section/;
use HTML::TokeParser;
use File::Temp qw/tempfile/;
use LWP::Simple qw/getstore/;

my $filename = $ARGV[0] or die "filename argument required!";
my $file     = file($filename);
my $content  = $file->slurp;
my $html     = markdown($content);

my $parser = HTML::TokeParser->new( \$html );
while ( my $token = $parser->get_tag('img') ) {
    my $src = $token->[1]{src};
    my ($suffix) = $src =~ /.+(\..\w+?)$/;
    my ( $fh, $tempname ) = tempfile( SUFFIX => $suffix );
    getstore( $src, $tempname );
    $html =~ s/$src/$tempname/g;
}

my $header = get_data_section('header.html');
my $footer = get_data_section('footer.html');
print "$header$html$footer";

__DATA__

@@ header.html
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="style.css" type="text/css" />
  </head>
  <body>

@@ footer.html
  </body>
</html>

これを「convert.pl」などと保存して、以下のようにすればHTMLが生成される。

$ perl convert.pl oppai.mkdn > oppai.html

そしてすかさずKindleGenで変換。

$ ~/bin/kindlegen oppai.html

するとカバーが無いと怒られつつも「oppai.mobi」が生成されるのでKindleに転送して見てみる。

IMG_1921.JPG

できたー!画像もコードも綺麗に読める!

IMG_1922.jpg

やっぱりE-Ink読みやすいな!そしてこういう風に自分の書いた文章を物理デバイスでプレビューすると直したい点がわかったり全体のボリューム感を把握できていいわー。今手元に複数のMarkdownファイルがあるのでそれをうまいことまとめて一つのHTMLにすればもっとよさげ。表紙とか目次についても比較的簡単にプログラマブルにやれそうなんで調べてみます。