2012年1月20日

iBooks AuthorはEPUBオーサリングツールではない

[ 電子書籍 ]

Appleから電子書籍を作れるアプリ iBooks Author がでました。

作った電書をibooks フォーマットという初耳のファイルに出力して中を眺めると、だいぶEPUBぽい。ということは、これはEPUBのオーサリングツールなんでしょうか? ibooksファイルとEPUBをざっくり比べてみました。

EPUBと同じところ

  • zipアーカイブである
  • mimetypeという名前のファイルがある
  • OEBPSで定義されたMETA-INF/container.xmlがある
  • opf2.0のファイルがある
  • ナビゲーション用にncxファイルがある
  • コンテンツは基本的にxhtmlである

EPUBと違うところ

  • 拡張子がちがう
  • mimetypeの中身が違う。EPUBでは"application/epub+zip"、ibooksフォーマットでは"application/x-ibooks+zip"
  • opfのmanifestにapplication/x-ibooks+linehintsとかimage/x-thumb-jpegなんてmediatypeをもつitemがある(EPUBではmediatypeを限定していないので「違う」というのは正確ではないですが)
  • cssに-ibooks-というプレフィクスがついたものがある

違うフォーマットだよね

拡張子が.epubじゃない上に、中のmimetypeがapplication/epub+zipじゃない。これは"ibooksフォーマットはEPUBじゃないよ"という意志の現れだとかんじました。これは拡張されたEPUBではなく、よく似ているけど全く別のフォーマットだと私は捉えました。

EPUBオーサリングツールじゃない

つまり「iBooks AuthorはiPad iBooks専用電子書籍のオーサリングツール」なのであって、「変な拡張をしたEPUBを吐き出す困ったツール」ではないのだと思います。

もうちょっと乱暴に「電子書籍アプリの簡単作成ツール」といってしまってもよいのじゃないかなあ。

2010年11月12日

電書部マークアップvalidatorを作ってみた

[ Ruby 電子書籍 ]

電書部の技術班。今年はこればっかりやっていた気がする。

gihyo.jpで、電書部の技術解説の記事「電書部技術班,電子書籍配信サーバーに挑む」がはじまっています。その中でEPUB変換まわりの原稿書きました。

第4回 電書用マークアップYDMLを使った原稿作成と,YDMLパーサ
第5回 電書原稿からEPUBをつくりだす

何気ないふうを装いつつも、少しどきどきしながらYDMLという言葉を出しました。でもどこからも何の突っ込みもなくてそれはそれでちょっとさみしいものです。

YDMLパーサ記事について「なんでXMLパーサでやらないの?」という趣旨のつっこみがtwitterで入りました。思い起こすとそもそもパーサジェネレータ作った理由は

  • YDMLとは違うマークアップを目論んでいた
  • DSLぽいものをRubyで作ってみたかった
  • とにかく作ってみたかった
そんなことでした。が、何をぼけていたのか、テキスト混合ノードはXML的にはwell-formedじゃないからという恥ずかしい説明をしてしまいました。恥ずかしいのでその経緯はリンクしません。(tweet消してはいないので探せばみつかります)

XMLでのvalidateくらいやってみるかと思い立ってやってみましたら、RelaxNGの勉強からはじめたのに1時間くらいで出来てしまい愕然としました。

YDMLを少しだけ改変(ルートのエレメント定義して、書式が変なタグを修正)してwell-formed XMLにしたものにたいして、RelaxNG compact syntaxでスキーマを定義し、それをcompactじゃないsyntaxに変換したうえでNokogiri::XML::RelaxNGに喰わせています。

ちゃんとvalidateはできるのですが、validじゃなかったときのエラーメッセージが分かりづらい。場合によっては分かりづらいを通り越して意味不明なので実用性低めです。でもせっかく作ったのでgithubにあげました。

https://github.com/skoji/ydml_simple_validator

2010年7月 7日

gepub 0.1.1 をリリースしました。

[ gepub 電子書籍 ]

必要十分を目指すrubyで書いたepubライブラリ・gepubのversion 0.1.1をリリースしました。はじめてminor versionが1になったよ。gem install gepub で降ってくるはず。

ソースはこちら。http://github.com/skoji/gepub

主な変更点。

  1. インタフェースをいちから書き直して、itemを生成してbookに追加するというモデルにしました。だいぶシンプルになってる、といいなあ。
  2. 圧縮前epubのディレクトリを作成せずに、直接epubを生成するようにしました
  3. ソースとなるデータをファイルではなくIOオブジェクトで渡すようにしました

IOオブジェクトで渡すようになったのは地味な変更だけど、地味に使いやすいんじゃないかと思っております。


これまでのGEPUB::GeneratorではなくGEPUB::Bookをつかってください。

GEPUB::Generatorは0.2.0のタイミングで削除する予定です。使い方はgithubに置いてあるexample.rbをご参照ください。例は少しずつ充実させます。

この後は、

  • メタデータをもうちょっとちゃんと書き込めるようにする
  • インタフェースがまだおかしい気がするのでみなおす
  • XMLライブラリをNokogiriにする

などなどを考えていますが、予定は気まぐれに変わります。こうなるといいなー、なんていうのがあればお知らせください。ないだろうけど。

電子書籍部でつかっているテキストto EPUBのコードも遠からず公開する予定です。

2010年5月 4日

EPUB生成ライブラリを作ってみた

[ gepub 電子書籍 ]

(2010/5/5 : githubにあげました)

EPUB生成のライブラリをrubyで作ってみました。ブツはこちら。http://github.com/skoji/gepub

  • コンテンツ指定のファイルは/content.opfに固定
  • identifierのschemeはURLに固定
  • identifierの名前はBookIDに固定

などなどいろいろ決め打ちにしています。

利用例はこんなです。

require 'rubygems'
require 'gepub'
require 'fileutils'


epubdir = "testepub" # epubのコンテンツを置くディレクトリ
title = "samplepub"  # epubのファイル名


FileUtils.rm_rf(epubdir)
FileUtils.mkdir(epubdir)

# epub メタデータ作成
epub = GEPUB::Generator.new(title)
epub.author="the author"
epub.publisher="the publisher"
epub.date = "2010-05-03"
epub.identifier = "http://www.skoji.jp/testepub/2010-05-03" # identifierはURLのみ

# サンプルのコンテンツ生成。通常は、別途作成しているはず。
[ 'coverpage', 'chapter1', 'chapter2' ].each {
  |name|
  File.open(epubdir + "/#{name}.html", 'w') {
    |file|
    file << <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
  <head>
    <title>sample #{name} </title>
  </head>
  <body>
  <h1>#{name}</h1>
<p>here comes the contents for #{name}</p>
  </body>
</html>
EOF
  }
}

# "coverpage"は表紙を想定。従って目次のデータには入れない。
# spineに入れた順にリーダでは表示される。
epub.addManifest('cover', "coverpage.html", 'application/xhtml+xml')
epub.spine.push('cover')


epub.addManifest('chap1', "chapter1.html", 'application/xhtml+xml')
epub.spine.push('chap1')
epub.addNav('chap1', 'Chapter 1', "chapter1.html")

epub.addManifest('chap2', "chapter2.html", 'application/xhtml+xml')
epub.spine.push('chap2')
epub.addNav('chap1', 'Chapter 2', "chapter2.html")

# この他にcssとかイメージがあれば、それもManifestへ追加する。
# cssやイメージはspineやaddNavへの追加は不要。

# container.xml/contents.opf/toc.ncxなどのファイルを生成
epub.create(epubdir)

# 生成したディレクトリから、epubファイル作成
epub.create_epub(epubdir, ".")

サンプル書いて気付きましたが、EPUB::Creatorというクラスの役割がぶれてるなあ。

2010年4月 8日

EPUB入門メモ

[ 電子書籍 ]

EPUBに関するメモ。

リンク

元締め
International Digital Publishing Forum

EPUB仕様日本語訳をしている、ろすさんのサイト
厨二病棟

わかりやすげなまとめ
Epub Format Construction Guide

ePubのメタデータはダブリンコア
dublin core metadata element

仕様でかいし、自前でつくるときはvalidatorがないと不安です
epub validator

Hello world的な、達人出版会の記事
はじめてのEPUB

その他

コンテンツのXHTMLには、langやxml:langを指定しておく。そうしないとAdobe Digital Editionでは日本語文字化けする(validatorに怒られるのだけど...)

zipでつくるときは、こんなんがよい。

zip -0X testbook.epub mimetype
zip -9rXD testbook.epub -x mimetype

mimetypeは非圧縮(-0)で先頭に。他のコンテンツは圧縮してよし(-9)。属性は不要なので-X。ディレクトリは保存しなくてよいので-D。など。