<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sisudoc-spine/src/sisudoc/io_out, branch main</title>
<subtitle>SiSU Spine: document publishing and search (in D) 2015</subtitle>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/'/>
<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://www.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://www.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://www.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://www.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://www.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://www.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>
<entry>
<title>include .ssp document abstraction in source 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-22T17:57:17+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=8df299dc69ade4484b1167a8fa293c291fbb8a4a'/>
<id>8df299dc69ade4484b1167a8fa293c291fbb8a4a</id>
<content type='text'>
- When --source/--pod is used, automatically generate the .ssp
  document abstraction and bundle it into the pod at
  media/abstraction/{doc_uid}.{lang}.ssp

- This makes show_abstraction implicitly true when source_or_pod
  is active, so the .ssp file is generated before the pod
  assembler runs (abstraction runs before outputHub, and
  source_or_pod is the first task in outputHub).

- Changes:
    paths_source.d:
      Add abstraction_root() path helper to _PodPaths struct,
      following the same pattern as image_root(). Produces
      paths like pod/media/abstraction/ for both zpod (inside
      zip) and filesystem_open_zpod (open directory).

    source_pod.d:
      - Create media/abstraction/ directory in
        podArchive_directory_tree
      - Bundle .ssp file in pod_zipMakeReady: reads from the
        abstraction output directory, copies to open pod
        directory, adds to zip archive, computes SHA-256 digest
      - Write .ssp digest in zipArchiveDigest alongside sstm
        and ssi digests

    spine.d:
      Make show_abstraction() return true when source_or_pod is
      active (previously only returned true for explicit
      --show-abstraction flag).

- The .ssp is always included when building pods - no exclusion
  flag for this experimental feature to keep things simple.
  Not generated for non-pod outputs (--text, --html, etc.)
  unless --show-abstraction is explicitly passed.

- 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>
- When --source/--pod is used, automatically generate the .ssp
  document abstraction and bundle it into the pod at
  media/abstraction/{doc_uid}.{lang}.ssp

- This makes show_abstraction implicitly true when source_or_pod
  is active, so the .ssp file is generated before the pod
  assembler runs (abstraction runs before outputHub, and
  source_or_pod is the first task in outputHub).

- Changes:
    paths_source.d:
      Add abstraction_root() path helper to _PodPaths struct,
      following the same pattern as image_root(). Produces
      paths like pod/media/abstraction/ for both zpod (inside
      zip) and filesystem_open_zpod (open directory).

    source_pod.d:
      - Create media/abstraction/ directory in
        podArchive_directory_tree
      - Bundle .ssp file in pod_zipMakeReady: reads from the
        abstraction output directory, copies to open pod
        directory, adds to zip archive, computes SHA-256 digest
      - Write .ssp digest in zipArchiveDigest alongside sstm
        and ssi digests

    spine.d:
      Make show_abstraction() return true when source_or_pod is
      active (previously only returned true for explicit
      --show-abstraction flag).

- The .ssp is always included when building pods - no exclusion
  flag for this experimental feature to keep things simple.
  Not generated for non-pod outputs (--text, --html, etc.)
  unless --show-abstraction is explicitly passed.

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>document abstraction as per document sqlite db</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-22T17:52:21+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=51549f11d60cd353564486b3598e69259fb01b66'/>
<id>51549f11d60cd353564486b3598e69259fb01b66</id>
<content type='text'>
  --show-abstraction-db flag to write per-document

- SQLite database of document abstraction
  (Claude-Code primary assist)

- Add a new output mode that serializes the in-memory document
  abstraction to a per-document SQLite database. This complements
  the .ssp text format (--show-abstraction) with a queryable
  database representation of the same data.

- Schema:
    metadata table - key/value pairs for document metadata
      (title, creator, dates, rights, classify, identifiers,
      language, notes, make settings, doc_has counts)
    objects table - one row per document object with columns:
      section, seq (position within section), ocn, is_a,
      is_of_part, is_of_type, heading_level, identifier,
      parent_ocn, last_descendant_ocn, ancestors,
      indent/bullet/lang, has_* flags, segment/anchor tags,
      table/code properties, text content
    Indexed on: section, ocn, parent_ocn, is_a, heading_level

- Uses prepared statements via d2sqlite3 (existing dependency)
  for safe and efficient insertion. Each document produces a
  standalone .abstraction.db file in the abstraction/ output
  directory.

- New files:
    src/sisudoc/io_out/create_abstraction_db.d
      Follows the same pattern as create_abstraction_txt.d.
      Creates schema, populates metadata via key/value inserts,
      then iterates all sections writing objects with prepared
      statements within a single transaction.

- Changes to spine.d:
    - Add "show-abstraction-db" to opts init, getopt, OptActions
    - Add to abstraction(), require_processing_files(), and
      meta_processing_general() gates
    - Insert call at both spineAbstraction sites

- Tested against all 35 sample documents (including 9-language
  live-manual) - zero failures. Works standalone or combined
  with --show-abstraction and other output flags.

- Example queries the database supports:
    SELECT ocn, heading_level, text FROM objects
      WHERE is_a = 'heading' AND section = 'body';
    SELECT * FROM objects WHERE parent_ocn = 10;
    SELECT key, value FROM metadata WHERE key LIKE 'title.%';

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  --show-abstraction-db flag to write per-document

- SQLite database of document abstraction
  (Claude-Code primary assist)

- Add a new output mode that serializes the in-memory document
  abstraction to a per-document SQLite database. This complements
  the .ssp text format (--show-abstraction) with a queryable
  database representation of the same data.

- Schema:
    metadata table - key/value pairs for document metadata
      (title, creator, dates, rights, classify, identifiers,
      language, notes, make settings, doc_has counts)
    objects table - one row per document object with columns:
      section, seq (position within section), ocn, is_a,
      is_of_part, is_of_type, heading_level, identifier,
      parent_ocn, last_descendant_ocn, ancestors,
      indent/bullet/lang, has_* flags, segment/anchor tags,
      table/code properties, text content
    Indexed on: section, ocn, parent_ocn, is_a, heading_level

- Uses prepared statements via d2sqlite3 (existing dependency)
  for safe and efficient insertion. Each document produces a
  standalone .abstraction.db file in the abstraction/ output
  directory.

- New files:
    src/sisudoc/io_out/create_abstraction_db.d
      Follows the same pattern as create_abstraction_txt.d.
      Creates schema, populates metadata via key/value inserts,
      then iterates all sections writing objects with prepared
      statements within a single transaction.

- Changes to spine.d:
    - Add "show-abstraction-db" to opts init, getopt, OptActions
    - Add to abstraction(), require_processing_files(), and
      meta_processing_general() gates
    - Insert call at both spineAbstraction sites

- Tested against all 35 sample documents (including 9-language
  live-manual) - zero failures. Works standalone or combined
  with --show-abstraction and other output flags.

- Example queries the database supports:
    SELECT ocn, heading_level, text FROM objects
      WHERE is_a = 'heading' AND section = 'body';
    SELECT * FROM objects WHERE parent_ocn = 10;
    SELECT key, value FROM metadata WHERE key LIKE 'title.%';

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>.ssp document abstraction as PEG parsable text</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-22T17:44:39+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=49fd1ba683dd36e3826cf0d48e950c26d5235c1c'/>
<id>49fd1ba683dd36e3826cf0d48e950c26d5235c1c</id>
<content type='text'>
  --show-abstraction flag to write .ssp document abstraction files

- Add a new output mode that serializes the in-memory document
  abstraction (produced by spineAbstraction) to a human-readable,
  line-oriented text format (.ssp). This captures the full object
  model after parsing and abstraction but before output generation.

- The .ssp format uses unambiguous line prefixes:
    @section { }  - section boundaries (head/toc/body/endnotes/...)
    [N] type      - object declaration with OCN
    .name: value  - object properties (only non-defaults)
    | content     - text content lines
    % comment     - comments

- New files:
    src/sisudoc/io_out/create_abstraction_txt.d
      Serializer module following the same template pattern as
      metadoc_show_summary.d. Walks doc.abstraction() section by
      section, writing metadata preamble (@meta, @make, @doc_has)
      then each object with its properties and text content.
      Output goes to {output_path}/{lang}/abstraction/{doc}.ssp

- Changes to spine.d:
    - Add "show-abstraction" to opts initialization, getopt, and
      OptActions struct
    - Add show_abstraction to abstraction(), require_processing_files(),
      and meta_processing_general() so the flag triggers full document
      processing
    - Insert call at both spineAbstraction sites (parallel and serial
      branches), gated by show_abstraction flag, following the same
      pattern as show_config/show_summary/show_make

- Tested against all 35 sample documents (including multilingual
  live-manual in 9 languages) - zero failures. Works standalone
  (--show-abstraction) or combined with other output flags
  (--show-abstraction --html --text). No effect on existing code
  paths when the flag is not used.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  --show-abstraction flag to write .ssp document abstraction files

- Add a new output mode that serializes the in-memory document
  abstraction (produced by spineAbstraction) to a human-readable,
  line-oriented text format (.ssp). This captures the full object
  model after parsing and abstraction but before output generation.

- The .ssp format uses unambiguous line prefixes:
    @section { }  - section boundaries (head/toc/body/endnotes/...)
    [N] type      - object declaration with OCN
    .name: value  - object properties (only non-defaults)
    | content     - text content lines
    % comment     - comments

- New files:
    src/sisudoc/io_out/create_abstraction_txt.d
      Serializer module following the same template pattern as
      metadoc_show_summary.d. Walks doc.abstraction() section by
      section, writing metadata preamble (@meta, @make, @doc_has)
      then each object with its properties and text content.
      Output goes to {output_path}/{lang}/abstraction/{doc}.ssp

- Changes to spine.d:
    - Add "show-abstraction" to opts initialization, getopt, and
      OptActions struct
    - Add show_abstraction to abstraction(), require_processing_files(),
      and meta_processing_general() so the flag triggers full document
      processing
    - Insert call at both spineAbstraction sites (parallel and serial
      branches), gated by show_abstraction flag, following the same
      pattern as show_config/show_summary/show_make

- Tested against all 35 sample documents (including multilingual
  live-manual in 9 languages) - zero failures. Works standalone
  (--show-abstraction) or combined with other output flags
  (--show-abstraction --html --text). No effect on existing code
  paths when the flag is not used.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>latex minor improvements and fixes, require testing</title>
<updated>2026-04-07T02:19:14+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-07T02:19:11+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=47d3a00c05728521c4af109266c073ae1b764768'/>
<id>47d3a00c05728521c4af109266c073ae1b764768</id>
<content type='text'>
- FIXES issue with .tex files and xetex finding image paths when run
  within latex/ output directory
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- FIXES issue with .tex files and xetex finding image paths when run
  within latex/ output directory
</pre>
</div>
</content>
</entry>
</feed>
