diff options
author | Ralph Amissah <ralph.amissah@gmail.com> | 2022-02-04 18:48:25 -0500 |
---|---|---|
committer | Ralph Amissah <ralph.amissah@gmail.com> | 2022-02-05 18:26:02 -0500 |
commit | 30b6d716f3e4448667ee61bdda044df739d6ad68 (patch) | |
tree | 8cbe98e04605f388bc52cb368198833121cf1f8a /src | |
parent | codegen cgi search removed (using src in org-mode) (diff) |
epub, work on
Diffstat (limited to 'src')
-rw-r--r-- | src/doc_reform/io_out/defaults.d | 2 | ||||
-rw-r--r-- | src/doc_reform/io_out/epub3.d | 156 | ||||
-rw-r--r-- | src/doc_reform/io_out/rgx.d | 2 | ||||
-rw-r--r-- | src/doc_reform/io_out/xmls.d | 20 | ||||
-rw-r--r-- | src/doc_reform/meta/defaults.d | 2 | ||||
-rw-r--r-- | src/doc_reform/meta/metadoc_from_src.d | 12 | ||||
-rw-r--r-- | src/doc_reform/meta/rgx.d | 3 |
7 files changed, 40 insertions, 157 deletions
diff --git a/src/doc_reform/io_out/defaults.d b/src/doc_reform/io_out/defaults.d index aedbbc1..6839c92 100644 --- a/src/doc_reform/io_out/defaults.d +++ b/src/doc_reform/io_out/defaults.d @@ -73,7 +73,7 @@ template InternalMarkup() { string mark_internal_site_lnk = "¤"; string nbsp = "░"; string br_line = "┘"; - string br_nl = "┙"; + string br_newline_inline = "┙"; string br_paragraph = "┚"; string br_obj = "break_obj"; string br_page_line = "┼"; diff --git a/src/doc_reform/io_out/epub3.d b/src/doc_reform/io_out/epub3.d index 6593db5..a49304f 100644 --- a/src/doc_reform/io_out/epub3.d +++ b/src/doc_reform/io_out/epub3.d @@ -70,8 +70,7 @@ template outputEPub3() { .replaceAll(rgx.xhtml_quotation, """) // """ .replaceAll(rgx.xhtml_less_than, "<") // "<" .replaceAll(rgx.xhtml_greater_than, ">") // ">" - .replaceAll(rgx.br_line, "<br>") - .replaceAll(rgx.br_nl, "<br>") + .replaceAll(rgx.br_line, "<br />") .replaceAll(rgx.nbsp_char, " "); return _txt; } @@ -114,8 +113,7 @@ template outputEPub3() { <dc:identifier id="bookid">urn:uuid:%s</dc:identifier> </metadata> <manifest> - <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" /> - <link rel="stylesheet" href="%s" type="text/css" id="main-css" /> + <item id="css" href="%s" media-type="text/css"/> <item id="nav" href="toc_nav.xhtml" media-type="application/xhtml+xml" properties="nav" /> ┃", _uuid, @@ -147,7 +145,7 @@ template outputEPub3() { ); } content ~= " " ~ "</manifest>" ~ "\n "; - content ~= " " ~ "<spine toc=\"ncx\">" ~ "\n "; + content ~= " " ~ "<spine>" ~ "\n "; content ~= parts["spine"]; content ~= " " ~ "</spine>" ~ "\n "; content ~= " " ~ "<guide>" ~ "\n "; @@ -196,7 +194,6 @@ template outputEPub3() { <h1>Contents</h1> </header> <nav epub:type="toc" id="toc"> - <ol> <li>┃", (doc_matters.conf_make_meta.meta.title_full).special_characters_text, ); @@ -210,7 +207,10 @@ template outputEPub3() { </li> ┃", toc_head, - obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip, + obj.text + .replaceAll(rgx.inline_notes_al_gen, "") + .replaceAll(rgx.br_newline_inline, "<br />") + .strip, ); } else if (sect == "tail") { // skip } else if ((sect != "tail") && (obj.metainfo.is_a == "heading")) { @@ -268,7 +268,7 @@ template outputEPub3() { break; } if (n == 0) { - _toc_nav_tail ~="</nav> + _toc_nav_tail ~=" </nav> </section> </body> </html>\n"; @@ -281,115 +281,6 @@ template outputEPub3() { toc ~= _toc_nav_tail; return toc; } - @safe string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { - int counter_play_order = 0; - string _uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO shared elsewhere - auto markup = InlineMarkup(); - static auto rgx = RgxO(); - enum DomTags { none, open, close, close_and_open, open_still, } - string toc; - string toc_ = format(q"┃<?xml version="1.0" encoding="utf-8"?> - <ncx xmlns="https://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="Styles/epub.css" type="text/css" id="main-css" /> - <meta name="dtb:uid" content="urn:uuid:%s" /> - <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.conf_make_meta.meta.title_full).special_characters_text, // title - (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : " by " ~ (doc_matters.conf_make_meta.meta.creator_author).special_characters_text, // author - _uuid, // uuid - "3", // content depth - (doc_matters.conf_make_meta.meta.title_full).special_characters_text, // title - (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : (doc_matters.conf_make_meta.meta.creator_author).special_characters_text, // author - ); - string _toc_ncx_tail = ""; - foreach (sect; doc_matters.has.keys_seq.seg) { - foreach (obj; doc_abstraction[sect]) { - if (sect == "head") { toc = toc_; - } - if (obj.metainfo.is_a == "heading") { - string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip.special_characters_text; - // writeln(_txt, " --- ", obj.metainfo.dom_structure_collapsed_tags_status); // DEBUG line - string hashtag = (obj.metainfo.heading_lev_markup <= 4) ? "" : ("#" ~ obj.metainfo.ocn.to!string); - foreach_reverse (k; 0 .. 7) { - switch (obj.metainfo.dom_structure_collapsed_tags_status[k]) { // for epub may need to construct for levels 1 to 4 only - case DomTags.close : - if (sect != "head") { - toc ~= "\n </navPoint>"; // issue at start of some documents - } - break; - case DomTags.close_and_open : - toc ~= "\n </navPoint>"; - goto default; - case DomTags.open : - goto default; - default : - string _toc; - if ((obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.open - || obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.close_and_open - // || obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.open_still - )) { - ++counter_play_order; - _toc = format(q"┃ - <navPoint class="chapter" id="navpoint" playOrder="%s"> - <navLabel> - <text>%s</text> - </navLabel> - <content src="%s.xhtml%s" />┃", - counter_play_order, - _txt, - obj.tags.segment_anchor_tag_epub, - hashtag, - ); - } - if (obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.close_and_open) { - toc ~= _toc; - } else if (obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.open) { - toc ~= _toc; - } - break; - } - if (doc_matters.has.keys_seq.seg[doc_matters.has.keys_seq.seg.length - 2] == sect) { - if (k == 6) {_toc_ncx_tail = "";} - switch (obj.metainfo.dom_structure_collapsed_tags_status[k]) { - case 0: case 2: - // case DomTags.none: case DomTags.close: - break; - case 1: case 3: case 4: - // case DomTags.open: case DomTags.close_and_open: case DomTags.open_still: - if (k != 0) { - } - _toc_ncx_tail ~= " " ~ markup.indent_by_spaces_provided(k, " ") ~ "</navPoint>" ~ "\n"; - break; - default : - break; - } - if (k == 0) { - _toc_ncx_tail ~= format(q"┃ </navMap> - </ncx>┃"); - } - } - } - } - } - } - toc ~= _toc_ncx_tail; - return toc; - } @system void outputEPub3(D,I)( const D doc_abstraction, I doc_matters, @@ -406,7 +297,6 @@ template outputEPub3() { /+ fixed output +/ string mimetypes; string meta_inf_container_xml; - string oebps_toc_ncx; string oebps_toc_nav_xhtml; /+ variable output +/ string oebps_content_opf; @@ -654,25 +544,25 @@ template outputEPub3() { assert(obj.text.length > 0); if (obj.metainfo.heading_lev_markup <= 4) { oepbs_content_parts["manifest_documents"] ~= - format(q"┃ <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> + format(q"┃<item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> ┃", obj.tags.segment_anchor_tag_epub, obj.tags.segment_anchor_tag_epub, ); oepbs_content_parts["spine"] ~= - format(q"┃ <itemref idref="%s.xhtml" linear="yes" /> + format(q"┃<itemref idref="%s.xhtml" linear="yes" /> ┃", obj.tags.segment_anchor_tag_epub, ); oepbs_content_parts["guide"] ~= - format(q"┃ <reference type="%s" href="%s" /> + format(q"┃<reference type="%s" href="%s" /> ┃", obj.tags.segment_anchor_tag_epub, obj.tags.segment_anchor_tag_epub, ); } else if (obj.metainfo.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" /> + format(q"┃<item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> ┃", obj.tags.segment_anchor_tag_epub, obj.metainfo.object_number, @@ -680,13 +570,13 @@ template outputEPub3() { obj.metainfo.object_number, ); oepbs_content_parts["spine"] ~= - format(q"┃ <itemref idref="%s.xhtml#%s" linear="yes" /> + format(q"┃<itemref idref="%s.xhtml#%s" linear="yes" /> ┃", obj.tags.segment_anchor_tag_epub, obj.metainfo.object_number, ); oepbs_content_parts["guide"] ~= - format(q"┃ <reference type="%s#%s" href="%s#%s" /> + format(q"┃<reference type="%s#%s" href="%s#%s" /> ┃", obj.tags.segment_anchor_tag_epub, obj.metainfo.object_number, @@ -698,11 +588,10 @@ template outputEPub3() { } } /+ epub specific documents +/ - epubWrite.mimetypes = epub3_mimetypes; + epubWrite.mimetypes = epub3_mimetypes; epubWrite.meta_inf_container_xml = epub3_container_xml; - epubWrite.oebps_toc_ncx = doc_abstraction.epub2_oebps_toc_ncx(doc_matters); - epubWrite.oebps_toc_nav_xhtml = doc_abstraction.epub3_oebps_toc_nav_xhtml(doc_matters); - epubWrite.oebps_content_opf = doc_abstraction.epub3_oebps_content(doc_matters, oepbs_content_parts); + epubWrite.oebps_toc_nav_xhtml = doc_abstraction.epub3_oebps_toc_nav_xhtml(doc_matters); + epubWrite.oebps_content_opf = doc_abstraction.epub3_oebps_content(doc_matters, oepbs_content_parts); epubWrite.epub3_write_output_files(doc_matters); } @system void epub3_write_output_files(W,M)( @@ -714,7 +603,6 @@ template outputEPub3() { 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 = RgxO(); @@ -821,16 +709,6 @@ template outputEPub3() { fn = pth_epub3.fn_oebps_toc_nav_xhtml; 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(epub_write.oebps_toc_ncx); - } - } - fn = pth_epub3.fn_oebps_toc_ncx; - EPUBzip(epub_write.oebps_toc_ncx, fn); - } { /+ OEBPS/content.opf (doc manifest) +/ { /+ debug +/ if (doc_matters.opt.action.debug_do) { diff --git a/src/doc_reform/io_out/rgx.d b/src/doc_reform/io_out/rgx.d index 7f3b9da..3aaf420 100644 --- a/src/doc_reform/io_out/rgx.d +++ b/src/doc_reform/io_out/rgx.d @@ -76,7 +76,7 @@ static template spineRgxOut() { static br_empty_line = ctRegex!(`\n[ ]*\n`, "mg"); static br_newlines_linebreaks = ctRegex!(`[\n┘┙]`, "mg"); static br_line = ctRegex!(`┘`, "mg"); - static br_nl = ctRegex!(`┙`, "mg"); + static br_newline_inline = ctRegex!(`┙`, "mg"); /+ inline markup footnotes endnotes +/ static inline_notes_al = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg"); static inline_notes_al_special = ctRegex!(`【(?:[*+]\s+)(.+?)】`, "mg"); // TODO remove match when special footnotes are implemented diff --git a/src/doc_reform/io_out/xmls.d b/src/doc_reform/io_out/xmls.d index 66661cf..6191fa9 100644 --- a/src/doc_reform/io_out/xmls.d +++ b/src/doc_reform/io_out/xmls.d @@ -99,16 +99,14 @@ template outputXHTMLs() { .replaceAll(rgx.xhtml_quotation, """) // """ .replaceAll(rgx.xhtml_less_than, "<") // "<" .replaceAll(rgx.xhtml_greater_than, ">") // ">" - .replaceAll(rgx.br_line, "<br>") - .replaceAll(rgx.br_nl, "<br>") + .replaceAll(rgx.br_line, "<br />") .replaceAll(rgx.nbsp_char, " "); return _txt; } @safe string special_characters_date(string _txt) { _txt = _txt .replaceAll(regex(r"(?:-00)+"), "") - .replaceAll(rgx.br_line, "<br>") - .replaceAll(rgx.br_nl, "<br>") + .replaceAll(rgx.br_line, "<br />") .replaceAll(rgx.nbsp_char, " "); return _txt; } @@ -237,7 +235,7 @@ template outputXHTMLs() { .replaceAll( rgx.br_line, "") .replaceAll( - rgx.br_nl, ""); + rgx.br_newline_inline, ""); } else { _locations = "<p class=\"tiny_left\"><a href=\"https://www.doc-reform.org\">spine</a></p>\n<p class=\"tiny_left\"><a href=\"https://git.sisudoc.org/software/spine/\">sources / git</a></p>\n<p class=\"tiny_left\"><a href=\"https://www.sisudoc.org\">www.sisudoc.org</a></p>"; } @@ -812,14 +810,16 @@ template outputXHTMLs() { (doc_matters.opt.action.ocn_off) ? "" : ((obj.metainfo.object_number.empty) ? "" : obj.metainfo.identifier), - obj.metainfo.heading_lev_markup, + ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 + : obj.metainfo.heading_lev_markup), obj.metainfo.is_a, obj.metainfo.identifier, obj.metainfo.identifier, tags, heading_lev_anchor_tag, _txt, - obj.metainfo.heading_lev_markup, + ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 + : obj.metainfo.heading_lev_markup), ); } else { o = format(q"┃%s @@ -829,12 +829,14 @@ template outputXHTMLs() { </h%s> </div>┃", _horizontal_rule, - obj.metainfo.heading_lev_markup, + ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 + : obj.metainfo.heading_lev_markup), obj.metainfo.is_a, tags, heading_lev_anchor_tag, _txt, - obj.metainfo.heading_lev_markup, + ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 + : obj.metainfo.heading_lev_markup), ); } return o; diff --git a/src/doc_reform/meta/defaults.d b/src/doc_reform/meta/defaults.d index 21c081c..ea969d5 100644 --- a/src/doc_reform/meta/defaults.d +++ b/src/doc_reform/meta/defaults.d @@ -184,7 +184,7 @@ template InternalMarkup() { string mark_internal_site_lnk = "¤"; string nbsp = "░"; string br_line = "┘"; - string br_nl = "┙"; + string br_newline_inline = "┙"; string br_paragraph = "┚"; string br_obj = "break_obj"; string br_page_line = "┼"; diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d index 3099d84..6396655 100644 --- a/src/doc_reform/meta/metadoc_from_src.d +++ b/src/doc_reform/meta/metadoc_from_src.d @@ -4060,11 +4060,11 @@ template docAbstraction() { an_object[an_object_key] = an_object[an_object_key] .replaceFirst(rgx.variable_doc_title_author_date, (conf_make_meta.meta.title_full - ~ mkup.br_nl + ~ mkup.br_newline_inline ~ conf_make_meta.meta.creator_author ~ " (" ~ (conf_make_meta.meta.date_published.replaceFirst(regex(r"(?:-00)+"),"")) ~ ")")) .replaceFirst(rgx.variable_doc_title, - (conf_make_meta.meta.title_full ~ mkup.br_nl)) + (conf_make_meta.meta.title_full ~ mkup.br_newline_inline)) .replaceFirst(rgx.variable_doc_author, conf_make_meta.meta.creator_author) .replaceFirst(rgx.variable_doc_date, @@ -4075,10 +4075,10 @@ template docAbstraction() { an_object[an_object_key] = an_object[an_object_key] .replaceFirst(rgx.variable_doc_title_author_date, (conf_make_meta.meta.title_full - ~ mkup.br_nl + ~ mkup.br_newline_inline ~ conf_make_meta.meta.creator_author)) .replaceFirst(rgx.variable_doc_title, - (conf_make_meta.meta.title_full ~ mkup.br_nl)) + (conf_make_meta.meta.title_full ~ mkup.br_newline_inline)) .replaceFirst(rgx.variable_doc_author, conf_make_meta.meta.creator_author); } else if (an_object[an_object_key].match(rgx.variable_doc_title)) { @@ -4694,6 +4694,7 @@ template docAbstraction() { obj_txt["munge"] = obj_txt_in .replaceFirst(rgx.headings, "") .replaceFirst(rgx.object_number_off_all, "") + .replaceFirst(rgx.markup_inline_linebreak, mkup.br_newline_inline) .strip; TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt["munge"], reset_note_numbers); debug(munge) { @@ -4709,7 +4710,8 @@ template docAbstraction() { @safe auto munge_para()(string obj_txt_in) { obj_txt["munge"] = (obj_txt_in) .replaceFirst(rgx.para_attribs, "") - .replaceFirst(rgx.object_number_off_all, ""); + .replaceFirst(rgx.object_number_off_all, "") + .replaceFirst(rgx.markup_inline_linebreak, mkup.br_newline_inline); TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt["munge"]); debug(munge) { writeln(__LINE__); diff --git a/src/doc_reform/meta/rgx.d b/src/doc_reform/meta/rgx.d index 0d2912d..8c48eac 100644 --- a/src/doc_reform/meta/rgx.d +++ b/src/doc_reform/meta/rgx.d @@ -77,6 +77,7 @@ static template spineRgxIn() { static newline_eol_delimiter = ctRegex!("\n"); static newline_eol_strip_preceding = ctRegex!("[ ]*\n"); static newline_eol_delimiter_only = ctRegex!("^\n"); + static markup_inline_linebreak = ctRegex!(`\s*\\\\s*`, "m"); static line_delimiter_ws_strip = ctRegex!("[ ]*\n[ ]*"); static para_delimiter = ctRegex!("\n[ ]*\n+"); static table_col_delimiter = ctRegex!("[ ]*\n+", "mg"); @@ -245,7 +246,7 @@ static template spineRgxIn() { static br_empty_line = ctRegex!(`\n[ ]*\n`, "mg"); static br_newlines_linebreaks = ctRegex!(`[\n┘┙]`, "mg"); static br_line = ctRegex!(`┘`, "mg"); - static br_nl = ctRegex!(`┙`, "mg"); + static br_newline_inline = ctRegex!(`┙`, "mg"); /+ inline markup footnotes endnotes +/ static inline_notes_al = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg"); static inline_notes_al_special = ctRegex!(`【(?:[*+]\s+)(.+?)】`, "mg"); // TODO remove match when special footnotes are implemented |