aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRalph Amissah <ralph.amissah@gmail.com>2026-09-12 22:59:01 -0400
committerRalph Amissah <ralph.amissah@gmail.com>2026-09-14 12:18:51 -0400
commit282b2a4166aeba76e3b99abaa46bf6858f7cd172 (patch)
tree6fd6d1d48b349d41809ddb624a3283fb04c95d8f
parentepub, html, db: use of elements & attributes, fix (diff)
epub, html: document heads and ids, fixes
One document head per file, and ids must be unique. No remaining fatal errors in the epub in the marup sample set. (assisted by Claude-Code)
-rw-r--r--org/out_xmls.org19
-rw-r--r--src/sisudoc/outputs/io_out/epub3.d11
-rw-r--r--src/sisudoc/outputs/io_out/xmls.d8
3 files changed, 26 insertions, 12 deletions
diff --git a/org/out_xmls.org b/org/out_xmls.org
index dac590e..5b989df 100644
--- a/org/out_xmls.org
+++ b/org/out_xmls.org
@@ -639,7 +639,7 @@ string tail(M)(M doc_matters) {
string o;
o = format(q"┃<hr />
<div class="rights">
- <p class="small" id="copyright"><a name="copyright"></a>
+ <p class="small" id="copyright">
<b>Copyright:</b> %s
</p>
</div>
@@ -651,10 +651,10 @@ string tail(M)(M doc_matters) {
</div>
<hr />
<div class="generator">
- <p class="small_center" id="sisu_spine"><a name="sisu_spine"></a>
+ <p class="small_center" id="sisu_spine">
<a href="https://sisudoc.org" class="lnkicon">≅ SiSU Spine ፨</a> (object numbering &amp; object search)
</p>
- <p class="small_center" id="sisu_spine"><a name="sisu_spine"></a>
+ <p class="small_center" id="sisu_spine_dates">
(web 1993, object numbering 1997, object search 2002 ...) <<year>>
</p>
</div>
@@ -1107,7 +1107,7 @@ string heading(O,M)(
if (obj.metainfo.is_of_section == "toc") {
o ~= format(q"┃
<div class="substance">
- <p class="small" id="copyright"><a name="copyright"></a>
+ <p class="small" id="copyright_toc">
Copyright: %s
</p>
<!-- <p class="small" id="rights"><a name="rights"></a>
@@ -2815,6 +2815,13 @@ string epub3_oebps_toc_nav_xhtml(D)(D doc) {
static auto rgx = RgxO();
static auto rgx_xhtml = RgxXHTML();
string segment_filename;
+ /+ ↓ a segment file gets one document head, not one per heading. +/
+ bool[string] _seg_head_written;
+ string _segHead(M)(M _m, string _seg) {
+ if (_seg in _seg_head_written) { return ""; }
+ _seg_head_written[_seg] = true;
+ return xhtml_format.epub3_seg_head(_m);
+ }
string[] top_level_headings = ["","","",""];
string[string] oepbs_content_parts;
bool[string] _segment_files_seen; /+ a segment file is listed once +/
@@ -2872,7 +2879,7 @@ if (obj.metainfo.is_a == "heading") {
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);
+ epubWrite.doc_epub3[obj.tags.segment_anchor_tag_epub] ~= _segHead(doc.matters, obj.tags.segment_anchor_tag_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];
@@ -2881,7 +2888,7 @@ if (obj.metainfo.is_a == "heading") {
break;
case 4:
segment_filename = obj.tags.segment_anchor_tag_epub;
- epubWrite.doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc.matters);
+ epubWrite.doc_epub3[segment_filename] ~= _segHead(doc.matters, segment_filename);
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];
diff --git a/src/sisudoc/outputs/io_out/epub3.d b/src/sisudoc/outputs/io_out/epub3.d
index d149dac..1c08bab 100644
--- a/src/sisudoc/outputs/io_out/epub3.d
+++ b/src/sisudoc/outputs/io_out/epub3.d
@@ -306,6 +306,13 @@ template outputEPub3() {
static auto rgx = RgxO();
static auto rgx_xhtml = RgxXHTML();
string segment_filename;
+ /+ ↓ a segment file gets one document head, not one per heading. +/
+ bool[string] _seg_head_written;
+ string _segHead(M)(M _m, string _seg) {
+ if (_seg in _seg_head_written) { return ""; }
+ _seg_head_written[_seg] = true;
+ return xhtml_format.epub3_seg_head(_m);
+ }
string[] top_level_headings = ["","","",""];
string[string] oepbs_content_parts;
bool[string] _segment_files_seen; /+ a segment file is listed once +/
@@ -351,7 +358,7 @@ template outputEPub3() {
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);
+ epubWrite.doc_epub3[obj.tags.segment_anchor_tag_epub] ~= _segHead(doc.matters, obj.tags.segment_anchor_tag_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];
@@ -360,7 +367,7 @@ template outputEPub3() {
break;
case 4:
segment_filename = obj.tags.segment_anchor_tag_epub;
- epubWrite.doc_epub3[segment_filename] ~= xhtml_format.epub3_seg_head(doc.matters);
+ epubWrite.doc_epub3[segment_filename] ~= _segHead(doc.matters, segment_filename);
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];
diff --git a/src/sisudoc/outputs/io_out/xmls.d b/src/sisudoc/outputs/io_out/xmls.d
index 3f7f4c9..f1bcd95 100644
--- a/src/sisudoc/outputs/io_out/xmls.d
+++ b/src/sisudoc/outputs/io_out/xmls.d
@@ -495,7 +495,7 @@ string tail(M)(M doc_matters) {
string o;
o = format(q"┃<hr />
<div class="rights">
- <p class="small" id="copyright"><a name="copyright"></a>
+ <p class="small" id="copyright">
<b>Copyright:</b> %s
</p>
</div>
@@ -507,10 +507,10 @@ string tail(M)(M doc_matters) {
</div>
<hr />
<div class="generator">
- <p class="small_center" id="sisu_spine"><a name="sisu_spine"></a>
+ <p class="small_center" id="sisu_spine">
<a href="https://sisudoc.org" class="lnkicon">≅ SiSU Spine ፨</a> (object numbering &amp; object search)
</p>
- <p class="small_center" id="sisu_spine"><a name="sisu_spine"></a>
+ <p class="small_center" id="sisu_spine_dates">
(web 1993, object numbering 1997, object search 2002 ...) 2026
</p>
</div>
@@ -903,7 +903,7 @@ string tail(M)(M doc_matters) {
if (obj.metainfo.is_of_section == "toc") {
o ~= format(q"┃
<div class="substance">
- <p class="small" id="copyright"><a name="copyright"></a>
+ <p class="small" id="copyright_toc">
Copyright: %s
</p>
<!-- <p class="small" id="rights"><a name="rights"></a>