From 282b2a4166aeba76e3b99abaa46bf6858f7cd172 Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Sat, 12 Sep 2026 22:59:01 -0400 Subject: 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) --- src/sisudoc/outputs/io_out/epub3.d | 11 +++++++++-- src/sisudoc/outputs/io_out/xmls.d | 8 ++++---- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src') 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"┃
-
@@ -507,10 +507,10 @@ string tail(M)(M doc_matters) {
-

+

≅ SiSU Spine ፨ (object numbering & object search)

-

+

(web 1993, object numbering 1997, object search 2002 ...) 2026

@@ -903,7 +903,7 @@ string tail(M)(M doc_matters) { if (obj.metainfo.is_of_section == "toc") { o ~= format(q"┃
-