diff options
author | Ralph Amissah <ralph@amissah.com> | 2017-05-01 18:46:11 -0400 |
---|---|---|
committer | Ralph Amissah <ralph@amissah.com> | 2019-04-10 15:14:14 -0400 |
commit | a9a46fca7397aaa357bfdc2b98e181617bb6887b (patch) | |
tree | 4a3c214b8139204cdb4cce723f14da7bd34a939f | |
parent | xml family, special characters, deal with once (diff) |
xmls work particularly with epub output
-rw-r--r-- | org/ao_doc_abstraction.org | 151 | ||||
-rw-r--r-- | org/output_xmls.org | 306 | ||||
-rw-r--r-- | org/output_xmls_css.org | 8 | ||||
-rw-r--r-- | org/sdp.org | 9 | ||||
-rw-r--r-- | src/sdp/abstraction.d | 9 | ||||
-rw-r--r-- | src/sdp/ao_abstract_doc_source.d | 149 | ||||
-rw-r--r-- | src/sdp/output_epub3.d | 190 | ||||
-rw-r--r-- | src/sdp/output_html.d | 4 | ||||
-rw-r--r-- | src/sdp/output_xmls.d | 112 | ||||
-rw-r--r-- | src/sdp/output_xmls_css.d | 8 |
10 files changed, 587 insertions, 359 deletions
diff --git a/org/ao_doc_abstraction.org b/org/ao_doc_abstraction.org index 93768c1..878f1a0 100644 --- a/org/ao_doc_abstraction.org +++ b/org/ao_doc_abstraction.org @@ -605,6 +605,7 @@ auto note_section = NotesSection(); auto bookindex_extract_hash = BookIndexNuggetHash(); string[][string] lev4_subtoc; string[] html_segnames=["toc"]; +int cnt1 = 1; int cnt2 = 1; int cnt3 = 1; #+END_SRC ** 2. _loop: process document body_ [+6] :loop: @@ -725,6 +726,7 @@ if there is a glossary section you need to: comp_obj_heading_.text = "Glossary"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_glossary"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -806,6 +808,7 @@ if there is a blurb section you need to: comp_obj_heading_.text = "Blurb"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_blurb"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -1143,8 +1146,28 @@ if ((type["heading"] == State.on) segment_anchor_tag_that_object_belongs_to = anchor_tag_; segment_anchor_tag_that_object_belongs_to_uri = anchor_tag_ ~ ".fnSuffix#" ~ obj_cite_number.to!string; } else if (an_object["lev_markup_number"].to!int < 4) { - segment_anchor_tag_that_object_belongs_to = ""; - segment_anchor_tag_that_object_belongs_to_uri = ""; + string segn; + switch (an_object["lev_markup_number"].to!int) { + case 0: + segn = "_the_title"; + goto default; + case 1: + segn = "_part_" ~ cnt1.to!string; + ++cnt1; + goto default; + case 2: + segn = "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string; + ++cnt2; + goto default; + case 3: + segn = "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string ~ "_" ~ cnt3.to!string; + ++cnt3; + goto default; + default: + segment_anchor_tag_that_object_belongs_to = segn; + segment_anchor_tag_that_object_belongs_to_uri = segn ~ ".fnSuffix"; + break; + } } an_object["bookindex_nugget"] = ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : ""; @@ -1390,6 +1413,7 @@ if (biblio_ordered.length > 0) { comp_obj_heading_.text = "Bibliography"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_bibliography"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -1704,7 +1728,7 @@ the_document_head_section ~= the_document_body_section[0]; the_document_body_section=the_document_body_section[1..$]; #+END_SRC -*** minor loops :post: +*** _minor loops_ :post: **** 1. loop: backmatter loop up to lev4: html_segnames, set backmatter pointers could optimise by @@ -1817,11 +1841,15 @@ auto extract_images(S)(S content_block) { } return images_; } +string[] segnames_0_4; foreach (ref obj; the_document_head_section) { if (obj.is_a == "heading") { debug(dom) { writeln(obj.text); } + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) || (opt_action_bool["html_seg"]) @@ -1839,9 +1867,12 @@ if (the_table_of_contents_section["scroll"].length > 1) { dom_collapsed_buffer = dom_collapsed.dup; foreach (ref obj; the_table_of_contents_section["scroll"]) { if (obj.is_a == "heading") { - if (obj.heading_lev_markup == 4) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + } } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1862,9 +1893,12 @@ if (the_table_of_contents_section["scroll"].length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + } } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1886,13 +1920,16 @@ if (the_document_body_section.length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.lev4_subtoc = lev4_subtoc[obj.segment_anchor_tag]; - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.lev4_subtoc = lev4_subtoc[obj.segment_anchor_tag]; + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1921,12 +1958,15 @@ if (the_endnotes_section.length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1948,12 +1988,15 @@ if (the_glossary_section.length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1975,12 +2018,15 @@ if (the_bibliography_section.length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -2003,12 +2049,15 @@ if (the_bookindex_section["scroll"].length > 1) { if (obj.is_a == "heading") { debug(dom) { } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -2029,12 +2078,15 @@ if (the_bookindex_section["scroll"].length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -2056,12 +2108,15 @@ if (the_blurb_section.length > 1) { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -2205,6 +2260,7 @@ auto t = tuple( document_the, docSectKeysSeq!()(document_section_keys_sequenced), segnames, + segnames_0_4, images, ); return t; @@ -3436,7 +3492,6 @@ void _block_flag_line_empty_(B)( auto substantive_obj_misc_tuple = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, dochead_make_aa); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; - anchor_tags = substantive_obj_misc_tuple[sObj.anchor_tags]; comp_obj_block = comp_obj_block.init; comp_obj_block.use = "body"; comp_obj_block.is_of = "block"; @@ -3484,7 +3539,7 @@ void _block_flag_line_empty_(B)( comp_obj_poem_ocn.is_a = "poem"; comp_obj_poem_ocn.ocn = obj_cite_number; comp_obj_poem_ocn.obj_cite_number = (obj_cite_number_poem["start"], obj_cite_number_poem["end"]); - comp_obj_poem_ocn.text = ""; // an_object["substantive"]; + comp_obj_poem_ocn.text = ""; the_document_body_section ~= comp_obj_poem_ocn; type["blocks"] = TriState.off; type["poem"] = TriState.off; @@ -5838,6 +5893,7 @@ struct BookIndexReportSection { comp_obj_heading_.text = "Book Index"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_book_index"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -6088,6 +6144,7 @@ struct NotesSection { comp_obj_heading_.text = "Endnotes"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_endnotes"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; diff --git a/org/output_xmls.org b/org/output_xmls.org index 017c346..1757ffa 100644 --- a/org/output_xmls.org +++ b/org/output_xmls.org @@ -130,12 +130,9 @@ string _xhtml_anchor_tags(const(string[]) anchor_tags) { #+name: xhtml_format_objects #+BEGIN_SRC d -auto html_scroll_head(Me)( - Me dochead_meta, +auto html_scroll_head(Dm)( + Dm doc_matters, ) { - debug(asserts) { - static assert(is(typeof(dochead_meta) == string[string][string])); - } string o; o = format(q"¶<!DOCTYPE html> <html> @@ -163,11 +160,12 @@ auto html_scroll_head(Me)( <link href="../../css/html.css" rel="stylesheet" /> <link href="../../../css/html.css" rel="stylesheet" /> </head> -<body lang="en"> +<body lang="%s"> <a name="top" id="top"></a>¶", -dochead_meta["title"]["full"], -(dochead_meta["creator"]["author"].empty) ? "" : ", " ~ dochead_meta["creator"]["author"], -); + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.language, + ); return o; } #+END_SRC @@ -176,12 +174,9 @@ dochead_meta["title"]["full"], #+name: xhtml_format_objects #+BEGIN_SRC d -auto html_seg_head(Me)( - Me dochead_meta, +auto html_seg_head(Dm)( + Dm doc_matters, ) { - debug(asserts) { - static assert(is(typeof(dochead_meta) == string[string][string])); - } string o; o = format(q"¶<!DOCTYPE html> <html> @@ -209,11 +204,13 @@ auto html_seg_head(Me)( <link href="../../css/html.css" rel="stylesheet" /> <link href="../../../css/html.css" rel="stylesheet" /> </head> -<body lang="en"> +<body lang="%s"> <a name="top" id="top"></a>¶", -dochead_meta["title"]["full"], -(dochead_meta["creator"]["author"].empty) ? "" : ", " ~ dochead_meta["creator"]["author"], -); + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" + : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.language, + ); return o; } #+END_SRC @@ -222,50 +219,60 @@ dochead_meta["title"]["full"], #+name: xhtml_format_objects #+BEGIN_SRC d -auto epub3_seg_head(Me)( - Me dochead_meta, +auto epub3_seg_head(Dm)( + Dm doc_matters, ) { - debug(asserts) { - static assert(is(typeof(dochead_meta) == string[string][string])); - } - string html_simple = format(q"¶<!DOCTYPE html> + string html_base = format(q"¶<!DOCTYPE html> <html>¶", ); + string html_simple = format(q"¶<!DOCTYPE html> +<html + xmlns="http://www.w3.org/1999/xhtml" + xmlns:epub="http://www.idpf.org/2007/ops" + lang="%s" xml:lang="%s">¶", + doc_matters.language, + doc_matters.language, + ); string html_strict = format(q"¶<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">¶", -); +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:epub="http://www.idpf.org/2007/ops" + lang="%s" xml:lang="%s">¶", + doc_matters.language, + doc_matters.language, + ); string o; o = format(q"¶%s <head> - <meta charset="utf-8"> - <title> - %s%s - </title> - <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> - <meta name="dc.title" content="Title" /> - <meta name="dc.author" content="Author" /> - <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> - <meta name="dc.date" content="year" /> - <meta name="dc.date.created" content="year" /> - <meta name="dc.date.issued" content="year" /> - <meta name="dc.date.available" content="year" /> - <meta name="dc.date.valid" content="year" /> - <meta name="dc.date.modified" content="year" /> - <meta name="dc.language" content="US" /> - <meta name="dc.rights" content="Copyright: Copyright (C) year holder" /> - <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> - </meta> + <title> + %s%s + </title> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> + <meta name="dc.title" content="%s" /> + <meta name="dc.author" content="%s" /> + <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> + <meta name="dc.date" content="year" /> + <meta name="dc.date.created" content="year" /> + <meta name="dc.date.issued" content="year" /> + <meta name="dc.date.available" content="year" /> + <meta name="dc.date.valid" content="year" /> + <meta name="dc.date.modified" content="year" /> + <meta name="dc.language" content="US" /> + <meta name="dc.rights" content="Copyright: Copyright (C) year holder" /> + <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> <link rel="generator" href="http://www.sisudoc.org/" /> <link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> </head> -<body lang="en"> +<body lang="%s"> <a name="top" id="top"></a>¶", -html_strict, -dochead_meta["title"]["full"], -(dochead_meta["creator"]["author"].empty) ? "" : ", " ~ dochead_meta["creator"]["author"], -); + html_simple, + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.language, + ); return o; } #+END_SRC @@ -477,10 +484,12 @@ auto toc_seg(O)( auto heading(O)( auto return ref const O obj, string _txt, + string _type="html", ) { auto tags = _xhtml_anchor_tags(obj.anchor_tags); string _horizontal_rule = "<hr />"; - if (obj.heading_lev_markup == 0) { + if ((_type != "html") + || (obj.heading_lev_markup == 0 || obj.heading_lev_markup > 4)) { _horizontal_rule = ""; } string o; @@ -546,11 +555,12 @@ auto heading_seg(O)( auto return ref const O obj, string _txt, string _suffix = ".html", + string _type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix); _txt = t[0]; string[] _endnotes = t[1]; - string o = heading(obj, _txt); + string o = heading(obj, _txt, _type); auto u = tuple( o, _endnotes, @@ -1228,7 +1238,7 @@ void scroll(D,I)( } } } - doc = xhtml_format.html_scroll_head(doc_matters.dochead_meta) ~ doc_html ~ xhtml_format.tail; + doc = xhtml_format.html_scroll_head(doc_matters) ~ doc_html ~ xhtml_format.tail; scroll_write_output(doc_matters, doc); } #+END_SRC @@ -1316,7 +1326,7 @@ void seg(D,I)( break; case 4: segment_filename = obj.segment_anchor_tag; - doc_html[segment_filename] ~= xhtml_format.html_seg_head(doc_matters.dochead_meta); + doc_html[segment_filename] ~= xhtml_format.html_seg_head(doc_matters); foreach (top_level_heading; top_level_headings) { // writeln(top_level_heading); doc_html[segment_filename] ~= top_level_heading; @@ -1707,10 +1717,24 @@ string epub3_oebps_content(D,I,P)(D doc_abstraction, I doc_matters, P parts) { string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { enum DomTags { none, open, close, close_and_open, open_still, } auto markup = InlineMarkup(); - string toc ="<nav epub:type=\"toc\" id=\"toc\">\n"; + auto rgx = Rgx(); + string toc =format("<html xmlns=\"http://www.w3.org/1999/xhtml\" + xmlns:epub=\"http://www.idpf.org/2007/ops\"> +<head> + <title>%s</title> +</head> +<body> + <section epub:type=\"frontmatter toc\"> + <header> + <h1>Contents</h1> + </header> + <nav epub:type=\"toc\" id=\"toc\">\n", + doc_matters.dochead_meta["title"]["full"], + ); foreach (sect; doc_matters.keys_seq.seg) { foreach (obj; doc_abstraction[sect]) { if (obj.is_a == "heading") { + string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip; foreach_reverse (n; 0 .. 7) { string k = n.to!string; switch (obj.dom_collapsed[n]) { @@ -1720,10 +1744,12 @@ string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { break; case DomTags.close_and_open : toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; - if (obj.dom_markedup[n] < 4) { + if (obj.heading_lev_markup < 4) { toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<span class=\"navhd\">" ~ obj.text ~ "</span>" ~ "\n"; + ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ "\">" + ~ _txt + ~ "</a>" ~ "\n"; } else { string hashtag =(obj.heading_lev_markup == 4) ? "" @@ -1731,15 +1757,18 @@ string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" ~ markup.indent_by_spaces_provided((n + 2), " ") ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ hashtag ~ "\">" - ~ obj.text + ~ _txt ~ "</a>" ~ "\n"; } break; case DomTags.open : toc ~= markup.indent_by_spaces_provided(n, " ") ~ "<ol>" ~ "\n"; - if (obj.dom_markedup[n] < 4) { - toc ~= markup.indent_by_spaces_provided(n, " ") - ~ "<li><span class=\"navhd\">" ~ obj.text ~ "</span>" ~ "\n"; + if (obj.heading_lev_markup < 4) { + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" + ~ markup.indent_by_spaces_provided((n + 2), " ") + ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ "\">" + ~ _txt + ~ "</a>" ~ "\n"; } else { string hashtag =(obj.heading_lev_markup == 4) ? "" @@ -1747,7 +1776,7 @@ string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" ~ markup.indent_by_spaces_provided((n + 2), " ") ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ hashtag ~ "\">" - ~ obj.text + ~ _txt ~ "</a>" ~ "\n"; } break; @@ -1758,7 +1787,10 @@ string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { } } } - toc ~="</nav>\n"; + toc ~="</nav> + </section> + </body> +</html>\n"; return toc; } #+END_SRC @@ -1774,70 +1806,75 @@ string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { int counter = 0; string uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO shared elsewhere auto markup = InlineMarkup(); + auto rgx = Rgx(); enum DomTags { none, open, close, close_and_open, open_still, } string toc = format(q"¶<?xml version='1.0' encoding='utf-8'?> <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1"> - <head> - <!-- four required metadata items (for all NCX documents, - (including the relaxed constraints of OPS 2.0) --> - <title>%s%s</title> - <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> - <meta name="dtb:uid" content="urn:uuid:%s" /> - <!-- <meta name="epub-creator" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> --> - <meta name="dtb:depth" content="%s" /> - <meta name="dtb:totalPageCount" content="0" /> - <meta name="dtb:maxPageNumber" content="0" /> - </head> - <docTitle> - <text>%s</text> - </docTitle> - <docAuthor> - <text>%s</text> - </docAuthor> - <navMap>¶", - doc_matters.dochead_meta["title"]["full"], // title - (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : " by " ~ doc_matters.dochead_meta["creator"]["author"], // author - uuid, // uuid - "3", // content depth - doc_matters.dochead_meta["title"]["full"], // title - (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : doc_matters.dochead_meta["creator"]["author"], // author +<head> + <!-- four required metadata items (for all NCX documents, + (including the relaxed constraints of OPS 2.0) --> + <title>%s%s</title> + <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> + <meta name="dtb:uid" content="urn:uuid:%s" /> + <!-- <meta name="epub-creator" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> --> + <meta name="dtb:depth" content="%s" /> + <meta name="dtb:totalPageCount" content="0" /> + <meta name="dtb:maxPageNumber" content="0" /> +</head> +<docTitle> + <text>%s</text> +</docTitle> +<docAuthor> + <text>%s</text> +</docAuthor> +<navMap>¶", + doc_matters.dochead_meta["title"]["full"], // title + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" + : " by " ~ doc_matters.dochead_meta["creator"]["author"], // author + uuid, // uuid + "3", // content depth + doc_matters.dochead_meta["title"]["full"], // title + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" + : doc_matters.dochead_meta["creator"]["author"], // author ); foreach (sect; doc_matters.keys_seq.seg) { foreach (obj; doc_abstraction[sect]) { if (obj.is_a == "heading") { + string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip; + string hashtag =(obj.heading_lev_markup <= 4) ? "" : ("#" ~ obj.ocn.to!string); foreach_reverse (k; 0 .. 7) { switch (obj.dom_markedup[k]) { case DomTags.close : - // writeln(markup.indent_by_spaces_provided(k), "</", k, ">"); // --debug dom tags -toc ~= "</navPoint>"; + toc ~= "\n </navPoint>"; break; case DomTags.close_and_open : - // writeln(markup.indent_by_spaces_provided(k), "</", k, ">"); // --debug dom tags - // writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text); // --debug dom tags ++counter; -toc ~= "</navPoint>"; -toc ~= format(q"¶<navPoint class="chapter" id="navpoint" playOrder="%s"> -<navLabel> - <text>%s</text> -</navLabel> -<content src="%s" />¶", -counter, -obj.text, -obj.segment_anchor_tag, // lev < 4 [no link]; lev == 4 [filename] markup.xhtml; lev > 4 [filename#ocn] (links done in segment_anchor_tag) -); + toc ~= "\n </navPoint>"; + toc ~= format(q"¶ + <navPoint class="chapter" id="navpoint" playOrder="%s"> + <navLabel> + <text>%s</text> + </navLabel> + <content src="%s.xhtml%s" />¶", + counter, + _txt, + obj.segment_anchor_tag, + hashtag, + ); break; case DomTags.open : - // writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text); // --debug dom tags ++counter; -toc ~= format(q"¶<navPoint class="chapter" id="navpoint" playOrder="%s"> -<navLabel> - <text>%s</text> -</navLabel> -<content src="%s" />¶", -counter, -obj.text, -obj.segment_anchor_tag, // lev < 4 [no link]; lev == 4 [filename] markup.xhtml; lev > 4 [filename#ocn] (fix links in segment_anchor_tag) -); + toc ~= format(q"¶ + <navPoint class="chapter" id="navpoint" playOrder="%s"> + <navLabel> + <text>%s</text> + </navLabel> + <content src="%s.xhtml%s" />¶", + counter, + _txt, + obj.segment_anchor_tag, + hashtag, + ); break; default : break; @@ -1871,6 +1908,7 @@ void outputEPub3(D,I)( string[] top_level_headings = ["","","",""]; string[string] oepbs_content_parts; string suffix = ".xhtml"; + string[] doc_parts_; foreach (part; doc_matters.keys_seq.seg) { foreach (obj; doc_abstraction[part]) { string _txt = xhtml_format.special_characters(obj, obj.text); @@ -1898,23 +1936,23 @@ void outputEPub3(D,I)( top_level_headings[3] = ""; goto default; default: - auto t = xhtml_format.heading_seg(obj, suffix); - top_level_headings[obj.heading_lev_markup] = t[0]; + doc_parts_ ~= obj.segment_anchor_tag; + doc_epub3[obj.segment_anchor_tag] ~= xhtml_format.epub3_seg_head(doc_matters); + auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); + doc_epub3[obj.segment_anchor_tag] ~= t[0]; + doc_epub3_endnotes[obj.segment_anchor_tag] ~= t[1]; break; } break; case 4: segment_filename = obj.segment_anchor_tag; - doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters.dochead_meta); - foreach (top_level_heading; top_level_headings) { - doc_epub3[segment_filename] ~= top_level_heading; - } - auto t = xhtml_format.heading_seg(obj, _txt, suffix); + doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); + auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); doc_epub3[segment_filename] ~= t[0]; doc_epub3_endnotes[segment_filename] ~= t[1]; break; case 5: .. case 7: - auto t = xhtml_format.heading_seg(obj, _txt, suffix); + auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); doc_epub3[segment_filename] ~= t[0]; doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -1937,7 +1975,9 @@ void outputEPub3(D,I)( case "para": switch (obj.is_a) { case "toc": - doc_epub3[segment_filename] ~= xhtml_format.toc_seg(obj, _txt); + auto t = xhtml_format.para_seg(obj, _txt, suffix); + doc_epub3[segment_filename] ~= t[0]; + doc_epub3_endnotes[segment_filename] ~= t[1]; break; default: if ((doc_matters.opt_action_bool["debug"])) { @@ -2067,35 +2107,41 @@ void outputEPub3(D,I)( } } if (obj.is_a == "heading") { - if (obj.heading_lev_markup == 4) { - oepbs_content_parts["manifest_documents"] ~= format(q"¶ <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> + if (obj.heading_lev_markup <= 4) { + oepbs_content_parts["manifest_documents"] ~= + format(q"¶ <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> ¶", obj.segment_anchor_tag, obj.segment_anchor_tag, ); - oepbs_content_parts["spine"] ~= format(q"¶ <itemref idref="%s.xhtml" linear="yes" /> + oepbs_content_parts["spine"] ~= + format(q"¶ <itemref idref="%s.xhtml" linear="yes" /> ¶", obj.segment_anchor_tag, ); - oepbs_content_parts["guide"] ~= format(q"¶ <reference type="%s" href="%s" /> + oepbs_content_parts["guide"] ~= + format(q"¶ <reference type="%s" href="%s" /> ¶", obj.segment_anchor_tag, obj.segment_anchor_tag, ); } else if (obj.heading_lev_markup > 4) { - oepbs_content_parts["manifest_documents"] ~= format(q"¶ <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> + oepbs_content_parts["manifest_documents"] ~= + format(q"¶ <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> ¶", obj.segment_anchor_tag, obj.obj_cite_number, obj.segment_anchor_tag, obj.obj_cite_number, ); - oepbs_content_parts["spine"] ~= format(q"¶ <itemref idref="%s.xhtml#%s" linear="yes" /> + oepbs_content_parts["spine"] ~= + format(q"¶ <itemref idref="%s.xhtml#%s" linear="yes" /> ¶", obj.segment_anchor_tag, obj.obj_cite_number, ); - oepbs_content_parts["guide"] ~= format(q"¶ <reference type="%s#%s" href="%s#%s" /> + oepbs_content_parts["guide"] ~= + format(q"¶ <reference type="%s#%s" href="%s#%s" /> ¶", obj.segment_anchor_tag, obj.obj_cite_number, @@ -2121,6 +2167,7 @@ void outputEPub3(D,I)( oebps_toc_nav_xhtml, oebps_toc_ncx, oebps_content_opf, + doc_parts_, ); } #+END_SRC @@ -2138,8 +2185,8 @@ void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( Otnx oebps_toc_nav_xhtml, Otn oebps_toc_ncx, Oc oebps_content_opf, + string[] doc_parts_, ) { - auto css = SiSUcss(); debug(asserts) { static assert(is(typeof(doc_epub3) == string[][string])); static assert(is(typeof(mimetypes) == string)); @@ -2173,7 +2220,7 @@ void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( } } { /+ OEBPS/[segments].xhtml (the document contents) +/ - foreach (seg_filename; doc_matters.segnames) { + foreach (seg_filename; doc_matters.segnames_lv_0_to_4) { string fn = pth_epub3.fn_oebps_content_xhtml(doc_matters.source_filename, seg_filename); /+ add zip archive file members (with their content) +/ auto zip_arc_member_file = new ArchiveMember(); @@ -2323,6 +2370,7 @@ void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( } } { /+ OEBPS/epub.css +/ + auto css = SiSUcss(); debug(epub_output) { fn_dbg = pth_epub3.dbg_fn_oebps_css(doc_matters.source_filename); File(fn_dbg, "w").writeln(css.epub_css); @@ -2333,7 +2381,7 @@ void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( // add OEBPS/content.opf to zip archive zip_arc_member_file.name = fn; auto zip_data = new OutBuffer(); - zip_data.write(oebps_content_opf.dup); // cast as: char[] + zip_data.write(css.epub_css.dup); // cast as: char[] zip_arc_member_file.expandedData = zip_data.toBytes(); zip.addMember(zip_arc_member_file); /+ create the zip file +/ diff --git a/org/output_xmls_css.org b/org/output_xmls_css.org index 83b6559..5b34915 100644 --- a/org/output_xmls_css.org +++ b/org/output_xmls_css.org @@ -25,7 +25,7 @@ template SiSUcss() { string css_shared=" <<css_shared>> "; - struct _CSS { + struct _css { auto html_css() { string _css = "/* SiSU css html stylesheet */\n" ~ css_shared; return _css; @@ -35,7 +35,7 @@ template SiSUcss() { return _css; } } - return _CSS(); + return _css(); } } #+END_SRC @@ -888,4 +888,8 @@ template SiSUcss() { color: #000000; background-color: #f9f9aa; } + /* in toc no list numbering */ + nav#toc ol { + list-style-type: none; + } #+END_SRC diff --git a/org/sdp.org b/org/sdp.org index f6c26f2..0817dfd 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -451,7 +451,7 @@ template SiSUabstraction() { <<sdp_mixin>> enum headBody { header, body_content, insert_filelist } enum makeMeta { make, meta } - enum docAbst { doc_abstraction, section_keys, segnames, images } + enum docAbst { doc_abstraction, section_keys, segnames, segnames_0_4, images } auto rgx = Rgx(); auto SiSUabstraction(Fn,O,E)(Fn fn_src, O opts, E env){ <<sdp_conf_files>> @@ -540,10 +540,11 @@ auto da = SiSUdocAbstraction!()( opts ); static assert(!isTypeTuple!(da)); -static assert(da.length==4); +static assert(da.length==5); auto doc_abstraction = da[docAbst.doc_abstraction]; // head ~ toc ~ body ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb; auto _document_section_keys_sequenced = da[docAbst.section_keys]; string[] _doc_html_segnames = da[docAbst.segnames]; +string[] _doc_epub_segnames_0_4 = da[docAbst.segnames_0_4]; auto _images = da[docAbst.images]; #+END_SRC @@ -564,6 +565,10 @@ struct DocumentMatters { string[] _k = _doc_html_segnames; return _k; } + string[] segnames_lv_0_to_4() { + string[] _k = _doc_epub_segnames_0_4; + return _k; + } auto dochead_make() { string[string][string] _k = _make_and_meta[makeMeta.make]; return _k; diff --git a/src/sdp/abstraction.d b/src/sdp/abstraction.d index d6124a0..51b76d6 100644 --- a/src/sdp/abstraction.d +++ b/src/sdp/abstraction.d @@ -37,7 +37,7 @@ template SiSUabstraction() { mixin outputHub; enum headBody { header, body_content, insert_filelist } enum makeMeta { make, meta } - enum docAbst { doc_abstraction, section_keys, segnames, images } + enum docAbst { doc_abstraction, section_keys, segnames, segnames_0_4, images } auto rgx = Rgx(); auto SiSUabstraction(Fn,O,E)(Fn fn_src, O opts, E env){ auto sdl_root_configuration = ConfigHub!()("conf.sdl", env); @@ -69,10 +69,11 @@ template SiSUabstraction() { opts ); static assert(!isTypeTuple!(da)); - static assert(da.length==4); + static assert(da.length==5); auto doc_abstraction = da[docAbst.doc_abstraction]; // head ~ toc ~ body ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb; auto _document_section_keys_sequenced = da[docAbst.section_keys]; string[] _doc_html_segnames = da[docAbst.segnames]; + string[] _doc_epub_segnames_0_4 = da[docAbst.segnames_0_4]; auto _images = da[docAbst.images]; struct DocumentMatters { auto keys_seq() { @@ -84,6 +85,10 @@ template SiSUabstraction() { string[] _k = _doc_html_segnames; return _k; } + string[] segnames_lv_0_to_4() { + string[] _k = _doc_epub_segnames_0_4; + return _k; + } auto dochead_make() { string[string][string] _k = _make_and_meta[makeMeta.make]; return _k; diff --git a/src/sdp/ao_abstract_doc_source.d b/src/sdp/ao_abstract_doc_source.d index f7eca53..f231af6 100644 --- a/src/sdp/ao_abstract_doc_source.d +++ b/src/sdp/ao_abstract_doc_source.d @@ -346,6 +346,7 @@ template SiSUdocAbstraction() { auto bookindex_extract_hash = BookIndexNuggetHash(); string[][string] lev4_subtoc; string[] html_segnames=["toc"]; + int cnt1 = 1; int cnt2 = 1; int cnt3 = 1; /+ abstraction init ↑ +/ /+ ↓ loop markup document/text line by line +/ srcDocLoop: @@ -435,6 +436,7 @@ template SiSUdocAbstraction() { comp_obj_heading_.text = "Glossary"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_glossary"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -503,6 +505,7 @@ template SiSUdocAbstraction() { comp_obj_heading_.text = "Blurb"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_blurb"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -744,8 +747,28 @@ template SiSUdocAbstraction() { segment_anchor_tag_that_object_belongs_to = anchor_tag_; segment_anchor_tag_that_object_belongs_to_uri = anchor_tag_ ~ ".fnSuffix#" ~ obj_cite_number.to!string; } else if (an_object["lev_markup_number"].to!int < 4) { - segment_anchor_tag_that_object_belongs_to = ""; - segment_anchor_tag_that_object_belongs_to_uri = ""; + string segn; + switch (an_object["lev_markup_number"].to!int) { + case 0: + segn = "_the_title"; + goto default; + case 1: + segn = "_part_" ~ cnt1.to!string; + ++cnt1; + goto default; + case 2: + segn = "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string; + ++cnt2; + goto default; + case 3: + segn = "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string ~ "_" ~ cnt3.to!string; + ++cnt3; + goto default; + default: + segment_anchor_tag_that_object_belongs_to = segn; + segment_anchor_tag_that_object_belongs_to_uri = segn ~ ".fnSuffix"; + break; + } } an_object["bookindex_nugget"] = ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : ""; @@ -949,6 +972,7 @@ template SiSUdocAbstraction() { comp_obj_heading_.text = "Bibliography"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_bibliography"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -1264,11 +1288,15 @@ template SiSUdocAbstraction() { } return images_; } + string[] segnames_0_4; foreach (ref obj; the_document_head_section) { if (obj.is_a == "heading") { debug(dom) { writeln(obj.text); } + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) || (opt_action_bool["html_seg"]) @@ -1286,9 +1314,12 @@ template SiSUdocAbstraction() { dom_collapsed_buffer = dom_collapsed.dup; foreach (ref obj; the_table_of_contents_section["scroll"]) { if (obj.is_a == "heading") { - if (obj.heading_lev_markup == 4) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + } } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1309,9 +1340,12 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); + } } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1333,13 +1367,16 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.lev4_subtoc = lev4_subtoc[obj.segment_anchor_tag]; - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.lev4_subtoc = lev4_subtoc[obj.segment_anchor_tag]; + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1368,12 +1405,15 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1395,12 +1435,15 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1422,12 +1465,15 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1450,12 +1496,15 @@ template SiSUdocAbstraction() { if (obj.is_a == "heading") { debug(dom) { } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1476,12 +1525,15 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1503,12 +1555,15 @@ template SiSUdocAbstraction() { debug(dom) { writeln(obj.text); } - if (obj.heading_lev_markup == 4) { - obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; - if (html_segnames.length > obj.ptr_html_segnames + 1) { - obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + if (obj.heading_lev_markup <= 4) { + segnames_0_4 ~= obj.segment_anchor_tag; + if (obj.heading_lev_markup == 4) { + obj.segname_prev = html_segnames[obj.ptr_html_segnames - 1]; + if (html_segnames.length > obj.ptr_html_segnames + 1) { + obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; + } + assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } - assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); } if ((opt_action_bool["html"]) || (opt_action_bool["html_scroll"]) @@ -1621,6 +1676,7 @@ template SiSUdocAbstraction() { document_the, docSectKeysSeq!()(document_section_keys_sequenced), segnames, + segnames_0_4, images, ); return t; @@ -2633,7 +2689,6 @@ template SiSUdocAbstraction() { auto substantive_obj_misc_tuple = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, dochead_make_aa); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; - anchor_tags = substantive_obj_misc_tuple[sObj.anchor_tags]; comp_obj_block = comp_obj_block.init; comp_obj_block.use = "body"; comp_obj_block.is_of = "block"; @@ -2675,7 +2730,7 @@ template SiSUdocAbstraction() { comp_obj_poem_ocn.is_a = "poem"; comp_obj_poem_ocn.ocn = obj_cite_number; comp_obj_poem_ocn.obj_cite_number = (obj_cite_number_poem["start"], obj_cite_number_poem["end"]); - comp_obj_poem_ocn.text = ""; // an_object["substantive"]; + comp_obj_poem_ocn.text = ""; the_document_body_section ~= comp_obj_poem_ocn; type["blocks"] = TriState.off; type["poem"] = TriState.off; @@ -4631,6 +4686,7 @@ template SiSUdocAbstraction() { comp_obj_heading_.text = "Book Index"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_book_index"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; @@ -4852,6 +4908,7 @@ template SiSUdocAbstraction() { comp_obj_heading_.text = "Endnotes"; comp_obj_heading_.ocn = 0; comp_obj_heading_.obj_cite_number = ""; + comp_obj_heading_.segment_anchor_tag = "_part_endnotes"; comp_obj_heading_.marked_up_level = "B"; comp_obj_heading_.heading_lev_markup = 1; comp_obj_heading_.heading_lev_collapsed = 1; diff --git a/src/sdp/output_epub3.d b/src/sdp/output_epub3.d index 3df1992..074808c 100644 --- a/src/sdp/output_epub3.d +++ b/src/sdp/output_epub3.d @@ -122,10 +122,24 @@ template outputEPub3() { string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { enum DomTags { none, open, close, close_and_open, open_still, } auto markup = InlineMarkup(); - string toc ="<nav epub:type=\"toc\" id=\"toc\">\n"; + auto rgx = Rgx(); + string toc =format("<html xmlns=\"http://www.w3.org/1999/xhtml\" + xmlns:epub=\"http://www.idpf.org/2007/ops\"> + <head> + <title>%s</title> + </head> + <body> + <section epub:type=\"frontmatter toc\"> + <header> + <h1>Contents</h1> + </header> + <nav epub:type=\"toc\" id=\"toc\">\n", + doc_matters.dochead_meta["title"]["full"], + ); foreach (sect; doc_matters.keys_seq.seg) { foreach (obj; doc_abstraction[sect]) { if (obj.is_a == "heading") { + string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip; foreach_reverse (n; 0 .. 7) { string k = n.to!string; switch (obj.dom_collapsed[n]) { @@ -135,10 +149,12 @@ template outputEPub3() { break; case DomTags.close_and_open : toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "</li>" ~ "\n"; - if (obj.dom_markedup[n] < 4) { + if (obj.heading_lev_markup < 4) { toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" ~ markup.indent_by_spaces_provided((n + 2), " ") - ~ "<span class=\"navhd\">" ~ obj.text ~ "</span>" ~ "\n"; + ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ "\">" + ~ _txt + ~ "</a>" ~ "\n"; } else { string hashtag =(obj.heading_lev_markup == 4) ? "" @@ -146,15 +162,18 @@ template outputEPub3() { toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" ~ markup.indent_by_spaces_provided((n + 2), " ") ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ hashtag ~ "\">" - ~ obj.text + ~ _txt ~ "</a>" ~ "\n"; } break; case DomTags.open : toc ~= markup.indent_by_spaces_provided(n, " ") ~ "<ol>" ~ "\n"; - if (obj.dom_markedup[n] < 4) { - toc ~= markup.indent_by_spaces_provided(n, " ") - ~ "<li><span class=\"navhd\">" ~ obj.text ~ "</span>" ~ "\n"; + if (obj.heading_lev_markup < 4) { + toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" + ~ markup.indent_by_spaces_provided((n + 2), " ") + ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ "\">" + ~ _txt + ~ "</a>" ~ "\n"; } else { string hashtag =(obj.heading_lev_markup == 4) ? "" @@ -162,7 +181,7 @@ template outputEPub3() { toc ~= markup.indent_by_spaces_provided((n + 1), " ") ~ "<li>" ~ "\n" ~ markup.indent_by_spaces_provided((n + 2), " ") ~ "<a href=\"" ~ obj.segment_anchor_tag ~ ".xhtml" ~ hashtag ~ "\">" - ~ obj.text + ~ _txt ~ "</a>" ~ "\n"; } break; @@ -173,77 +192,85 @@ template outputEPub3() { } } } - toc ~="</nav>\n"; + toc ~="</nav> + </section> + </body> + </html>\n"; return toc; } string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { int counter = 0; string uuid = "18275d951861c77f78acd05672c9906924c59f18a2e0ba06dad95959693e9bd8"; // TODO shared elsewhere auto markup = InlineMarkup(); + auto rgx = Rgx(); enum DomTags { none, open, close, close_and_open, open_still, } string toc = format(q"¶<?xml version='1.0' encoding='utf-8'?> <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1"> - <head> - <!-- four required metadata items (for all NCX documents, - (including the relaxed constraints of OPS 2.0) --> - <title>%s%s</title> - <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> - <meta name="dtb:uid" content="urn:uuid:%s" /> - <!-- <meta name="epub-creator" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> --> - <meta name="dtb:depth" content="%s" /> - <meta name="dtb:totalPageCount" content="0" /> - <meta name="dtb:maxPageNumber" content="0" /> - </head> - <docTitle> - <text>%s</text> - </docTitle> - <docAuthor> - <text>%s</text> - </docAuthor> - <navMap>¶", - doc_matters.dochead_meta["title"]["full"], // title - (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : " by " ~ doc_matters.dochead_meta["creator"]["author"], // author - uuid, // uuid - "3", // content depth - doc_matters.dochead_meta["title"]["full"], // title - (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : doc_matters.dochead_meta["creator"]["author"], // author + <head> + <!-- four required metadata items (for all NCX documents, + (including the relaxed constraints of OPS 2.0) --> + <title>%s%s</title> + <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> + <meta name="dtb:uid" content="urn:uuid:%s" /> + <!-- <meta name="epub-creator" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> --> + <meta name="dtb:depth" content="%s" /> + <meta name="dtb:totalPageCount" content="0" /> + <meta name="dtb:maxPageNumber" content="0" /> + </head> + <docTitle> + <text>%s</text> + </docTitle> + <docAuthor> + <text>%s</text> + </docAuthor> + <navMap>¶", + doc_matters.dochead_meta["title"]["full"], // title + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" + : " by " ~ doc_matters.dochead_meta["creator"]["author"], // author + uuid, // uuid + "3", // content depth + doc_matters.dochead_meta["title"]["full"], // title + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" + : doc_matters.dochead_meta["creator"]["author"], // author ); foreach (sect; doc_matters.keys_seq.seg) { foreach (obj; doc_abstraction[sect]) { if (obj.is_a == "heading") { + string _txt = obj.text.replaceAll(rgx.inline_notes_al_gen, "").strip; + string hashtag =(obj.heading_lev_markup <= 4) ? "" : ("#" ~ obj.ocn.to!string); foreach_reverse (k; 0 .. 7) { switch (obj.dom_markedup[k]) { case DomTags.close : - // writeln(markup.indent_by_spaces_provided(k), "</", k, ">"); // --debug dom tags - toc ~= "</navPoint>"; + toc ~= "\n </navPoint>"; break; case DomTags.close_and_open : - // writeln(markup.indent_by_spaces_provided(k), "</", k, ">"); // --debug dom tags - // writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text); // --debug dom tags ++counter; - toc ~= "</navPoint>"; - toc ~= format(q"¶<navPoint class="chapter" id="navpoint" playOrder="%s"> - <navLabel> - <text>%s</text> - </navLabel> - <content src="%s" />¶", - counter, - obj.text, - obj.segment_anchor_tag, // lev < 4 [no link]; lev == 4 [filename] markup.xhtml; lev > 4 [filename#ocn] (links done in segment_anchor_tag) - ); + toc ~= "\n </navPoint>"; + toc ~= format(q"¶ + <navPoint class="chapter" id="navpoint" playOrder="%s"> + <navLabel> + <text>%s</text> + </navLabel> + <content src="%s.xhtml%s" />¶", + counter, + _txt, + obj.segment_anchor_tag, + hashtag, + ); break; case DomTags.open : - // writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text); // --debug dom tags ++counter; - toc ~= format(q"¶<navPoint class="chapter" id="navpoint" playOrder="%s"> - <navLabel> - <text>%s</text> - </navLabel> - <content src="%s" />¶", - counter, - obj.text, - obj.segment_anchor_tag, // lev < 4 [no link]; lev == 4 [filename] markup.xhtml; lev > 4 [filename#ocn] (fix links in segment_anchor_tag) - ); + toc ~= format(q"¶ + <navPoint class="chapter" id="navpoint" playOrder="%s"> + <navLabel> + <text>%s</text> + </navLabel> + <content src="%s.xhtml%s" />¶", + counter, + _txt, + obj.segment_anchor_tag, + hashtag, + ); break; default : break; @@ -271,6 +298,7 @@ template outputEPub3() { string[] top_level_headings = ["","","",""]; string[string] oepbs_content_parts; string suffix = ".xhtml"; + string[] doc_parts_; foreach (part; doc_matters.keys_seq.seg) { foreach (obj; doc_abstraction[part]) { string _txt = xhtml_format.special_characters(obj, obj.text); @@ -298,23 +326,23 @@ template outputEPub3() { top_level_headings[3] = ""; goto default; default: - auto t = xhtml_format.heading_seg(obj, suffix); - top_level_headings[obj.heading_lev_markup] = t[0]; + doc_parts_ ~= obj.segment_anchor_tag; + doc_epub3[obj.segment_anchor_tag] ~= xhtml_format.epub3_seg_head(doc_matters); + auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); + doc_epub3[obj.segment_anchor_tag] ~= t[0]; + doc_epub3_endnotes[obj.segment_anchor_tag] ~= t[1]; break; } break; case 4: segment_filename = obj.segment_anchor_tag; - doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters.dochead_meta); - foreach (top_level_heading; top_level_headings) { - doc_epub3[segment_filename] ~= top_level_heading; - } - auto t = xhtml_format.heading_seg(obj, _txt, suffix); + doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc_matters); + auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); doc_epub3[segment_filename] ~= t[0]; doc_epub3_endnotes[segment_filename] ~= t[1]; break; case 5: .. case 7: - auto t = xhtml_format.heading_seg(obj, _txt, suffix); + auto t = xhtml_format.heading_seg(obj, _txt, suffix, "epub"); doc_epub3[segment_filename] ~= t[0]; doc_epub3_endnotes[segment_filename] ~= t[1]; break; @@ -337,7 +365,9 @@ template outputEPub3() { case "para": switch (obj.is_a) { case "toc": - doc_epub3[segment_filename] ~= xhtml_format.toc_seg(obj, _txt); + auto t = xhtml_format.para_seg(obj, _txt, suffix); + doc_epub3[segment_filename] ~= t[0]; + doc_epub3_endnotes[segment_filename] ~= t[1]; break; default: if ((doc_matters.opt_action_bool["debug"])) { @@ -467,35 +497,41 @@ template outputEPub3() { } } if (obj.is_a == "heading") { - if (obj.heading_lev_markup == 4) { - oepbs_content_parts["manifest_documents"] ~= format(q"¶ <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> + if (obj.heading_lev_markup <= 4) { + oepbs_content_parts["manifest_documents"] ~= + format(q"¶ <item id="%s.xhtml" href="%s.xhtml" media-type="application/xhtml+xml" /> ¶", obj.segment_anchor_tag, obj.segment_anchor_tag, ); - oepbs_content_parts["spine"] ~= format(q"¶ <itemref idref="%s.xhtml" linear="yes" /> + oepbs_content_parts["spine"] ~= + format(q"¶ <itemref idref="%s.xhtml" linear="yes" /> ¶", obj.segment_anchor_tag, ); - oepbs_content_parts["guide"] ~= format(q"¶ <reference type="%s" href="%s" /> + oepbs_content_parts["guide"] ~= + format(q"¶ <reference type="%s" href="%s" /> ¶", obj.segment_anchor_tag, obj.segment_anchor_tag, ); } else if (obj.heading_lev_markup > 4) { - oepbs_content_parts["manifest_documents"] ~= format(q"¶ <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> + oepbs_content_parts["manifest_documents"] ~= + format(q"¶ <item id="%s.xhtml#%s" href="%s.xhtml#%s" media-type="application/xhtml+xml" /> ¶", obj.segment_anchor_tag, obj.obj_cite_number, obj.segment_anchor_tag, obj.obj_cite_number, ); - oepbs_content_parts["spine"] ~= format(q"¶ <itemref idref="%s.xhtml#%s" linear="yes" /> + oepbs_content_parts["spine"] ~= + format(q"¶ <itemref idref="%s.xhtml#%s" linear="yes" /> ¶", obj.segment_anchor_tag, obj.obj_cite_number, ); - oepbs_content_parts["guide"] ~= format(q"¶ <reference type="%s#%s" href="%s#%s" /> + oepbs_content_parts["guide"] ~= + format(q"¶ <reference type="%s#%s" href="%s#%s" /> ¶", obj.segment_anchor_tag, obj.obj_cite_number, @@ -521,6 +557,7 @@ template outputEPub3() { oebps_toc_nav_xhtml, oebps_toc_ncx, oebps_content_opf, + doc_parts_, ); } void epub3_write_output_files(M,D,E,Mt,Mic,Otnx,Otn,Oc)( @@ -532,8 +569,8 @@ template outputEPub3() { Otnx oebps_toc_nav_xhtml, Otn oebps_toc_ncx, Oc oebps_content_opf, + string[] doc_parts_, ) { - auto css = SiSUcss(); debug(asserts) { static assert(is(typeof(doc_epub3) == string[][string])); static assert(is(typeof(mimetypes) == string)); @@ -567,7 +604,7 @@ template outputEPub3() { } } { /+ OEBPS/[segments].xhtml (the document contents) +/ - foreach (seg_filename; doc_matters.segnames) { + foreach (seg_filename; doc_matters.segnames_lv_0_to_4) { string fn = pth_epub3.fn_oebps_content_xhtml(doc_matters.source_filename, seg_filename); /+ add zip archive file members (with their content) +/ auto zip_arc_member_file = new ArchiveMember(); @@ -717,6 +754,7 @@ template outputEPub3() { } } { /+ OEBPS/epub.css +/ + auto css = SiSUcss(); debug(epub_output) { fn_dbg = pth_epub3.dbg_fn_oebps_css(doc_matters.source_filename); File(fn_dbg, "w").writeln(css.epub_css); @@ -727,7 +765,7 @@ template outputEPub3() { // add OEBPS/content.opf to zip archive zip_arc_member_file.name = fn; auto zip_data = new OutBuffer(); - zip_data.write(oebps_content_opf.dup); // cast as: char[] + zip_data.write(css.epub_css.dup); // cast as: char[] zip_arc_member_file.expandedData = zip_data.toBytes(); zip.addMember(zip_arc_member_file); /+ create the zip file +/ diff --git a/src/sdp/output_html.d b/src/sdp/output_html.d index 509ae43..048d6e9 100644 --- a/src/sdp/output_html.d +++ b/src/sdp/output_html.d @@ -169,7 +169,7 @@ template outputHTML() { } } } - doc = xhtml_format.html_scroll_head(doc_matters.dochead_meta) ~ doc_html ~ xhtml_format.tail; + doc = xhtml_format.html_scroll_head(doc_matters) ~ doc_html ~ xhtml_format.tail; scroll_write_output(doc_matters, doc); } void scroll_write_output(M,C)( @@ -244,7 +244,7 @@ template outputHTML() { break; case 4: segment_filename = obj.segment_anchor_tag; - doc_html[segment_filename] ~= xhtml_format.html_seg_head(doc_matters.dochead_meta); + doc_html[segment_filename] ~= xhtml_format.html_seg_head(doc_matters); foreach (top_level_heading; top_level_headings) { // writeln(top_level_heading); doc_html[segment_filename] ~= top_level_heading; diff --git a/src/sdp/output_xmls.d b/src/sdp/output_xmls.d index 347409e..78ee414 100644 --- a/src/sdp/output_xmls.d +++ b/src/sdp/output_xmls.d @@ -72,12 +72,9 @@ template outputXHTMLs() { } return tags; } - auto html_scroll_head(Me)( - Me dochead_meta, + auto html_scroll_head(Dm)( + Dm doc_matters, ) { - debug(asserts) { - static assert(is(typeof(dochead_meta) == string[string][string])); - } string o; o = format(q"¶<!DOCTYPE html> <html> @@ -105,19 +102,17 @@ template outputXHTMLs() { <link href="../../css/html.css" rel="stylesheet" /> <link href="../../../css/html.css" rel="stylesheet" /> </head> - <body lang="en"> + <body lang="%s"> <a name="top" id="top"></a>¶", - dochead_meta["title"]["full"], - (dochead_meta["creator"]["author"].empty) ? "" : ", " ~ dochead_meta["creator"]["author"], - ); + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.language, + ); return o; } - auto html_seg_head(Me)( - Me dochead_meta, + auto html_seg_head(Dm)( + Dm doc_matters, ) { - debug(asserts) { - static assert(is(typeof(dochead_meta) == string[string][string])); - } string o; o = format(q"¶<!DOCTYPE html> <html> @@ -145,57 +140,69 @@ template outputXHTMLs() { <link href="../../css/html.css" rel="stylesheet" /> <link href="../../../css/html.css" rel="stylesheet" /> </head> - <body lang="en"> + <body lang="%s"> <a name="top" id="top"></a>¶", - dochead_meta["title"]["full"], - (dochead_meta["creator"]["author"].empty) ? "" : ", " ~ dochead_meta["creator"]["author"], - ); + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" + : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.language, + ); return o; } - auto epub3_seg_head(Me)( - Me dochead_meta, + auto epub3_seg_head(Dm)( + Dm doc_matters, ) { - debug(asserts) { - static assert(is(typeof(dochead_meta) == string[string][string])); - } - string html_simple = format(q"¶<!DOCTYPE html> + string html_base = format(q"¶<!DOCTYPE html> <html>¶", ); + string html_simple = format(q"¶<!DOCTYPE html> + <html + xmlns="http://www.w3.org/1999/xhtml" + xmlns:epub="http://www.idpf.org/2007/ops" + lang="%s" xml:lang="%s">¶", + doc_matters.language, + doc_matters.language, + ); string html_strict = format(q"¶<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">¶", - ); + <html xmlns="http://www.w3.org/1999/xhtml" + xmlns:epub="http://www.idpf.org/2007/ops" + lang="%s" xml:lang="%s">¶", + doc_matters.language, + doc_matters.language, + ); string o; o = format(q"¶%s <head> - <meta charset="utf-8"> - <title> - %s%s - </title> - <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> - <meta name="dc.title" content="Title" /> - <meta name="dc.author" content="Author" /> - <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> - <meta name="dc.date" content="year" /> - <meta name="dc.date.created" content="year" /> - <meta name="dc.date.issued" content="year" /> - <meta name="dc.date.available" content="year" /> - <meta name="dc.date.valid" content="year" /> - <meta name="dc.date.modified" content="year" /> - <meta name="dc.language" content="US" /> - <meta name="dc.rights" content="Copyright: Copyright (C) year holder" /> - <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> - </meta> + <title> + %s%s + </title> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> + <meta name="dc.title" content="%s" /> + <meta name="dc.author" content="%s" /> + <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> + <meta name="dc.date" content="year" /> + <meta name="dc.date.created" content="year" /> + <meta name="dc.date.issued" content="year" /> + <meta name="dc.date.available" content="year" /> + <meta name="dc.date.valid" content="year" /> + <meta name="dc.date.modified" content="year" /> + <meta name="dc.language" content="US" /> + <meta name="dc.rights" content="Copyright: Copyright (C) year holder" /> + <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> <link rel="generator" href="http://www.sisudoc.org/" /> <link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> </head> - <body lang="en"> + <body lang="%s"> <a name="top" id="top"></a>¶", - html_strict, - dochead_meta["title"]["full"], - (dochead_meta["creator"]["author"].empty) ? "" : ", " ~ dochead_meta["creator"]["author"], - ); + html_simple, + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.dochead_meta["title"]["full"], + (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], + doc_matters.language, + ); return o; } auto tail() { @@ -357,10 +364,12 @@ template outputXHTMLs() { auto heading(O)( auto return ref const O obj, string _txt, + string _type="html", ) { auto tags = _xhtml_anchor_tags(obj.anchor_tags); string _horizontal_rule = "<hr />"; - if (obj.heading_lev_markup == 0) { + if ((_type != "html") + || (obj.heading_lev_markup == 0 || obj.heading_lev_markup > 4)) { _horizontal_rule = ""; } string o; @@ -414,11 +423,12 @@ template outputXHTMLs() { auto return ref const O obj, string _txt, string _suffix = ".html", + string _type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix); _txt = t[0]; string[] _endnotes = t[1]; - string o = heading(obj, _txt); + string o = heading(obj, _txt, _type); auto u = tuple( o, _endnotes, diff --git a/src/sdp/output_xmls_css.d b/src/sdp/output_xmls_css.d index 8d7c0ff..c746b16 100644 --- a/src/sdp/output_xmls_css.d +++ b/src/sdp/output_xmls_css.d @@ -848,8 +848,12 @@ template SiSUcss() { color: #000000; background-color: #f9f9aa; } + /* in toc no list numbering */ + nav#toc ol { + list-style-type: none; + } "; - struct _CSS { + struct _css { auto html_css() { string _css = "/* SiSU css html stylesheet */\n" ~ css_shared; return _css; @@ -859,6 +863,6 @@ template SiSUcss() { return _css; } } - return _CSS(); + return _css(); } } |