Posted at

Node.jsでEPUB 3を作る

HTML5+javascriptを使ってブラウザでEPUB3を作成するで、ブラウザでEPUBを作るのはやってみたので、今度はNode.jsでEPUBを作っていきたいと思います。まぁ、もうできているのですが、まだバグなどはいっぱい残っているだろう。

github

https://github.com/kyukyunyorituryo/fxlepub3

npm

https://www.npmjs.com/package/fxlepub3

何をしているかというと、テンプレートエンジンのejsを使ってテンプレートを書き換えて、EPUBにパッケージ化している。

 画像のEPUBなので、画像を取り込んで、EPUBファイルに入れることもしている。

簡単な作りなので、テンプレートを除いて本体のコードが150行程度である。


fs = require('fs');
ejs = require('ejs');
var JSZip = require("jszip");
var filetype = require('file-type');
var sizeOf = require('image-size');
const uuidv4 = require('uuid/v4');
var uuid4 = uuidv4()
var today = new Date();
var date = today.toISOString().slice(0,19)+"Z";

読み込んだパッケージも6つで、そんなに量が多くない。


  • ejsはテンプレートエンジン。

  • jszipはEPUB圧縮用である。archiverを使う人もいるけどなれてる方を使う。

  • file-typeは画像の拡張子や形式を調べるのに使った。

  • image-sizeは画像のサイズから、固定レイアウトの指定するサイズを読み取った。

  • uuidは、前に使ってたuuid.jsと違っている部分があって、「urn:uuid:」があるかないかが違っていた。

フォルダー内の画像の読み込み、テンプレートファイルの読み込み、設定json形式の読み込み。


var epub = require('fxlepub3');

var data={
"url":"C:/Users/user/Downloads/comic/testdata/",
"output":'C:/Users/user/Downloads/comic/fxlsample/out.epub',
"title": "タイトル",
"author1": "著者名1",
"author2": "著者名2",
"index": [
["cover.jpg", "表紙"],
["00001.jpg", "目次"],
["00005.jpg", "最終ページ"]
],
"page_direction": "rtl",
"panel_view": "horizontal-rl",
"cover_file": {},
"files": []
}
epub.gen(data)

npmでパッケージ化しているので、requireから読み出す。指定したフォルダーから画像を読み込んで、指定した場所にEPUBを出力する。

<% for (let i in data.files) { -%>

<item media-type="<%= data.files[i].type %>" id="<%= data.files[i].file_id %>" href="image/<%= data.files[i].file_id+"."+data.files[i].ext %>"/>
<% } -%>

テンプレートエンジンで繰り返し処理を追加するのにテンプレート内にfor文を書いている。本体よりもテンプレートファイルの方に処理が複雑になってしまった。