diff options
| author | Ralph Amissah <ralph.amissah@gmail.com> | 2019-01-24 10:30:39 -0500 | 
|---|---|---|
| committer | Ralph Amissah <ralph.amissah@gmail.com> | 2019-05-17 16:59:38 -0400 | 
| commit | 12693cbe0ebf16a8a3be1e4d72e3802b54c918ee (patch) | |
| tree | b2fe025900750928ae7a33d3507c24cb3f41fd34 /src/doc_reform | |
| parent | 0.4.3 stow (most) uri/links in array, separate from object text (diff) | |
output_xmls epub use struct
Diffstat (limited to 'src/doc_reform')
| -rw-r--r-- | src/doc_reform/output/epub3.d | 204 | ||||
| -rw-r--r-- | src/doc_reform/output/xmls.d | 35 | 
2 files changed, 125 insertions, 114 deletions
| diff --git a/src/doc_reform/output/epub3.d b/src/doc_reform/output/epub3.d index 1df1216..c94c240 100644 --- a/src/doc_reform/output/epub3.d +++ b/src/doc_reform/output/epub3.d @@ -300,14 +300,25 @@ template outputEPub3() {      mixin DocReformOutputRgxInit;      auto xhtml_format = outputXHTMLs();      auto rgx = Rgx(); -    string[][string] doc_epub3; -    string[][string] doc_epub3_endnotes;      string[] doc;      string segment_filename;      string[] top_level_headings = ["","","",""];      string[string] oepbs_content_parts;      string suffix = ".xhtml"; -    string[] doc_parts_; +    struct writeOut { /+ epub specific documents +/ +      /+ fixed output +/ +      string mimetypes; +      string meta_inf_container_xml; +      string oebps_toc_ncx; +      string oebps_toc_nav_xhtml; +      /+ variable output +/ +      string oebps_content_opf; +      string[][string] doc_epub3; +      string[][string] doc_epub3_endnotes; +      string[] doc_parts; +    } +    auto epubWrite = writeOut(); +    // writeln(doc_matters.xml.keys_seq.seg);      foreach (part; doc_matters.xml.keys_seq.seg) {        foreach (obj; doc_abstraction[part]) {          string _txt = xhtml_format.special_characters(obj); @@ -336,25 +347,25 @@ template outputEPub3() {                top_level_headings[3] = "";                goto default;              default: -              doc_parts_ ~= obj.tags.segment_anchor_tag_epub; -              doc_epub3[obj.tags.segment_anchor_tag_epub] ~= xhtml_format.epub3_seg_head(doc_matters); +              epubWrite.doc_parts ~= obj.tags.segment_anchor_tag_epub; +              epubWrite.doc_epub3[obj.tags.segment_anchor_tag_epub] ~= xhtml_format.epub3_seg_head(doc_matters);                auto t = xhtml_format.heading_seg(doc_matters, obj, _txt, suffix, "epub"); -              doc_epub3[obj.tags.segment_anchor_tag_epub] ~= t[0]; -              doc_epub3_endnotes[obj.tags.segment_anchor_tag_epub] ~= t[1]; +              epubWrite.doc_epub3[obj.tags.segment_anchor_tag_epub] ~= t[0]; +              epubWrite.doc_epub3_endnotes[obj.tags.segment_anchor_tag_epub] ~= t[1];                break;              }              break;            case 4:              segment_filename = obj.tags.segment_anchor_tag_epub; -            doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); +            epubWrite.doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters);              auto t = xhtml_format.heading_seg(doc_matters, obj, _txt, suffix, "epub"); -            doc_epub3[segment_filename] ~= t[0]; -            doc_epub3_endnotes[segment_filename] ~= t[1]; +            epubWrite.doc_epub3[segment_filename] ~= t[0]; +            epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];              break;            case 5: .. case 7:              auto t = xhtml_format.heading_seg(doc_matters, obj, _txt, suffix, "epub"); -            doc_epub3[segment_filename] ~= t[0]; -            doc_epub3_endnotes[segment_filename] ~= t[1]; +            epubWrite.doc_epub3[segment_filename] ~= t[0]; +            epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];              break;            case 8: .. case 9:              { /+ debug +/ @@ -383,8 +394,8 @@ template outputEPub3() {                switch (obj.metainfo.is_a) {                case "toc":                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                default:                  { /+ debug +/ @@ -412,8 +423,8 @@ template outputEPub3() {                switch (obj.metainfo.is_a) {                case "para":                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                default:                  { /+ debug +/ @@ -429,32 +440,32 @@ template outputEPub3() {                switch (obj.metainfo.is_a) {                case "quote":                  auto t = xhtml_format.quote_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0].to!string; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "group":                  auto t = xhtml_format.group_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0].to!string; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "block":                  auto t = xhtml_format.block_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0].to!string; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "poem":                  break;                case "verse":                  auto t = xhtml_format.verse_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0].to!string; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "code": -                doc_epub3[segment_filename] ~= xhtml_format.code(obj, _txt); +                epubWrite.doc_epub3[segment_filename] ~= xhtml_format.code(obj, _txt);                  break;                case "table": -                doc_epub3[segment_filename] ~= xhtml_format.table(obj, _txt); -                doc_epub3_endnotes[segment_filename] ~= ""; +                epubWrite.doc_epub3[segment_filename] ~= xhtml_format.table(obj, _txt); +                epubWrite.doc_epub3_endnotes[segment_filename] ~= "";                  break;                default:                  { /+ debug +/ @@ -483,27 +494,27 @@ template outputEPub3() {                switch (obj.metainfo.is_a) {                case "endnote":             assert(part == "endnotes");                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3[segment_filename] ~= t[0];                  break;                case "glossary":            assert(part == "glossary");                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "bibliography":        assert(part == "bibliography");                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "bookindex":           assert(part == "bookindex");                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                case "blurb":               assert(part == "blurb");                  auto t = xhtml_format.para_seg(doc_matters, obj, _txt, suffix, "epub"); -                doc_epub3[segment_filename] ~= t[0]; -                doc_epub3_endnotes[segment_filename] ~= t[1]; +                epubWrite.doc_epub3[segment_filename] ~= t[0]; +                epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1];                  break;                default:                  { /+ debug +/ @@ -585,48 +596,47 @@ template outputEPub3() {        }      }      /+ epub specific documents +/ -    auto mimetypes = epub3_mimetypes; -    auto meta_inf_container_xml = epub3_container_xml; -    auto oebps_toc_ncx = epub2_oebps_toc_ncx(doc_abstraction, doc_matters); -    auto oebps_toc_nav_xhtml = epub3_oebps_toc_nav_xhtml(doc_abstraction, doc_matters); -    auto oebps_content_opf = epub3_oebps_content(doc_abstraction, doc_matters, oepbs_content_parts); -    epub3_write_output_files( -      doc_matters, -      doc_epub3, -      doc_epub3_endnotes, -      mimetypes, -      meta_inf_container_xml, -      oebps_toc_nav_xhtml, -      oebps_toc_ncx, -      oebps_content_opf, -      doc_parts_, -    ); +    epubWrite.mimetypes =              epub3_mimetypes; +    epubWrite.meta_inf_container_xml = epub3_container_xml; +    epubWrite.oebps_toc_ncx =          epub2_oebps_toc_ncx(doc_abstraction, doc_matters); +    epubWrite.oebps_toc_nav_xhtml =    epub3_oebps_toc_nav_xhtml(doc_abstraction, doc_matters); +    epubWrite.oebps_content_opf =      epub3_oebps_content(doc_abstraction, doc_matters, oepbs_content_parts); +    epubWrite.epub3_write_output_files(doc_matters);    } -  void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( -    M    doc_matters, -    D    doc_epub3, -    E    doc_epub3_endnotes, -    Mt   mimetypes, -    Mic  meta_inf_container_xml, -    Otnx oebps_toc_nav_xhtml, -    Otn  oebps_toc_ncx, -    Oc   oebps_content_opf, -    string[] doc_parts_, +  void epub3_write_output_files(W,I)( +    W    epub_write, +    I    doc_matters,    ) {      debug(asserts) { -      static assert(is(typeof(doc_epub3)              == string[][string])); -      static assert(is(typeof(mimetypes)              == string)); -      static assert(is(typeof(meta_inf_container_xml) == string)); -      static assert(is(typeof(oebps_toc_nav_xhtml)    == string)); -      static assert(is(typeof(oebps_toc_ncx)          == string)); -      static assert(is(typeof(oebps_content_opf)      == string)); +      static assert(is(typeof(epub_write.doc_epub3)              == string[][string])); +      static assert(is(typeof(epub_write.mimetypes)              == string)); +      static assert(is(typeof(epub_write.meta_inf_container_xml) == string)); +      static assert(is(typeof(epub_write.oebps_toc_nav_xhtml)    == string)); +      static assert(is(typeof(epub_write.oebps_toc_ncx)          == string)); +      static assert(is(typeof(epub_write.oebps_content_opf)      == string));      } +    static auto rgx = Rgx();      auto pth_epub3 = DocReformPathsEPUB!()(doc_matters.output_path, doc_matters.src.language);      auto xhtml_format = outputXHTMLs();      /+ zip file +/      auto fn_epub = pth_epub3.epub_file(doc_matters.src.filename);      auto zip = new ZipArchive(); // ZipArchive zip = new ZipArchive();      /+ zip archive member files +/ +    void EPUBzip()(string contents, string fn) { +      auto zip_arc_member_file = new ArchiveMember(); +      zip_arc_member_file.name = fn; +      auto zip_data = new OutBuffer(); +      (doc_matters.opt.action.debug_do) +      ? zip_data.write(contents.dup) +      : zip_data.write(contents.dup +        .replaceAll(rgx.spaces_line_start, "") +        .replaceAll(rgx.newline, "") +        .strip +      ); +      zip_arc_member_file.expandedData = zip_data.toBytes(); +      zip.addMember(zip_arc_member_file); +      createZipFile!()(fn_epub, zip.build()); +    }      try {        if (!exists(pth_epub3.base)) {          pth_epub3.base.mkdirRecurse; @@ -654,19 +664,19 @@ template outputEPub3() {              if (doc_matters.opt.action.debug_do) {                string fn_dbg = pth_epub3.dbg_fn_oebps_content_xhtml(doc_matters.src.filename, seg_filename);                auto f = File(fn_dbg, "w"); -              foreach (docseg; doc_epub3[seg_filename]) { +              foreach (docseg; epub_write.doc_epub3[seg_filename]) {                  f.writeln(docseg);                } -              foreach (docseg; doc_epub3_endnotes[seg_filename]) { +              foreach (docseg; epub_write.doc_epub3_endnotes[seg_filename]) {                  f.writeln(docseg);                }                f.writeln(xhtml_format.tail);              }            } -          foreach (docseg; doc_epub3[seg_filename]) { +          foreach (docseg; epub_write.doc_epub3[seg_filename]) {              zip_data.write(docseg.dup);            } -          foreach (docseg; doc_epub3_endnotes[seg_filename]) { +          foreach (docseg; epub_write.doc_epub3_endnotes[seg_filename]) {              zip_data.write(docseg.dup);            }            zip_data.write(xhtml_format.tail.dup); @@ -683,81 +693,51 @@ template outputEPub3() {          { /+ debug +/            if (doc_matters.opt.action.debug_do) {              fn_dbg = pth_epub3.dbg_fn_mimetypes(doc_matters.src.filename); -            File(fn_dbg, "w").writeln(mimetypes); +            File(fn_dbg, "w").writeln(epub_write.mimetypes);            }          }          fn = pth_epub3.fn_mimetypes(doc_matters.src.filename); -        auto zip_arc_member_file = new ArchiveMember(); -        zip_arc_member_file.name = fn; -        auto zip_data = new OutBuffer(); -        zip_data.write(mimetypes.dup); -        zip_arc_member_file.expandedData = zip_data.toBytes(); -        zip.addMember(zip_arc_member_file); -        createZipFile!()(fn_epub, zip.build()); +        EPUBzip(epub_write.mimetypes, fn);        }        { /+  META-INF/container.xml (identify doc root) +/          { /+ debug +/            if (doc_matters.opt.action.debug_do) {              fn_dbg = pth_epub3.dbg_fn_dmi_container_xml(doc_matters.src.filename); -            File(fn_dbg, "w").writeln(meta_inf_container_xml); +            File(fn_dbg, "w").writeln(epub_write.meta_inf_container_xml);            }          }          fn = pth_epub3.fn_dmi_container_xml(doc_matters.src.filename); -        auto zip_arc_member_file = new ArchiveMember(); -        zip_arc_member_file.name = fn; -        auto zip_data = new OutBuffer(); -        zip_data.write(meta_inf_container_xml.dup); -        zip_arc_member_file.expandedData = zip_data.toBytes(); -        zip.addMember(zip_arc_member_file); -        createZipFile!()(fn_epub, zip.build()); +        EPUBzip(epub_write.meta_inf_container_xml, fn);        }        { /+ OEBPS/toc_nav.xhtml (navigation toc epub3) +/          { /+ debug +/            if (doc_matters.opt.action.debug_do) {              fn_dbg = pth_epub3.dbg_fn_oebps_toc_nav_xhtml(doc_matters.src.filename); -            File(fn_dbg, "w").writeln(oebps_toc_nav_xhtml); +            File(fn_dbg, "w").writeln(epub_write.oebps_toc_nav_xhtml);            }          }          fn = pth_epub3.fn_oebps_toc_nav_xhtml(doc_matters.src.filename); -        auto zip_arc_member_file = new ArchiveMember(); -        zip_arc_member_file.name = fn; -        auto zip_data = new OutBuffer(); -        zip_data.write(oebps_toc_nav_xhtml.dup); -        zip_arc_member_file.expandedData = zip_data.toBytes(); -        zip.addMember(zip_arc_member_file); -        createZipFile!()(fn_epub, zip.build()); +        EPUBzip(epub_write.oebps_toc_nav_xhtml, fn);        }        { /+ OEBPS/toc.ncx (navigation toc epub2) +/          { /+ debug +/            if (doc_matters.opt.action.debug_do) {              fn_dbg = pth_epub3.dbg_fn_oebps_toc_ncx(doc_matters.src.filename); -            File(fn_dbg, "w").writeln(oebps_toc_ncx); +            File(fn_dbg, "w").writeln(epub_write.oebps_toc_ncx);            }          }          fn = pth_epub3.fn_oebps_toc_ncx(doc_matters.src.filename); -        auto zip_arc_member_file = new ArchiveMember(); -        zip_arc_member_file.name = fn; -        auto zip_data = new OutBuffer(); -        zip_data.write(oebps_toc_ncx.dup); -        zip_arc_member_file.expandedData = zip_data.toBytes(); -        zip.addMember(zip_arc_member_file); -        createZipFile!()(fn_epub, zip.build()); +        EPUBzip(epub_write.oebps_toc_ncx, fn);        }        { /+ OEBPS/content.opf (doc manifest) +/          { /+ debug +/            if (doc_matters.opt.action.debug_do) {              fn_dbg = pth_epub3.dbg_fn_oebps_content_opf(doc_matters.src.filename); -            File(fn_dbg, "w").writeln(oebps_content_opf); +            File(fn_dbg, "w").writeln(epub_write.oebps_content_opf);            }          }          fn = pth_epub3.fn_oebps_content_opf(doc_matters.src.filename); -        auto zip_arc_member_file = new ArchiveMember(); -        zip_arc_member_file.name = fn; -        auto zip_data = new OutBuffer(); -        zip_data.write(oebps_content_opf.dup); -        zip_arc_member_file.expandedData = zip_data.toBytes(); -        zip.addMember(zip_arc_member_file); -        createZipFile!()(fn_epub, zip.build()); +        EPUBzip(epub_write.oebps_content_opf, fn);        }        { /+ OEBPS/_sisu/image (images) +/          foreach (image; doc_matters.srcs.image_list) { diff --git a/src/doc_reform/output/xmls.d b/src/doc_reform/output/xmls.d index 41787ae..fe02338 100644 --- a/src/doc_reform/output/xmls.d +++ b/src/doc_reform/output/xmls.d @@ -379,8 +379,7 @@ template outputXHTMLs() {                    rgx.inline_link_hash,                    "┥$1┝┤"                    ~ doc_matters.xml.tag_associations[(m.captures[3])][seg_lvs] -                  ~ _suffix -                  ~ "#" ~ "$3" +                  ~ _suffix ~ "#" ~ "$3"                    ~ "├"                  );                } @@ -627,6 +626,10 @@ template outputXHTMLs() {        string            _txt,        string            _xml_type = "html",      ) { +      assert(obj.metainfo.is_of_part    == "body" || "frontmatter" || "backmatter"); +      assert(obj.metainfo.is_of_section == "body" || "toc" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb"); +      assert(obj.metainfo.is_of_type    == "para"); +      assert(obj.metainfo.is_a          == "heading");        auto tags = _xhtml_anchor_tags(obj);        string heading_lev_anchor_tag;        string _horizontal_rule = "<hr />"; @@ -709,6 +712,10 @@ template outputXHTMLs() {        const        O    obj,        string            _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body" || "frontmatter" || "backmatter"); +      assert(obj.metainfo.is_of_section == "body" || "toc" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb"); +      assert(obj.metainfo.is_of_type    == "para"); +      assert(obj.metainfo.is_a          == "para" || "toc" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb");        auto tags = _xhtml_anchor_tags(obj);        _txt = font_face(_txt);        string o; @@ -778,6 +785,10 @@ template outputXHTMLs() {        const        O  obj,        string          _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body"); +      assert(obj.metainfo.is_of_section == "body" || "glossary" || "bibliography" || "bookindex" || "blurb"); +      assert(obj.metainfo.is_of_type    == "block"); +      assert(obj.metainfo.is_a          == "quote");        _txt = font_face(_txt);        string o;        if (!(obj.metainfo.identifier.empty)) { @@ -837,6 +848,10 @@ template outputXHTMLs() {        const        O    obj,        string            _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body"); +      assert(obj.metainfo.is_of_section == "body" || "glossary" || "bibliography" || "bookindex" || "blurb"); +      assert(obj.metainfo.is_of_type    == "block"); +      assert(obj.metainfo.is_a          == "group");        _txt = font_face(_txt);        string o;        if (!(obj.metainfo.identifier.empty)) { @@ -897,6 +912,10 @@ template outputXHTMLs() {        const        O    obj,        string            _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body"); +      assert(obj.metainfo.is_of_section == "body" || "glossary" || "bibliography" || "bookindex" || "blurb"); +      assert(obj.metainfo.is_of_type    == "block"); +      assert(obj.metainfo.is_a          == "block");        _txt = font_face(_txt);        string o;        if (!(obj.metainfo.identifier.empty)) { @@ -953,6 +972,10 @@ template outputXHTMLs() {        const        O    obj,        string            _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body"); +      assert(obj.metainfo.is_of_section == "body" || "glossary" || "bibliography" || "bookindex" || "blurb"); +      assert(obj.metainfo.is_of_type    == "block"); +      assert(obj.metainfo.is_a          == "verse");        _txt = font_face(_txt);        string o;        if (!(obj.metainfo.identifier.empty)) { @@ -1042,6 +1065,10 @@ template outputXHTMLs() {        const        O    obj,        string            _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body"); +      assert(obj.metainfo.is_of_section == "body"); +      assert(obj.metainfo.is_of_type    == "block"); +      assert(obj.metainfo.is_a          == "table");        auto tags = _xhtml_anchor_tags(obj);        _txt = font_face(_txt);        auto t = tablarize(obj, _txt); @@ -1086,6 +1113,10 @@ template outputXHTMLs() {        const        O    obj,        string            _txt,      ) { +      assert(obj.metainfo.is_of_part    == "body"); +      assert(obj.metainfo.is_of_section == "body"); +      assert(obj.metainfo.is_of_type    == "block"); +      assert(obj.metainfo.is_a          == "code");        string o;        if (!(obj.metainfo.identifier.empty)) {          o = format(q"¶  <div class="substance"> | 
