<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sisudoc-spine/src, branch main</title>
<subtitle>SiSU Spine: document publishing and search (in D) 2015</subtitle>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/'/>
<entry>
<title>source_pod: --pod2 include (doc abstraction) .ssp</title>
<updated>2026-05-16T15:58:32+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-05-15T23:05:49+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=9d244bf416f94415faa532fc5c7d98c0213012b6'/>
<id>9d244bf416f94415faa532fc5c7d98c0213012b6</id>
<content type='text'>
- include all (doc abstraction) .ssp in pod zip and in digests
  - fixed: for multi-language pods built with --pod2, only the last
    language's .ssp file was being written into pod.zip and listed in
    .digests.txt each languages' .ssp files were on disk in the pod
    directory (copied during their own per-language passes) but were not
    in final zip as it was being built once for each language and
    writing over previous, (only the last one remaining). The solution
    is to follow the pattern already used to avoid this by .sstm and
    .ssi, namely wait for the last language and iterate the
    manifest_list_of_languages internaly.

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- include all (doc abstraction) .ssp in pod zip and in digests
  - fixed: for multi-language pods built with --pod2, only the last
    language's .ssp file was being written into pod.zip and listed in
    .digests.txt each languages' .ssp files were on disk in the pod
    directory (copied during their own per-language passes) but were not
    in final zip as it was being built once for each language and
    writing over previous, (only the last one remaining). The solution
    is to follow the pattern already used to avoid this by .sstm and
    .ssi, namely wait for the last language and iterate the
    manifest_list_of_languages internaly.

(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>latex: some fixes for xelatex 2025</title>
<updated>2026-05-16T15:58:32+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-05-15T23:03:57+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=f968e493cc95501296c2f86d1a0994aed366e132'/>
<id>f968e493cc95501296c2f86d1a0994aed366e132</id>
<content type='text'>
(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
(assisted by Claude-Code)
</pre>
</div>
</content>
</entry>
<entry>
<title>sqlite: stop on missing/unwritable sqlite-db-path</title>
<updated>2026-05-16T15:57:30+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-05-15T22:51:42+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=d9eb4ea08e509515f594b9bfcbf1c422d04c7e0c'/>
<id>d9eb4ea08e509515f594b9bfcbf1c422d04c7e0c</id>
<content type='text'>
- fatal error on missing/unwritable --sqlite-db-path

(assisted by Claude-Code)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- fatal error on missing/unwritable --sqlite-db-path

(assisted by Claude-Code)
</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://doc-reform.org/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>
<entry>
<title>add children_headings to document abstraction</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T19:28:10+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=ef717e73137e7ce0c0f699bbfa4fc2da461fce37'/>
<id>ef717e73137e7ce0c0f699bbfa4fc2da461fce37</id>
<content type='text'>
Add int[] children_headings field to DocObj_MetaInfo_ and
compute it in the post-processing pass of metadoc_from_src.d,
right after last_descendant_ocn. Single O(n) pass builds a
parent_ocn -&gt; child heading OCNs map, then assigns to each
heading object. Useful for tree-structured output.

The .ssp serializer now reads directly from the abstraction
field instead of pre-computing its own map.

  metadoc_object_setter.d: +1 line (field declaration)
  metadoc_from_src.d: +17 lines (computation)
  create_abstraction_txt.d: -10 lines (simplified)

Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add int[] children_headings field to DocObj_MetaInfo_ and
compute it in the post-processing pass of metadoc_from_src.d,
right after last_descendant_ocn. Single O(n) pass builds a
parent_ocn -&gt; child heading OCNs map, then assigns to each
heading object. Useful for tree-structured output.

The .ssp serializer now reads directly from the abstraction
field instead of pre-computing its own map.

  metadoc_object_setter.d: +1 line (field declaration)
  metadoc_from_src.d: +17 lines (computation)
  create_abstraction_txt.d: -10 lines (simplified)

Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>add --pod2 flag, decouple --show-abstraction from --pod</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T18:09:25+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=c02be49130e6eecce62d5117bc95d698fb386901'/>
<id>c02be49130e6eecce62d5117bc95d698fb386901</id>
<content type='text'>
Finer-grained control over when .ssp files are produced:

  --show-abstraction  writes .ssp to OUTPUT/lang/abstraction/
                      independently of any pod flag
  --pod               builds pod without .ssp bundled
  --pod2              builds pod with .ssp in media/abstraction/

Changes to spine.d:
  - show_abstraction() now only responds to its own flag and
    pod2, no longer triggered by source_or_pod
  - Add pod2 to opts init, getopt, OptActions
  - pod() returns true for both --pod and --pod2
  - source_or_pod() includes pod2

Changes to source_pod.d:
  - Remove per-document pod directory (rmdirRecurse) before
    regeneration, ensuring clean slate on every run. This
    prevents stale content from previous runs (e.g. a --pod2
    run followed by --pod would otherwise leave an outdated
    media/abstraction/ directory)
  - Gate abstraction directory creation and .ssp bundling on
    pod2 flag specifically

Tested: --pod (no .ssp), --pod2 (.ssp in pod + zip),
--show-abstraction (standalone .ssp), --pod after --pod2
(stale abstraction cleaned up). All 35 sample documents pass.

Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Finer-grained control over when .ssp files are produced:

  --show-abstraction  writes .ssp to OUTPUT/lang/abstraction/
                      independently of any pod flag
  --pod               builds pod without .ssp bundled
  --pod2              builds pod with .ssp in media/abstraction/

Changes to spine.d:
  - show_abstraction() now only responds to its own flag and
    pod2, no longer triggered by source_or_pod
  - Add pod2 to opts init, getopt, OptActions
  - pod() returns true for both --pod and --pod2
  - source_or_pod() includes pod2

Changes to source_pod.d:
  - Remove per-document pod directory (rmdirRecurse) before
    regeneration, ensuring clean slate on every run. This
    prevents stale content from previous runs (e.g. a --pod2
    run followed by --pod would otherwise leave an outdated
    media/abstraction/ directory)
  - Gate abstraction directory creation and .ssp bundling on
    pod2 flag specifically

Tested: --pod (no .ssp), --pod2 (.ssp in pod + zip),
--show-abstraction (standalone .ssp), --pod after --pod2
(stale abstraction cleaned up). All 35 sample documents pass.

Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>.ssp: omit empty-value array property entries</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T18:06:31+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=e292f03817f4bf307b2cc6e35bd81b7fe2d33717'/>
<id>e292f03817f4bf307b2cc6e35bd81b7fe2d33717</id>
<content type='text'>
Add empty-string guards to array property loops
(.stow_link, .lev4_subtoc, .anchor_tag) so entries with
zero-length values are not emitted. Empty properties have
no value for PEG parsing - absent lines are faster to skip
than matching a property name to find an empty value.

Removes 1488 empty .anchor_tag: lines from Wealth of
Networks .ssp alone.

Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add empty-string guards to array property loops
(.stow_link, .lev4_subtoc, .anchor_tag) so entries with
zero-length values are not emitted. Empty properties have
no value for PEG parsing - absent lines are faster to skip
than matching a property name to find an empty value.

Removes 1488 empty .anchor_tag: lines from Wealth of
Networks .ssp alone.

Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>.ssp: add .children property for heading tree navigation</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T18:04:24+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=0cd28e99f8847b8c4b554a45f1ae22a4cd19eb1c'/>
<id>0cd28e99f8847b8c4b554a45f1ae22a4cd19eb1c</id>
<content type='text'>
- Add explicit child heading OCN lists to heading objects,
  pre-computed in a single O(n) pass over the body section
  before serialization. This makes the document tree directly
  navigable without scanning - each heading lists its direct
  sub-heading OCNs.

- Example output for a chapter heading:
    [10] heading :1
    .last_descendant: 65
    .children: 14 24 42 57

- Implementation: builds an int[][int] map (parent_ocn -&gt;
  child heading OCNs) from one pass over the body objects,
  then emits .children: during serialization for headings
  that have entries in the map.

- The tree was already reconstructable from parent_ocn +
  last_descendant_ocn, but .children makes it immediate -
  no scanning required to find a heading's sub-structure.

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Add explicit child heading OCN lists to heading objects,
  pre-computed in a single O(n) pass over the body section
  before serialization. This makes the document tree directly
  navigable without scanning - each heading lists its direct
  sub-heading OCNs.

- Example output for a chapter heading:
    [10] heading :1
    .last_descendant: 65
    .children: 14 24 42 57

- Implementation: builds an int[][int] map (parent_ocn -&gt;
  child heading OCNs) from one pass over the body objects,
  then emits .children: during serialization for headings
  that have entries in the map.

- The tree was already reconstructable from parent_ocn +
  last_descendant_ocn, but .children makes it immediate -
  no scanning required to find a heading's sub-structure.

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>.ssp serializer: include all ObjGenericComposite fields</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T18:02:51+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=0edd3f79f2ceaf74c009a1f4dc25aa95b5a1c673'/>
<id>0edd3f79f2ceaf74c009a1f4dc25aa95b5a1c673</id>
<content type='text'>
- Make the .ssp format a complete representation of the
  document abstraction by serializing all remaining fields
  from ObjGenericComposite (only omitting ptr.* runtime
  indices which are meaningless outside the in-memory context).

- New fields added:
    .ancestors_collapsed: - collapsed level ancestor chain
    .dom_status: - DOM structure markedup tags status[8]
    .dom_status_collapsed: - DOM structure collapsed status[8]
    .heading_lev_collapsed: - collapsed heading level
    .parent_lev: - parent heading level (markup)
    .o_n_type: - object numbering type (0=ocn, 1=non, 2=bkidx)
    .is_of_type: - para/block type classification
    .attrib: - general attributes string
    .meta_lang: - block language (group/block/quote)
    .meta_syntax: - codeblock syntax from metainfo
    .sha256: - hex-encoded SHA-256 digest of object content
    .has: images_no_dim - image without dimensions flag
    .table_aligns: - column alignment array
    .table_walls: - table walls/borders flag
    .stow_link: - extracted URLs (one per line)
    .heading_lev_anchor: - heading level anchor tag
    .segment_epub: - EPUB segment anchor tag
    .heading_ancestors_text: - pipe-separated ancestor headings
    .lev4_subtoc: - sub-table-of-contents entries (one per line)
    .anchor_tag: - additional anchor tags (one per line)

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Make the .ssp format a complete representation of the
  document abstraction by serializing all remaining fields
  from ObjGenericComposite (only omitting ptr.* runtime
  indices which are meaningless outside the in-memory context).

- New fields added:
    .ancestors_collapsed: - collapsed level ancestor chain
    .dom_status: - DOM structure markedup tags status[8]
    .dom_status_collapsed: - DOM structure collapsed status[8]
    .heading_lev_collapsed: - collapsed heading level
    .parent_lev: - parent heading level (markup)
    .o_n_type: - object numbering type (0=ocn, 1=non, 2=bkidx)
    .is_of_type: - para/block type classification
    .attrib: - general attributes string
    .meta_lang: - block language (group/block/quote)
    .meta_syntax: - codeblock syntax from metainfo
    .sha256: - hex-encoded SHA-256 digest of object content
    .has: images_no_dim - image without dimensions flag
    .table_aligns: - column alignment array
    .table_walls: - table walls/borders flag
    .stow_link: - extracted URLs (one per line)
    .heading_lev_anchor: - heading level anchor tag
    .segment_epub: - EPUB segment anchor tag
    .heading_ancestors_text: - pipe-separated ancestor headings
    .lev4_subtoc: - sub-table-of-contents entries (one per line)
    .anchor_tag: - additional anchor tags (one per line)

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>.ssp serializer: omit identifier when it equals OCN</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T18:00:13+00:00</published>
<link rel='alternate' type='text/html' href='https://doc-reform.org/projects/sisudoc-spine/commit/?id=5f9cb0e9724ab4c3f3539ef801b4604504543e4a'/>
<id>5f9cb0e9724ab4c3f3539ef801b4604504543e4a</id>
<content type='text'>
- For heading objects, the identifier was always emitted on the
  declaration line (e.g. "[10] heading :1 10") even when it was
  just the OCN repeated. Now only emits the identifier when it
  differs from the OCN (i.e. when there is a named segment like
  "acknowledgments" or "a1"), reducing redundancy.

  Before: [10] heading :1 10
  After:  [10] heading :1

  Named segments still appear: [0] heading :1 a1

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- For heading objects, the identifier was always emitted on the
  declaration line (e.g. "[10] heading :1 10") even when it was
  just the OCN repeated. Now only emits the identifier when it
  differs from the OCN (i.e. when there is a named segment like
  "acknowledgments" or "a1"), reducing redundancy.

  Before: [10] heading :1 10
  After:  [10] heading :1

  Named segments still appear: [0] heading :1 a1

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
</feed>
