KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

turndownを改造してHTMLを青空文庫形式に変換するツールを作れないか試してみた。

 turndownを改造してHTMLを青空文庫形式に変換するツールを作れないか試している。HTMLからマークダウンへの変換するツールはいくつかある、それならば、少し手を加えるだけで青空文庫形式に変換できるのでは。

turndown github.com

turndownのコードを見ると、domパーサーとmarkdownに変換部分が分離されているようなので、markdown変換部分を置き換えるだけでよさそう。

forkしてみるとテスト環境がそろっているのでテストがしやすそうだった。 クローンしたフォルダーで npm install npm i domino npm test を実行すると、ビルドされてdistフォルダーにウェブ用のjsが作られるようだ。 index.htmlを実行すると動作テストができるが、読み込先をdistフォルダーに変更した

<script src="https://unpkg.com/turndown/dist/turndown.js"></script>

<script src="./dist/turndown.js"></script>

マークダウンの変換はsrc/commonmark-rulesで行っているので、commonmark-rulesを書き換えてからnpm testを実行すると全体をビルドされるようだ。ビルドに時間がかかるので、lib/turndown.cjs.jsを直接書き換えて実行しつつ、たまにビルドして確認するのが早そうだ。

var TurndownService = require('./lib/turndown.cjs.js')

github.com

設定はオブジェクトを渡す

var TurndownService = require('./lib/turndown.cjs.js')
option={
    "headingStyle": "atx",
    "hr": "* * *",
    "bulletListMarker": "*",
    "codeBlockStyle": "fenced",
    "fence": "```",
    "emDelimiter": "_",
    "strongDelimiter": "**",
    "linkStyle": "inlined",
    "linkReferenceStyle": "full"
}
var turndownService = new TurndownService(option)
var markdown = turndownService.turndown('<h1>Hello world!</h1><h2>Hello world!</h2><h3>Hello world!</h3>')
console.log(markdown)

epub parserを調べてみた

 作ったEPUBのソースがないときに、EPUBから原稿に戻すepub parserがあればいいのではと思ったので調べてみた。

 javaで調べてみるとアンドロイド向けのが見つかり、jsを調べるとepub2向けのが見つかってepub3向けのがないなという感想を覚えた。調べたらあるのかもしれないが、あまり活発に更新されているわけではなさそう。jsのを見ていくとjszipで展開して中身を見ていく感じであった。凡庸的にepub parserを作るのは大変そうなので、aozoraepub3で作ったものをパースして青空文庫形式にできればいい。epub parserでパースしたものをマークダウンに変換したりなどというものはいくつかあるようだ。

パーサーで何を読み取りたいかというと、下のもの。

  • タイトル
  • 著者
  • カバー画像
  • 目次
  • 順番
  • 本文

jszipでzipファイルを展開するのに、async awaitの書き方に直した。filedataにzipファイルの中身が入る形になる。きれいな書き方ではないが、とりあえず動けば。

var filedata= [];
(async function(){
const fileContent = fs.readFileSync(sample, null).buffer;
const zip = new JSZip();
await zip.loadAsync(fileContent);
for (const fileName in zip.files) {
  const file = zip.files[fileName];
  if (!file.dir) {
    const content = await file.async('text');
    filedata.push({ "FileName" : fileName , "Content" :content})
  }
 }
})();

jsdomでxmlのパースで本のタイトルを取得するのにnamespaceが必要になる。xmlをjsonに変換してから読み取るやり方をしているのも見た。DOM操作のほうが慣れているのでnode.jsのjsdomを使っている。

//<dc:title id="title">表題</dc:title>
const dc="http://purl.org/dc/elements/1.1/"
document.getElementsByTagNameNS(dc,'title')

 

github.com

github.com

html markdown converter github.com

github.com

qiita.com

webpack,react,browserifyなどnode.jsをウェブページ向けに変換するのはどれがいいのやら。

zipファイルからファイル名が.opfのものを検索して、domparserに読み込む。

github.com

Node.jsでDOMを触る
torimemoblog.wordpress.com

developer.mozilla.org How To Create Html Nested Lists In JavaScript techindetail.com

How to parse nested elements using DOM stackoverflow.com

EPUB制作: 目次Navigation Documentのよくある間違い techracho.bpsinc.jp

再起処理でdom

magazine.techacademy.jp

qiita.com

DOMを再帰関数で深さを取得 stackoverflow.com

Node.jsからVOICEVOXを使ってみる。 qiita.com

VOICEVOX(音声合成)をREST-APIで利用する qiita.com

web上でEPUB編集など

EPUB編集といえばsigilというソフトウェアがあるが、インストールしないといけないので手間がある。また、ZIP圧縮ソフトで展開して圧縮するとmimetypeが圧縮されるのでepubチェックでエラーになることがある。  Zipadeeというサイトがあったので調べてみた。単純にZIPファイルの中身を編集できるサイト化と思ったが、やっている作業はクライアントサイドjavascriptのようだった。jszipで圧縮しているのでmimetypeの問題はなさそう。 web上でEPUB編集ができるZipadee zipadee.vercel.app

書き換えると「SAVE UPDATED FILE」という表示がされて、クリックするとできるようで上書き保存される。編集したものを保存するにはファイル名を変更するといい。xhmlやxmlなどはテキストが色づけて表示される。

EPUBCheckFX

Java8を削除したくてpaginaEPUB-Checkerの代わりのソフトを探していた。EPUBCheckのgithubでissueがあったので使ってみた。EPUBCheckにグラフィカルなインターフェースを作ったという感じ。

github.com

kindle出版でWORDってどうなん

 kindle出版でWORDで作ろうという感じのツイートを見たので、感想などを。  WORDでいいならWORDでいいんじゃねとは思う。EPUB作成ソフトを作っているからkindleがどのように変換させているのかを中をのぞいたりしていた人間からするとワード変換にバグはある。epubにもバグあるけど、もっと偏執的なこだわりがある人が見つけるバグという違いはある。kindleの中身は割とepubに近いのではと思っているので、WORDから変換しているのはepubに近いのでは。docxは書き方に自由度が高いのでソフトウェアによって書き方がだいぶ違う、ソフトウェアをまたぐとレイアウトや中身が書き換わることがある。なのでdocxという形式があまり好きじゃない。

ここでEPUBというものがどのソフトによって作られたEPUB化によってだいぶ違う。pagesやindesignのEPUBはkindle出版に使うにはごみなので、それならワードのほうがましだとは思う。  グーグルドキュメントが作るEPUBも横書きにしか対応していない、国内の電子書籍販売サイトでは受け付けていないところが多い。出版社が出しているのはEPUBなんだけど、そのEPUBはpagesやindesignやグーグルドキュメントがつくるEPUBと中身が全く違う。CSS指定せずに縦書きに画像を入れると国内の電子書籍販売サイトだと画面買いに画像が飛び出ることがある。

fxlepub3のJava版を作ってみる2 Velocityでテンプレートに埋め込みzip圧縮

 作りながら考えるので初期設計と変わってきてしまっている。必要な要素の実験をしているので仕方がない。node.jsの場合との違いはJavaではライブラリを使わなくてもいいことがある。JSONからオブジェクトを作って、オブジェクトで必要なものを一括管理して、テンプレートに入れてZIP圧縮という手順にしている。

 JSで一度書いたものをJavaにするだけなのにものすごく時間がかかっているのは、Javaの知識が浅いのとオブジェクト指向に慣れていないのとがある。JSでZIP圧縮がjszipのライブラリが簡単だったので、Javaはどうするかなと考えていた。JavaEPUB圧縮するにはと検索してもあまりなかったので、EPUBチェックにEPUB圧縮のコードがあったので見てた。application/epub+zipを無圧縮でmimetypeというファイルにする必要がある。めんどくさいのが無圧縮の部分でそれ以外は、javaのzip圧縮ライブラリはいくつもあるので簡単だ。

 Javaのファイルの書き出しはbyte[]でstringから書き出すという形が楽そうなのでそうした。velocityテンプレートもvmファイルからではなく、テキスト・ブロックからstringに代入したほうが楽そうだった。intellijのバグか何なのかvmファイルが保存しても勝手にロールバックして何度も書き換えが必要になっていた。

 

 とりあえず画像とjsonから固定レイアウトのEPUBを出力し、EPUBチェックが通るようになった。あとはGUIの設計と精度を上げること。ただ今の方法だと、同じファイルを二回呼び出したりするとバグになる可能性がある。

 

 

99nyorituryo.hatenablog.com

 

java.akjava.com

www.techscore.com

style.potepan.com

www.techscore.com

null

stackoverflow.com

uuid

qiita.com

timezone

qiita.com

drambuie.hatenadiary.org

 

画像サイズの取得

stackoverflow.com

ファイルタイプ

waman.hatenablog.com

ファイルパス

www.javadrive.jp

Javaでオブジェクトの確認にJSONに変換してチェックしている。

        try {
            String jsonAsString = objectMapper.writeValueAsString(data);

            System.out.println(jsonAsString);
        } catch (JsonProcessingException ex) {
            throw new RuntimeException(ex);
        }

JSONビュワーで確認

 

jsonviewer.stack.hu

velocityの使い方

github.com

EPUBの圧縮方法

stackoverflow.com

m12i.hatenablog.com

mokuji配列の検索

www.fenet.jp

 

 

https://support.asteria.com/hc/ja/articles/229094007-Velocity%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

作った文字列をzipに次々入れていく感じに入れていきたいので。

stackoverflow.com

 

関数作って一括で処理したいが、mimetypeを無圧縮でするのでmimetypeだけを別で処理した。

style.potepan.com

itsakura.com