Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TOC in webpub should be converted to <nav epub:type="toc"> in EPUB output #469

Open
MurakamiShinyu opened this issue Feb 11, 2024 · 0 comments

Comments

@MurakamiShinyu
Copy link
Member

MurakamiShinyu commented Feb 11, 2024

文書内に <nav role="doc-toc"> などのマークアップで目次を入れることで、Vivliostyle Viewer の目次メニューや出力したPDFの「しおり」には目次ができるのに、EPUB出力ではそれがEPUBの目次にならないという問題があります。

例:
https://github.com/MurakamiShinyu/shokubutsu_ichinichi/blob/main/shokubutsu_ichinichi.html

これを Vivliostyle CLI で EPUB に変換します。

vivliostyle build shokubutsu_ichinichi.html -o shokubutsu_ichinichi.epub

このEPUBをEPUB閲覧アプリ(Apple Books、Kindle Previewerなど)で開くと、目次メニューにタイトル「植物一日一題」以外に目次項目が表示されません。

EPUBの中のXHTMLファイル shokubutsu_ichinichi.xhtml を見てみると、元のHTMLファイルにあった <nav class="toc" role="doc-toc"> とは別に、次のようにEPUB用の目次がbody要素の終わりに追加されています:

  <nav epub:type="landmarks" id="landmarks" hidden="">
    <ol>
      <li><a epub:type="toc" href="shokubutsu_ichinichi.xhtml#toc">Table of Contents</a></li>
    </ol>
  </nav>
  <nav id="toc" role="doc-toc" epub:type="toc" hidden="">
    <ol>
      <li><a href="shokubutsu_ichinichi.xhtml">植物一日一題</a></li>
    </ol>
  </nav>
</body>
</html>

このように、本のタイトルだけがEPUBでの目次項目になっています。また、次の問題もあります:

  • landmarks項目での目次へのリンク先は文書内の目次ページであるべきなのに、hidden 属性で非表示になっているEPUB用の nav 要素になっている。これでは目次ページにジャンプしようとしても文書の最後のページにジャンプするだけとなる。

修正の提案

以下ように修正するとよいと思います:

  • 元の文書内にEPUB用の目次 <nav epub:type="…"> がある場合はそれをそのまま活かし、別のnav要素を追加しない。
  • EPUB用ではない目次(<nav role="doc-toc"> など)が元の文書内にあれば、その内容を使ってEPUB用の目次 <nav epub:type="toc"> を作る。
    • サポートする必要がある目次の形式については、Publication Manifest仕様のMachine-Processable Table of Contentsを参照。
    • 目次要素の検出については Vivliostyle.jsの findTocElements() の処理(最近 Improve TOC handling vivliostyle.js#1259fix: All <nav epub:type="…"> elements in EPUB navigation doc should be shown in TOC box vivliostyle.js#1271 で修正したもの)を参考に。その要約:
      • EPUB用の目次(<nav epub:type="…">)があれば、それを使う。それがなくて、webpub用の目次(属性 role="doc-toc" 付きの要素)があれば、それを使う。どちらもない場合には、セレクタ nav,.toc,#toc,#table-of-contents,#contents,[role=directory] で見つかる要素を使う。
    • EPUB用の目次の仕様ではリストの要素として <ol> しか認められていないが、webpub用の目次では <ol>, <ul> とも有効なので、EPUB用の目次に変換するには <ul><ol> に変える必要がある。
      • このような要素の変更が必要なため、元の HTML の <nav role="doc-toc">epub:type="toc" を追加するのではなく、<nav epub:type="toc"> を別の要素として作る必要がある。本の内容として表示する文書(EPUBのspine項目)にそれを入れる場合には、hidden 属性が必要。(EPUB用目次を別のXHTMLファイルに生成して、spine項目にはしない場合には hidden 属性はなくてよい)
  • <nav epub:type="landmarks"> で目次へのリンクを出力する場合、そのリンク先は文書内に元からある目次の要素(hidden 属性なし)とする。
  • <nav epub:type="landmarks"><nav epub:type="toc"> のあとに出力したほうがよい。Vivliostyle ViewerでTOC Boxで出現順に表示される。Landmarksよりも目次が最初にあるほうが便利。
  • <nav epub:type="…"> 要素内に見出しがあったほうがよい。例: <h2>Table of Contents</h2><h2>Landmarks</h2>

参考:Vivliostyle.jsで最近行った目次の扱いの修正について

  • Vivliostyle.jsの最新版 v2.27.0 でつぎのように目次の扱いを修正しました:
  • 次の修正版リリース v2.27.1 に入れる予定の修正:
    • 目次要素の検出の処理を再修正 (See: fix: All <nav epub:type="…"> elements in EPUB navigation doc should be shown in TOC box vivliostyle.js#1271)
      • 文書内にEPUB用目次 <nav epub:type="…"> とwebpub用目次(属性 role="doc-toc")が両方ある場合には、EPUB用目次だけ使うようにした。
        • これによりwebpubから変換したEPUBで、ひとつの文書内に両方の形式の目次がある場合に、Vivliostyle Viewerの目次ボックス内にそれらが重複して表示される問題がなくなります。
      • XHTMLではないHTMLファイルであっても <nav epub:type="…"> があればそれを使うようにした。
        • XHTMLの場合 epub: は名前空間プレフィックスだがHTMLの場合はそうではないので doc.querySelectorAll("nav[*|type],nav[epub\\:type]") で両方を検出するようにした。
        • これにより、MD原稿でEPUB用目次を自分で書く場合に、<nav epub:type="toc"> と書くことができるようになります。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant