<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sisudoc-spine/org/out_xmls.org, branch sisudoc-spine_v0.25.1</title>
<subtitle>SiSU Spine: document publishing and search (in D) 2015</subtitle>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/'/>
<entry>
<title>odt: office:meta from the document, not the run</title>
<updated>2026-09-22T17:09:35+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-21T04:25:19+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=515c44399843c62336a0102e933f9fbd7289743d'/>
<id>515c44399843c62336a0102e933f9fbd7289743d</id>
<content type='text'>
Three faults in four lines of the odt metadata.

meta:creation-date and dc:date were taken from generated_time, the run's
own clock, so two runs over unchanged markup produced different odt
bytes. They now carry the document's own instant, so an odt is a
function of its source. That was the last clock stamp in any writer:
every output format is now reproducible.

generated_time is a human-readable run stamp, of the form
"2026-9-17 [38/3] 18:39:35", with unpadded numbers and an iso week in
brackets. It is not a valid xsd:dateTime, which is what ODF asks for in
both of those fields, so what was written there was malformed as well as
unstable.

dc:language now carries the document's own language tag.

The instant is doc_matters.modified_utc, moved there from epub3.d
in this commit: epub3 needs the same value for its dcterms:modified,
and one definition cannot drift from the other. generated_time now
has no caller and is left in place.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Three faults in four lines of the odt metadata.

meta:creation-date and dc:date were taken from generated_time, the run's
own clock, so two runs over unchanged markup produced different odt
bytes. They now carry the document's own instant, so an odt is a
function of its source. That was the last clock stamp in any writer:
every output format is now reproducible.

generated_time is a human-readable run stamp, of the form
"2026-9-17 [38/3] 18:39:35", with unpadded numbers and an iso week in
brackets. It is not a valid xsd:dateTime, which is what ODF asks for in
both of those fields, so what was written there was malformed as well as
unstable.

dc:language now carries the document's own language tag.

The instant is doc_matters.modified_utc, moved there from epub3.d
in this commit: epub3 needs the same value for its dcterms:modified,
and one definition cannot drift from the other. generated_time now
has no caller and is left in place.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub: dcterms:modified timestamp, reproducibility</title>
<updated>2026-09-22T16:50:33+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-21T04:02:21+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=67d27829788d49eab208d871cf4dfc95c5f3ba6e'/>
<id>67d27829788d49eab208d871cf4dfc95c5f3ba6e</id>
<content type='text'>
timestamp dcterms:modified from the document, not the clock

EPUB3 requires exactly one dcterms:modified on the package

It is now read in order: SOURCE_DATE_EPOCH where the environment sets
it, which is the reproducible-builds convention and lets a build pin
every artefact of one run; then the document's own date.modified; then
date.published. The clock remains the last resort, for a document that
says nothing about when it is from.

A document date is loose markup. "1991", "2006-03" and "2021-12-00" all
occur in the sample set, and a month or day of 00 is not a date. A
missing or zero part becomes 01, and a day out of range for its month
falls back to the first, so what is written is always a valid
CCYY-MM-DDThh:mm:ssZ.

Over the sample set two consecutive runs now produce all 36 epubs byte
identical, and epubcheck reports no change: 0 fatal, 0 errors.

(previously taken from the clock at build time. Two runs over unchanged
markup therefore produced different epub bytes, so no comparison of epub
output could tell a real change from the seconds between two builds. It
also meant an epub was a function of when it was built rather than of
what it was built from.)

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
timestamp dcterms:modified from the document, not the clock

EPUB3 requires exactly one dcterms:modified on the package

It is now read in order: SOURCE_DATE_EPOCH where the environment sets
it, which is the reproducible-builds convention and lets a build pin
every artefact of one run; then the document's own date.modified; then
date.published. The clock remains the last resort, for a document that
says nothing about when it is from.

A document date is loose markup. "1991", "2006-03" and "2021-12-00" all
occur in the sample set, and a month or day of 00 is not a date. A
missing or zero part becomes 01, and a day out of range for its month
falls back to the first, so what is written is always a valid
CCYY-MM-DDThh:mm:ssZ.

Over the sample set two consecutive runs now produce all 36 epubs byte
identical, and epubcheck reports no change: 0 fatal, 0 errors.

(previously taken from the clock at build time. Two runs over unchanged
markup therefore produced different epub bytes, so no comparison of epub
output could tell a real change from the seconds between two builds. It
also meant an epub was a function of when it was built rather than of
what it was built from.)

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>xml: markup language attributes take a bcp 47 tag</title>
<updated>2026-09-22T16:50:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-21T03:43:35+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=cd93d2d8b5062493650673ecdd13139d6f0e5171'/>
<id>cd93d2d8b5062493650673ecdd13139d6f0e5171</id>
<content type='text'>
Spine names a language as the directory under media/text/ is
named, which for a region is the posix form with an underscore,
pt_BR. A lang, xml:lang or dc:language value is a BCP 47 (RFC
3066) tag and wants a hyphen, pt-BR. Spine put its own code
there unchanged, so a document in a region language produced an
invalid attribute in every one of its xhtml files: 138 epubcheck
errors for a document of ten segments and a navigation file.

src.language_tag is the same language as a tag. The attributes
and the dc metadata now read it. Output paths keep src.language,
since a path is named after the directory, not after the tag.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Spine names a language as the directory under media/text/ is
named, which for a region is the posix form with an underscore,
pt_BR. A lang, xml:lang or dc:language value is a BCP 47 (RFC
3066) tag and wants a hyphen, pt-BR. Spine put its own code
there unchanged, so a document in a region language produced an
invalid attribute in every one of its xhtml files: 138 epubcheck
errors for a document of ten segments and a navigation file.

src.language_tag is the same language as a tag. The attributes
and the dc metadata now read it. Output paths keep src.language,
since a path is named after the directory, not after the tag.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>images alt text, and epub says what it is</title>
<updated>2026-09-14T16:18:51+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-14T01:56:43+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=eb5a9f3dab1d1848a1aa90c534a125c222327635'/>
<id>eb5a9f3dab1d1848a1aa90c534a125c222327635</id>
<content type='text'>
Four things, not visible in an error count:

- Images had no alt text, even where markup carried the text, and the
  field alt text is present, incorrectly used in code; fixed as the alt.

  { sm_tux.png 64x80 "Gnu/Linux - a better way" }image

  an image with nothing to say for itself gets alt=""

- Images with no dimensions were incorrectly written width="0"
  height="0", fixed

- Accessibility metadata, which EPUB Accessibility 1.1 requires:
  schema:accessMode, accessibilityFeature and accessibilityHazard, plus
  accessModeSufficient and accessibilitySummary, which epubcheck does
  not test for; used by
  - readers looking for a book it can use,
  - anyone distributing into the EU.
  Every value is derived from the document, not asserted: a document
  with no images says so, one whose images all carry alt text claims
  alternativeText and textual sufficiency, one where an image says
  nothing claims neither.
  Nothing claims WCAG conformance, which would be a claim about an
  evaluation that has not happened.

- DPUB-ARIA roles beside the structure spine already knew about.
  doc-toc, doc-endnotes, doc-bibliography, doc-glossary and doc-index on
  the sections, doc-noteref on a note reference and doc-footnote on the
  note it points at. "doc_endnotes" as a class name means something to a
  stylesheet and nothing to a reading system. Not doc-biblioentry: DPUB-
  ARIA 1.1 deprecated it. These are plain ARIA, so the html gets them
   too.

Also dealt with here:
- Spine makes certain sections such as endnotes, bookindex, ... and a
  heading that has a name for itself cannot share the same name, if it
  does the name is now disambiguated, disambiguated. (disambiguation
  similar to that used for a repeated anchor tag)

- Endnote anchors fixed to use "id" (being one unique tag in the
  document that is target of every reference to it)instead of obsolete
  form (they were &lt;a name="note_1"&gt;. "name" on an &lt;a&gt;).
  Book index markers keep "name": the same marker sits on every object
  an entry names, 296 times in one document, and those are markers of
  where a term occurs rather than distinct targets.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Four things, not visible in an error count:

- Images had no alt text, even where markup carried the text, and the
  field alt text is present, incorrectly used in code; fixed as the alt.

  { sm_tux.png 64x80 "Gnu/Linux - a better way" }image

  an image with nothing to say for itself gets alt=""

- Images with no dimensions were incorrectly written width="0"
  height="0", fixed

- Accessibility metadata, which EPUB Accessibility 1.1 requires:
  schema:accessMode, accessibilityFeature and accessibilityHazard, plus
  accessModeSufficient and accessibilitySummary, which epubcheck does
  not test for; used by
  - readers looking for a book it can use,
  - anyone distributing into the EU.
  Every value is derived from the document, not asserted: a document
  with no images says so, one whose images all carry alt text claims
  alternativeText and textual sufficiency, one where an image says
  nothing claims neither.
  Nothing claims WCAG conformance, which would be a claim about an
  evaluation that has not happened.

- DPUB-ARIA roles beside the structure spine already knew about.
  doc-toc, doc-endnotes, doc-bibliography, doc-glossary and doc-index on
  the sections, doc-noteref on a note reference and doc-footnote on the
  note it points at. "doc_endnotes" as a class name means something to a
  stylesheet and nothing to a reading system. Not doc-biblioentry: DPUB-
  ARIA 1.1 deprecated it. These are plain ARIA, so the html gets them
   too.

Also dealt with here:
- Spine makes certain sections such as endnotes, bookindex, ... and a
  heading that has a name for itself cannot share the same name, if it
  does the name is now disambiguated, disambiguated. (disambiguation
  similar to that used for a repeated anchor tag)

- Endnote anchors fixed to use "id" (being one unique tag in the
  document that is target of every reference to it)instead of obsolete
  form (they were &lt;a name="note_1"&gt;. "name" on an &lt;a&gt;).
  Book index markers keep "name": the same marker sits on every object
  an entry names, 296 times in one document, and those are markers of
  where a term occurs rather than distinct targets.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub and html: no errors left over the sample set</title>
<updated>2026-09-14T16:18:51+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-14T00:53:26+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=6835275408e1629f450d163e0cc5221c977e87d2'/>
<id>6835275408e1629f450d163e0cc5221c977e87d2</id>
<content type='text'>
epubcheck 5.3.0 over the 35 sample epubs went from 1302 remaining errors
to none. The six causes for those remaining errors fixed here.

most of the count was one of them:

- Tables (1123 errors, 86%) where the writer emitted obsolete
  attributes, removed in 2014; table also now in div instead of a
  paragraph. also fixed:

- Navigation (115). Every level 4 heading's nav entry ended "#0", the
  ocn of an object that has no ocn and so no id.

- Duplicate ids (37). (from three unrelated sources).

- The publication identifier (27 warnings). dc:identifier was a
  hardcoded hex string, not a UUID, and the same one in all 35 files,
  so two documents in one library collided. It is now UUID v5 over the
  document's own uid: a real RFC 4122 identifier, stable across builds
  and distinct per document.

- Image manifest entries (15). media-type was "image/" plus the file
  extension, giving "image/jpg", which is not a media type; epubcheck
  reads it as a foreign resource and wants a fallback. There is now a
  mapping, which also covers svg and webp. Item ids came from the file
  basename, and "2bits_02_01-100.png" gave an id starting with a digit,
  which is not an XML name; ids are now prefixed and sanitised.

- An ocn resolving to no segment (9). A poem block and its first verse
  share one ocn; the verses are written into a segment and the block
  itself is not.

Also dropped from the package document: an xmlns:xsi that nothing
used, and a prefix declaration for the rendition vocabulary, which is
a reserved prefix and needed no declaring. The package now carries
xml:lang.

test-epub-validity.sh now allows no fatal and no error. Two NAV-011
warnings remain and are described in it. Three reference .ssp files
change, all of them the anchor tag disambiguation above.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
epubcheck 5.3.0 over the 35 sample epubs went from 1302 remaining errors
to none. The six causes for those remaining errors fixed here.

most of the count was one of them:

- Tables (1123 errors, 86%) where the writer emitted obsolete
  attributes, removed in 2014; table also now in div instead of a
  paragraph. also fixed:

- Navigation (115). Every level 4 heading's nav entry ended "#0", the
  ocn of an object that has no ocn and so no id.

- Duplicate ids (37). (from three unrelated sources).

- The publication identifier (27 warnings). dc:identifier was a
  hardcoded hex string, not a UUID, and the same one in all 35 files,
  so two documents in one library collided. It is now UUID v5 over the
  document's own uid: a real RFC 4122 identifier, stable across builds
  and distinct per document.

- Image manifest entries (15). media-type was "image/" plus the file
  extension, giving "image/jpg", which is not a media type; epubcheck
  reads it as a foreign resource and wants a fallback. There is now a
  mapping, which also covers svg and webp. Item ids came from the file
  basename, and "2bits_02_01-100.png" gave an id starting with a digit,
  which is not an XML name; ids are now prefixed and sanitised.

- An ocn resolving to no segment (9). A poem block and its first verse
  share one ocn; the verses are written into a segment and the block
  itself is not.

Also dropped from the package document: an xmlns:xsi that nothing
used, and a prefix declaration for the rendition vocabulary, which is
a reserved prefix and needed no declaring. The package now carries
xml:lang.

test-epub-validity.sh now allows no fatal and no error. Two NAV-011
warnings remain and are described in it. Three reference .ssp files
change, all of them the anchor tag disambiguation above.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub, html: a named anchor, and subtitle fixes</title>
<updated>2026-09-14T16:18:51+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-13T03:55:37+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=1716ad72ccb6454529a9fc05b0f5a79fd72a8748'/>
<id>1716ad72ccb6454529a9fc05b0f5a79fd72a8748</id>
<content type='text'>
fixes related to:
- named anchor id
- subtitles, emit only where they exist

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
fixes related to:
- named anchor id
- subtitles, emit only where they exist

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub, html: correctly identify code block as block</title>
<updated>2026-09-14T16:18:51+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-13T03:21:04+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=4041423feda883d6c26ed41d093c5ce5ae9e37c4'/>
<id>4041423feda883d6c26ed41d093c5ce5ae9e37c4</id>
<content type='text'>
- wrapper set to &lt;div&gt;, with class unchanged, and the six stylesheets
  select div.code where they selected p.code.
- invented element &lt;codeline&gt; removed

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- wrapper set to &lt;div&gt;, with class unchanged, and the six stylesheets
  select div.code where they selected p.code.
- invented element &lt;codeline&gt; removed

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub, html: reference issues fixes</title>
<updated>2026-09-14T16:18:51+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-13T03:11:45+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=4af9d673346d558b47bd113c5ca20dd61e33b8cb'/>
<id>4af9d673346d558b47bd113c5ca20dd61e33b8cb</id>
<content type='text'>
- _part_eof.xhtml was declared in the manifest and never written.
- image_sys/bullet_09.png was referenced as a background image, a
  throwback to the Ruby version of sisu, never used here.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- _part_eof.xhtml was declared in the manifest and never written.
- image_sys/bullet_09.png was referenced as a background image, a
  throwback to the Ruby version of sisu, never used here.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub, html: document heads and ids, fixes</title>
<updated>2026-09-14T16:18:51+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-13T02:59:01+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=282b2a4166aeba76e3b99abaa46bf6858f7cd172'/>
<id>282b2a4166aeba76e3b99abaa46bf6858f7cd172</id>
<content type='text'>
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)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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)
</pre>
</div>
</content>
</entry>
<entry>
<title>epub, html, db: use of elements &amp; attributes, fix</title>
<updated>2026-09-14T16:18:49+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-13T02:42:06+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=c959735f21b3ddac6932bc9e8862d77a4421f133'/>
<id>c959735f21b3ddac6932bc9e8862d77a4421f133</id>
<content type='text'>
fixed, four things used that XHTML does not have.
(search db sisudoc-spine-search-cgi results share styling)

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
fixed, four things used that XHTML does not have.
(search db sisudoc-spine-search-cgi results share styling)

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
</feed>
