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 +/ |