Home | First | Prev | Next | Last |
sub encode_mail_header { ($str) = @_; # JIS コードに変換 from_to($str, 'utf8', 'iso-2022-jp'); # Base64 でエンコード $str = MIME::Base64::encode($str); # 改行コードを削除 chomp $str; $str =~ s/\n|\r|\x0d\x0a//g; # 識別子を付加 $str = "=?ISO-2022-JP?B?" . $str . "?="; return $str; }このサブルーチンに文字列を渡すと、sendmail で送信できる文字列が返ってくるというものです。
sub encode_mail_header { ($str) = @_; # JIS コードに変換 from_to($str, 'utf8', 'iso-2022-jp'); # Base64 でエンコード $str = MIME::Base64::encode($str); # 改行コードを削除 chomp $str; $str =~ s/\n|\r|\x0d\x0a//g; # 識別子を付加 $str = "=?ISO-2022-JP?B?" . $str . "?="; return $str; }
$ sudo snap install anbox-installer
$ anbox-installer
$ anbox-installerを実行し、オプションの 2. Delete を選び、~/snap 内の anbox を削除しておきました。
sudo dpkg --add-architecture i386 sudo apt-add-repository 'https://dl.winehq.org/wine-builds/ubuntu/' wget https://dl.winehq.org/wine-builds/Release.key && sudo apt-key add Release.key sudo apt update && sudo apt install winehq-devel
$ wine KindleForPC-installer-1.20.47037.exeところが、Kindle for PC が「初期化しています…」で止まったままになりました。winehq.org などで調べてみると、Kindle for PC の最新版は Wine では動かないようで、KindleForPC-installer-1.17.44183.exe を次のようにしてダウンロードしました。
https://s3.amazonaws.com/kindleforpc/44183/KindleForPC-installer-1.17.44183.exeそして
$ wine KindleForPC-installer-1.17.44183.exeとしてインストール成功。デスクトップにある Kindle のランチャーアイコンで起動できました。
https://dl.dropboxusercontent.com/u/35619242/msttfcorefonts_cabs.tar.gzファイルを解凍してから
$ sudo dpkg-reconfigure ttf-mscorefonts-installerで導入できます。
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.py | sudo python -c "import sys; main=lambda:sys.stderr.write('Download failed\n'); exec(sys.stdin.read()); main()"ファイルは /opt/calibre にインストールされました。
$ ebook-edit tategaki.epubで、style-sheet.css の writing-mode: vertical-rl を削除して、yokogaki.epub で保存し、
$ ebook-viewer yokogaki.epubとして表示してみると、横書きに変換できました。
静けさや岩に染み入る<ruby>蝉<rt>せみ</rt></ruby>の声に、ルビ用の括弧「(」と「)」を <rp> タグをつけ挿入しました。
静けさや岩に染み入る<ruby>蝉<rp>(</rp><rt>せみ</rt><rp>)</rp></ruby>の声としました。こうすると、ルビに対応していないリーダーでも、ルビを括弧の中で読むことができ、ルビに対応している場合は、括弧は表示されません。
$ sudo add-apt-repository ppa:ubuntuhandbook1/sigil
/home/philip/.wine/drive_c/users/philip/KindleDRMRemovalですが、これは隠しファイルの下にあって、アクセスが面倒なので、ホームユーザのすぐ下にリンクを貼っておいて、簡単にアクセスできるようにしました。
名前 AozoraEpub コメント コマンド java -jar AozoraEpub3.jar ディレクトリの編集 /home/penguin/.local/share/applications/AozoraEpub3 アイコン /home/penguin/.local/share/applications/AozoraEpub3/AozoraEpub3.icoこれでアイコンをクリックすれば、AozoraEpub3.jar が動くようになりました。
#-webkit-writing-mode: vertical-rl; #-epub-writing-mode: vertical-rl;を上記のようにコメントアウトして ebook-viewer で読んでいますが、ebook-viewer に縦書きキャンセルの機能があると良いと思いました。縦書きの状況を確認したいときには ebook_edit の File preview を使っています。
$html_file = "list.html"; $book = "半七捕物帳"; @lines = `cat $html_file`; foreach $line (@lines) { chomp $line; if ($line =~ /^<li><a href="(http:\/\/www.aozora.gr.jp\/cards\/[]\d]+\/card[\d]+\.html)">$book<\/a>/) { $url = $1; print "$url\n"; } }
$ wget -i list.txtとして、本文データへのリンクをしるしてある「図書カード」html ファイルをダウンロードしました。
<li<<a href="../cards/000082/card1293.html">半七捕物帳</a< 01 お文の魂(新字新仮名、作品ID:1293) </li<赤字の部分が著者番号です。本文データのリンク・リストを作るスクリプトは以下のようにしました。
$author_number = "000082"; @files = glob "card*.html"; foreach $file (@files) { @lines = `cat $file`; foreach $line (@lines) { chomp $line; if ($line =~ /^\[<a href="#download">ファイルのダウンロード<\/a>\|<a href=".\/files\/([\d]+_[\d]+.html)">いますぐXHTML版で読む<\/a>]$/) { $data_file = $1; print "http://www.aozora.gr.jp/cards/$author_number/files/$data_file\n"; } } }
$ wget -i link.listで、最終的に必要なファイルをダウンロードしました。ダウンロードした html ファイルは ID番号_シリーズ番号.html という形式になっているので、thunar のファイル名一括変換機能をつかって、シリーズ番号.html 形式に改名しました。こうすると、短編集を順に読むことができます。
@files = glob "*.html"; @urls = ""; foreach $file (@files) { @lines = `cat $file`; foreach $line (@lines) { chomp $line; # 一行の中に複数のリンクがある場合を想定 @parts = split /class="gaiji"/, $line; foreach $part (@parts) { if ($part =~ /gaiji[\d\-\/]+\.png/) { # 外字へのリンク $the_url = "http://www.aozora.gr.jp/$&"; # 同じリンクがないかどうかの検査 $skip = 0; foreach $url (@urls) { if ($url eq $the_url) { $skip = 1; last; } } # 同じリンクがなかった場合 if ($skip == 0) { $urls[$i++] = $the_url; print "$the_url\n"; } } } } }上のスクリプトの結果を gaiji.list に保存し、それを wget に読ませて画像をダウンロードしました。それから Sigil で epub ファイルを開き Book Browser の Images に外字画像を追加しました。そして <img src= 以下を "../Images/外字画像ファイル" 形式に書き換えました。
img.gaiji { width: 1em; height: 1em; align: top; }と指定されているので、表示フォントの大きさにしたがって、外字画像も拡大して表示されました。
@lines = `cat aozora.css`; foreach $line (@lines) { chomp $line; if ($line =~ /css\/[a-z]+\/[a-z]+\/[a-z]+\/[a-z]+.png/) { print "http://www.aozora.gr.jp/cards/$&\n"; } }このとき、注意しなければならないのは、before/ フォルダーと after/ フォルダーに同じ名前のファイルがあることです。それで、私は、リンク・ファイルを before を含むものと、 after を含むものの二つにわけ、それぞれ別のフォルダーに画像をダウンロードしました。
(旧) .underline_solid { font-style: normal; padding: 0 0 7px 0; background: url("css/kentenbosen/after/sen/bosen.png") repeat-x; } (新) .underline_solid { font-style: normal; padding: 0 0 7px 0; background: url("../Images/after_bosen.png") repeat-x; }他も同様に、before と after を間違えないようにして書き換えました。
@charset "utf-8"; @namespace "http://www.w3.org/1999/xhtml"; /** 縦書き テキスト用スタイル */ @page { margin: 0em 0em 0em 0em; } html { margin: 0em 0em 0em 0em; padding: 0; writing-mode: vertical-rl; -webkit-writing-mode: vertical-rl; -epub-writing-mode: vertical-rl; -epub-line-break: strict; line-break: strict; -epub-word-break: normal; word-break: normal; } body { margin: 0; padding: 0; display: block; color: #000; font-size: 100%; line-height: 1.5; vertical-align: baseline; } /** 太字、ゴシック */ .gtc { font-family: '@MS ゴシック','@MS Gothic',sans-serif; } .b { font-weight: bold; } .i { font-style: italic; }青空文庫からの借用ですが、たいていのものは、これで大丈夫でした。
思い出してもぞっとするとあるところのスタイルシートは、もともとは
.sesame_dot { font-style: normal; padding: 7px 0 0; background: url("css/kentenbosen/before/ten/boten.png") repeat-x; }となっていて、画像が使われています。私はこれを、ローカルの画像を参照するように
.sesame_dot { font-style: normal; padding: 7px 0 0; background: url("../Images/before_boten.png") repeat-x; }と書き換えたものを使っていますが、どちらにせよ、画像を使うのをやめて
思い出しても<ruby><rb>ぞ</rb><rt>丶</rt></ruby><ruby><rb>っ</rb><rt>丶</rt></ruby>とする
$ nkf -w -Lu shiftjis.html > utf8.htmlオプション -Lu で改行コードを CRLF から LF にしておきました。もちろん、HTML 内の Shift_JIS も UTF-8 に変えました。
@letters = split //, $word;を使っていますが、これを日本語の文字列にはそのまま使えません。日本語文字は一文字 3バイトから成り立ちますので、工夫が必要です。私は
utf8::decode($word); @letters = split //, $word;として、split を使う前に utf8::decode を使って、文字列を日本語として処理できるようにしました。
sub boten { # <em class="sesame_dot"> がある文字列を取り込む my ($line) = @_; # もとの文字列を保存しておく $original_line = $line; # 一行に複数の <em class="sesame_dot"> があることを想定 @parts = split /<\/em>/, $line; foreach $part (@parts) { if ($part =~ /<em class="[^ ]+">/) { # 傍点の対象となる文字を取り出す $word = $'; utf8::decode($word); @letter = split //,$word; utf8::encode($letter); # 一文字づつにルビをつける $string = ""; foreach $letter (@letter) { utf8::decode($word); $replace = $string . "<ruby><rb>$letter</rb><rt>丶</rt></ruby>"; } $original_line =~ s/<em [^ ]+<\/em>/$replace/; } } return "$original_line"; }
┏━ Images ┃ ┣━ 1-02-22.png ┃ ┣━ 1-03-27.png ┃ ┗━ 1-07-83.png ┃ ┣━Styles ┃ ┣━ aozora.css ┃ ┣━ vertical_font.css ┃ ┗━ vertical_text.css ┃ ┗━Text ┣━ 12234.html ┣━ 14066.html ┗━ 16289.html
<spine toc="ncx">ページめくりの方向を「右から左へ」とするために、次のようにしました。
<spine page-progression-direction="rtl" toc="ncx">これを epub から mobi に変換すれば、Kindle 端末で縦書きをきれいに読むことができました。
※[#「求/(餮-殄)」、第4水準2-92-54]ここから外字画像のファイル番号(2-92-54)を抽出し、上記コメントを
<img src="../Images/2-92-54.png" alt="※" class="gaiji" />に置き換えました。
彼ははた[#「はた」に傍点]と膝をたたいた。ここから、傍点をふる単語を抽出し、次の体裁に変更しました。
彼は┃はた《丶》と膝をたたいた。にいったん置き換え、ルビ付けのサブルーチンでルビが「丶」のときには、区切り記号(┃)からルビ記号(《)までの間のすべての文字にルビを打つように、しました。なお、「傍点」のほかにも、「丸傍点」や「白丸傍点」とあるファイルもありましたので、「丸傍点」に「●」、「白丸傍点」に「○」が対応するようにもしました。
sub ruby { my ($line) = @_; @parts = split /$ruby_mark2/, $line; $newline = ""; foreach $part (@parts) { # ルビ部分の取り出し if ($part =~ /$ruby_mark1/) { $ruby = $'; $str = $`;$ruby_mark1 と $ruby_mark2 は次のように定義されています。
$ruby_mark1 = "《"; $ruby_mark2 = "》"; ここまでは、文字列を、$ruby_mark2 で分割して、$ruby_mark1 のあとにあるルビと、ルビをふる語がある文字列とを取り出しています。$part = &ruby2($str,$ruby); } $newline = $newline . $part; } return $newline; }そして、サブルーチン ruby2 でルビをふる語を取り出して、それを返すようにしました。
sub ruby2 { my ($str,$ruby) = @_; $newstr = $str; utf8::decode($str); @letters = split //, $str; $word_key = 0; foreach $c (@letters) { if ($c =~ /\p{Han}/ or $c =~ /$word_mark/) { if ($word_key == 0) { $word = ""; } utf8::encode($c); $word = $word . $c; $word_key = 1; } else { $word_key = 0; } } $newstr =~ s/$word$/<ruby><rb>$word<\/rb><rp>(<\/rp><rt>$ruby<\/rt><rp>)<\/rp><\/ruby>/; $newstr =~ s/$word_mark//g; return $newstr; }10月16日の記事に書いたように、ここでは、utf8::decode() を使ったあとで、UTF-8 の文字列を文字単位に分けています。
$c =~ /\p{Han}/は、文字が漢字かどうかを判定するものです。
$newstr =~ s/$word/........としてしまったので、同じ漢字がルビをふる漢字の前にあった場合、それにルビがふられてしまいましたので、
$newstr =~ s/$word$/........として、行末の漢字にルビがふられるようにしました。
sub ruby { my ($line) = @_; @parts = split /$ruby_mark2/, $line; $newline = ""; foreach $part (@parts) { # ルビ部分の取り出し if ($part =~ /$ruby_mark1/) { $ruby = $'; $str = $`; # 外字、外国語のルビ if ($str =~ /$/ # 外字画像 or $str =~ /[0-9A-F]+$/ # 外字コード or $str =~ /[\w]+$/) { # 外国語 $code = $&; $str =~ s/$code/$kanji_mark/; $part = &ruby2($str,$ruby); $part =~ s/$kanji_mark/$code/; } # 通常のルビ else { $part = &ruby2($str,$ruby); } } $newline = $newline . $part; } return $newline; }
※[#「米+參」、第3水準1-89-88]などのようにです。この場合、画像名は 1-89-88.png ですから、上記のコメント部分を画像へのリンクに置き換えれば、外字が画像で表示されます。
※[#「言+卒」、U+8AB6、50-5]といったようにです。この場合、U+8AB6 がコードポイントになりますので、上記コメントを
誶とすれば、フォントに含まれている外字を表示することができ、そのほうが、外字画像を使うより、もっときれいです。
cat inp_file | sed -f aozora_kanji.sed > out_fileとすれば、外字画像を外字フォントに置き換えることができます。
Home | First | Prev | Next | Last |