diff options
| author | Ralph Amissah <ralph.amissah@gmail.com> | 2022-02-04 18:48:25 -0500 | 
|---|---|---|
| committer | Ralph Amissah <ralph.amissah@gmail.com> | 2022-02-05 18:26:02 -0500 | 
| commit | 30b6d716f3e4448667ee61bdda044df739d6ad68 (patch) | |
| tree | 8cbe98e04605f388bc52cb368198833121cf1f8a /org | |
| parent | codegen cgi search removed (using src in org-mode) (diff) | |
epub, work on
Diffstat (limited to 'org')
| -rw-r--r-- | org/default_misc.org | 2 | ||||
| -rw-r--r-- | org/default_regex.org | 3 | ||||
| -rw-r--r-- | org/metaverse.org | 12 | ||||
| -rw-r--r-- | org/out_xmls.org | 183 | 
4 files changed, 37 insertions, 163 deletions
diff --git a/org/default_misc.org b/org/default_misc.org index 5c71dee..429e13a 100644 --- a/org/default_misc.org +++ b/org/default_misc.org @@ -237,7 +237,7 @@ template InternalMarkup() {      string mark_internal_site_lnk = "¤";      string nbsp                   = "░";      string br_line                = "┘"; -    string br_nl                  = "┙"; +    string br_newline_inline      = "┙";      string br_paragraph           = "┚";      string br_obj                 = "break_obj";      string br_page_line           = "┼"; diff --git a/org/default_regex.org b/org/default_regex.org index 6734b62..636d767 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -105,6 +105,7 @@ static trailing_linebreak                             = ctRegex!(",[ ]{1,2}\\\\\  static newline_eol_delimiter                          = ctRegex!("\n");  static newline_eol_strip_preceding                    = ctRegex!("[ ]*\n");  static newline_eol_delimiter_only                     = ctRegex!("^\n"); +static markup_inline_linebreak                        = ctRegex!(`\s*\\\\s*`, "m");  static line_delimiter_ws_strip                        = ctRegex!("[ ]*\n[ ]*");  static para_delimiter                                 = ctRegex!("\n[ ]*\n+");  static table_col_delimiter                            = ctRegex!("[ ]*\n+", "mg"); @@ -526,7 +527,7 @@ static src_formalised_file_path_parts                 = ctRegex!(`(?P<pth>(?:[/a  static br_empty_line                                  = ctRegex!(`\n[ ]*\n`, "mg");  static br_newlines_linebreaks                         = ctRegex!(`[\n┘┙]`, "mg");  static br_line                                        = ctRegex!(`┘`, "mg"); -static br_nl                                          = ctRegex!(`┙`, "mg"); +static br_newline_inline                              = ctRegex!(`┙`, "mg");  #+END_SRC  *** inline (internal program) markup footnotes endnotes :inline:footnote: diff --git a/org/metaverse.org b/org/metaverse.org index b97bd2f..a3896c2 100644 --- a/org/metaverse.org +++ b/org/metaverse.org @@ -5170,11 +5170,11 @@ if (pith["block_is"] == eN.blk_is.quote) {          an_object[an_object_key] = an_object[an_object_key]            .replaceFirst(rgx.variable_doc_title_author_date,              (conf_make_meta.meta.title_full -            ~ mkup.br_nl +            ~ mkup.br_newline_inline              ~ conf_make_meta.meta.creator_author              ~ " (" ~ (conf_make_meta.meta.date_published.replaceFirst(regex(r"(?:-00)+"),"")) ~ ")"))            .replaceFirst(rgx.variable_doc_title, -            (conf_make_meta.meta.title_full ~ mkup.br_nl)) +            (conf_make_meta.meta.title_full ~ mkup.br_newline_inline))            .replaceFirst(rgx.variable_doc_author,              conf_make_meta.meta.creator_author)            .replaceFirst(rgx.variable_doc_date, @@ -5185,10 +5185,10 @@ if (pith["block_is"] == eN.blk_is.quote) {          an_object[an_object_key] = an_object[an_object_key]            .replaceFirst(rgx.variable_doc_title_author_date,              (conf_make_meta.meta.title_full -            ~ mkup.br_nl +            ~ mkup.br_newline_inline              ~ conf_make_meta.meta.creator_author))            .replaceFirst(rgx.variable_doc_title, -            (conf_make_meta.meta.title_full ~ mkup.br_nl)) +            (conf_make_meta.meta.title_full ~ mkup.br_newline_inline))            .replaceFirst(rgx.variable_doc_author,              conf_make_meta.meta.creator_author);        } else if (an_object[an_object_key].match(rgx.variable_doc_title)) { @@ -5893,6 +5893,7 @@ invariant() {    obj_txt["munge"] = obj_txt_in     .replaceFirst(rgx.headings, "")     .replaceFirst(rgx.object_number_off_all, "") +   .replaceFirst(rgx.markup_inline_linebreak, mkup.br_newline_inline)     .strip;    TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt["munge"], reset_note_numbers);    debug(munge) { @@ -5923,7 +5924,8 @@ invariant() {  @safe auto munge_para()(string obj_txt_in) {    obj_txt["munge"] = (obj_txt_in)      .replaceFirst(rgx.para_attribs, "") -    .replaceFirst(rgx.object_number_off_all, ""); +    .replaceFirst(rgx.object_number_off_all, "") +    .replaceFirst(rgx.markup_inline_linebreak, mkup.br_newline_inline);    TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt["munge"]);    debug(munge) {      writeln(__LINE__); diff --git a/org/out_xmls.org b/org/out_xmls.org index 84c15db..0e9bafe 100644 --- a/org/out_xmls.org +++ b/org/out_xmls.org @@ -159,8 +159,7 @@ import      .replaceAll(rgx.xhtml_quotation,    """) // """      .replaceAll(rgx.xhtml_less_than,    "<")   // "<"      .replaceAll(rgx.xhtml_greater_than, ">")   // ">" -    .replaceAll(rgx.br_line,            "<br>") -    .replaceAll(rgx.br_nl,              "<br>") +    .replaceAll(rgx.br_line,            "<br />")      .replaceAll(rgx.nbsp_char,          " ");    return _txt;  } @@ -173,8 +172,7 @@ import  @safe string special_characters_date(string _txt) {    _txt = _txt      .replaceAll(regex(r"(?:-00)+"),     "") -    .replaceAll(rgx.br_line,            "<br>") -    .replaceAll(rgx.br_nl,              "<br>") +    .replaceAll(rgx.br_line,            "<br />")      .replaceAll(rgx.nbsp_char,          " ");    return _txt;  } @@ -334,7 +332,7 @@ import        .replaceAll(          rgx.br_line, "")        .replaceAll( -        rgx.br_nl, ""); +        rgx.br_newline_inline, "");    } else {       _locations = "<p class=\"tiny_left\"><a href=\"https://www.doc-reform.org\">spine</a></p>\n<p class=\"tiny_left\"><a href=\"https://git.sisudoc.org/software/spine/\">sources / git</a></p>\n<p class=\"tiny_left\"><a href=\"https://www.sisudoc.org\">www.sisudoc.org</a></p>";    } @@ -999,14 +997,16 @@ import        (doc_matters.opt.action.ocn_off)          ? "" : ((obj.metainfo.object_number.empty)            ? "" : obj.metainfo.identifier), -      obj.metainfo.heading_lev_markup, +      ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 +      : obj.metainfo.heading_lev_markup),        obj.metainfo.is_a,        obj.metainfo.identifier,        obj.metainfo.identifier,        tags,        heading_lev_anchor_tag,        _txt, -      obj.metainfo.heading_lev_markup, +      ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 +      : obj.metainfo.heading_lev_markup),      );    } else {      o = format(q"┃%s @@ -1016,12 +1016,14 @@ import      </h%s>    </div>┃",        _horizontal_rule, -      obj.metainfo.heading_lev_markup, +      ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 +      : obj.metainfo.heading_lev_markup),        obj.metainfo.is_a,        tags,        heading_lev_anchor_tag,        _txt, -      obj.metainfo.heading_lev_markup, +      ((_xml_type == "epub" && obj.metainfo.heading_lev_markup == 0) ? 1 +      : obj.metainfo.heading_lev_markup),      );    }    return o; @@ -2349,7 +2351,6 @@ template outputEPub3() {    <<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>> @@ -2440,8 +2441,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">      <dc:identifier id="bookid">urn:uuid:%s</dc:identifier>    </metadata>    <manifest> -    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" /> -    <link rel="stylesheet" href="%s" type="text/css" id="main-css" /> +    <item id="css" href="%s" media-type="text/css"/>      <item id="nav" href="toc_nav.xhtml" media-type="application/xhtml+xml" properties="nav" />  ┃",      _uuid, @@ -2473,7 +2473,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">      );    }    content ~= "  " ~ "</manifest>"         ~ "\n  "; -  content ~= "  " ~ "<spine toc=\"ncx\">" ~ "\n  "; +  content ~= "  " ~ "<spine>"             ~ "\n  ";    content ~= parts["spine"];    content ~= "  " ~ "</spine>"            ~ "\n  ";    content ~= "  " ~ "<guide>"             ~ "\n  "; @@ -2530,7 +2530,6 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">      <h1>Contents</h1>    </header>    <nav epub:type="toc" id="toc"> -  <ol>      <li>┃",            (doc_matters.conf_make_meta.meta.title_full).special_characters_text,          ); @@ -2544,7 +2543,10 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">      </li>  ┃",            toc_head, -          obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip, +          obj.text +            .replaceAll(rgx.inline_notes_al_gen, "") +            .replaceAll(rgx.br_newline_inline, "<br />") +            .strip,          );        } else if (sect == "tail") { // skip        } else if ((sect != "tail") && (obj.metainfo.is_a == "heading")) { @@ -2602,7 +2604,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">                break;              }              if (n == 0) { -              _toc_nav_tail ~="</nav> +              _toc_nav_tail ~="  </nav>  </section>  </body>  </html>\n"; @@ -2617,124 +2619,6 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">  }  #+END_SRC -**** TODO _doc navigation epub2_ (OEBPS/toc.ncx) navigable toc using Dom structure - -- toc.ncx (epub2 navigation document) -  - (replaced in epub3 by a declared xhtml nav file, in our case toc_nav.xhtml) - -#+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_play_order = 0; -  string _uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO shared elsewhere -  auto markup = InlineMarkup(); -  static auto rgx = RgxO(); -  enum DomTags { none, open, close, close_and_open, open_still, } -  string toc; -  string toc_ = format(q"┃<?xml version="1.0" encoding="utf-8"?> -<ncx xmlns="https://www.daisy.org/z3986/2005/ncx/" version="2005-1"> -<head> -  <!-- four required metadata items (for all NCX documents, -    (including the relaxed constraints of OPS 2.0) --> -  <title>%s%s</title> -  <link rel="stylesheet" href="Styles/epub.css" type="text/css" id="main-css" /> -  <meta name="dtb:uid" content="urn:uuid:%s" /> -  <meta name="dtb:depth" content="%s" /> -  <meta name="dtb:totalPageCount" content="0" /> -  <meta name="dtb:maxPageNumber" content="0" /> -</head> -<docTitle> -  <text>%s</text> -</docTitle> -<docAuthor> -  <text>%s</text> -</docAuthor> -<navMap>┃", -    (doc_matters.conf_make_meta.meta.title_full).special_characters_text,                          // title -    (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" -      : " by " ~ (doc_matters.conf_make_meta.meta.creator_author).special_characters_text,         // author -    _uuid,                                                                // uuid -    "3",                                                                 // content depth -    (doc_matters.conf_make_meta.meta.title_full).special_characters_text,                          // title -    (doc_matters.conf_make_meta.meta.creator_author.empty) ? "" -      : (doc_matters.conf_make_meta.meta.creator_author).special_characters_text,                  // author -  ); -  string _toc_ncx_tail = ""; -  foreach (sect; doc_matters.has.keys_seq.seg) { -    foreach (obj; doc_abstraction[sect]) { -      if (sect == "head") { toc = toc_; -      } -      if (obj.metainfo.is_a == "heading") { -        string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip.special_characters_text; -        // writeln(_txt, " --- ", obj.metainfo.dom_structure_collapsed_tags_status); // DEBUG line -        string hashtag = (obj.metainfo.heading_lev_markup <= 4) ? "" : ("#" ~ obj.metainfo.ocn.to!string); -        foreach_reverse (k; 0 .. 7) { -          switch (obj.metainfo.dom_structure_collapsed_tags_status[k]) { // for epub may need to construct for levels 1 to 4 only -          case DomTags.close : -            if (sect != "head") { -              toc ~= "\n    </navPoint>"; // issue at start of some documents -            } -            break; -          case DomTags.close_and_open : -            toc ~= "\n    </navPoint>"; -            goto default; -          case DomTags.open : -            goto default; -          default : -            string _toc; -            if ((obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.open -              || obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.close_and_open -              // || obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.open_still -            )) { -              ++counter_play_order; -              _toc = format(q"┃ -  <navPoint class="chapter" id="navpoint" playOrder="%s"> -    <navLabel> -      <text>%s</text> -    </navLabel> -    <content src="%s.xhtml%s" />┃", -                counter_play_order, -                _txt, -                obj.tags.segment_anchor_tag_epub, -                hashtag, -              ); -            } -            if (obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.close_and_open) { -              toc ~= _toc; -            } else if (obj.metainfo.dom_structure_collapsed_tags_status[k] == DomTags.open) { -              toc ~= _toc; -            } -            break; -          } -          if (doc_matters.has.keys_seq.seg[doc_matters.has.keys_seq.seg.length - 2] == sect) { -            if (k == 6) {_toc_ncx_tail = "";} -            switch (obj.metainfo.dom_structure_collapsed_tags_status[k]) { -            case 0: case 2: -            // case DomTags.none: case DomTags.close: -              break; -            case 1: case 3: case 4: -            // case DomTags.open: case DomTags.close_and_open: case DomTags.open_still: -              if (k != 0) { -              } -              _toc_ncx_tail ~= "   " ~ markup.indent_by_spaces_provided(k, "  ") ~ "</navPoint>" ~ "\n"; -              break; -            default : -              break; -            } -            if (k == 0) { -              _toc_ncx_tail ~= format(q"┃  </navMap> -</ncx>┃"); -            } -          } -        } -      } -    } -  } -  toc ~= _toc_ncx_tail; -  return toc; -} -#+END_SRC -  ** the document contents                                                :seg:  *** ↻ loop & switch (sections & objects) format epub3 xhtml output @@ -2756,7 +2640,6 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">      /+ fixed output +/      string mimetypes;      string meta_inf_container_xml; -    string oebps_toc_ncx;      string oebps_toc_nav_xhtml;      /+ variable output +/      string oebps_content_opf; @@ -3052,25 +2935,25 @@ 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" /> +      format(q"┃<item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" />        ┃",        obj.tags.segment_anchor_tag_epub,        obj.tags.segment_anchor_tag_epub,      );      oepbs_content_parts["spine"] ~= -      format(q"┃    <itemref idref="%s.xhtml" linear="yes" /> +      format(q"┃<itemref idref="%s.xhtml" linear="yes" />        ┃",        obj.tags.segment_anchor_tag_epub,      );      oepbs_content_parts["guide"] ~= -      format(q"┃      <reference type="%s" href="%s" /> +      format(q"┃<reference type="%s" href="%s" />        ┃",        obj.tags.segment_anchor_tag_epub,        obj.tags.segment_anchor_tag_epub,      );    } else if (obj.metainfo.heading_lev_markup > 4) {      oepbs_content_parts["manifest_documents"] ~= -      format(q"┃      <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> +      format(q"┃<item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" />        ┃",        obj.tags.segment_anchor_tag_epub,        obj.metainfo.object_number, @@ -3078,13 +2961,13 @@ if (obj.metainfo.is_a == "heading") {        obj.metainfo.object_number,      );      oepbs_content_parts["spine"] ~= -      format(q"┃    <itemref idref="%s.xhtml#%s" linear="yes" /> +      format(q"┃<itemref idref="%s.xhtml#%s" linear="yes" />        ┃",        obj.tags.segment_anchor_tag_epub,        obj.metainfo.object_number,      );      oepbs_content_parts["guide"] ~= -      format(q"┃      <reference type="%s#%s" href="%s#%s" /> +      format(q"┃<reference type="%s#%s" href="%s#%s" />        ┃",        obj.tags.segment_anchor_tag_epub,        obj.metainfo.object_number, @@ -3102,11 +2985,10 @@ if (obj.metainfo.is_a == "heading") {      }    }    /+ epub specific documents +/ -  epubWrite.mimetypes =              epub3_mimetypes; +  epubWrite.mimetypes              = epub3_mimetypes;    epubWrite.meta_inf_container_xml = epub3_container_xml; -  epubWrite.oebps_toc_ncx =          doc_abstraction.epub2_oebps_toc_ncx(doc_matters); -  epubWrite.oebps_toc_nav_xhtml =    doc_abstraction.epub3_oebps_toc_nav_xhtml(doc_matters); -  epubWrite.oebps_content_opf =      doc_abstraction.epub3_oebps_content(doc_matters, oepbs_content_parts); +  epubWrite.oebps_toc_nav_xhtml    = doc_abstraction.epub3_oebps_toc_nav_xhtml(doc_matters); +  epubWrite.oebps_content_opf      = doc_abstraction.epub3_oebps_content(doc_matters, oepbs_content_parts);    epubWrite.epub3_write_output_files(doc_matters);  }  #+END_SRC @@ -3127,7 +3009,6 @@ zip -0 file.epub mimetype && zip -r -9 file.epub META-INF OEBPS      static assert(is(typeof(epub_write.mimetypes)              == string));      static assert(is(typeof(epub_write.meta_inf_container_xml) == string));      static assert(is(typeof(epub_write.oebps_toc_nav_xhtml)    == string)); -    static assert(is(typeof(epub_write.oebps_toc_ncx)          == string));      static assert(is(typeof(epub_write.oebps_content_opf)      == string));    }    static auto rgx = RgxO(); @@ -3234,16 +3115,6 @@ zip -0 file.epub mimetype && zip -r -9 file.epub META-INF OEBPS        fn = pth_epub3.fn_oebps_toc_nav_xhtml;        EPUBzip(epub_write.oebps_toc_nav_xhtml, fn);      } -    { /+ OEBPS/toc.ncx (navigation toc epub2) +/ -      { /+ debug +/ -        if (doc_matters.opt.action.debug_do) { -          fn_dbg = pth_epub3.dbg_fn_oebps_toc_ncx(doc_matters.src.filename); -          File(fn_dbg, "w").writeln(epub_write.oebps_toc_ncx); -        } -      } -      fn = pth_epub3.fn_oebps_toc_ncx; -      EPUBzip(epub_write.oebps_toc_ncx, fn); -    }      { /+ OEBPS/content.opf (doc manifest) +/        { /+ debug +/          if (doc_matters.opt.action.debug_do) {  | 
