diff options
Diffstat (limited to 'src/sdp/output_epub3.d')
| -rw-r--r-- | src/sdp/output_epub3.d | 190 | 
1 files changed, 114 insertions, 76 deletions
diff --git a/src/sdp/output_epub3.d b/src/sdp/output_epub3.d index 3df1992..074808c 100644 --- a/src/sdp/output_epub3.d +++ b/src/sdp/output_epub3.d @@ -122,10 +122,24 @@ template outputEPub3() {    string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) {      enum DomTags { none, open, close, close_and_open, open_still, }      auto markup = InlineMarkup(); -    string toc ="<nav epub:type=\"toc\" id=\"toc\">\n"; +    auto rgx = Rgx(); +    string toc =format("<html xmlns=\"http://www.w3.org/1999/xhtml\" +      xmlns:epub=\"http://www.idpf.org/2007/ops\"> +  <head> +    <title>%s</title> +  </head> +  <body> +    <section epub:type=\"frontmatter toc\"> +      <header> +        <h1>Contents</h1> +      </header> +      <nav epub:type=\"toc\" id=\"toc\">\n", +      doc_matters.dochead_meta["title"]["full"], +    );      foreach (sect; doc_matters.keys_seq.seg) {        foreach (obj; doc_abstraction[sect]) {          if (obj.is_a == "heading") { +          string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip;            foreach_reverse (n; 0 .. 7) {              string k = n.to!string;              switch (obj.dom_collapsed[n]) { @@ -135,10 +149,12 @@ template outputEPub3() {                break;              case DomTags.close_and_open :                toc ~= markup.indent_by_spaces_provided((n + 1), "  ") ~ "</li>" ~ "\n"; -              if  (obj.dom_markedup[n] < 4) { +              if  (obj.heading_lev_markup < 4) {                  toc ~= markup.indent_by_spaces_provided((n + 1), "  ") ~ "<li>" ~ "\n"                  ~ markup.indent_by_spaces_provided((n + 2), "  ") -                ~ "<span class=\"navhd\">" ~ obj.text ~ "</span>" ~ "\n"; +                ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ "\">" +                ~ _txt +                ~ "</a>" ~ "\n";                } else {                  string hashtag =(obj.heading_lev_markup == 4)                  ? "" @@ -146,15 +162,18 @@ template outputEPub3() {                  toc ~= markup.indent_by_spaces_provided((n + 1), "  ") ~ "<li>" ~ "\n"                  ~ markup.indent_by_spaces_provided((n + 2), "  ")                  ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ hashtag ~ "\">" -                ~ obj.text +                ~ _txt                  ~ "</a>" ~ "\n";                }                break;              case DomTags.open :                toc ~= markup.indent_by_spaces_provided(n, "  ") ~ "<ol>" ~ "\n"; -              if  (obj.dom_markedup[n] < 4) { -                toc ~= markup.indent_by_spaces_provided(n, "  ") -                ~ "<li><span class=\"navhd\">" ~ obj.text ~ "</span>" ~ "\n"; +              if  (obj.heading_lev_markup < 4) { +                toc ~= markup.indent_by_spaces_provided((n + 1), "  ") ~ "<li>" ~ "\n" +                ~ markup.indent_by_spaces_provided((n + 2), "  ") +                ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ "\">" +                ~ _txt +                ~ "</a>" ~ "\n";                } else {                  string hashtag =(obj.heading_lev_markup == 4)                  ? "" @@ -162,7 +181,7 @@ template outputEPub3() {                  toc ~= markup.indent_by_spaces_provided((n + 1), "  ") ~ "<li>" ~ "\n"                  ~ markup.indent_by_spaces_provided((n + 2), "  ")                  ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ hashtag ~ "\">" -                ~ obj.text +                ~ _txt                  ~ "</a>" ~ "\n";                }                break; @@ -173,77 +192,85 @@ template outputEPub3() {          }        }      } -    toc ~="</nav>\n"; +    toc ~="</nav> +      </section> +    </body> +  </html>\n";      return toc;    }    string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) {      int counter = 0;      string uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO shared elsewhere      auto markup = InlineMarkup(); +    auto rgx = Rgx();      enum DomTags { none, open, close, close_and_open, open_still, }      string toc = format(q"¶<?xml version='1.0' encoding='utf-8'?>    <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1"> -    <head> -      <!-- four required metadata items (for all NCX documents, -        (including the relaxed constraints of OPS 2.0) --> -      <title>%s%s</title> -      <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> -      <meta name="dtb:uid" content="urn:uuid:%s" /> -      <!-- <meta name="epub-creator" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> --> -      <meta name="dtb:depth" content="%s" /> -      <meta name="dtb:totalPageCount" content="0" /> -      <meta name="dtb:maxPageNumber" content="0" /> -    </head> -    <docTitle> -      <text>%s</text> -    </docTitle> -    <docAuthor> -      <text>%s</text> -    </docAuthor> -    <navMap>¶", -      doc_matters.dochead_meta["title"]["full"],                                                               // title -      (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : " by " ~ doc_matters.dochead_meta["creator"]["author"], // author -      uuid,                                                                                        // uuid -      "3",                                                                                         // content depth -      doc_matters.dochead_meta["title"]["full"],                                                               // title -      (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : doc_matters.dochead_meta["creator"]["author"],          // author +  <head> +    <!-- four required metadata items (for all NCX documents, +      (including the relaxed constraints of OPS 2.0) --> +    <title>%s%s</title> +    <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> +    <meta name="dtb:uid" content="urn:uuid:%s" /> +    <!-- <meta name="epub-creator" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> --> +    <meta name="dtb:depth" content="%s" /> +    <meta name="dtb:totalPageCount" content="0" /> +    <meta name="dtb:maxPageNumber" content="0" /> +  </head> +  <docTitle> +    <text>%s</text> +  </docTitle> +  <docAuthor> +    <text>%s</text> +  </docAuthor> +  <navMap>¶", +      doc_matters.dochead_meta["title"]["full"],                          // title +      (doc_matters.dochead_meta["creator"]["author"].empty) ? "" +        : " by " ~ doc_matters.dochead_meta["creator"]["author"],         // author +      uuid,                                                               // uuid +      "3",                                                                // content depth +      doc_matters.dochead_meta["title"]["full"],                          // title +      (doc_matters.dochead_meta["creator"]["author"].empty) ? "" +        : doc_matters.dochead_meta["creator"]["author"],                  // author      );      foreach (sect; doc_matters.keys_seq.seg) {        foreach (obj; doc_abstraction[sect]) {          if (obj.is_a == "heading") { +          string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip; +          string hashtag =(obj.heading_lev_markup <= 4) ? "" : ("#" ~ obj.ocn.to!string);            foreach_reverse (k; 0 .. 7) {              switch (obj.dom_markedup[k]) {              case DomTags.close : -              // writeln(markup.indent_by_spaces_provided(k), "</", k, ">"); // --debug dom tags -  toc ~= "</navPoint>"; +              toc ~= "\n    </navPoint>";                break;              case DomTags.close_and_open : -              // writeln(markup.indent_by_spaces_provided(k), "</", k, ">"); // --debug dom tags -              // writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text); // --debug dom tags                ++counter; -  toc ~= "</navPoint>"; -  toc ~= format(q"¶<navPoint class="chapter" id="navpoint" playOrder="%s"> -  <navLabel> -    <text>%s</text> -  </navLabel> -  <content src="%s" />¶", -  counter, -  obj.text, -  obj.segment_anchor_tag,   // lev < 4 [no link]; lev == 4 [filename] markup.xhtml; lev > 4 [filename#ocn] (links done in segment_anchor_tag) -  ); +              toc ~= "\n    </navPoint>"; +              toc ~= format(q"¶ +    <navPoint class="chapter" id="navpoint" playOrder="%s"> +      <navLabel> +        <text>%s</text> +      </navLabel> +      <content src="%s.xhtml%s" />¶", +                counter, +                _txt, +                obj.segment_anchor_tag, +                hashtag, +              );                break;              case DomTags.open : -              // writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text); // --debug dom tags                ++counter; -  toc ~= format(q"¶<navPoint class="chapter" id="navpoint" playOrder="%s"> -  <navLabel> -    <text>%s</text> -  </navLabel> -  <content src="%s" />¶", -  counter, -  obj.text, -  obj.segment_anchor_tag,   // lev < 4 [no link]; lev == 4 [filename] markup.xhtml; lev > 4 [filename#ocn] (fix links in segment_anchor_tag) -  ); +              toc ~= format(q"¶ +    <navPoint class="chapter" id="navpoint" playOrder="%s"> +      <navLabel> +        <text>%s</text> +      </navLabel> +      <content src="%s.xhtml%s" />¶", +                counter, +                _txt, +                obj.segment_anchor_tag, +                hashtag, +              );                break;              default :                break; @@ -271,6 +298,7 @@ template outputEPub3() {      string[] top_level_headings = ["","","",""];      string[string] oepbs_content_parts;      string suffix = ".xhtml"; +    string[] doc_parts_;      foreach (part; doc_matters.keys_seq.seg) {        foreach (obj; doc_abstraction[part]) {          string _txt = xhtml_format.special_characters(obj, obj.text); @@ -298,23 +326,23 @@ template outputEPub3() {                top_level_headings[3] = "";                goto default;              default: -              auto t = xhtml_format.heading_seg(obj, suffix); -              top_level_headings[obj.heading_lev_markup] = t[0]; +              doc_parts_ ~= obj.segment_anchor_tag; +              doc_epub3[obj.segment_anchor_tag] ~= xhtml_format.epub3_seg_head(doc_matters); +              auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); +              doc_epub3[obj.segment_anchor_tag] ~= t[0]; +              doc_epub3_endnotes[obj.segment_anchor_tag] ~= t[1];                break;              }              break;            case 4:              segment_filename = obj.segment_anchor_tag; -            doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters.dochead_meta); -            foreach (top_level_heading; top_level_headings) { -              doc_epub3[segment_filename] ~= top_level_heading; -            } -            auto t = xhtml_format.heading_seg(obj, _txt, suffix); +            doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); +            auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub");              doc_epub3[segment_filename] ~= t[0];              doc_epub3_endnotes[segment_filename] ~= t[1];              break;            case 5: .. case 7: -            auto t = xhtml_format.heading_seg(obj, _txt, suffix); +            auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub");              doc_epub3[segment_filename] ~= t[0];              doc_epub3_endnotes[segment_filename] ~= t[1];              break; @@ -337,7 +365,9 @@ template outputEPub3() {              case "para":                switch (obj.is_a) {                case "toc": -                doc_epub3[segment_filename] ~= xhtml_format.toc_seg(obj, _txt); +                auto t = xhtml_format.para_seg(obj, _txt, suffix); +                doc_epub3[segment_filename] ~= t[0]; +                doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                default:                  if ((doc_matters.opt_action_bool["debug"])) { @@ -467,35 +497,41 @@ template outputEPub3() {            }          }          if (obj.is_a == "heading") { -          if (obj.heading_lev_markup == 4) { -            oepbs_content_parts["manifest_documents"] ~= format(q"¶      <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> +          if (obj.heading_lev_markup <= 4) { +            oepbs_content_parts["manifest_documents"] ~= +              format(q"¶      <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" />    ¶",                obj.segment_anchor_tag,                obj.segment_anchor_tag,              ); -            oepbs_content_parts["spine"] ~= format(q"¶    <itemref idref="%s.xhtml" linear="yes" /> +            oepbs_content_parts["spine"] ~= +              format(q"¶    <itemref idref="%s.xhtml" linear="yes" />    ¶",                obj.segment_anchor_tag,              ); -            oepbs_content_parts["guide"] ~= format(q"¶      <reference type="%s" href="%s" /> +            oepbs_content_parts["guide"] ~= +              format(q"¶      <reference type="%s" href="%s" />    ¶",                obj.segment_anchor_tag,                obj.segment_anchor_tag,              );            } else if (obj.heading_lev_markup > 4) { -            oepbs_content_parts["manifest_documents"] ~= format(q"¶      <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> +            oepbs_content_parts["manifest_documents"] ~= +              format(q"¶      <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" />    ¶",                obj.segment_anchor_tag,                obj.obj_cite_number,                obj.segment_anchor_tag,                obj.obj_cite_number,              ); -            oepbs_content_parts["spine"] ~= format(q"¶    <itemref idref="%s.xhtml#%s" linear="yes" /> +            oepbs_content_parts["spine"] ~= +              format(q"¶    <itemref idref="%s.xhtml#%s" linear="yes" />    ¶",                obj.segment_anchor_tag,                obj.obj_cite_number,              ); -            oepbs_content_parts["guide"] ~= format(q"¶      <reference type="%s#%s" href="%s#%s" /> +            oepbs_content_parts["guide"] ~= +              format(q"¶      <reference type="%s#%s" href="%s#%s" />    ¶",                obj.segment_anchor_tag,                obj.obj_cite_number, @@ -521,6 +557,7 @@ template outputEPub3() {        oebps_toc_nav_xhtml,        oebps_toc_ncx,        oebps_content_opf, +      doc_parts_,      );    }    void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( @@ -532,8 +569,8 @@ template outputEPub3() {      Otnx oebps_toc_nav_xhtml,      Otn  oebps_toc_ncx,      Oc   oebps_content_opf, +    string[] doc_parts_,    ) { -    auto css = SiSUcss();      debug(asserts) {        static assert(is(typeof(doc_epub3)              == string[][string]));        static assert(is(typeof(mimetypes)              == string)); @@ -567,7 +604,7 @@ template outputEPub3() {          }        }        { /+ OEBPS/[segments].xhtml (the document contents) +/ -        foreach (seg_filename; doc_matters.segnames) { +        foreach (seg_filename; doc_matters.segnames_lv_0_to_4) {            string fn = pth_epub3.fn_oebps_content_xhtml(doc_matters.source_filename, seg_filename);            /+ add zip archive file members (with their content) +/            auto zip_arc_member_file = new ArchiveMember(); @@ -717,6 +754,7 @@ template outputEPub3() {          }        }        { /+ OEBPS/epub.css +/ +        auto css = SiSUcss();          debug(epub_output) {            fn_dbg = pth_epub3.dbg_fn_oebps_css(doc_matters.source_filename);            File(fn_dbg, "w").writeln(css.epub_css); @@ -727,7 +765,7 @@ template outputEPub3() {          // add OEBPS/content.opf to zip archive          zip_arc_member_file.name = fn;          auto zip_data = new OutBuffer(); -        zip_data.write(oebps_content_opf.dup); // cast as: char[] +        zip_data.write(css.epub_css.dup); // cast as: char[]          zip_arc_member_file.expandedData = zip_data.toBytes();          zip.addMember(zip_arc_member_file);          /+ create the zip file +/  | 
