<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sisudoc-spine/org/default_regex.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>markdown output, --markdown (--md)</title>
<updated>2026-09-28T17:12:20+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-28T15:43:54+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=af9f8677ff80287a0c83319258261d2368e14294'/>
<id>af9f8677ff80287a0c83319258261d2368e14294</id>
<content type='text'>
A plain-text output that keeps the object numbers, written as CommonMark
with GFM pipe tables, one .md per document-language in &lt;lang&gt;/markdown/,
(linked from the metadata page) with images into that shared directory
itself, skipping any already there, so --markdown alone still gives a complete tree.

provided as an alternative to --text rather than a replacement

--markdown  produces a document that renders, (both provide objext
  numbering survives both. Every object carries an anchor and a
  superscript number linking to itself, so a citation by object number
  is a link in any markdown renderer.
--text may still be of value to read in a terminal

A note is written where it is referenced, with a link back to the
object it came from, rather than gathered into an endnotes
section.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
A plain-text output that keeps the object numbers, written as CommonMark
with GFM pipe tables, one .md per document-language in &lt;lang&gt;/markdown/,
(linked from the metadata page) with images into that shared directory
itself, skipping any already there, so --markdown alone still gives a complete tree.

provided as an alternative to --text rather than a replacement

--markdown  produces a document that renders, (both provide objext
  numbering survives both. Every object carries an anchor and a
  superscript number linking to itself, so a citation by object number
  is a link in any markdown renderer.
--text may still be of value to read in a terminal

A note is written where it is referenced, with a link back to the
object it came from, rather than gathered into an endnotes
section.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>typst output --typist &amp; --pdf that makes the pdf</title>
<updated>2026-09-28T17:07:41+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-28T00:40:20+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=b254c23c56a113bdcdb89f1f7917352baaa1cf0a'/>
<id>b254c23c56a113bdcdb89f1f7917352baaa1cf0a</id>
<content type='text'>
typst provides a new pdf build path replacing latex as the primary pdf
builder.
  --typst (--typ) writes the .typ;
  --pdf writes the .typ and compiles it by spawning `typst compile`.
    (--pdf is redefined, being typst to pdf rather than latex).
  --latex is unchanged and writes the .tex;

One .typ per document-language (not one per paper size). The paper and
the orientation are read from sys.inputs with a default, so the same
file compiles to every paper --set-papersize asks for, the pdfs keep
their original names.

Spine's paper names (derived from what suited latex) and typst's are
different vocabularies and are mapped; a paper typst does not have is
named and skipped.

With the flag --pdf spine invokes a typesetter to generate the pdf
output directly, which is new (the latex path writes a .tex and leaves
xelatex to the caller). If typst is not available on the machine it is
reported absent, naming the binary and printing the command, and the run
continues, the .typ is written.

Several useful features of an object-centric pdf are easily met, usually
being a few lines each.
- The object number goes in the margin as one `place` at a coordinate
  inside the object's own block, carrying the label every citation
  points at.
- A note is a real footnote at the point of reference, with the
  document's own number and one link back to the object.
- The table of contents locates by object number rather than by page, so
  it holds true across every paper and every setting.

That typst compiles silently across the sample set means every internal
link in every document resolves (--pdf over the collection with two
paper sizes gives 144 pdfs, none skipped and none failed, each the page
size its name claims and each tagged).

paths: .typ, pdf named in same way as .tex based built pdfs so site
linkage works either way

flake.nix: added a typst dev shell, for .typ pdf typesetter
- dsh-typst-pdf providing a pdf typsetter for spine's .typ.
- dsh-latex-pdf provides xelatex for .tex which can still be written.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
typst provides a new pdf build path replacing latex as the primary pdf
builder.
  --typst (--typ) writes the .typ;
  --pdf writes the .typ and compiles it by spawning `typst compile`.
    (--pdf is redefined, being typst to pdf rather than latex).
  --latex is unchanged and writes the .tex;

One .typ per document-language (not one per paper size). The paper and
the orientation are read from sys.inputs with a default, so the same
file compiles to every paper --set-papersize asks for, the pdfs keep
their original names.

Spine's paper names (derived from what suited latex) and typst's are
different vocabularies and are mapped; a paper typst does not have is
named and skipped.

With the flag --pdf spine invokes a typesetter to generate the pdf
output directly, which is new (the latex path writes a .tex and leaves
xelatex to the caller). If typst is not available on the machine it is
reported absent, naming the binary and printing the command, and the run
continues, the .typ is written.

Several useful features of an object-centric pdf are easily met, usually
being a few lines each.
- The object number goes in the margin as one `place` at a coordinate
  inside the object's own block, carrying the label every citation
  points at.
- A note is a real footnote at the point of reference, with the
  document's own number and one link back to the object.
- The table of contents locates by object number rather than by page, so
  it holds true across every paper and every setting.

That typst compiles silently across the sample set means every internal
link in every document resolves (--pdf over the collection with two
paper sizes gives 144 pdfs, none skipped and none failed, each the page
size its name claims and each tagged).

paths: .typ, pdf named in same way as .tex based built pdfs so site
linkage works either way

flake.nix: added a typst dev shell, for .typ pdf typesetter
- dsh-typst-pdf providing a pdf typsetter for spine's .typ.
- dsh-latex-pdf provides xelatex for .tex which can still be written.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>uid and paths separator "~" in place of ":"</title>
<updated>2026-09-23T12:19:53+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-23T11:18:52+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=26aba525c0c55cb0ec77cf3a788cb59de2683cee'/>
<id>26aba525c0c55cb0ec77cf3a788cb59de2683cee</id>
<content type='text'>
need a character to split filenames on in certain circumstances.
there problems with use of a colon in filenames, which is legal on posix
but not on Windows."~" fits the bill better being legal on every
filesystem of interest and is unreserved in rfc 3986, needing no escaping in a url.

The reference abstraction is renamed, its content unchanged. Over
the sample collection two filenames move and nothing else does: the
abstraction and database digests are identical, the archive's
members and their sizes are unchanged, and only the member order
shifts, "~" collating after letters where ":" sorted before them. The
document's epub dc:identifier is a v5 uuid derived from the uid, so it
changes for those filenames.

Every document's uid changes in the search database (spine.search.db).

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
need a character to split filenames on in certain circumstances.
there problems with use of a colon in filenames, which is legal on posix
but not on Windows."~" fits the bill better being legal on every
filesystem of interest and is unreserved in rfc 3986, needing no escaping in a url.

The reference abstraction is renamed, its content unchanged. Over
the sample collection two filenames move and nothing else does: the
abstraction and database digests are identical, the archive's
members and their sizes are unchanged, and only the member order
shifts, "~" collating after letters where ":" sorted before them. The
document's epub dc:identifier is a v5 uuid derived from the uid, so it
changes for those filenames.

Every document's uid changes in the search database (spine.search.db).

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>pod: read when zstd-wrapped</title>
<updated>2026-09-22T17:46:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-21T12:58:06+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=f89f0152a913cec14c6ee688a4f1b2ac7c4758ff'/>
<id>f89f0152a913cec14c6ee688a4f1b2ac7c4758ff</id>
<content type='text'>
sisupod using zstd compression recognised by first bytes.
&lt;doc&gt;.sisupod: spine reads one before it writes one, so when the name
changes (from .zip to .ssiupod) every pod already published stays
readable.

A .sisupod is one zstd frame wrapping the archive spine already builds.
The reader unwraps the bytes and hands the same archive to the same
parser, so every guard downstream is untouched: entry names, per-entry
and total size, path depth, escape and symlinks.

Which container it is comes from the first four bytes (rather than the
name). A pod published as a plain .zip reads as it always did, a
.sisupod reads, and either one renamed reads too. The suffix is still
recognised, both spellings, for the argument and for a url.

libzstd is declared rather than bound: provides the whole surface of
fifteen extern C prototypes (there is nothing to generate and no
upstream tree to track, which is the arrangement sqlite3 already has).
dub links it with "libs": [ "zstd" ]; nix needs zstd.out rather than
zstd, whose default output is the binaries and carries no library at
all.

A frame declares its uncompressed size in its own header, and for a pod
fetched over https that number is attacker controlled. The declared size
is checked against a ceiling before a buffer is asked for, a frame that
will not declare one is refused, and what comes out is checked against
what was promised. The ceiling is the extraction limit the archive
reader already applies, so the two bounds agree.

Measured: output built from a .sisupod is byte identical to output built
from the same pod's .zip, 359 files over text, html, epub, odt and .ssp
for three documents, live-manual's ten languages included. A truncated
frame is refused and the document skipped.

  free_culture           2863504 -&gt; 1099736   2.60x
  the_wealth_of_networks 4294022 -&gt; 1172649   3.66x
  live-manual            6972418 -&gt;  675970  10.31x

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
sisupod using zstd compression recognised by first bytes.
&lt;doc&gt;.sisupod: spine reads one before it writes one, so when the name
changes (from .zip to .ssiupod) every pod already published stays
readable.

A .sisupod is one zstd frame wrapping the archive spine already builds.
The reader unwraps the bytes and hands the same archive to the same
parser, so every guard downstream is untouched: entry names, per-entry
and total size, path depth, escape and symlinks.

Which container it is comes from the first four bytes (rather than the
name). A pod published as a plain .zip reads as it always did, a
.sisupod reads, and either one renamed reads too. The suffix is still
recognised, both spellings, for the argument and for a url.

libzstd is declared rather than bound: provides the whole surface of
fifteen extern C prototypes (there is nothing to generate and no
upstream tree to track, which is the arrangement sqlite3 already has).
dub links it with "libs": [ "zstd" ]; nix needs zstd.out rather than
zstd, whose default output is the binaries and carries no library at
all.

A frame declares its uncompressed size in its own header, and for a pod
fetched over https that number is attacker controlled. The declared size
is checked against a ceiling before a buffer is asked for, a frame that
will not declare one is refused, and what comes out is checked against
what was promised. The ceiling is the extraction limit the archive
reader already applies, so the two bounds agree.

Measured: output built from a .sisupod is byte identical to output built
from the same pod's .zip, 359 files over text, html, epub, odt and .ssp
for three documents, live-manual's ten languages included. A truncated
frame is refused and the document skipped.

  free_culture           2863504 -&gt; 1099736   2.60x
  the_wealth_of_networks 4294022 -&gt; 1172649   3.66x
  live-manual            6972418 -&gt;  675970  10.31x

(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>regex: confine url within an endnote (delimiter)</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-13T04:50:43+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=5c3172a03800835c5dbb8207a9661df630e3e607'/>
<id>5c3172a03800835c5dbb8207a9661df630e3e607</id>
<content type='text'>
in error regex permitted a url to go past an endnote close delimiter,
fixed

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
in error regex permitted a url to go past an endnote close delimiter,
fixed

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>ocda: get image from is internal image markup</title>
<updated>2026-09-12T16:14:37+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-09-11T12:07:47+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=6a241cdc7368bf4cc23ffbc9e83f0adeadc35a9b'/>
<id>6a241cdc7368bf4cc23ffbc9e83f0adeadc35a9b</id>
<content type='text'>
correct circumstance where regex was incorrectly able to match image
shaped words as well as identified and marked up image
(internal markup).

take all matches.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
correct circumstance where regex was incorrectly able to match image
shaped words as well as identified and marked up image
(internal markup).

take all matches.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>ocda + outputs split: module/import + dub.json fixups</title>
<updated>2026-05-25T16:21:38+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-05-25T14:47:12+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=0c5e723742fb923bfa85e3ee47434b463f390f20'/>
<id>0c5e723742fb923bfa85e3ee47434b463f390f20</id>
<content type='text'>
Modules and imports rewritten to sisudoc.ocda.* and
sisudoc.outputs.*; dub.json excludedSourceFiles and the
spine:abstraction sub-package sourcePaths collapsed to
./src/sisudoc/ocda.

Verified: nix build .#spine-overlay-ldc clean.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Modules and imports rewritten to sisudoc.ocda.* and
sisudoc.outputs.*; dub.json excludedSourceFiles and the
spine:abstraction sub-package sourcePaths collapsed to
./src/sisudoc/ocda.

Verified: nix build .#spine-overlay-ldc clean.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>org files cosmetic, remove word BUG</title>
<updated>2026-05-05T22:38:24+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-05-05T22:38:24+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=b321e212521b80e5c6d66a00e8f9cd3c4bc117e8'/>
<id>b321e212521b80e5c6d66a00e8f9cd3c4bc117e8</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>org headers rearranged (&amp; odd hilighting issue)</title>
<updated>2026-05-04T16:12:12+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-05-04T15:46:57+00:00</published>
<link rel='alternate' type='text/html' href='https://sisudoc.com/projects/sisudoc-spine/commit/?id=c81bb010f45b732f97d7fbecd812ecae28f2be7d'/>
<id>c81bb010f45b732f97d7fbecd812ecae28f2be7d</id>
<content type='text'>
- odd hilighting issue ... must result from my org config, but "fix"
  makes things easier for me.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- odd hilighting issue ... must result from my org config, but "fix"
  makes things easier for me.
</pre>
</div>
</content>
</entry>
</feed>
