diff options
-rw-r--r-- | org/config_nix.org | 17 | ||||
-rw-r--r-- | org/default_paths.org | 4 | ||||
-rw-r--r-- | org/metaverse.org | 11 | ||||
-rw-r--r-- | org/out_xmls.org | 1923 | ||||
-rwxr-xr-x | shell.nix | 10 | ||||
-rw-r--r-- | src/doc_reform/io_out/epub3.d | 297 | ||||
-rw-r--r-- | src/doc_reform/io_out/html.d | 56 | ||||
-rw-r--r-- | src/doc_reform/io_out/paths_output.d | 2 | ||||
-rw-r--r-- | src/doc_reform/io_out/xmls.d | 76 | ||||
-rw-r--r-- | src/doc_reform/meta/metadoc_from_src.d | 11 |
10 files changed, 1272 insertions, 1135 deletions
diff --git a/org/config_nix.org b/org/config_nix.org index 3e63e9d..2268ac6 100644 --- a/org/config_nix.org +++ b/org/config_nix.org @@ -504,6 +504,7 @@ pkgs.mkShell { <<shell_packages_nix_related>> <<shell_packages_d_build_related>> # <<shell_packages_search_sqlite_related>> + # <<shell_packages_xml_and_epub_related>> ] )]; shellHook = '' @@ -546,6 +547,22 @@ ldc sqlite #+END_SRC +***** packages xml epub related + +#+NAME: shell_packages_xml_and_epub_related +#+BEGIN_SRC nix +# xml_and_epub_related +libxml2 +html-tidy +xmlstarlet +epubcheck +ebook_tools +epr +sigil +calibre # (ebook-viewer) +foliate +#+END_SRC + **** misc #+HEADER: :NO-tangle ../shell.nix diff --git a/org/default_paths.org b/org/default_paths.org index 2bf0d14..376201f 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -290,7 +290,7 @@ template PathMatters() { /+ z pod name if any + src filename (without lng code) filename ~ mkup.uid_sep ~ lng - * unique per src pod + ,* unique per src pod used by - pod (multilingual collection) - sqlite discrete index (multilingual collection) @@ -1423,7 +1423,7 @@ template spinePathsEPUB() { return dbg_docdir(fn_src).chainPath("OEBPS").array; } string dbg_doc_oebps_css(string fn_src) { - return dbg_doc_oebps(fn_src).chainPath("css").array; + return dbg_doc_oebps(fn_src).chainPath("Styles").array; } string dbg_doc_oebps_image(string fn_src) { return dbg_doc_oebps(fn_src).chainPath("image").array; diff --git a/org/metaverse.org b/org/metaverse.org index 94b5690..0118542 100644 --- a/org/metaverse.org +++ b/org/metaverse.org @@ -715,6 +715,9 @@ scope(exit) { reset_note_numbers = true; lev_anchor_tag = ""; anchor_tag = ""; + // dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; + // dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; + // dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; } #+END_SRC @@ -3236,10 +3239,10 @@ obj_cite_digit_ = 0; html_segnames_ptr = 0; html_segnames_ptr_cntr = 0; content_non_header = "8"; -dom_structure_markedup_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; -dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; -dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; -dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; +dom_structure_markedup_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0,]; +dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0,]; +dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0,]; +dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0,]; lev_anchor_tag = ""; anchor_tag = ""; #+END_SRC diff --git a/org/out_xmls.org b/org/out_xmls.org index 1158ff7..1379276 100644 --- a/org/out_xmls.org +++ b/org/out_xmls.org @@ -32,45 +32,45 @@ template outputXHTMLs() { mixin spineRgxOut; struct outputXHTMLs { static auto rgx = RgxO(); - <<xhtml_format_objects_0>> - <<xhtml_format_objects_1>> - <<xhtml_format_objects_2>> - <<xhtml_format_objects_3>> - <<xhtml_format_objects_4>> - <<xhtml_format_objects_5>> - <<xhtml_format_objects_6>> - <<xhtml_format_objects_7>> - <<xhtml_format_objects_8>> - <<xhtml_format_objects_9>> - <<xhtml_format_objects_10>> - <<xhtml_format_objects_11>> - <<xhtml_format_objects_12>> - <<xhtml_format_objects_13>> - <<xhtml_format_objects_14>> - <<xhtml_format_objects_15>> - <<xhtml_format_objects_16>> - <<xhtml_format_objects_17>> - <<xhtml_format_objects_18>> - <<xhtml_format_objects_19>> - <<xhtml_format_objects_20>> - <<xhtml_format_objects_21>> - <<xhtml_format_objects_22>> - <<xhtml_format_objects_23>> - <<xhtml_format_objects_24>> - <<xhtml_format_objects_25>> - <<xhtml_format_objects_26>> - <<xhtml_format_objects_27>> - <<xhtml_format_objects_28>> - <<xhtml_format_objects_29>> - <<xhtml_format_objects_30>> - <<xhtml_format_objects_31>> - <<xhtml_format_objects_32>> - <<xhtml_format_objects_33>> - <<xhtml_format_objects_34>> - <<xhtml_format_objects_35>> - <<xhtml_format_objects_36>> - <<xhtml_format_objects_37>> - <<xhtml_format_objects_38>> + <<xhtml_format_objects_div_delimit>> + <<xhtml_format_objects_special_characters_text>> + <<xhtml_format_objects_special_characters>> + <<xhtml_format_objects_font_face>> + <<xhtml_format_objects_xml_anchor_tags>> + <<xhtml_format_objects_header_metadata>> + <<xhtml_format_objects_site_info_button>> + <<xhtml_format_objects_inline_search_form>> + <<xhtml_format_objects_html_head>> + <<xhtml_format_objects_epub3_seg_head>> + <<xhtml_format_objects_tail>> + <<xhtml_format_objects_inline_images>> + <<xhtml_format_objects_inline_links>> + <<xhtml_format_objects_inline_notes_scroll>> + <<xhtml_format_objects_inline_notes_seg>> + <<xhtml_format_objects_inline_markup_scroll>> + <<xhtml_format_objects_inline_markup_seg>> + <<xhtml_format_objects_lev4_heading_subtoc>> + <<xhtml_format_objects_nav_pre_next_svg>> + <<xhtml_format_objects_heading>> + <<xhtml_format_objects_heading_scroll>> + <<xhtml_format_objects_heading_seg>> + <<xhtml_format_objects_para>> + <<xhtml_format_objects_para_scroll>> + <<xhtml_format_objects_para_seg>> + <<xhtml_format_objects_quote>> + <<xhtml_format_objects_quote_scroll>> + <<xhtml_format_objects_quote_seg>> + <<xhtml_format_objects_group>> + <<xhtml_format_objects_group_scroll>> + <<xhtml_format_objects_group_seg>> + <<xhtml_format_objects_block>> + <<xhtml_format_objects_block_scroll>> + <<xhtml_format_objects_block_seg>> + <<xhtml_format_objects_verse>> + <<xhtml_format_objects_verse_scroll>> + <<xhtml_format_objects_verse_seg>> + <<xhtml_format_objects_tablarize>> + <<xhtml_format_objects_table>> <<xhtml_format_objects_code>> } } @@ -113,7 +113,7 @@ import *** misc **** div delimiter -#+NAME: xhtml_format_objects_0 +#+NAME: xhtml_format_objects_div_delimit #+BEGIN_SRC d @safe string div_delimit( string part, @@ -149,14 +149,14 @@ import **** special characters text -#+NAME: xhtml_format_objects_1 +#+NAME: xhtml_format_objects_special_characters_text #+BEGIN_SRC d @safe string special_characters_text(string _txt) { _txt = _txt - .replaceAll(rgx.xhtml_ampersand, "&") - .replaceAll(rgx.xhtml_quotation, """) - .replaceAll(rgx.xhtml_less_than, "<") - .replaceAll(rgx.xhtml_greater_than, ">") + .replaceAll(rgx.xhtml_ampersand, "&") // "&" + .replaceAll(rgx.xhtml_quotation, """) // """ + .replaceAll(rgx.xhtml_less_than, "<") // "<" + .replaceAll(rgx.xhtml_greater_than, ">") // ">" .replaceAll(rgx.nbsp_char, " "); return _txt; } @@ -164,7 +164,7 @@ import **** special characters -#+NAME: xhtml_format_objects_2 +#+NAME: xhtml_format_objects_special_characters #+BEGIN_SRC d @safe string special_characters(O)( const O obj, @@ -180,7 +180,7 @@ import **** font_face -#+NAME: xhtml_format_objects_3 +#+NAME: xhtml_format_objects_font_face #+BEGIN_SRC d @safe string font_face(string _txt) { _txt = _txt @@ -200,14 +200,14 @@ import **** anchor tags -#+NAME: xhtml_format_objects_4 +#+NAME: xhtml_format_objects_xml_anchor_tags #+BEGIN_SRC d @safe string _xhtml_anchor_tags(O)(O obj) { string tags=""; if (obj.tags.anchor_tags.length > 0) { foreach (tag; obj.tags.anchor_tags) { if (!(tag.empty)) { - tags ~= "<a name=\"" ~ tag ~ "\"></a>"; + tags ~= "<a name=\"" ~ special_characters_text(tag) ~ "\"></a>"; } } } @@ -218,7 +218,7 @@ import **** doc head & tails ***** metadata -#+NAME: xhtml_format_objects_5 +#+NAME: xhtml_format_objects_header_metadata #+BEGIN_SRC d @safe string header_metadata(M)( M doc_matters, @@ -241,19 +241,19 @@ import <meta name="generator" content="%s" /> <link rel="generator" href="%s" /> <!-- spine DocReform header metadata -->┃", - doc_matters.conf_make_meta.meta.title_full.replaceAll(regex("\""), """), - doc_matters.conf_make_meta.meta.creator_author, + special_characters_text(doc_matters.conf_make_meta.meta.title_full), + special_characters_text(doc_matters.conf_make_meta.meta.creator_author), _publisher, - doc_matters.conf_make_meta.meta.date_published, - doc_matters.conf_make_meta.meta.date_created, - doc_matters.conf_make_meta.meta.date_issued, - doc_matters.conf_make_meta.meta.date_available, - doc_matters.conf_make_meta.meta.date_valid, - doc_matters.conf_make_meta.meta.date_modified, + special_characters_text(doc_matters.conf_make_meta.meta.date_published), + special_characters_text(doc_matters.conf_make_meta.meta.date_created), + special_characters_text(doc_matters.conf_make_meta.meta.date_issued), + special_characters_text(doc_matters.conf_make_meta.meta.date_available), + special_characters_text(doc_matters.conf_make_meta.meta.date_valid), + special_characters_text(doc_matters.conf_make_meta.meta.date_modified), doc_matters.src.language, - doc_matters.conf_make_meta.meta.rights_copyright, - doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.name_and_version, - doc_matters.generator_program.url_home, + special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright), + doc_matters.opt.action.debug_do ? "" : special_characters_text(doc_matters.generator_program.name_and_version), + special_characters_text(doc_matters.generator_program.url_home), ); return o; } @@ -261,7 +261,7 @@ import ***** site info button -#+NAME: xhtml_format_objects_6 +#+NAME: xhtml_format_objects_site_info_button #+BEGIN_SRC d @safe string site_info_button(M)( M doc_matters, @@ -291,7 +291,7 @@ import ***** search form -#+NAME: xhtml_format_objects_7 +#+NAME: xhtml_format_objects_inline_search_form #+BEGIN_SRC d @safe string inline_search_form(M)( M doc_matters, @@ -330,7 +330,7 @@ import ***** html head & head banner -#+NAME: xhtml_format_objects_8 +#+NAME: xhtml_format_objects_html_head #+BEGIN_SRC d @safe string html_head(M)( M doc_matters, @@ -367,9 +367,9 @@ import <div class="flex-menu-option"> %s </div>%s%s┃", - doc_matters.conf_make_meta.meta.title_full, + special_characters_text(doc_matters.conf_make_meta.meta.title_full), (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : ", " ~ doc_matters.conf_make_meta.meta.creator_author, + : ", " ~ special_characters_text(doc_matters.conf_make_meta.meta.creator_author), header_metadata(doc_matters), ((type == "seg") ? "../" : ""), ((type == "seg") @@ -387,7 +387,7 @@ import ***** epub seg head -#+NAME: xhtml_format_objects_9 +#+NAME: xhtml_format_objects_epub3_seg_head #+BEGIN_SRC d @safe string epub3_seg_head(M)( M doc_matters, @@ -437,22 +437,22 @@ import <body lang="%s"> <a name="top" id="top"></a>┃", html_simple, - doc_matters.conf_make_meta.meta.title_full.replaceAll(regex("\""), """), + special_characters_text(doc_matters.conf_make_meta.meta.title_full), (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : ", " ~ doc_matters.conf_make_meta.meta.creator_author, - doc_matters.conf_make_meta.meta.title_full, + : ", " ~ special_characters_text(doc_matters.conf_make_meta.meta.creator_author), + special_characters_text(doc_matters.conf_make_meta.meta.title_full), (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : ", " ~ doc_matters.conf_make_meta.meta.creator_author, - doc_matters.conf_make_meta.meta.date_published, - doc_matters.conf_make_meta.meta.date_created, - doc_matters.conf_make_meta.meta.date_issued, - doc_matters.conf_make_meta.meta.date_available, - doc_matters.conf_make_meta.meta.date_valid, - doc_matters.conf_make_meta.meta.date_modified, + : ", " ~ special_characters_text(doc_matters.conf_make_meta.meta.creator_author), + special_characters_text(doc_matters.conf_make_meta.meta.date_published), + special_characters_text(doc_matters.conf_make_meta.meta.date_created), + special_characters_text(doc_matters.conf_make_meta.meta.date_issued), + special_characters_text(doc_matters.conf_make_meta.meta.date_available), + special_characters_text(doc_matters.conf_make_meta.meta.date_valid), + special_characters_text(doc_matters.conf_make_meta.meta.date_modified), doc_matters.src.language, - doc_matters.conf_make_meta.meta.rights_copyright, - doc_matters.generator_program.name_and_version, - doc_matters.generator_program.url_home, + special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright), + special_characters_text(doc_matters.generator_program.name_and_version), + special_characters_text(doc_matters.generator_program.url_home), doc_matters.src.language, ); return o; @@ -461,7 +461,7 @@ import ***** xhtml tail -#+NAME: xhtml_format_objects_10 +#+NAME: xhtml_format_objects_tail #+BEGIN_SRC d @safe string tail() { string o; @@ -477,7 +477,7 @@ import *** inline markup **** images -#+NAME: xhtml_format_objects_11 +#+NAME: xhtml_format_objects_inline_images #+BEGIN_SRC d @safe string inline_images(O,M)( string _txt, @@ -510,7 +510,7 @@ import **** links ***** scroll, seg, epub -#+NAME: xhtml_format_objects_12 +#+NAME: xhtml_format_objects_inline_links #+BEGIN_SRC d @safe string inline_links(O,M)( string _txt, @@ -608,7 +608,7 @@ import **** notes ***** scroll -#+NAME: xhtml_format_objects_13 +#+NAME: xhtml_format_objects_inline_notes_scroll #+BEGIN_SRC d @safe string inline_notes_scroll(O,M)( string _txt, @@ -645,7 +645,7 @@ import ***** seg -#+NAME: xhtml_format_objects_14 +#+NAME: xhtml_format_objects_inline_notes_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) inline_notes_seg(O,M)( string _txt, @@ -716,7 +716,7 @@ import **** inline markup ***** scroll -#+NAME: xhtml_format_objects_15 +#+NAME: xhtml_format_objects_inline_markup_scroll #+BEGIN_SRC d @safe string inline_markup_scroll(O,M)( string _txt, @@ -738,9 +738,9 @@ import ***** seg -#+NAME: xhtml_format_objects_16 +#+NAME: xhtml_format_objects_inline_markup_seg #+BEGIN_SRC d -@safe auto inline_markup_seg(O,M)( +@safe Tuple!(string, string[]) inline_markup_seg(O,M)( string _txt, const O obj, M doc_matters, @@ -765,7 +765,7 @@ import *** toc **** subtoc -#+NAME: xhtml_format_objects_17 +#+NAME: xhtml_format_objects_lev4_heading_subtoc #+BEGIN_SRC d @safe string lev4_heading_subtoc(O,M)( const O obj, @@ -798,7 +798,7 @@ import **** navigation pre next svg -#+NAME: xhtml_format_objects_18 +#+NAME: xhtml_format_objects_nav_pre_next_svg #+BEGIN_SRC d @safe auto nav_pre_next_svg(O,M)( const O obj, @@ -879,7 +879,7 @@ import *** heading **** heading -#+NAME: xhtml_format_objects_19 +#+NAME: xhtml_format_objects_heading #+BEGIN_SRC d @safe string heading(O,M)( string _txt, @@ -952,7 +952,7 @@ import **** scroll -#+NAME: xhtml_format_objects_20 +#+NAME: xhtml_format_objects_heading_scroll #+BEGIN_SRC d @safe string heading_scroll(O,M)( string _txt, @@ -968,7 +968,7 @@ import **** seg -#+NAME: xhtml_format_objects_21 +#+NAME: xhtml_format_objects_heading_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) heading_seg(O,M)( string _txt, @@ -977,7 +977,7 @@ import string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0]; string[] _endnotes = t[1]; string o = heading(_txt, obj, doc_matters, _xml_type); @@ -992,7 +992,7 @@ import *** para **** para -#+NAME: xhtml_format_objects_22 +#+NAME: xhtml_format_objects_para #+BEGIN_SRC d @safe string para(O,M)( string _txt, @@ -1048,7 +1048,7 @@ import **** scroll -#+NAME: xhtml_format_objects_23 +#+NAME: xhtml_format_objects_para_scroll #+BEGIN_SRC d @safe string para_scroll(O,M)( string _txt, @@ -1067,7 +1067,7 @@ import **** seg -#+NAME: xhtml_format_objects_24 +#+NAME: xhtml_format_objects_para_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) para_seg(O,M)( string _txt, @@ -1076,7 +1076,7 @@ import string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = para(_txt, obj, doc_matters); @@ -1091,7 +1091,7 @@ import *** quote **** quote -#+NAME: xhtml_format_objects_25 +#+NAME: xhtml_format_objects_quote #+BEGIN_SRC d @safe string quote(O,M)( string _txt, @@ -1133,7 +1133,7 @@ import **** scroll -#+NAME: xhtml_format_objects_26 +#+NAME: xhtml_format_objects_quote_scroll #+BEGIN_SRC d @safe string quote_scroll(O,M)( string _txt, @@ -1149,7 +1149,7 @@ import **** seg -#+NAME: xhtml_format_objects_27 +#+NAME: xhtml_format_objects_quote_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) quote_seg(O,M)( string _txt, @@ -1158,7 +1158,7 @@ import string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = quote(_txt, obj, doc_matters); @@ -1173,7 +1173,7 @@ import *** group **** group -#+NAME: xhtml_format_objects_28 +#+NAME: xhtml_format_objects_group #+BEGIN_SRC d @safe string group(O,M)( string _txt, @@ -1217,7 +1217,7 @@ import **** scroll -#+NAME: xhtml_format_objects_29 +#+NAME: xhtml_format_objects_group_scroll #+BEGIN_SRC d @safe string group_scroll(O,M)( string _txt, @@ -1234,7 +1234,7 @@ import **** seg -#+NAME: xhtml_format_objects_30 +#+NAME: xhtml_format_objects_group_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) group_seg(O,M)( string _txt, @@ -1243,7 +1243,7 @@ import string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = group(_txt, obj, doc_matters); @@ -1258,7 +1258,7 @@ import *** block **** block -#+NAME: xhtml_format_objects_31 +#+NAME: xhtml_format_objects_block #+BEGIN_SRC d @safe string block(O,M)( string _txt, @@ -1298,7 +1298,7 @@ import **** scroll -#+NAME: xhtml_format_objects_32 +#+NAME: xhtml_format_objects_block_scroll #+BEGIN_SRC d @safe string block_scroll(O,M)( string _txt, @@ -1315,7 +1315,7 @@ import **** seg -#+NAME: xhtml_format_objects_33 +#+NAME: xhtml_format_objects_block_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) block_seg(O,M)( string _txt, @@ -1324,7 +1324,7 @@ import string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = block(_txt, obj, doc_matters); @@ -1339,7 +1339,7 @@ import *** poem verse **** verse -#+NAME: xhtml_format_objects_34 +#+NAME: xhtml_format_objects_verse #+BEGIN_SRC d @safe string verse(O,M)( string _txt, @@ -1377,7 +1377,7 @@ import **** scroll -#+NAME: xhtml_format_objects_35 +#+NAME: xhtml_format_objects_verse_scroll #+BEGIN_SRC d @safe string verse_scroll(O,M)( string _txt, @@ -1394,7 +1394,7 @@ import **** seg -#+NAME: xhtml_format_objects_36 +#+NAME: xhtml_format_objects_verse_seg #+BEGIN_SRC d @safe Tuple!(string, string[]) verse_seg(O,M)( string _txt, @@ -1403,7 +1403,7 @@ import string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = verse(_txt, obj, doc_matters); @@ -1489,7 +1489,7 @@ align="left|right|center" "style=\"text-align:" ~ "right\"" -#+NAME: xhtml_format_objects_37 +#+NAME: xhtml_format_objects_tablarize #+BEGIN_SRC d @safe Tuple!(string, string) tablarize(O)( string _txt, @@ -1528,7 +1528,7 @@ align="left|right|center" **** table -#+NAME: xhtml_format_objects_38 +#+NAME: xhtml_format_objects_table #+BEGIN_SRC d @safe string table(O,M)( string _txt, @@ -1577,21 +1577,21 @@ template outputHTML() { <<output_imports_xml>> mixin outputXHTMLs; <<output_html_scroll_0>> - <<output_html_scroll_1>> - <<output_html_scroll_2>> - <<output_html_scroll_3>> - <<output_html_scroll_4>> - <<output_html_scroll_5>> - <<output_html_scroll_6>> + <<output_html_scroll_loop_parts>> + <<output_html_scroll_is_frontmatter>> + <<output_html_scroll_is_body>> + <<output_html_scroll_is_backmatter>> + <<output_html_scroll_close_is_case>> + <<output_html_scroll_scroll_write_output>> <<output_html_seg_0>> - <<output_html_seg_1>> - <<output_html_seg_2>> - <<output_html_seg_3>> - <<output_html_seg_4>> - <<output_html_seg_5>> - <<output_html_seg_6>> - <<output_html_seg_7>> - <<output_html_seg_8>> + <<output_html_seg_loop_parts>> + <<output_html_seg_is_heading>> + <<output_html_seg_is_not_heading_switch>> + <<output_html_seg_is_frontmatter>> + <<output_html_seg_is_body>> + <<output_html_seg_is_backmatter>> + <<output_html_seg_close_is_case>> + <<output_html_seg_write_output>> <<output_html_css>> <<copy_html_images>> } @@ -1618,183 +1618,183 @@ template outputHTML() { **** ↻ the loops & outer switch (sections & objects) format output -#+NAME: output_html_scroll_1 +#+NAME: output_html_scroll_loop_parts #+BEGIN_SRC d - foreach (part; doc_matters.has.keys_seq.scroll) { - foreach (obj; doc_abstraction[part]) { - delimit = xhtml_format.div_delimit(part, previous_part); - string _txt = xhtml_format.special_characters(obj); - switch (obj.metainfo.is_of_part) { +foreach (part; doc_matters.has.keys_seq.scroll) { + foreach (obj; doc_abstraction[part]) { + delimit = xhtml_format.div_delimit(part, previous_part); + string _txt = xhtml_format.special_characters(obj); + switch (obj.metainfo.is_of_part) { #+END_SRC ***** frontmatter -#+NAME: output_html_scroll_2 +#+NAME: output_html_scroll_is_frontmatter #+BEGIN_SRC d - case "frontmatter": assert(part == "head" || "toc"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "heading": - doc_html ~= delimit ~ xhtml_format.heading_scroll(_txt, obj, doc_matters, suffix); - break; - case "toc": - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; +case "frontmatter": assert(part == "head" || "toc"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "heading": + doc_html ~= delimit ~ xhtml_format.heading_scroll(_txt, obj, doc_matters, suffix); + break; + case "toc": + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); } - break; + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; #+END_SRC ***** body -#+NAME: output_html_scroll_3 +#+NAME: output_html_scroll_is_body #+BEGIN_SRC d - case "body": assert(part == "body" || "head"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "heading": - doc_html ~= delimit ~ xhtml_format.heading_scroll(_txt, obj, doc_matters, suffix); - break; - case "para": - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - case "block": - switch (obj.metainfo.is_a) { - case "quote": - doc_html ~= xhtml_format.quote_scroll(_txt, obj, doc_matters); - break; - case "group": - doc_html ~= xhtml_format.group_scroll(_txt, obj, doc_matters); - break; - case "block": - doc_html ~= xhtml_format.block_scroll(_txt, obj, doc_matters); - break; - case "poem": - break; - case "verse": - doc_html ~= xhtml_format.verse_scroll(_txt, obj, doc_matters, suffix); - break; - case "code": - doc_html ~= xhtml_format.code(_txt, obj, doc_matters); - break; - case "table": - doc_html ~= xhtml_format.table(_txt, obj, doc_matters); - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; +case "body": assert(part == "body" || "head"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "heading": + doc_html ~= delimit ~ xhtml_format.heading_scroll(_txt, obj, doc_matters, suffix); + break; + case "para": + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + case "block": + switch (obj.metainfo.is_a) { + case "quote": + doc_html ~= xhtml_format.quote_scroll(_txt, obj, doc_matters); + break; + case "group": + doc_html ~= xhtml_format.group_scroll(_txt, obj, doc_matters); + break; + case "block": + doc_html ~= xhtml_format.block_scroll(_txt, obj, doc_matters); + break; + case "poem": + break; + case "verse": + doc_html ~= xhtml_format.verse_scroll(_txt, obj, doc_matters, suffix); + break; + case "code": + doc_html ~= xhtml_format.code(_txt, obj, doc_matters); + break; + case "table": + doc_html ~= xhtml_format.table(_txt, obj, doc_matters); + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); } - break; + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; #+END_SRC ***** backmatter -#+NAME: output_html_scroll_4 +#+NAME: output_html_scroll_is_backmatter #+BEGIN_SRC d - case "backmatter": - assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "heading": - doc_html ~= delimit ~ xhtml_format.heading_scroll(_txt, obj, doc_matters, suffix); - break; - case "endnote": assert(part == "endnotes"); - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - case "glossary": assert(part == "glossary"); - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - case "bibliography": assert(part == "bibliography"); - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - case "bookindex": assert(part == "bookindex"); - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - case "blurb": assert(part == "blurb"); - doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; - } - break; - case "comment": - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - writeln(__FILE__, ":", __LINE__, ": ", obj.text); - } +case "backmatter": + assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "heading": + doc_html ~= delimit ~ xhtml_format.heading_scroll(_txt, obj, doc_matters, suffix); + break; + case "endnote": assert(part == "endnotes"); + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + case "glossary": assert(part == "glossary"); + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + case "bibliography": assert(part == "bibliography"); + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + case "bookindex": assert(part == "bookindex"); + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + case "blurb": assert(part == "blurb"); + doc_html ~= xhtml_format.para_scroll(_txt, obj, doc_matters, suffix); + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); } - break; + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; +case "comment": + break; +default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + writeln(__FILE__, ":", __LINE__, ": ", obj.text); + } + } + break; #+END_SRC ***** closings & post loop -#+NAME: output_html_scroll_5 +#+NAME: output_html_scroll_close_is_case #+BEGIN_SRC d } } @@ -1806,7 +1806,7 @@ template outputHTML() { *** write output file -#+NAME: output_html_scroll_6 +#+NAME: output_html_scroll_scroll_write_output #+BEGIN_SRC d @trusted void scroll_write_output(D,M)( D doc, @@ -1858,275 +1858,275 @@ template outputHTML() { **** ↻ the loop (sections & objects) format output -#+NAME: output_html_seg_1 +#+NAME: output_html_seg_loop_parts #+BEGIN_SRC d - foreach (part; doc_matters.has.keys_seq.seg) { - foreach (obj; doc_abstraction[part]) { - delimit = xhtml_format.div_delimit(part, previous_part); - string _txt = xhtml_format.special_characters(obj); +foreach (part; doc_matters.has.keys_seq.seg) { + foreach (obj; doc_abstraction[part]) { + delimit = xhtml_format.div_delimit(part, previous_part); + string _txt = xhtml_format.special_characters(obj); #+END_SRC ***** all headings -#+NAME: output_html_seg_2 -#+BEGIN_SRC d - if (obj.metainfo.is_a == "heading") { - assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.heading_lev_markup) { - case 0: .. case 3: - /+ fill buffer, and replace with new levels from 1 to 3 +/ - switch (obj.metainfo.heading_lev_markup) { - case 0: - top_level_headings[0] = ""; - top_level_headings[1] = ""; - top_level_headings[2] = ""; - top_level_headings[3] = ""; - goto default; - case 1: - top_level_headings[1] = ""; - top_level_headings[2] = ""; - top_level_headings[3] = ""; - goto default; - case 2: - top_level_headings[2] = ""; - top_level_headings[3] = ""; - goto default; - case 3: - top_level_headings[3] = ""; - goto default; - default: - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); - top_level_headings[obj.metainfo.heading_lev_markup] = t[0]; - break; - } - break; - case 4: - segment_filename = obj.tags.segment_anchor_tag_epub; - doc_html[segment_filename] ~= xhtml_format.html_head(doc_matters, "seg"); - auto navigation_bar = xhtml_format.nav_pre_next_svg(obj, doc_matters); - doc_html[segment_filename] ~= navigation_bar.toc_pre_next; - previous_seg_filename = segment_filename; - foreach (top_level_heading; top_level_headings) { - doc_html[segment_filename] ~= top_level_heading; - } - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html[segment_filename] ~= xhtml_format.lev4_heading_subtoc(obj, doc_matters); - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case 5: .. case 7: - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case 8: .. case 9: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); - writeln(__FILE__, ":", __LINE__, ": ", obj.text); - } - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); - } - } - break; - } +#+NAME: output_html_seg_is_heading +#+BEGIN_SRC d +if (obj.metainfo.is_a == "heading") { + assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + switch (obj.metainfo.heading_lev_markup) { + case 0: .. case 3: + /+ fill buffer, and replace with new levels from 1 to 3 +/ + switch (obj.metainfo.heading_lev_markup) { + case 0: + top_level_headings[0] = ""; + top_level_headings[1] = ""; + top_level_headings[2] = ""; + top_level_headings[3] = ""; + goto default; + case 1: + top_level_headings[1] = ""; + top_level_headings[2] = ""; + top_level_headings[3] = ""; + goto default; + case 2: + top_level_headings[2] = ""; + top_level_headings[3] = ""; + goto default; + case 3: + top_level_headings[3] = ""; + goto default; + default: + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); + top_level_headings[obj.metainfo.heading_lev_markup] = t[0]; + break; + } + break; + case 4: + segment_filename = obj.tags.segment_anchor_tag_epub; + doc_html[segment_filename] ~= xhtml_format.html_head(doc_matters, "seg"); + auto navigation_bar = xhtml_format.nav_pre_next_svg(obj, doc_matters); + doc_html[segment_filename] ~= navigation_bar.toc_pre_next; + previous_seg_filename = segment_filename; + foreach (top_level_heading; top_level_headings) { + doc_html[segment_filename] ~= top_level_heading; + } + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0].to!string; + doc_html[segment_filename] ~= xhtml_format.lev4_heading_subtoc(obj, doc_matters); + doc_html_endnotes[segment_filename] ~= t[1]; + break; + case 5: .. case 7: + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0].to!string; + doc_html_endnotes[segment_filename] ~= t[1]; + break; + case 8: .. case 9: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); + writeln(__FILE__, ":", __LINE__, ": ", obj.text); + } + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); + } + } + break; + } #+END_SRC ***** non-heading -#+NAME: output_html_seg_3 +#+NAME: output_html_seg_is_not_heading_switch #+BEGIN_SRC d - } else { - assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.is_of_part) { +} else { + assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + Tuple!(string, string[]) t; + switch (obj.metainfo.is_of_part) { #+END_SRC ****** frontmatter -#+NAME: output_html_seg_4 +#+NAME: output_html_seg_is_frontmatter #+BEGIN_SRC d - case "frontmatter": assert(part == "head" || "toc"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "toc": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; +case "frontmatter": assert(part == "head" || "toc"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "toc": + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0].to!string; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; #+END_SRC ****** body -#+NAME: output_html_seg_5 +#+NAME: output_html_seg_is_body #+BEGIN_SRC d - case "body": assert(part == "body"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "para": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - case "block": - switch (obj.metainfo.is_a) { - case "quote": - auto t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "group": - auto t = xhtml_format.group_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "block": - auto t = xhtml_format.block_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "poem": - break; - case "verse": - auto t = xhtml_format.verse_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "code": - doc_html[segment_filename] ~= xhtml_format.code(_txt, obj, doc_matters); - break; - case "table": - doc_html[segment_filename] ~= xhtml_format.table(_txt, obj, doc_matters); - doc_html_endnotes[segment_filename] ~= ""; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; - } - break; +case "body": assert(part == "body"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "para": + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0].to!string; + doc_html_endnotes[segment_filename] ~= t[1]; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + case "block": + switch (obj.metainfo.is_a) { + case "quote": + t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; + case "group": + t = xhtml_format.group_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; + case "block": + t = xhtml_format.block_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; + case "poem": + break; + case "verse": + t = xhtml_format.verse_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; + case "code": + doc_html[segment_filename] ~= xhtml_format.code(_txt, obj, doc_matters); + break; + case "table": + doc_html[segment_filename] ~= xhtml_format.table(_txt, obj, doc_matters); + doc_html_endnotes[segment_filename] ~= ""; + break; + default: + if ((obj.metainfo.is_a == "quote" + || obj.metainfo.is_a == "group" + || obj.metainfo.is_a == "block" + || obj.metainfo.is_a == "verse" + )) { + doc_html[segment_filename] ~= t[0].to!string; + doc_html_endnotes[segment_filename] ~= t[1]; + } else { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; #+END_SRC ****** backmatter -#+NAME: output_html_seg_6 +#+NAME: output_html_seg_is_backmatter #+BEGIN_SRC d - case "backmatter": - assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "endnote": assert(part == "endnotes"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0]; - break; - case "glossary": assert(part == "glossary"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0]; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "bibliography": assert(part == "bibliography"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0]; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "bookindex": assert(part == "bookindex"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0]; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - case "blurb": assert(part == "blurb"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0]; - doc_html_endnotes[segment_filename] ~= t[1]; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; - } - break; - case "comment": - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); - } - } - break; +case "backmatter": + assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "endnote": assert(part == "endnotes"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0]; + break; + case "glossary": assert(part == "glossary"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0]; + doc_html_endnotes[segment_filename] ~= t[1]; + break; + case "bibliography": assert(part == "bibliography"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0]; + doc_html_endnotes[segment_filename] ~= t[1]; + break; + case "bookindex": assert(part == "bookindex"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0]; + doc_html_endnotes[segment_filename] ~= t[1]; + break; + case "blurb": assert(part == "blurb"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + doc_html[segment_filename] ~= t[0]; + doc_html_endnotes[segment_filename] ~= t[1]; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); } + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; +case "comment": + break; +default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); + } + } + break; +} #+END_SRC ***** closings & post loop -#+NAME: output_html_seg_7 +#+NAME: output_html_seg_close_is_case #+BEGIN_SRC d } } @@ -2137,7 +2137,7 @@ template outputHTML() { *** write output files -#+NAME: output_html_seg_8 +#+NAME: output_html_seg_write_output #+BEGIN_SRC d @trusted void seg_write_output(D,E,M)( // @system? D doc_html, @@ -2255,23 +2255,25 @@ template outputEPub3() { <<output_imports_epub>> mixin InternalMarkup; mixin outputXHTMLs; - <<output_epub3_fixed_0>> - <<output_epub3_fixed_1>> - <<output_epub3_constructs_0>> - <<output_epub3_constructs_1>> - <<output_epub3_constructs_2>> - <<output_epub3_xhtml>> - <<output_epub3_xhtml_seg_0>> - <<output_epub3_xhtml_seg_1>> - <<output_epub3_xhtml_seg_2>> - <<output_epub3_xhtml_seg_3>> - <<output_epub3_xhtml_seg_4>> - <<output_epub3_xhtml_seg_5>> - <<output_epub3_xhtml_seg_6>> - <<output_epub3_xhtml_seg_7>> - <<output_epub3_xhtml_seg_8>> - <<output_epub3_xhtml_seg_9>> - <<output_epub3_css>> + static auto rgx = RgxO(); + <<xhtml_format_objects_special_characters_text>> + <<output_epub3_fixed_mimetypes>> + <<output_epub3_fixed_container_xml>> + <<output_epub3_constructs_oebps_content>> + <<output_epub3_constructs_oebps_toc_nav_xhtml>> + <<output_epub3_constructs_oebps_toc_ncx>> + <<output_epub3_xhtml_seg_output>> + <<output_epub3_xhtml_seg_output_loop>> + <<output_epub3_xhtml_seg_object_is_heading>> + <<output_epub3_xhtml_seg_object_is_not_heading>> + <<output_epub3_xhtml_seg_object_is_frontmatter>> + <<output_epub3_xhtml_seg_object_is_body>> + <<output_epub3_xhtml_seg_object_is_backmatter>> + <<output_epub3_xhtml_seg_object_is_comment_and_close>> + <<output_epub3_xhtml_seg_object_is_heading_set>> + <<output_epub3_xhtml_seg_close_ifs_and_write>> + <<output_epub3_xhtml_seg_write_output_files>> + <<output_epub3_xhtml_seg_debug_extract_zip_dir>> } #+END_SRC @@ -2281,7 +2283,7 @@ template outputEPub3() { - mimetype file indicating that zip file contains an EPUB -#+NAME: output_epub3_fixed_0 +#+NAME: output_epub3_fixed_mimetypes #+BEGIN_SRC d @safe string epub3_mimetypes() { string o; @@ -2294,11 +2296,11 @@ template outputEPub3() { - identifies the root package document (so systems can find it), [unchanged from epub2] -#+NAME: output_epub3_fixed_1 +#+NAME: output_epub3_fixed_container_xml #+BEGIN_SRC d @safe string epub3_container_xml() { string o; - o = format(q"┃<?xml version="1.0" encoding="UTF-8"?>┃") ~ "\n"; + o = format(q"┃<?xml version="1.0" encoding="utf-8"?>┃") ~ "\n"; o ~= format(q"┃<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> <rootfiles> @@ -2316,20 +2318,28 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> - provides the default reading order - identifies the navigation document -#+NAME: output_epub3_constructs_0 +#+BEGIN_SRC d +<package version="2.0" unique-identifier="PrimaryID" xmlns="http://www.idpf.org/2007/opf"> +#+END_SRC + +#+NAME: epub3_package_version +#+BEGIN_SRC d +<package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="uid" prefix="rendition: http://www.idpf.org/vocab/rendition/#"> +#+END_SRC + +#+NAME: output_epub3_constructs_oebps_content #+BEGIN_SRC d @safe string epub3_oebps_content(D,M,P)(D doc_abstraction, M doc_matters, P parts) { auto xhtml_format = outputXHTMLs(); auto pth_epub3 = spinePathsEPUB!()(doc_matters.output_path, doc_matters.src.language); string _uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO sort uuid in doc_matters! - string content = format(q"┃ <?xml version="1.0" encoding="UTF-8"?> -<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="EPB-UUID"> + string content = format(q"┃<?xml version="1.0" encoding="utf-8"?> +<<epub3_package_version>> <metadata xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:dcterms="https://purl.org/dc/terms/" xmlns:dc="https://purl.org/dc/elements/1.1/" unique-identifier="urn:uuid:%s" version="2.0"> - <!-- <dc:title id="title">%s</dc:title> --> <dc:title id="title">%s</dc:title> <meta refines="#title" property="title-type">main</meta> <dc:title id="subtitle">%s</dc:title> @@ -2340,18 +2350,13 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> <dc:rights>Copyright: %s</dc:rights> <dc:identifier scheme="URI">%s</dc:identifier> <dc:identifier id="bookid">urn:uuid:%s</dc:identifier> - <!-- <dc:identifier id="EPB-UUID">urn:uuid:%s</dc:identifier> --> </metadata> <manifest> - <!-- NCX epub2 navigation --> - <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" /> - <!-- CSS Style Sheets --> - <link rel="stylesheet" href="%s" type="text/css" id="main-css" /> - <!-- nav epub3 navigation --> - <item id="nav" href="toc_nav.xhtml" media-type="application/xhtml+xml" properties="nav" /> + <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="nav" href="toc_nav.xhtml" media-type="application/xhtml+xml" properties="nav" /> ┃", _uuid, - xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.title_full), xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.title_main), (doc_matters.conf_make_meta.meta.title_sub.empty) ? "" : xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.title_sub), @@ -2366,13 +2371,10 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ? "" : xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright), _uuid, _uuid, - _uuid, (pth_epub3.fn_oebps_css).chompPrefix("OEBPS/"), ); - content ~= " " ~ "<!-- Content Documents -->" ~ "\n "; content ~= parts["manifest_documents"]; // TODO sort jpg & png - content ~= " " ~ "<!-- Images -->" ~ "\n "; foreach (image; doc_matters.srcs.image_list) { content ~= format(q"┃ <item id="%s" href="%s/%s" media-type="image/%s" /> ┃", @@ -2422,85 +2424,107 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> - toc_nav.xhtml declared as nav file in content.opf (epub3 navigation document) -#+NAME: output_epub3_constructs_1 +#+NAME: output_epub3_constructs_oebps_toc_nav_xhtml #+BEGIN_SRC d @safe 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(); static auto rgx = RgxO(); - string toc =format("<html xmlns=\"https://www.w3.org/1999/xhtml\" - xmlns:epub=\"http://www.idpf.org/2007/ops\"> + string toc; + string toc_head = format(q"┃<html xmlns="https://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.conf_make_meta.meta.title_full, - ); +<section epub:type="frontmatter toc"> + <header> + <h1>Contents</h1> + </header> + <nav epub:type="toc" id="toc"> + <ol> + <li>┃", + (doc_matters.conf_make_meta.meta.title_full).special_characters_text, + ); + string _toc_nav_tail = ""; + // writeln(doc_matters.has.keys_seq.seg); // DEBUG line foreach (sect; doc_matters.has.keys_seq.seg) { foreach (obj; doc_abstraction[sect]) { - if (obj.metainfo.is_a == "heading") { + if ((sect == "head") && (obj.metainfo.is_a == "heading")) { + toc = format(q"┃%s + <a href="_the_title.xhtml">%s</a> + </li> +┃", + toc_head, + obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip, + ); + } else if (sect == "tail") { // skip + } else if ((sect != "tail") && (obj.metainfo.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.metainfo.dom_structure_collapsed_tags_status[n]) { + case DomTags.none : + break; case DomTags.close : - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; - toc ~= markup.indent_by_spaces_provided(n, " ") ~ "</ol>" ~ "\n"; + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; + toc ~= markup.indent_by_spaces_provided(n, " ") ~ "</ol>" ~ "\n"; break; case DomTags.close_and_open : - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; - if (obj.metainfo.heading_lev_markup < 4) { - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } else { - string hashtag =(obj.metainfo.heading_lev_markup == 4) - ? "" - : ("#" ~ obj.metainfo.ocn.to!string); - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ hashtag ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } - break; + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; + goto default; case DomTags.open : - toc ~= markup.indent_by_spaces_provided(n, " ") ~ "<ol>" ~ "\n"; - if (obj.metainfo.heading_lev_markup < 4) { - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } else { - string hashtag =(obj.metainfo.heading_lev_markup == 4) - ? "" - : ("#" ~ obj.metainfo.ocn.to!string); - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ hashtag ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } - break; + toc ~= markup.indent_by_spaces_provided(n, " ") ~ "<ol>" ~ "\n"; + goto default; default : + if ((obj.metainfo.dom_structure_collapsed_tags_status[n] == DomTags.close_and_open || + obj.metainfo.dom_structure_collapsed_tags_status[n] == DomTags.open + )) { + string _hashtag = ""; + if ((obj.metainfo.heading_lev_markup <= 4) && (obj.metainfo.ocn == 0)) { + _hashtag = "#" ~ obj.metainfo.ocn.to!string; + } + string _href = "<a href=\"" + ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" + ~ _hashtag + ~ "\">"; + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" + ~ markup.indent_by_spaces_provided((n + 2), " ") + ~ _href ~ _txt.special_characters_text ~ "</a>" ~ "\n"; + } break; } + if (doc_matters.has.keys_seq.seg[doc_matters.has.keys_seq.seg.length - 2] == sect) { + // writeln(n, ": ", sect, ": ", _txt, " - ", obj.metainfo.dom_structure_collapsed_tags_status); // DEBUG + // read last heading (heading prior to closing) and determine what those instructions imply still need to be done + // CLOSE // DomTags { 0 none, 1 open, 2 close, 3 close_and_open, 4 open_still, } + if (n == 6) {_toc_nav_tail = "";} + switch (obj.metainfo.dom_structure_collapsed_tags_status[n]) { + 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 (n != 0) { + _toc_nav_tail ~= " " ~ markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; + } + _toc_nav_tail ~= " " ~ markup.indent_by_spaces_provided(n, " ") ~ "</ol>" ~ "\n"; + break; + default : + break; + } + if (n == 0) { + _toc_nav_tail ~="</nav> +</section> +</body> +</html>\n"; + } + } } } } } - toc ~="</nav> - </section> - </body> -</html>\n"; + toc ~= _toc_nav_tail; return toc; } #+END_SRC @@ -2510,15 +2534,16 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> - toc.ncx (epub2 navigation document) - (replaced in epub3 by a declared xhtml nav file, in our case toc_nav.xhtml) -#+NAME: output_epub3_constructs_2 +#+NAME: output_epub3_constructs_oebps_toc_ncx #+BEGIN_SRC d @safe string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { - int counter = 0; + 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 = format(q"┃<?xml version="1.0" encoding="UTF-8"?> + 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, @@ -2537,67 +2562,87 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> <text>%s</text> </docAuthor> <navMap>┃", - doc_matters.conf_make_meta.meta.title_full, // title + (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, // author + : " 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, // title + (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, // author + : (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; - string hashtag =(obj.metainfo.heading_lev_markup <= 4) ? "" : ("#" ~ obj.metainfo.ocn.to!string); + 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_markedup_tags_status[k]) { + switch (obj.metainfo.dom_structure_collapsed_tags_status[k]) { // for epub may need to construct for levels 1 to 4 only case DomTags.close : - toc ~= "\n </navPoint>"; + if (sect != "head") { + toc ~= "\n </navPoint>"; // issue at start of some documents + } break; case DomTags.close_and_open : - ++counter; 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.tags.segment_anchor_tag_epub, - hashtag, - ); - break; + goto default; case DomTags.open : - ++counter; - toc ~= format(q"┃ + 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, - _txt, - obj.tags.segment_anchor_tag_epub, - hashtag, - ); - break; - default : + 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 ~= format(q"┃ - </navPoint> - </navPoint> - </navPoint> - </navMap> -</ncx>┃"); + toc ~= _toc_ncx_tail; return toc; } #+END_SRC @@ -2605,7 +2650,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ** the document contents :seg: *** ↻ loop & switch (sections & objects) format epub3 xhtml output -#+NAME: output_epub3_xhtml_seg_0 +#+NAME: output_epub3_xhtml_seg_output #+BEGIN_SRC d @system void outputEPub3(D,I)( const D doc_abstraction, @@ -2636,7 +2681,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> **** ↻ the loop (sections & objects) format output -#+NAME: output_epub3_xhtml_seg_1 +#+NAME: output_epub3_xhtml_seg_output_loop #+BEGIN_SRC d foreach (part; doc_matters.has.keys_seq.seg) { foreach (obj; doc_abstraction[part]) { @@ -2645,307 +2690,320 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ***** all headings -#+NAME: output_epub3_xhtml_seg_2 -#+BEGIN_SRC d - if (obj.metainfo.is_a == "heading") { - assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.heading_lev_markup) { - case 0: .. case 3: - /+ fill buffer, and replace with new levels from 1 to 3 +/ - switch (obj.metainfo.heading_lev_markup) { - case 0: - top_level_headings[0] = ""; - top_level_headings[1] = ""; - top_level_headings[2] = ""; - top_level_headings[3] = ""; - goto default; - case 1: - top_level_headings[1] = ""; - top_level_headings[2] = ""; - top_level_headings[3] = ""; - goto default; - case 2: - top_level_headings[2] = ""; - top_level_headings[3] = ""; - goto default; - case 3: - top_level_headings[3] = ""; - goto default; - default: - 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(_txt, obj, doc_matters, suffix, "epub"); - 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; - epubWrite.doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - epubWrite.doc_epub3[segment_filename] ~= t[0]; - epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; - break; - case 8: .. case 9: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); - writeln(__FILE__, ":", __LINE__, ": ", obj.text); - } - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); - } - } - break; - } +#+NAME: output_epub3_xhtml_seg_object_is_heading +#+BEGIN_SRC d +if (obj.metainfo.is_a == "heading") { + assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + switch (obj.metainfo.heading_lev_markup) { + case 0: .. case 3: + /+ fill buffer, and replace with new levels from 1 to 3 +/ + switch (obj.metainfo.heading_lev_markup) { + case 0: + top_level_headings[0] = ""; + top_level_headings[1] = ""; + top_level_headings[2] = ""; + top_level_headings[3] = ""; + goto default; + case 1: + top_level_headings[1] = ""; + top_level_headings[2] = ""; + top_level_headings[3] = ""; + goto default; + case 2: + top_level_headings[2] = ""; + top_level_headings[3] = ""; + goto default; + case 3: + top_level_headings[3] = ""; + goto default; + default: + 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); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); + 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; + epubWrite.doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case 5: .. case 7: + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case 8: .. case 9: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); + writeln(__FILE__, ":", __LINE__, ": ", obj.text); + } + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a, ": ", obj.metainfo.heading_lev_markup); + } + } + break; + } #+END_SRC ***** non-heading -#+NAME: output_epub3_xhtml_seg_3 +#+NAME: output_epub3_xhtml_seg_object_is_not_heading #+BEGIN_SRC d - } else { - assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.is_of_part) { +} else { + assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + Tuple!(string, string[]) t; + switch (obj.metainfo.is_of_part) { #+END_SRC ****** frontmatter -#+NAME: output_epub3_xhtml_seg_4 +#+NAME: output_epub3_xhtml_seg_object_is_frontmatter #+BEGIN_SRC d - case "frontmatter": assert(part == "head" || "toc"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "toc": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); - epubWrite.doc_epub3[segment_filename] ~= t[0]; - epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; - } - break; +case "frontmatter": assert(part == "head" || "toc"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "toc": + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; #+END_SRC ****** body -#+NAME: output_epub3_xhtml_seg_5 +#+NAME: output_epub3_xhtml_seg_object_is_body #+BEGIN_SRC d - case "body": assert(part == "body"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "para": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); - epubWrite.doc_epub3[segment_filename] ~= t[0]; - epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - case "block": - switch (obj.metainfo.is_a) { - case "quote": - auto t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; - epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; - break; - case "code": - epubWrite.doc_epub3[segment_filename] ~= xhtml_format.code(_txt, obj, doc_matters); - break; - case "table": - epubWrite.doc_epub3[segment_filename] ~= xhtml_format.table(_txt, obj, doc_matters); - epubWrite.doc_epub3_endnotes[segment_filename] ~= ""; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; - } - break; +case "body": assert(part == "body"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "para": + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + case "block": + switch (obj.metainfo.is_a) { + case "quote": + t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "group": + t = xhtml_format.group_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "block": + t = xhtml_format.block_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "poem": + break; + case "verse": + t = xhtml_format.verse_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "code": + epubWrite.doc_epub3[segment_filename] ~= xhtml_format.code(_txt, obj, doc_matters); + break; + case "table": + epubWrite.doc_epub3[segment_filename] ~= xhtml_format.table(_txt, obj, doc_matters); + epubWrite.doc_epub3_endnotes[segment_filename] ~= ""; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); + } + } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; #+END_SRC ****** backmatter -#+NAME: output_epub3_xhtml_seg_6 +#+NAME: output_epub3_xhtml_seg_object_is_backmatter #+BEGIN_SRC d - case "backmatter": - assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "endnote": assert(part == "endnotes"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); - epubWrite.doc_epub3[segment_filename] ~= t[0]; - break; - case "glossary": assert(part == "glossary"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - 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(_txt, obj, doc_matters, suffix, "epub"); - epubWrite.doc_epub3[segment_filename] ~= t[0]; - epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - } - } - break; - } - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); - } - } - break; - } - break; - case "comment": - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); - } - } - break; +case "backmatter": + assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + switch (obj.metainfo.is_of_type) { + case "para": + switch (obj.metainfo.is_a) { + case "endnote": assert(part == "endnotes"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + break; + case "glossary": assert(part == "glossary"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "bibliography": assert(part == "bibliography"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "bookindex": assert(part == "bookindex"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + case "blurb": assert(part == "blurb"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + epubWrite.doc_epub3[segment_filename] ~= t[0]; + epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); } } - if (obj.metainfo.is_a == "heading") { - 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" /> -┃", - obj.tags.segment_anchor_tag_epub, - obj.tags.segment_anchor_tag_epub, - ); - oepbs_content_parts["spine"] ~= - 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" /> -┃", - 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" /> -┃", - obj.tags.segment_anchor_tag_epub, - obj.metainfo.object_number, - obj.tags.segment_anchor_tag_epub, - obj.metainfo.object_number, - ); - oepbs_content_parts["spine"] ~= - 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" /> -┃", - obj.tags.segment_anchor_tag_epub, - obj.metainfo.object_number, - obj.tags.segment_anchor_tag_epub, - obj.metainfo.object_number, - ); - } + break; + } + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_type); + } + } + break; + } + break; +#+END_SRC + +****** comment + +#+NAME: output_epub3_xhtml_seg_object_is_comment_and_close +#+BEGIN_SRC d + case "comment": + break; + default: + { /+ debug +/ + if (doc_matters.opt.action.debug_do + && doc_matters.opt.action.verbose) { + writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); + } + } + break; + } +} +#+END_SRC + +****** heading + +#+NAME: output_epub3_xhtml_seg_object_is_heading_set +#+BEGIN_SRC d +if (obj.metainfo.is_a == "heading") { + 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" /> + ┃", + obj.tags.segment_anchor_tag_epub, + obj.tags.segment_anchor_tag_epub, + ); + oepbs_content_parts["spine"] ~= + 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" /> + ┃", + 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" /> + ┃", + obj.tags.segment_anchor_tag_epub, + obj.metainfo.object_number, + obj.tags.segment_anchor_tag_epub, + obj.metainfo.object_number, + ); + oepbs_content_parts["spine"] ~= + 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" /> + ┃", + obj.tags.segment_anchor_tag_epub, + obj.metainfo.object_number, + obj.tags.segment_anchor_tag_epub, + obj.metainfo.object_number, + ); + } #+END_SRC ***** closings & post loop -#+NAME: output_epub3_xhtml_seg_7 +#+NAME: output_epub3_xhtml_seg_close_ifs_and_write #+BEGIN_SRC d } } @@ -2962,7 +3020,10 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ** write output files :write:zip: -#+NAME: output_epub3_xhtml_seg_8 +zip -0 file.epub mimetype && zip -r -9 file.epub META-INF OEBPS +(mimetypes should be included but should not be zipped) + +#+NAME: output_epub3_xhtml_seg_write_output_files #+BEGIN_SRC d @system void epub3_write_output_files(W,M)( W epub_write, @@ -3158,7 +3219,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ** zip debug, read zip archive :zip: -#+NAME: output_epub3_xhtml_seg_9 +#+NAME: output_epub3_xhtml_seg_debug_extract_zip_dir #+BEGIN_SRC d debug(epub_archive) { if (exists(fn_epub)) { @@ -16,6 +16,16 @@ pkgs.mkShell { #meson # # search_sqlite_related # sqlite + # # xml_and_epub_related + # libxml2 + # html-tidy + # xmlstarlet + # epubcheck + # ebook_tools + # epr + # sigil + # calibre # (ebook-viewer) + # foliate ] )]; shellHook = '' diff --git a/src/doc_reform/io_out/epub3.d b/src/doc_reform/io_out/epub3.d index 1a8d924..b38fe3e 100644 --- a/src/doc_reform/io_out/epub3.d +++ b/src/doc_reform/io_out/epub3.d @@ -63,6 +63,16 @@ template outputEPub3() { doc_reform.io_out.xmls_css; mixin InternalMarkup; mixin outputXHTMLs; + static auto rgx = RgxO(); + @safe string special_characters_text(string _txt) { + _txt = _txt + .replaceAll(rgx.xhtml_ampersand, "&") // "&" + .replaceAll(rgx.xhtml_quotation, """) // """ + .replaceAll(rgx.xhtml_less_than, "<") // "<" + .replaceAll(rgx.xhtml_greater_than, ">") // ">" + .replaceAll(rgx.nbsp_char, " "); + return _txt; + } @safe string epub3_mimetypes() { string o; o = format(q"┃application/epub+zip┃") ~ "\n"; @@ -70,7 +80,7 @@ template outputEPub3() { } @safe string epub3_container_xml() { string o; - o = format(q"┃<?xml version="1.0" encoding="UTF-8"?>┃") ~ "\n"; + o = format(q"┃<?xml version="1.0" encoding="utf-8"?>┃") ~ "\n"; o ~= format(q"┃<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> <rootfiles> @@ -83,14 +93,13 @@ template outputEPub3() { auto xhtml_format = outputXHTMLs(); auto pth_epub3 = spinePathsEPUB!()(doc_matters.output_path, doc_matters.src.language); string _uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO sort uuid in doc_matters! - string content = format(q"┃ <?xml version="1.0" encoding="UTF-8"?> - <package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="EPB-UUID"> + string content = format(q"┃<?xml version="1.0" encoding="utf-8"?> + <package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="uid" prefix="rendition: http://www.idpf.org/vocab/rendition/#"> <metadata xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:dcterms="https://purl.org/dc/terms/" xmlns:dc="https://purl.org/dc/elements/1.1/" unique-identifier="urn:uuid:%s" version="2.0"> - <!-- <dc:title id="title">%s</dc:title> --> <dc:title id="title">%s</dc:title> <meta refines="#title" property="title-type">main</meta> <dc:title id="subtitle">%s</dc:title> @@ -101,18 +110,13 @@ template outputEPub3() { <dc:rights>Copyright: %s</dc:rights> <dc:identifier scheme="URI">%s</dc:identifier> <dc:identifier id="bookid">urn:uuid:%s</dc:identifier> - <!-- <dc:identifier id="EPB-UUID">urn:uuid:%s</dc:identifier> --> </metadata> <manifest> - <!-- NCX epub2 navigation --> - <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" /> - <!-- CSS Style Sheets --> - <link rel="stylesheet" href="%s" type="text/css" id="main-css" /> - <!-- nav epub3 navigation --> - <item id="nav" href="toc_nav.xhtml" media-type="application/xhtml+xml" properties="nav" /> + <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="nav" href="toc_nav.xhtml" media-type="application/xhtml+xml" properties="nav" /> ┃", _uuid, - xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.title_full), xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.title_main), (doc_matters.conf_make_meta.meta.title_sub.empty) ? "" : xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.title_sub), @@ -127,13 +131,10 @@ template outputEPub3() { ? "" : xhtml_format.special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright), _uuid, _uuid, - _uuid, (pth_epub3.fn_oebps_css).chompPrefix("OEBPS/"), ); - content ~= " " ~ "<!-- Content Documents -->" ~ "\n "; content ~= parts["manifest_documents"]; // TODO sort jpg & png - content ~= " " ~ "<!-- Images -->" ~ "\n "; foreach (image; doc_matters.srcs.image_list) { content ~= format(q"┃ <item id="%s" href="%s/%s" media-type="image/%s" /> ┃", @@ -181,88 +182,111 @@ template outputEPub3() { enum DomTags { none, open, close, close_and_open, open_still, } auto markup = InlineMarkup(); static auto rgx = RgxO(); - string toc =format("<html xmlns=\"https://www.w3.org/1999/xhtml\" - xmlns:epub=\"http://www.idpf.org/2007/ops\"> + string toc; + string toc_head = format(q"┃<html xmlns="https://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.conf_make_meta.meta.title_full, - ); + <section epub:type="frontmatter toc"> + <header> + <h1>Contents</h1> + </header> + <nav epub:type="toc" id="toc"> + <ol> + <li>┃", + (doc_matters.conf_make_meta.meta.title_full).special_characters_text, + ); + string _toc_nav_tail = ""; + // writeln(doc_matters.has.keys_seq.seg); // DEBUG line foreach (sect; doc_matters.has.keys_seq.seg) { foreach (obj; doc_abstraction[sect]) { - if (obj.metainfo.is_a == "heading") { + if ((sect == "head") && (obj.metainfo.is_a == "heading")) { + toc = format(q"┃%s + <a href="_the_title.xhtml">%s</a> + </li> + ┃", + toc_head, + obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip, + ); + } else if (sect == "tail") { // skip + } else if ((sect != "tail") && (obj.metainfo.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.metainfo.dom_structure_collapsed_tags_status[n]) { + case DomTags.none : + break; case DomTags.close : - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; - toc ~= markup.indent_by_spaces_provided(n, " ") ~ "</ol>" ~ "\n"; + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; + toc ~= markup.indent_by_spaces_provided(n, " ") ~ "</ol>" ~ "\n"; break; case DomTags.close_and_open : - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; - if (obj.metainfo.heading_lev_markup < 4) { - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } else { - string hashtag =(obj.metainfo.heading_lev_markup == 4) - ? "" - : ("#" ~ obj.metainfo.ocn.to!string); - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ hashtag ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } - break; + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; + goto default; case DomTags.open : - toc ~= markup.indent_by_spaces_provided(n, " ") ~ "<ol>" ~ "\n"; - if (obj.metainfo.heading_lev_markup < 4) { - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } else { - string hashtag =(obj.metainfo.heading_lev_markup == 4) - ? "" - : ("#" ~ obj.metainfo.ocn.to!string); - toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" - ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<a href=\"" ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" ~ hashtag ~ "\">" - ~ _txt - ~ "</a>" ~ "\n"; - } - break; + toc ~= markup.indent_by_spaces_provided(n, " ") ~ "<ol>" ~ "\n"; + goto default; default : + if ((obj.metainfo.dom_structure_collapsed_tags_status[n] == DomTags.close_and_open || + obj.metainfo.dom_structure_collapsed_tags_status[n] == DomTags.open + )) { + string _hashtag = ""; + if ((obj.metainfo.heading_lev_markup <= 4) && (obj.metainfo.ocn == 0)) { + _hashtag = "#" ~ obj.metainfo.ocn.to!string; + } + string _href = "<a href=\"" + ~ obj.tags.segment_anchor_tag_epub ~ ".xhtml" + ~ _hashtag + ~ "\">"; + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" + ~ markup.indent_by_spaces_provided((n + 2), " ") + ~ _href ~ _txt.special_characters_text ~ "</a>" ~ "\n"; + } break; } + if (doc_matters.has.keys_seq.seg[doc_matters.has.keys_seq.seg.length - 2] == sect) { + // writeln(n, ": ", sect, ": ", _txt, " - ", obj.metainfo.dom_structure_collapsed_tags_status); // DEBUG + // read last heading (heading prior to closing) and determine what those instructions imply still need to be done + // CLOSE // DomTags { 0 none, 1 open, 2 close, 3 close_and_open, 4 open_still, } + if (n == 6) {_toc_nav_tail = "";} + switch (obj.metainfo.dom_structure_collapsed_tags_status[n]) { + 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 (n != 0) { + _toc_nav_tail ~= " " ~ markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; + } + _toc_nav_tail ~= " " ~ markup.indent_by_spaces_provided(n, " ") ~ "</ol>" ~ "\n"; + break; + default : + break; + } + if (n == 0) { + _toc_nav_tail ~="</nav> + </section> + </body> + </html>\n"; + } + } } } } } - toc ~="</nav> - </section> - </body> - </html>\n"; + toc ~= _toc_nav_tail; return toc; } @safe string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { - int counter = 0; + 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 = format(q"┃<?xml version="1.0" encoding="UTF-8"?> + 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, @@ -281,70 +305,89 @@ template outputEPub3() { <text>%s</text> </docAuthor> <navMap>┃", - doc_matters.conf_make_meta.meta.title_full, // title + (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, // author + : " 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, // title + (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, // author + : (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; - string hashtag =(obj.metainfo.heading_lev_markup <= 4) ? "" : ("#" ~ obj.metainfo.ocn.to!string); + 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_markedup_tags_status[k]) { + switch (obj.metainfo.dom_structure_collapsed_tags_status[k]) { // for epub may need to construct for levels 1 to 4 only case DomTags.close : - toc ~= "\n </navPoint>"; + if (sect != "head") { + toc ~= "\n </navPoint>"; // issue at start of some documents + } break; case DomTags.close_and_open : - ++counter; 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.tags.segment_anchor_tag_epub, - hashtag, - ); - break; + goto default; case DomTags.open : - ++counter; - toc ~= format(q"┃ + 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, - _txt, - obj.tags.segment_anchor_tag_epub, - hashtag, - ); - break; - default : + 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 ~= format(q"┃ - </navPoint> - </navPoint> - </navPoint> - </navMap> - </ncx>┃"); + toc ~= _toc_ncx_tail; return toc; } - @system void outputEPub3(D,I)( const D doc_abstraction, I doc_matters, @@ -400,7 +443,7 @@ template outputEPub3() { default: 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(_txt, obj, doc_matters, suffix, "epub"); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[obj.tags.segment_anchor_tag_epub] ~= t[0]; epubWrite.doc_epub3_endnotes[obj.tags.segment_anchor_tag_epub] ~= t[1]; break; @@ -409,12 +452,12 @@ template outputEPub3() { case 4: segment_filename = obj.tags.segment_anchor_tag_epub; epubWrite.doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[segment_filename] ~= t[0]; epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -438,13 +481,14 @@ template outputEPub3() { } } else { assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + Tuple!(string, string[]) t; switch (obj.metainfo.is_of_part) { case "frontmatter": assert(part == "head" || "toc"); switch (obj.metainfo.is_of_type) { case "para": switch (obj.metainfo.is_a) { case "toc": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[segment_filename] ~= t[0]; epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -473,7 +517,7 @@ template outputEPub3() { case "para": switch (obj.metainfo.is_a) { case "para": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[segment_filename] ~= t[0]; epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -490,24 +534,24 @@ template outputEPub3() { case "block": switch (obj.metainfo.is_a) { case "quote": - auto t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.group_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.block_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.verse_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[segment_filename] ~= t[0].to!string; epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -544,26 +588,26 @@ template outputEPub3() { case "para": switch (obj.metainfo.is_a) { case "endnote": assert(part == "endnotes"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[segment_filename] ~= t[0]; break; case "glossary": assert(part == "glossary"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); 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(_txt, obj, doc_matters, suffix, "epub"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "epub"); epubWrite.doc_epub3[segment_filename] ~= t[0]; epubWrite.doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -604,25 +648,25 @@ template outputEPub3() { 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" /> - ┃", + ┃", obj.tags.segment_anchor_tag_epub, obj.tags.segment_anchor_tag_epub, ); oepbs_content_parts["spine"] ~= 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" /> - ┃", + ┃", 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" /> - ┃", + ┃", obj.tags.segment_anchor_tag_epub, obj.metainfo.object_number, obj.tags.segment_anchor_tag_epub, @@ -630,13 +674,13 @@ template outputEPub3() { ); oepbs_content_parts["spine"] ~= 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" /> - ┃", + ┃", obj.tags.segment_anchor_tag_epub, obj.metainfo.object_number, obj.tags.segment_anchor_tag_epub, @@ -858,5 +902,4 @@ template outputEPub3() { } } } - } diff --git a/src/doc_reform/io_out/html.d b/src/doc_reform/io_out/html.d index ceaf9f9..5c55bd7 100644 --- a/src/doc_reform/io_out/html.d +++ b/src/doc_reform/io_out/html.d @@ -299,7 +299,7 @@ template outputHTML() { top_level_headings[3] = ""; goto default; default: - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); top_level_headings[obj.metainfo.heading_lev_markup] = t[0]; break; } @@ -313,13 +313,13 @@ template outputHTML() { foreach (top_level_heading; top_level_headings) { doc_html[segment_filename] ~= top_level_heading; } - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0].to!string; doc_html[segment_filename] ~= xhtml_format.lev4_heading_subtoc(obj, doc_matters); doc_html_endnotes[segment_filename] ~= t[1]; break; case 5: .. case 7: - auto t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); + Tuple!(string, string[]) t = xhtml_format.heading_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0].to!string; doc_html_endnotes[segment_filename] ~= t[1]; break; @@ -343,13 +343,14 @@ template outputHTML() { } } else { assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); + Tuple!(string, string[]) t; switch (obj.metainfo.is_of_part) { case "frontmatter": assert(part == "head" || "toc"); switch (obj.metainfo.is_of_type) { case "para": switch (obj.metainfo.is_a) { case "toc": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0].to!string; break; default: @@ -377,7 +378,7 @@ template outputHTML() { case "para": switch (obj.metainfo.is_a) { case "para": - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0].to!string; doc_html_endnotes[segment_filename] ~= t[1]; break; @@ -394,27 +395,19 @@ template outputHTML() { case "block": switch (obj.metainfo.is_a) { case "quote": - auto t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; + t = xhtml_format.quote_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; case "group": - auto t = xhtml_format.group_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; + t = xhtml_format.group_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; case "block": - auto t = xhtml_format.block_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; + t = xhtml_format.block_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; case "poem": break; case "verse": - auto t = xhtml_format.verse_seg(_txt, obj, doc_matters, suffix, "seg"); - doc_html[segment_filename] ~= t[0].to!string; - doc_html_endnotes[segment_filename] ~= t[1]; - break; + t = xhtml_format.verse_seg(_txt, obj, doc_matters, suffix, "seg"); + goto default; case "code": doc_html[segment_filename] ~= xhtml_format.code(_txt, obj, doc_matters); break; @@ -423,7 +416,14 @@ template outputHTML() { doc_html_endnotes[segment_filename] ~= ""; break; default: - { /+ debug +/ + if ((obj.metainfo.is_a == "quote" + || obj.metainfo.is_a == "group" + || obj.metainfo.is_a == "block" + || obj.metainfo.is_a == "verse" + )) { + doc_html[segment_filename] ~= t[0].to!string; + doc_html_endnotes[segment_filename] ~= t[1]; + } else { /+ debug +/ if (doc_matters.opt.action.debug_do && doc_matters.opt.action.verbose) { writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); @@ -448,26 +448,26 @@ template outputHTML() { case "para": switch (obj.metainfo.is_a) { case "endnote": assert(part == "endnotes"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0]; break; case "glossary": assert(part == "glossary"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0]; doc_html_endnotes[segment_filename] ~= t[1]; break; case "bibliography": assert(part == "bibliography"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0]; doc_html_endnotes[segment_filename] ~= t[1]; break; case "bookindex": assert(part == "bookindex"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0]; doc_html_endnotes[segment_filename] ~= t[1]; break; case "blurb": assert(part == "blurb"); - auto t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); + t = xhtml_format.para_seg(_txt, obj, doc_matters, suffix, "seg"); doc_html[segment_filename] ~= t[0]; doc_html_endnotes[segment_filename] ~= t[1]; break; @@ -560,7 +560,7 @@ template outputHTML() { M doc_matters, ) { { /+ (copy html images) +/ - + auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language); if (!exists(pth_html.image)) { pth_html.image.mkdirRecurse; diff --git a/src/doc_reform/io_out/paths_output.d b/src/doc_reform/io_out/paths_output.d index 96ef12d..86f418a 100644 --- a/src/doc_reform/io_out/paths_output.d +++ b/src/doc_reform/io_out/paths_output.d @@ -445,7 +445,7 @@ template spinePathsEPUB() { return dbg_docdir(fn_src).chainPath("OEBPS").array; } string dbg_doc_oebps_css(string fn_src) { - return dbg_doc_oebps(fn_src).chainPath("css").array; + return dbg_doc_oebps(fn_src).chainPath("Styles").array; } string dbg_doc_oebps_image(string fn_src) { return dbg_doc_oebps(fn_src).chainPath("image").array; diff --git a/src/doc_reform/io_out/xmls.d b/src/doc_reform/io_out/xmls.d index 703df3d..ab80a09 100644 --- a/src/doc_reform/io_out/xmls.d +++ b/src/doc_reform/io_out/xmls.d @@ -95,10 +95,10 @@ template outputXHTMLs() { } @safe string special_characters_text(string _txt) { _txt = _txt - .replaceAll(rgx.xhtml_ampersand, "&") - .replaceAll(rgx.xhtml_quotation, """) - .replaceAll(rgx.xhtml_less_than, "<") - .replaceAll(rgx.xhtml_greater_than, ">") + .replaceAll(rgx.xhtml_ampersand, "&") // "&" + .replaceAll(rgx.xhtml_quotation, """) // """ + .replaceAll(rgx.xhtml_less_than, "<") // "<" + .replaceAll(rgx.xhtml_greater_than, ">") // ">" .replaceAll(rgx.nbsp_char, " "); return _txt; } @@ -131,7 +131,7 @@ template outputXHTMLs() { if (obj.tags.anchor_tags.length > 0) { foreach (tag; obj.tags.anchor_tags) { if (!(tag.empty)) { - tags ~= "<a name=\"" ~ tag ~ "\"></a>"; + tags ~= "<a name=\"" ~ special_characters_text(tag) ~ "\"></a>"; } } } @@ -158,19 +158,19 @@ template outputXHTMLs() { <meta name="generator" content="%s" /> <link rel="generator" href="%s" /> <!-- spine DocReform header metadata -->┃", - doc_matters.conf_make_meta.meta.title_full.replaceAll(regex("\""), """), - doc_matters.conf_make_meta.meta.creator_author, + special_characters_text(doc_matters.conf_make_meta.meta.title_full), + special_characters_text(doc_matters.conf_make_meta.meta.creator_author), _publisher, - doc_matters.conf_make_meta.meta.date_published, - doc_matters.conf_make_meta.meta.date_created, - doc_matters.conf_make_meta.meta.date_issued, - doc_matters.conf_make_meta.meta.date_available, - doc_matters.conf_make_meta.meta.date_valid, - doc_matters.conf_make_meta.meta.date_modified, + special_characters_text(doc_matters.conf_make_meta.meta.date_published), + special_characters_text(doc_matters.conf_make_meta.meta.date_created), + special_characters_text(doc_matters.conf_make_meta.meta.date_issued), + special_characters_text(doc_matters.conf_make_meta.meta.date_available), + special_characters_text(doc_matters.conf_make_meta.meta.date_valid), + special_characters_text(doc_matters.conf_make_meta.meta.date_modified), doc_matters.src.language, - doc_matters.conf_make_meta.meta.rights_copyright, - doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.name_and_version, - doc_matters.generator_program.url_home, + special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright), + doc_matters.opt.action.debug_do ? "" : special_characters_text(doc_matters.generator_program.name_and_version), + special_characters_text(doc_matters.generator_program.url_home), ); return o; } @@ -266,9 +266,9 @@ template outputXHTMLs() { <div class="flex-menu-option"> %s </div>%s%s┃", - doc_matters.conf_make_meta.meta.title_full, + special_characters_text(doc_matters.conf_make_meta.meta.title_full), (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : ", " ~ doc_matters.conf_make_meta.meta.creator_author, + : ", " ~ special_characters_text(doc_matters.conf_make_meta.meta.creator_author), header_metadata(doc_matters), ((type == "seg") ? "../" : ""), ((type == "seg") @@ -330,22 +330,22 @@ template outputXHTMLs() { <body lang="%s"> <a name="top" id="top"></a>┃", html_simple, - doc_matters.conf_make_meta.meta.title_full.replaceAll(regex("\""), """), + special_characters_text(doc_matters.conf_make_meta.meta.title_full), (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : ", " ~ doc_matters.conf_make_meta.meta.creator_author, - doc_matters.conf_make_meta.meta.title_full, + : ", " ~ special_characters_text(doc_matters.conf_make_meta.meta.creator_author), + special_characters_text(doc_matters.conf_make_meta.meta.title_full), (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" - : ", " ~ doc_matters.conf_make_meta.meta.creator_author, - doc_matters.conf_make_meta.meta.date_published, - doc_matters.conf_make_meta.meta.date_created, - doc_matters.conf_make_meta.meta.date_issued, - doc_matters.conf_make_meta.meta.date_available, - doc_matters.conf_make_meta.meta.date_valid, - doc_matters.conf_make_meta.meta.date_modified, + : ", " ~ special_characters_text(doc_matters.conf_make_meta.meta.creator_author), + special_characters_text(doc_matters.conf_make_meta.meta.date_published), + special_characters_text(doc_matters.conf_make_meta.meta.date_created), + special_characters_text(doc_matters.conf_make_meta.meta.date_issued), + special_characters_text(doc_matters.conf_make_meta.meta.date_available), + special_characters_text(doc_matters.conf_make_meta.meta.date_valid), + special_characters_text(doc_matters.conf_make_meta.meta.date_modified), doc_matters.src.language, - doc_matters.conf_make_meta.meta.rights_copyright, - doc_matters.generator_program.name_and_version, - doc_matters.generator_program.url_home, + special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright), + special_characters_text(doc_matters.generator_program.name_and_version), + special_characters_text(doc_matters.generator_program.url_home), doc_matters.src.language, ); return o; @@ -587,7 +587,7 @@ template outputXHTMLs() { } return _txt; } - @safe auto inline_markup_seg(O,M)( + @safe Tuple!(string, string[]) inline_markup_seg(O,M)( string _txt, const O obj, M doc_matters, @@ -792,7 +792,7 @@ template outputXHTMLs() { string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0]; string[] _endnotes = t[1]; string o = heading(_txt, obj, doc_matters, _xml_type); @@ -872,7 +872,7 @@ template outputXHTMLs() { string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = para(_txt, obj, doc_matters); @@ -935,7 +935,7 @@ template outputXHTMLs() { string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = quote(_txt, obj, doc_matters); @@ -1001,7 +1001,7 @@ template outputXHTMLs() { string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = group(_txt, obj, doc_matters); @@ -1063,7 +1063,7 @@ template outputXHTMLs() { string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = block(_txt, obj, doc_matters); @@ -1123,7 +1123,7 @@ template outputXHTMLs() { string _suffix = ".html", string _xml_type = "html", ) { - auto t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); + Tuple!(string, string[]) t = inline_markup_seg(_txt, obj, doc_matters, _suffix, _xml_type); _txt = t[0].to!string; string[] _endnotes = t[1]; string o = verse(_txt, obj, doc_matters); diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d index d306df5..bc19ec2 100644 --- a/src/doc_reform/meta/metadoc_from_src.d +++ b/src/doc_reform/meta/metadoc_from_src.d @@ -452,6 +452,9 @@ template docAbstraction() { reset_note_numbers = true; lev_anchor_tag = ""; anchor_tag = ""; + // dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; + // dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; + // dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; } mixin spineNode; auto node_para_int_ = node_metadata_para_int; @@ -2468,10 +2471,10 @@ template docAbstraction() { html_segnames_ptr = 0; html_segnames_ptr_cntr = 0; content_non_header = "8"; - dom_structure_markedup_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; - dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; - dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; - dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; + dom_structure_markedup_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0,]; + dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0,]; + dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0,]; + dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0,]; lev_anchor_tag = ""; anchor_tag = ""; @safe auto doc_has() { |