aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore12
-rw-r--r--flake.lock6
-rw-r--r--makefile32
-rw-r--r--nix-overlays/dtools/disabled-tests.diff2
-rw-r--r--nix-overlays/dtools/fix-ldc-arm64.diff8
-rw-r--r--org/COPYRIGHT6
-rw-r--r--org/compile_time_info.org10
-rw-r--r--org/config_d_cfte.org10
-rw-r--r--org/config_dub.org10
-rw-r--r--org/config_env.org10
-rw-r--r--org/config_git.org22
-rw-r--r--org/config_make.org45
-rw-r--r--org/config_meson.org10
-rw-r--r--org/config_misc.org10
-rw-r--r--org/config_nix.org12
-rw-r--r--org/default_imports.org10
-rw-r--r--org/default_misc.org10
-rw-r--r--org/default_paths.org10
-rw-r--r--org/default_regex.org10
-rw-r--r--org/default_shared_snippets.org10
-rw-r--r--org/in_source_files.org10
-rw-r--r--org/in_zip_pod.org10
-rw-r--r--org/meta_conf_make_meta.org10
-rw-r--r--org/meta_debugs.org10
-rw-r--r--org/nix-develop-dlang-shared.org10
-rw-r--r--org/nixpkgs_overlays_d_related.org22
-rw-r--r--org/ocda.org10
-rw-r--r--org/ocda_functions.org11
-rw-r--r--org/ocda_obj_setter.org10
-rw-r--r--org/out_curate_metadata.org10
-rw-r--r--org/out_latex.org22
-rw-r--r--org/out_metadata.org10
-rw-r--r--org/out_odt.org13
-rw-r--r--org/out_skel.org10
-rw-r--r--org/out_sqlite.org38
-rw-r--r--org/out_src_abstraction_peg_text.org10
-rw-r--r--org/out_src_abstraction_sqlite_db.org10
-rw-r--r--org/out_src_pod.org65
-rw-r--r--org/out_text.org11
-rw-r--r--org/out_xmls.org10
-rw-r--r--org/out_xmls_css.org10
-rw-r--r--org/out_zip.org10
-rw-r--r--org/output_hub.org10
-rw-r--r--org/output_show.org10
-rw-r--r--org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org10
-rw-r--r--org/spine.org10
-rw-r--r--org/spine_info.org45
-rw-r--r--org/spine_markup_sample.org10
-rw-r--r--org/test_shell_script_ssp_document_abstraction.org18
-rw-r--r--org/util_editors.org976
-rw-r--r--org/util_spine_markup_conversion_from_sisu.org18
-rw-r--r--src/sisudoc/io_out/latex.d8
-rw-r--r--src/sisudoc/io_out/odt.d3
-rw-r--r--src/sisudoc/io_out/source_pod.d55
-rw-r--r--src/sisudoc/io_out/sqlite.d28
-rw-r--r--src/sisudoc/meta/metadoc_from_src_functions.d1
-rw-r--r--sundry/editor-syntax-etc/emacs/sisu-spine-mode-autoloads.el24
-rw-r--r--sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el296
-rw-r--r--sundry/editor-syntax-etc/nvim/README.md87
-rw-r--r--sundry/editor-syntax-etc/nvim/ftdetect/sisu.lua7
-rw-r--r--sundry/editor-syntax-etc/nvim/ftplugin/sisu.lua13
-rw-r--r--sundry/editor-syntax-etc/nvim/lua/sisu-spine/init.lua43
-rw-r--r--sundry/editor-syntax-etc/nvim/queries/sisu/folds.scm23
-rw-r--r--sundry/editor-syntax-etc/nvim/queries/sisu/highlights.scm189
-rw-r--r--sundry/editor-syntax-etc/nvim/queries/sisu/indents.scm48
-rw-r--r--sundry/editor-syntax-etc/nvim/queries/sisu/injections.scm16
-rw-r--r--sundry/editor-syntax-etc/nvim/queries/sisu/textobjects.scm140
-rw-r--r--sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim14
-rw-r--r--sundry/editor-syntax-etc/vim/templates/ssi.tpl30
-rw-r--r--sundry/editor-syntax-etc/vim/templates/ssm.tpl30
-rw-r--r--sundry/editor-syntax-etc/vim/templates/sst.tpl30
-rw-r--r--test/reference/abstraction/not_without_help.austin_amissah.en.ssp4
-rw-r--r--test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp4
-rwxr-xr-xtest/test-abstraction-ssp.sh7
74 files changed, 2405 insertions, 389 deletions
diff --git a/.gitignore b/.gitignore
index cbdcd6b..85cdddc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,6 +76,18 @@
!sundry/editor-syntax-etc/vim/ftplugin/*.vim
!sundry/editor-syntax-etc/vim/syntax
!sundry/editor-syntax-etc/vim/syntax/*.vim
+!sundry/editor-syntax-etc/vim/templates
+!sundry/editor-syntax-etc/vim/templates/*.tpl
+!sundry/editor-syntax-etc/nvim
+!sundry/editor-syntax-etc/nvim/*.md
+!sundry/editor-syntax-etc/nvim/ftdetect
+!sundry/editor-syntax-etc/nvim/ftdetect/*.lua
+!sundry/editor-syntax-etc/nvim/ftplugin
+!sundry/editor-syntax-etc/nvim/ftplugin/*.lua
+!sundry/editor-syntax-etc/nvim/queries
+!sundry/editor-syntax-etc/nvim/queries/sisu
+!sundry/editor-syntax-etc/nvim/queries/sisu/*.scm
+!sundry/editor-syntax-etc/nvim/**
!sundry/editor-syntax-etc/emacs
!sundry/editor-syntax-etc/emacs/*.el
!sundry/editor-syntax-etc/emacs/README
diff --git a/flake.lock b/flake.lock
index c17b46f..3e39fad 100644
--- a/flake.lock
+++ b/flake.lock
@@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
- "lastModified": 1777395829,
- "narHash": "sha256-HposVFZcsBCevgqLR73w/BpSe8J1lMgw5kASnnxO3A4=",
+ "lastModified": 1777826146,
+ "narHash": "sha256-wQ/iN5Zp5VIa3ebBibijPnLyKhor+xEbDy4d0goa9Zs=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "e75f25705c2934955ee5075e62530d74aca973c6",
+ "rev": "73c703c22422b8951895a960959dbbaca7296492",
"type": "github"
},
"original": {
diff --git a/makefile b/makefile
index b91d722..d8703de 100644
--- a/makefile
+++ b/makefile
@@ -642,14 +642,14 @@ skel:
mkdir -p build; \
mkdir -p views; \
mkdir -p data; \
- mkdir -p sundry/misc/util/d/cgi/search/cgi-bin/src; \
- mkdir -p sundry/misc/util/d/tools/markup_conversion; \
- mkdir -p sundry/misc/editor-syntax-etc/emacs; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/syntax; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/colors; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/ftplugin; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/rc; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/templates; \
+ mkdir -p sundry/util/d/cgi/search/cgi-bin/src; \
+ mkdir -p sundry/util/d/tools/markup_conversion; \
+ mkdir -p sundry/editor-syntax-etc/emacs; \
+ mkdir -p sundry/editor-syntax-etc/vim/syntax; \
+ mkdir -p sundry/editor-syntax-etc/vim/colors; \
+ mkdir -p sundry/editor-syntax-etc/vim/ftplugin; \
+ mkdir -p sundry/editor-syntax-etc/vim/rc; \
+ mkdir -p sundry/editor-syntax-etc/vim/templates; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/conf; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/io_in; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/io_out; \
@@ -685,14 +685,14 @@ distclean: expunge
distclean_and_init: expunge
mkdir -p views; \
- mkdir -p sundry/misc/util/d/cgi/search/cgi-bin/src; \
- mkdir -p sundry/misc/util/d/tools/markup_conversion; \
- mkdir -p sundry/misc/editor-syntax-etc/emacs; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/syntax; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/colors; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/ftplugin; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/rc; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/templates; \
+ mkdir -p sundry/util/d/cgi/search/cgi-bin/src; \
+ mkdir -p sundry/util/d/tools/markup_conversion; \
+ mkdir -p sundry/editor-syntax-etc/emacs; \
+ mkdir -p sundry/editor-syntax-etc/vim/syntax; \
+ mkdir -p sundry/editor-syntax-etc/vim/colors; \
+ mkdir -p sundry/editor-syntax-etc/vim/ftplugin; \
+ mkdir -p sundry/editor-syntax-etc/vim/rc; \
+ mkdir -p sundry/editor-syntax-etc/vim/templates; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR); \
mkdir -p $(PRG_BINDIR);
diff --git a/nix-overlays/dtools/disabled-tests.diff b/nix-overlays/dtools/disabled-tests.diff
index a22825a..79eb1cb 100644
--- a/nix-overlays/dtools/disabled-tests.diff
+++ b/nix-overlays/dtools/disabled-tests.diff
@@ -3,7 +3,7 @@
@@ -616,7 +616,7 @@ void runTests(string rdmdApp, string compiler, string model)
enforce(res.status == 1, res.output);
}
-
+
- version (Posix)
+ version (none)
{
diff --git a/nix-overlays/dtools/fix-ldc-arm64.diff b/nix-overlays/dtools/fix-ldc-arm64.diff
index 66eaa22..1c650a6 100644
--- a/nix-overlays/dtools/fix-ldc-arm64.diff
+++ b/nix-overlays/dtools/fix-ldc-arm64.diff
@@ -82,21 +82,21 @@ Adapted from https://github.com/dlang/tools/commit/6c6a042d1b08e3ec1790bd07a7f69
@@ -9,9 +9,8 @@ DUB=dub
WITH_DOC = no
DOC = ../dlang.org
-
+
-# Load operating system $(OS) (e.g. linux, osx, ...) and $(MODEL) (e.g. 32, 64) detection Makefile from dmd
-$(shell [ ! -d $(DMD_DIR) ] && git clone --depth=1 https://github.com/dlang/dmd $(DMD_DIR))
-include $(DMD_DIR)/compiler/src/osmodel.mak
+# Load operating system $(OS) (e.g. linux, osx, ...) and $(MODEL) (e.g. 32, 64) detection Makefile
+include osmodel.mak
-
+
ifeq (windows,$(OS))
DOTEXE:=.exe
@@ -30,7 +29,7 @@ DFLAGS = $(MODEL_FLAG) $(if $(findstring windows,$(OS)),,-fPIC) -preview=dip1000
DFLAGS += $(WARNINGS)
-
+
# Default DUB flags (DUB uses a different architecture format)
-DUBFLAGS = --arch=$(subst 32,x86,$(subst 64,x86_64,$(MODEL)))
+DUBFLAGS = --arch=$(ARCH)
-
+
TOOLS = \
$(ROOT)/catdoc$(DOTEXE) \
diff --git a/org/COPYRIGHT b/org/COPYRIGHT
index 1678968..249a68a 100644
--- a/org/COPYRIGHT
+++ b/org/COPYRIGHT
@@ -1,10 +1,10 @@
- Name: spine - SiSU Spine, Doc Reform
- Description: documents, structuring, processing, publishing, search
- static content generator
-
+
- Author: Ralph Amissah
[ralph.amissah@gmail.com]
-
+
- Copyright: (C) 2015 - 2026 Ralph Amissah
- Spine, Doc Reform (related to SiSU) uses standard:
@@ -13,7 +13,7 @@
modifications
- docReform object numbering (based on SiSU object citation numbering)
- standard SiSU document object numbering
-
+
- Homepages:
[https://www.sisudoc.org]
diff --git a/org/compile_time_info.org b/org/compile_time_info.org
index 0739030..bc2bcae 100644
--- a/org/compile_time_info.org
+++ b/org/compile_time_info.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/config_d_cfte.org b/org/config_d_cfte.org
index ae20abb..8bbf8d6 100644
--- a/org/config_d_cfte.org
+++ b/org/config_d_cfte.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[../org/][org/]]
diff --git a/org/config_dub.org b/org/config_dub.org
index a584adf..27a9c22 100644
--- a/org/config_dub.org
+++ b/org/config_dub.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/config_env.org b/org/config_env.org
index 98b6eb8..52e72c3 100644
--- a/org/config_env.org
+++ b/org/config_env.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[../org/][org/]]
- [[./config_nix.org][config_nix.org]]
diff --git a/org/config_git.org b/org/config_git.org
index 7f0a98c..42959df 100644
--- a/org/config_git.org
+++ b/org/config_git.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
@@ -100,6 +100,18 @@
!sundry/editor-syntax-etc/vim/ftplugin/*.vim
!sundry/editor-syntax-etc/vim/syntax
!sundry/editor-syntax-etc/vim/syntax/*.vim
+!sundry/editor-syntax-etc/vim/templates
+!sundry/editor-syntax-etc/vim/templates/*.tpl
+!sundry/editor-syntax-etc/nvim
+!sundry/editor-syntax-etc/nvim/*.md
+!sundry/editor-syntax-etc/nvim/ftdetect
+!sundry/editor-syntax-etc/nvim/ftdetect/*.lua
+!sundry/editor-syntax-etc/nvim/ftplugin
+!sundry/editor-syntax-etc/nvim/ftplugin/*.lua
+!sundry/editor-syntax-etc/nvim/queries
+!sundry/editor-syntax-etc/nvim/queries/sisu
+!sundry/editor-syntax-etc/nvim/queries/sisu/*.scm
+!sundry/editor-syntax-etc/nvim/**
!sundry/editor-syntax-etc/emacs
!sundry/editor-syntax-etc/emacs/*.el
!sundry/editor-syntax-etc/emacs/README
diff --git a/org/config_make.org b/org/config_make.org
index 17b5986..86688c3 100644
--- a/org/config_make.org
+++ b/org/config_make.org
@@ -6,13 +6,14 @@
#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
-#+STARTUP: show4levels hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+STARTUP: content hideblocks hidestars noindent entitiespretty
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
+#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[../org/][org/]]
@@ -683,14 +684,14 @@ skel:
mkdir -p build; \
mkdir -p views; \
mkdir -p data; \
- mkdir -p sundry/misc/util/d/cgi/search/cgi-bin/src; \
- mkdir -p sundry/misc/util/d/tools/markup_conversion; \
- mkdir -p sundry/misc/editor-syntax-etc/emacs; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/syntax; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/colors; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/ftplugin; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/rc; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/templates; \
+ mkdir -p sundry/util/d/cgi/search/cgi-bin/src; \
+ mkdir -p sundry/util/d/tools/markup_conversion; \
+ mkdir -p sundry/editor-syntax-etc/emacs; \
+ mkdir -p sundry/editor-syntax-etc/vim/syntax; \
+ mkdir -p sundry/editor-syntax-etc/vim/colors; \
+ mkdir -p sundry/editor-syntax-etc/vim/ftplugin; \
+ mkdir -p sundry/editor-syntax-etc/vim/rc; \
+ mkdir -p sundry/editor-syntax-etc/vim/templates; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/conf; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/io_in; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/io_out; \
@@ -726,14 +727,14 @@ distclean: expunge
distclean_and_init: expunge
mkdir -p views; \
- mkdir -p sundry/misc/util/d/cgi/search/cgi-bin/src; \
- mkdir -p sundry/misc/util/d/tools/markup_conversion; \
- mkdir -p sundry/misc/editor-syntax-etc/emacs; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/syntax; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/colors; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/ftplugin; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/rc; \
- mkdir -p sundry/misc/editor-syntax-etc/vim/templates; \
+ mkdir -p sundry/util/d/cgi/search/cgi-bin/src; \
+ mkdir -p sundry/util/d/tools/markup_conversion; \
+ mkdir -p sundry/editor-syntax-etc/emacs; \
+ mkdir -p sundry/editor-syntax-etc/vim/syntax; \
+ mkdir -p sundry/editor-syntax-etc/vim/colors; \
+ mkdir -p sundry/editor-syntax-etc/vim/ftplugin; \
+ mkdir -p sundry/editor-syntax-etc/vim/rc; \
+ mkdir -p sundry/editor-syntax-etc/vim/templates; \
mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR); \
mkdir -p $(PRG_BINDIR);
diff --git a/org/config_meson.org b/org/config_meson.org
index 60b434e..f268ff6 100644
--- a/org/config_meson.org
+++ b/org/config_meson.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/config_misc.org b/org/config_misc.org
index 670f4ba..64670e5 100644
--- a/org/config_misc.org
+++ b/org/config_misc.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
* sundry misc
** sh script to batch process _emacs org babel tangle_ :shell_script:tangle:
diff --git a/org/config_nix.org b/org/config_nix.org
index 0fef79d..83b26d3 100644
--- a/org/config_nix.org
+++ b/org/config_nix.org
@@ -6,14 +6,14 @@
#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
-#+STARTUP: show4levels hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+STARTUP: content hideblocks hidestars noindent entitiespretty
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
* nix :nix:
** flake.nix :flake:
diff --git a/org/default_imports.org b/org/default_imports.org
index 370f48f..1df7ab4 100644
--- a/org/default_imports.org
+++ b/org/default_imports.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/default_misc.org b/org/default_misc.org
index ad53155..a2a17a1 100644
--- a/org/default_misc.org
+++ b/org/default_misc.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/default_paths.org b/org/default_paths.org
index 958acfd..c0b7e43 100644
--- a/org/default_paths.org
+++ b/org/default_paths.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/default_regex.org b/org/default_regex.org
index 8e2e695..6c7c045 100644
--- a/org/default_regex.org
+++ b/org/default_regex.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/default_shared_snippets.org b/org/default_shared_snippets.org
index ce13a75..4eb7972 100644
--- a/org/default_shared_snippets.org
+++ b/org/default_shared_snippets.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/in_source_files.org b/org/in_source_files.org
index 478e0b9..bf53d10 100644
--- a/org/in_source_files.org
+++ b/org/in_source_files.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/in_zip_pod.org b/org/in_zip_pod.org
index e44b10e..f2903c4 100644
--- a/org/in_zip_pod.org
+++ b/org/in_zip_pod.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org
index 1cae84f..b39e54f 100644
--- a/org/meta_conf_make_meta.org
+++ b/org/meta_conf_make_meta.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :noweb yes
-#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/meta_debugs.org b/org/meta_debugs.org
index 26410bb..53a63ac 100644
--- a/org/meta_debugs.org
+++ b/org/meta_debugs.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/nix-develop-dlang-shared.org b/org/nix-develop-dlang-shared.org
index d11b752..e971677 100644
--- a/org/nix-develop-dlang-shared.org
+++ b/org/nix-develop-dlang-shared.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :noweb yes
-#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
* nix
** direnv
diff --git a/org/nixpkgs_overlays_d_related.org b/org/nixpkgs_overlays_d_related.org
index 53210eb..d166bbf 100644
--- a/org/nixpkgs_overlays_d_related.org
+++ b/org/nixpkgs_overlays_d_related.org
@@ -7,14 +7,14 @@
#+COPYRIGHT: Copyright (C) 2020 Ralph Amissah
#+LICENSE: Boost Software License 1.0
#+LANGUAGE: en
-#+STARTUP: show3levels hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+STARTUP: content hideblocks hidestars noindent entitiespretty
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
* nix ( written to ./dlang-nix-flakes/ )
** check updates CHECK
@@ -1407,7 +1407,7 @@ stdenv.mkDerivation (finalAttrs: {
@@ -616,7 +616,7 @@ void runTests(string rdmdApp, string compiler, string model)
enforce(res.status == 1, res.output);
}
-
+
- version (Posix)
+ version (none)
{
@@ -1501,22 +1501,22 @@ Adapted from https://github.com/dlang/tools/commit/6c6a042d1b08e3ec1790bd07a7f69
@@ -9,9 +9,8 @@ DUB=dub
WITH_DOC = no
DOC = ../dlang.org
-
+
-# Load operating system $(OS) (e.g. linux, osx, ...) and $(MODEL) (e.g. 32, 64) detection Makefile from dmd
-$(shell [ ! -d $(DMD_DIR) ] && git clone --depth=1 https://github.com/dlang/dmd $(DMD_DIR))
-include $(DMD_DIR)/compiler/src/osmodel.mak
+# Load operating system $(OS) (e.g. linux, osx, ...) and $(MODEL) (e.g. 32, 64) detection Makefile
+include osmodel.mak
-
+
ifeq (windows,$(OS))
DOTEXE:=.exe
@@ -30,7 +29,7 @@ DFLAGS = $(MODEL_FLAG) $(if $(findstring windows,$(OS)),,-fPIC) -preview=dip1000
DFLAGS += $(WARNINGS)
-
+
# Default DUB flags (DUB uses a different architecture format)
-DUBFLAGS = --arch=$(subst 32,x86,$(subst 64,x86_64,$(MODEL)))
+DUBFLAGS = --arch=$(ARCH)
-
+
TOOLS = \
$(ROOT)/catdoc$(DOTEXE) \
#+END_SRC
diff --git a/org/ocda.org b/org/ocda.org
index f822f8d..31d4c79 100644
--- a/org/ocda.org
+++ b/org/ocda.org
@@ -8,13 +8,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :noweb yes
-#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/ocda_functions.org b/org/ocda_functions.org
index 371b094..80305aa 100644
--- a/org/ocda_functions.org
+++ b/org/ocda_functions.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :noweb yes
-#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
@@ -1106,7 +1106,6 @@ ST_flow_table_array_munge flow_table_array_munge()(
#+NAME: ocdaFunc_block_line_empty
#+HEADER: :noweb yes
#+BEGIN_SRC d
-
@system ST_flow_block_flag_line_empty flow_block_flag_line_empty_(B,CMM,Ts)(
char[] line,
string[string] an_object,
diff --git a/org/ocda_obj_setter.org b/org/ocda_obj_setter.org
index 3da8b1d..64dd586 100644
--- a/org/ocda_obj_setter.org
+++ b/org/ocda_obj_setter.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :noweb yes
-#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/out_curate_metadata.org b/org/out_curate_metadata.org
index eda8194..983f330 100644
--- a/org/out_curate_metadata.org
+++ b/org/out_curate_metadata.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/out_latex.org b/org/out_latex.org
index bf80bac..dd98ca1 100644
--- a/org/out_latex.org
+++ b/org/out_latex.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
@@ -403,14 +403,14 @@ void outputLaTeXstyInit()(
fonts to try:
#+BEGIN_SRC latex
-\usepackage[scaled]{dejavu}
+\usepackage{dejavu}
\renewcommand*\familydefault{\sfdefault}
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
#+END_SRC
#+BEGIN_SRC latex
-\usepackage[scaled]{dejavu}
+\usepackage{dejavu}
\usepackage[scaled]{tgheros}
\usepackage[scaled]{quattrocento}
\usepackage[scaled]{cmbright}
@@ -431,7 +431,7 @@ fonts to try:
\usepackage{multicol}
\setlength{\marginparsep}{4mm}
\setlength{\marginparwidth}{8mm}
-\usepackage[scaled]{dejavu}
+\usepackage{dejavu}
\renewcommand*\familydefault{\sfdefault}
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
@@ -595,8 +595,8 @@ fonts to try:
}
\newcommand{\spaces}[1]{{\hspace*{#1ex}}}
\newcommand{\s}{\hspace*{1ex}}
-\renewcommand{\hardspace}{\hspace*{1ex}}
-\newcommand{\-}{\hspace*{1ex}}
+\newcommand{\hardspace}{\hspace*{1ex}}
+\renewcommand{\-}{\hspace*{1ex}}
\newcommand{\caret}{{\^{~}}}
\newcommand{\pipe}{{\textbar}}
\newcommand{\curlyOpen}{{}
@@ -1465,7 +1465,7 @@ string bullets_and_indentation(O)(
\pagenumbering{alph}
\setcounter{page}{1}
\markboth{%s}{%s}
-\br\linebreak Copyright {\begin{small}{\copyright\end{small}} %s \br\linebreak
+\br\linebreak Copyright \begin{small}\copyright\end{small} %s \br\linebreak
%s
\clearpage┃";
_txt = format(_tex_para,
diff --git a/org/out_metadata.org b/org/out_metadata.org
index 92455a0..ed16d42 100644
--- a/org/out_metadata.org
+++ b/org/out_metadata.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/out_odt.org b/org/out_odt.org
index 916341e..787070c 100644
--- a/org/out_odt.org
+++ b/org/out_odt.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
@@ -105,7 +105,7 @@ template outputODT() {
<<output_odt_variable_content_xml_8>>
<<output_odt_variable_content_xml_9>>
<<output_odt_variable_content_xml_10>>
- <<output_odt_variable_content_xml_11>>
+ <<output_odt_variable_content_xml_11>>;
<<output_odt_variable_content_xml_12>>
<<output_odt_variable_content_xml_13>>
<<output_odt_variable_manifest_xml_0>>
@@ -993,7 +993,6 @@ string table(O,M)(
pth_odt.manifest_rdf("fs"); /+ (manifest.rdf) +/
pth_odt.settings_xml("fs"); /+ (settings.xml) +/
pth_odt.styles_xml("fs"); /+ (styles_xml) +/
-
pth_odt.content_xml("fs");
pth_odt.manifest_xml("fs");
pth_odt.meta_xml("fs");
diff --git a/org/out_skel.org b/org/out_skel.org
index be7a5b8..d04ed57 100644
--- a/org/out_skel.org
+++ b/org/out_skel.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
diff --git a/org/out_sqlite.org b/org/out_sqlite.org
index 06d4a9f..9a4c63b 100644
--- a/org/out_sqlite.org
+++ b/org/out_sqlite.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
@@ -87,7 +87,12 @@ template SQLiteHubBuildTablesAndPopulate() {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
template SQLiteDbStatementComposite() {
void SQLiteDbStatementComposite(Db,D)(
@@ -144,7 +149,12 @@ template SQLiteHubDiscreteBuildTablesAndPopulate() {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
auto db = Database(pth_sqlite.sqlite_file(doc.matters.src.filename));
template SQLiteDiscreteDbStatementComposite() {
@@ -449,7 +459,12 @@ if (opt_action.sqlite_db_create) {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
auto db = Database(pth_sqlite.sqlite_file);
{
@@ -512,7 +527,12 @@ if ((doc.matters.opt.action.sqlite_db_create)) {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
_db_statement ~= SQLiteTablesReCreate!()();
SQLiteDbRun!()(db, _db_statement, doc.matters.opt.action, "TABLE RE-CREATE");
diff --git a/org/out_src_abstraction_peg_text.org b/org/out_src_abstraction_peg_text.org
index 7b7b600..b59c51d 100644
--- a/org/out_src_abstraction_peg_text.org
+++ b/org/out_src_abstraction_peg_text.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/out_src_abstraction_sqlite_db.org b/org/out_src_abstraction_sqlite_db.org
index a048934..4fa7cdb 100644
--- a/org/out_src_abstraction_sqlite_db.org
+++ b/org/out_src_abstraction_sqlite_db.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/out_src_pod.org b/org/out_src_pod.org
index e1076c2..a31937b 100644
--- a/org/out_src_pod.org
+++ b/org/out_src_pod.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
@@ -156,29 +156,38 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
}
} { // bundle abstraction .ssp file (only for --pod2)
if (doc_matters.opt.action.pod2) {
- import sisudoc.io_out.paths_output;
- auto out_pth = spineOutPaths!()(doc_matters.output_path, doc_matters.src.language);
- string abstraction_dir = ((out_pth.output_base.chainPath("abstraction")).asNormalizedPath).array;
- string ssp_filename = doc_matters.src.doc_uid_out ~ ".ssp";
- string fn_src_in = ((abstraction_dir.chainPath(ssp_filename)).asNormalizedPath).array.to!string;
- auto fn_src_out_pod_zip_base
- = pths_pod.abstraction_root(doc_matters.src.filename).zpod.to!string
- ~ "/" ~ ssp_filename;
- auto fn_src_out_filesystem
- = pths_pod.abstraction_root(doc_matters.src.filename).filesystem_open_zpod.to!string
- ~ "/" ~ ssp_filename;
- if (exists(fn_src_in)) {
- debug(io) { writeln("(io debug) src out found: ", fn_src_in); }
- { // take DIGEST write to pod file digests.txt
- auto data = (cast(byte[]) (fn_src_in).read);
- _digests[doc_matters.src.language]["ssp"] ~= data.sha256Of.toHexString
- ~ "::" ~ data.length.to!string ~ " - " ~ ssp_filename ~ "\n";
- }
- fn_src_in.copy(fn_src_out_filesystem);
- zip = podArchive("file_path_text", fn_src_in, fn_src_out_pod_zip_base, zip);
- } else {
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
- writeln("WARNING (io) src out NOT found (abstraction): ", fn_src_in);
+ if (doc_matters.src.language == doc_matters.pod.manifest_list_of_languages[$-1]) { // wait until all language versions of .ssp generated
+ import sisudoc.io_out.paths_output;
+ /+ doc_uid_out for any language follows the same pattern, differing
+ only in the trailing ".{lng}". Strip the current language to
+ reuse the base across all languages. +/
+ string _doc_uid_base
+ = doc_matters.src.doc_uid_out[0 .. $ - doc_matters.src.lng.length];
+ foreach (_lang; doc_matters.pod.manifest_list_of_languages) { // do for all language versions
+ auto out_pth_lng = spineOutPaths!()(doc_matters.output_path, _lang);
+ string abstraction_dir = ((out_pth_lng.output_base.chainPath("abstraction")).asNormalizedPath).array;
+ string ssp_filename = _doc_uid_base ~ _lang ~ ".ssp";
+ string fn_src_in = ((abstraction_dir.chainPath(ssp_filename)).asNormalizedPath).array.to!string;
+ auto fn_src_out_pod_zip_base
+ = pths_pod.abstraction_root(doc_matters.src.filename).zpod.to!string
+ ~ "/" ~ ssp_filename;
+ auto fn_src_out_filesystem
+ = pths_pod.abstraction_root(doc_matters.src.filename).filesystem_open_zpod.to!string
+ ~ "/" ~ ssp_filename;
+ if (exists(fn_src_in)) {
+ debug(io) { writeln("(io debug) src out found: ", fn_src_in); }
+ { // take DIGEST write to pod file digests.txt
+ auto data = (cast(byte[]) (fn_src_in).read);
+ _digests[_lang]["ssp"] ~= data.sha256Of.toHexString
+ ~ "::" ~ data.length.to!string ~ " - " ~ ssp_filename ~ "\n";
+ }
+ fn_src_in.copy(fn_src_out_filesystem);
+ zip = podArchive("file_path_text", fn_src_in, fn_src_out_pod_zip_base, zip);
+ } else {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
+ writeln("WARNING (io) src out NOT found (abstraction): ", fn_src_in);
+ }
+ }
}
}
}
diff --git a/org/out_text.org b/org/out_text.org
index a441276..2685986 100644
--- a/org/out_text.org
+++ b/org/out_text.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
@@ -562,4 +562,3 @@ DONE
- blurb
- inline_link /[┥┝┤├]
#+END_SRC
-
diff --git a/org/out_xmls.org b/org/out_xmls.org
index 976b7c1..a8a268a 100644
--- a/org/out_xmls.org
+++ b/org/out_xmls.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
diff --git a/org/out_xmls_css.org b/org/out_xmls_css.org
index 95c5145..6e3feaf 100644
--- a/org/out_xmls_css.org
+++ b/org/out_xmls_css.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
diff --git a/org/out_zip.org b/org/out_zip.org
index a3204ed..561c7e6 100644
--- a/org/out_zip.org
+++ b/org/out_zip.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
diff --git a/org/output_hub.org b/org/output_hub.org
index dde92d8..8270e2c 100644
--- a/org/output_hub.org
+++ b/org/output_hub.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/output_show.org b/org/output_show.org
index f3b1dcb..85ee080 100644
--- a/org/output_show.org
+++ b/org/output_show.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org b/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org
index 8473590..c24fb38 100644
--- a/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org
+++ b/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :noweb yes
-#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/spine.org b/org/spine.org
index e140bd2..cd1b03f 100644
--- a/org/spine.org
+++ b/org/spine.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./spine_build_scaffold.org][make/build]] VERSION
diff --git a/org/spine_info.org b/org/spine_info.org
index cd7ea11..3fecf1a 100644
--- a/org/spine_info.org
+++ b/org/spine_info.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./spine_build_scaffold.org][spine_build_scaffold.org]]
@@ -865,7 +865,7 @@ webserv:
** notices
*** project (project root) ./
-#+HEADER: :tangle "../COPYRIGHT"
+#+HEADER: :tangle-NO "../COPYRIGHT"
#+HEADER: :noweb yes
#+BEGIN_SRC text
- Name: spine - SiSU Spine, Doc Reform
@@ -882,26 +882,25 @@ webserv:
*** code org ./org
-#+HEADER: :tangle "../org/COPYRIGHT"
+- .org literate programming:
+ - copyright asserted
+ - omitted
+ - license
+ - dependency information
+
+#+HEADER: :tangle-NO "../org/COPYRIGHT"
#+HEADER: :noweb yes
#+BEGIN_SRC text
- Name: spine - SiSU Spine, Doc Reform
<<sisudoc_spine_copyright>>
- <<sisudoc_spine_license_agpl3>>
-
<<sisudoc_spine_summary>>
<<sisudoc_spine_markup_samples>>
-
-<<sisudoc_spine_dependencies>>
#+END_SRC
-*** code source ./src
-#+HEADER: :tangle "../src/COPYRIGHT"
#+HEADER: :noweb yes
-#+BEGIN_SRC text
- Name: spine - SiSU Spine, Doc Reform
<<sisudoc_spine_copyright>>
@@ -914,9 +913,9 @@ webserv:
<<sisudoc_spine_dependencies>>
#+END_SRC
-*** code source ./src/sisudoc
+*** code source ./src
-#+HEADER: :tangle "../src/sisudoc/COPYRIGHT"
+#+HEADER: :tangle-NO "../src/COPYRIGHT"
#+HEADER: :noweb yes
#+BEGIN_SRC text
- Name: spine - SiSU Spine, Doc Reform
@@ -931,23 +930,21 @@ webserv:
<<sisudoc_spine_dependencies>>
#+END_SRC
-*** org files ./org
-
-- .org literate programming:
- - copyright asserted
- - omitted
- - license
- - dependency information
+*** code source ./src/sisudoc
-#+HEADER: :tangle "./COPYRIGHT"
+#+HEADER: :tangle-NO "../src/sisudoc/COPYRIGHT"
#+HEADER: :noweb yes
#+BEGIN_SRC text
- Name: spine - SiSU Spine, Doc Reform
<<sisudoc_spine_copyright>>
+ <<sisudoc_spine_license_agpl3>>
+
<<sisudoc_spine_summary>>
<<sisudoc_spine_markup_samples>>
+
+<<sisudoc_spine_dependencies>>
#+END_SRC
*** doc (markup samples) ./doc
diff --git a/org/spine_markup_sample.org b/org/spine_markup_sample.org
index a6bb361..f6747c2 100644
--- a/org/spine_markup_sample.org
+++ b/org/spine_markup_sample.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
diff --git a/org/test_shell_script_ssp_document_abstraction.org b/org/test_shell_script_ssp_document_abstraction.org
index 5d25f5b..18b04ef 100644
--- a/org/test_shell_script_ssp_document_abstraction.org
+++ b/org/test_shell_script_ssp_document_abstraction.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
* test shell script ssp document abstraction test/test-abstraction-ssp.sh
@@ -44,7 +44,12 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SPINE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
-SAMPLES_DIR="$SPINE_DIR/../sisudoc-spine-samples/markup/pod-samples/pod"
+SAMPLES_RAW="$SPINE_DIR/$SpinePOD"
+if [ -d "$SAMPLES_RAW" ]; then
+ SAMPLES_DIR="$(cd "$SAMPLES_RAW" && pwd)"
+else
+ SAMPLES_DIR="$SAMPLES_RAW"
+fi
REF_DIR="$SCRIPT_DIR/reference/abstraction"
TMP_DIR="$SCRIPT_DIR/current/abstraction"
@@ -152,4 +157,3 @@ else
exit 1
fi
#+END_SRC
-
diff --git a/org/util_editors.org b/org/util_editors.org
index d07de15..f88e9d1 100644
--- a/org/util_editors.org
+++ b/org/util_editors.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
@@ -333,15 +333,25 @@ unlet s:cpo_save
#+HEADER: :tangle "../sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim"
#+BEGIN_SRC text
-" SiSU Vim syntax file (sisu-spine)
+" SiSU Vim syntax file (sisu-spine) - Vim 8 fallback (regex)
" SiSU Maintainer: Ralph Amissah <ralph.amissah@gmail.com>
" SiSU Markup: SiSU (sisu-5.6.7)
" sisu-spine Markup: sisu-spine
-" Last Change: 2017-06-22, 2025-02-21
+" Last Change: 2017-06-22, 2025-02-21, 2026-05-09
" URL: <https://git.sisudoc.org/projects/sisudoc-spine/tree/sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim>
" <https://git.sisudoc.org/projects/sisudoc-spine/tree/sundry/editor-syntax-etc/vim/syntax/sisu.vim>
" <https://sisudoc.org/>
"(originally looked at Ruby Vim by Mirko Nasato)
+"
+" Status: This is the regex-based Vim 8 fallback. For Neovim users, the
+" tree-sitter-sisu grammar provides structural highlighting, folding and
+" textobjects with strictly better behaviour on nested markup, multi-line
+" footnotes, block bodies, and segmented headings; see
+" sundry/editor-syntax-etc/nvim/README.md
+" Emacs 29+ users have an equivalent treesit-based mode at
+" sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el
+" This file remains the supported path for classic Vim, where tree-sitter
+" is not available without third-party plugins.
if version < 600
syntax clear
@@ -1897,8 +1907,630 @@ make:
1~ #___#
#+END_SRC
-* Emacs Syntax highlighting
+* NVim tree-sitter Syntax highlighting
+** README.md
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/README.md"
+#+BEGIN_SRC markdown
+# Neovim integration for SiSU spine markup
+
+Tree-sitter-backed syntax highlighting, folding, and structural
+navigation for `.sst` / `.ssm` / `.ssi` files in Neovim (>= 0.9).
+
+## What is in this directory
+
+```
+nvim/
+ ftdetect/sisu.lua - register .sst/.ssm/.ssi as filetype "sisu"
+ ftplugin/sisu.lua - per-buffer settings (commentstring, conceal)
+ lua/sisu-spine/init.lua - entry point: registers parser config
+ queries/sisu/ - tree-sitter queries (mirrors tree-sitter-sisu/queries/)
+ highlights.scm
+ folds.scm
+ injections.scm
+ textobjects.scm
+ indents.scm
+```
+
+## Install (manual)
+
+1. Symlink or copy this directory into your Neovim runtime path:
+
+ ```sh
+ ln -s /path/to/sisudoc-spine/sundry/editor-syntax-etc/nvim \
+ ~/.config/nvim/pack/sisu/start/sisu-spine
+ ```
+
+2. Tell `nvim-treesitter` how to fetch the parser. Add to your config
+ (`init.lua`):
+
+ ```lua
+ require("sisu-spine").setup()
+ require("nvim-treesitter.configs").setup({
+ ensure_installed = { "sisu" },
+ highlight = { enable = true },
+ indent = { enable = true },
+ fold = { enable = true },
+ textobjects = { select = { enable = true, lookahead = true } },
+ })
+ ```
+
+3. Build the parser:
+
+ ```vim
+ :TSInstall sisu
+ ```
+
+That is it. Open a `.sst` file - highlighting, folding, and textobject
+selection should all work.
+
+## Install (lazy.nvim)
+
+```lua
+{
+ dir = "/path/to/sisudoc-spine/sundry/editor-syntax-etc/nvim",
+ name = "sisu-spine",
+ ft = { "sisu" },
+ dependencies = { "nvim-treesitter/nvim-treesitter" },
+ config = function()
+ require("sisu-spine").setup()
+ end,
+}
+```
+
+## Sync queries from upstream
+
+The query files are duplicated from `tree-sitter-sisu/queries/` so that
+this Neovim drop-in works without depending on the parser repo's
+checkout layout. To refresh them after grammar changes:
+
+```sh
+cp ../../../sisudoc-spine-tools/tree-sitter-sisu/queries/*.scm \
+ queries/sisu/
+```
+
+(Path is relative to this README.)
+
+## Upstreaming the parser
+
+When the parser is publicly hosted under a stable URL it is worth
+submitting a config to `nvim-treesitter` so users can run `:TSInstall
+sisu` without the local `setup()` call. The required fields are in
+`lua/sisu-spine/init.lua` (`install_info` table); send a PR to
+<https://github.com/nvim-treesitter/nvim-treesitter> patching
+`lua/nvim-treesitter/parsers.lua`.
+#+END_SRC
+
+** lua
+*** init
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/lua/sisu-spine/init.lua"
+#+BEGIN_SRC lua
+-- Entry point for the SiSU spine markup Neovim integration.
+--
+-- Registers a tree-sitter parser config so users can run
+-- :TSInstall sisu
+-- to fetch and build the parser via nvim-treesitter.
+--
+-- The parser source lives can be found under the
+-- `projects/` namespace on git.sisudoc.org.
+
+local M = {}
+
+--- Register the `sisu` parser with nvim-treesitter and ensure that
+--- `.sst` / `.ssm` / `.ssi` are detected as filetype "sisu".
+---
+--- Call once from your init.lua before invoking `:TSInstall sisu`.
+function M.setup()
+ local ok, parsers = pcall(require, "nvim-treesitter.parsers")
+ if not ok then
+ vim.notify(
+ "sisu-spine: nvim-treesitter is not installed; "
+ .. "syntax highlighting will not be available.",
+ vim.log.levels.WARN
+ )
+ return
+ end
+
+ local parser_config = parsers.get_parser_configs()
+ parser_config.sisu = {
+ install_info = {
+ url = "https://git.sisudoc.org/projects/tree-sitter-sisu",
+ files = {
+ "src/parser.c",
+ "src/scanner.c",
+ },
+ branch = "main",
+ generate_requires_npm = false,
+ requires_generate_from_grammar = false,
+ },
+ filetype = "sisu",
+ }
+end
+
+return M
+#+END_SRC
+
+*** ftdetect
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/ftdetect/sisu.lua"
+#+BEGIN_SRC lua
+vim.filetype.add({
+ extension = {
+ sst = "sisu",
+ ssm = "sisu",
+ ssi = "sisu",
+ },
+})
+#+END_SRC
+
+*** ftplugin
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/ftplugin/sisu.lua"
+#+BEGIN_SRC lua
+-- Buffer-local settings for SiSU spine markup.
+
+vim.bo.commentstring = "%% %s"
+vim.bo.comments = ":%"
+
+-- Soft wrap suits prose.
+vim.wo.wrap = true
+vim.wo.linebreak = true
+
+-- Conceal inline-formatting delimiters when the user opts in
+-- (`:set conceallevel=2`). See queries/sisu/highlights.scm for
+-- @conceal captures.
+vim.wo.conceallevel = vim.wo.conceallevel
+#+END_SRC
+
+** queries
+*** folds
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/queries/sisu/folds.scm"
+#+BEGIN_SRC vimrc
+; Code folding queries for SiSU Spine markup
+
+; Block elements are foldable
+(code_block_curly) @fold
+(code_block_tic) @fold
+(poem_block_curly) @fold
+(poem_block_tic) @fold
+(block_block_curly) @fold
+(block_block_tic) @fold
+(group_block_curly) @fold
+(group_block_tic) @fold
+(table_block_curly) @fold
+(table_block_tic) @fold
+(quote_block_tic) @fold
+
+; Multi-line book index entries are foldable
+(book_index) @fold
+
+; Pipe tables are foldable
+(pipe_table) @fold
+
+; Header fields with continuations are foldable
+(header_field) @fold
+#+END_SRC
+*** highlights
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/queries/sisu/highlights.scm"
+#+BEGIN_SRC vimrc
+; Syntax highlighting queries for SiSU Spine markup
+; Compatible with tree-sitter highlight capture names from
+; https://tree-sitter.github.io/tree-sitter/syntax-highlighting
+
+; =================================================================
+; Comments
+; =================================================================
+(version_comment) @comment.documentation
+(header_comment) @comment
+(body_comment) @comment
+
+; =================================================================
+; Header (document metadata)
+; =================================================================
+(header_field
+ key: (header_key) @keyword)
+
+(header_field
+ value: (header_value) @string)
+
+(header_continuation) @string
+
+; =================================================================
+; Headings
+; =================================================================
+(part_marker) @keyword.directive
+(segment_marker) @keyword.directive
+
+(heading_part
+ content: (heading_content) @markup.heading)
+
+(heading_segment
+ content: (heading_content) @markup.heading)
+
+(segment_name) @label
+(suppress_marker) @punctuation.special
+
+; Heading levels for more specific styling
+(heading_part
+ marker: (part_marker) @markup.heading.1
+ (#match? @markup.heading.1 "^:A~$"))
+
+(heading_part
+ marker: (part_marker) @markup.heading.2
+ (#match? @markup.heading.2 "^:B~$"))
+
+(heading_part
+ marker: (part_marker) @markup.heading.3
+ (#match? @markup.heading.3 "^:C~$"))
+
+(heading_part
+ marker: (part_marker) @markup.heading.4
+ (#match? @markup.heading.4 "^:D~$"))
+
+(heading_segment
+ marker: (segment_marker) @markup.heading.5
+ (#match? @markup.heading.5 "^1~$"))
+
+(heading_segment
+ marker: (segment_marker) @markup.heading.6
+ (#match? @markup.heading.6 "^2~$"))
+
+; =================================================================
+; Inline formatting
+; =================================================================
+(emphasis) @markup.italic
+(bold) @markup.bold
+(italic) @markup.italic
+(underline) @markup.underline
+(citation_mark) @markup.quote
+(superscript) @markup.superscript
+(subscript) @markup.subscript
+(inserted) @markup.underline
+(strikethrough) @markup.strikethrough
+(monospace_inline) @markup.raw
+
+; Formatting delimiters
+["*{" "}*"] @punctuation.special
+["!{" "}!"] @punctuation.special
+["/{" "}/"] @punctuation.special
+["_{" "}_"] @punctuation.special
+["\"{" "}\""] @punctuation.special
+["^{" "}^"] @punctuation.special
+[",{" "},"] @punctuation.special
+["+{" "}+"] @punctuation.special
+["-{" "}-"] @punctuation.special
+["#{" "}#"] @punctuation.special
+
+; =================================================================
+; Footnotes and editor notes
+; =================================================================
+(footnote) @markup.link
+(footnote_marker) @punctuation.special
+(editor_note) @markup.link
+
+["~{" "}~"] @punctuation.special
+; Editor-note channel selector: ~[* (asterisk set) or ~[+ (plus set).
+; A distinct capture lets themes colour the two channels separately
+; from the generic footnote delimiters above.
+(editor_note_marker) @attribute
+["]~"] @punctuation.special
+
+; =================================================================
+; Links and images
+; =================================================================
+(link
+ text: (link_text) @markup.link.label)
+
+(link
+ target: (url) @markup.link.url)
+
+(link
+ target: (anchor_ref) @markup.link.url)
+
+(link
+ target: (collection_path) @markup.link.url)
+
+(auto_footnote_marker) @punctuation.special
+
+(image
+ spec: (image_spec) @markup.link.label)
+
+(url) @markup.link.url
+
+(inline_anchor) @label
+(anchor_name) @label
+
+; =================================================================
+; Block elements
+; =================================================================
+(block_open) @keyword.directive
+(block_close) @keyword.directive
+(raw_content) @markup.raw
+
+; Code blocks get more specific highlighting
+(code_block_curly
+ open: (block_open) @keyword.directive)
+(code_block_curly
+ content: (raw_content) @markup.raw.block)
+(code_block_curly
+ close: (block_close) @keyword.directive)
+
+(code_block_tic
+ open: (block_open) @keyword.directive)
+(code_block_tic
+ content: (raw_content) @markup.raw.block)
+(code_block_tic
+ close: (block_close) @keyword.directive)
+
+; =================================================================
+; Book index
+; =================================================================
+(book_index) @markup.list
+(index_content) @string
+
+; =================================================================
+; Paragraph prefixes
+; =================================================================
+(paragraph_prefix) @punctuation.special
+
+; =================================================================
+; Special markers
+; =================================================================
+(ocn_suppress) @comment
+(ocn_suppress_open) @comment
+(ocn_suppress_close) @comment
+
+(page_break) @punctuation.special
+(horizontal_rule) @punctuation.special
+
+; =================================================================
+; Composite includes
+; =================================================================
+(composite_include) @keyword.import
+(include_path) @string.special.path
+
+; =================================================================
+; Pipe table
+; =================================================================
+(table_spec) @keyword.directive
+(table_row) @markup.raw
+
+; =================================================================
+; Text
+; =================================================================
+(text) @spell
+
+; Line break
+(line_break) @punctuation.special
+#+END_SRC
+
+*** indents
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/queries/sisu/indents.scm"
+#+BEGIN_SRC vimrc
+; Indentation queries for SiSU Spine markup.
+;
+; SiSU markup is largely flat: paragraphs and headings live at column 0,
+; block bodies preserve their author-supplied indentation verbatim, and
+; nesting is by markers rather than by indent. So indents.scm is mostly a
+; no-op - the goal is to ensure that auto-indent on <CR> stays at column 0
+; for normal lines and respects existing indentation inside header
+; continuations and blocks.
+
+; Tree-sitter indent semantics (per nvim-treesitter and treesit):
+; @indent.begin - increases indent for the following line
+; @indent.end - matches the @indent.begin and decreases indent
+; @indent.zero - resets indent to column 0
+; @indent.align - aligns following lines with this node
+; @indent.branch - same level as the parent (for else/elif-style joins)
+
+; Top-level structures live at column 0 - reset to zero on the next line.
+(heading_part) @indent.zero
+(heading_segment) @indent.zero
+(paragraph) @indent.zero
+(book_index) @indent.zero
+(composite_include) @indent.zero
+(page_break) @indent.zero
+(horizontal_rule) @indent.zero
+(ocn_suppress_open) @indent.zero
+(ocn_suppress_close) @indent.zero
+(body_comment) @indent.zero
+
+; Block elements: opening line increases indent for the body, closing
+; line returns to zero. Editors that respect this will visually indent
+; raw content one step from the delimiter line, which is conventional.
+(code_block_curly) @indent.align
+(code_block_tic) @indent.align
+(poem_block_curly) @indent.align
+(poem_block_tic) @indent.align
+(block_block_curly) @indent.align
+(block_block_tic) @indent.align
+(group_block_curly) @indent.align
+(group_block_tic) @indent.align
+(table_block_curly) @indent.align
+(table_block_tic) @indent.align
+(quote_block_tic) @indent.align
+
+; Header continuation lines are indented by two spaces from column 0;
+; mark continuations as align so a host that chooses to auto-indent the
+; next continuation line matches the previous one.
+(header_field) @indent.align
+(header_continuation) @indent.align
+#+END_SRC
+
+*** injections
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/queries/sisu/injections.scm"
+#+BEGIN_SRC vimrc
+; Language injection queries for SiSU Spine markup
+;
+; Code blocks could potentially inject language-specific highlighting,
+; but SiSU code blocks don't specify language. These queries are
+; provided as a starting point for future extension.
+
+; Code block content could be injected with a specific language
+; if the block type or context provides a hint.
+; For now, raw content in code blocks is left unhighlighted.
+
+; Example: if code blocks specified a language, e.g. code(d){
+; ((code_block_curly
+; open: (block_open) @_open
+; content: (raw_content) @injection.content)
+; (#match? @_open "code\\(d\\)")
+; (#set! injection.language "d"))
+#+END_SRC
+
+*** textobjects
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/nvim/queries/sisu/textobjects.scm"
+#+BEGIN_SRC vimrc
+; Text-object queries for SiSU Spine markup.
+;
+; Capture conventions follow nvim-treesitter/textobjects:
+; @<thing>.outer -> select including delimiters / surrounding whitespace
+; @<thing>.inner -> select content only
+;
+; Hosts that consume these (Neovim's nvim-treesitter-textobjects, Helix,
+; Emacs treesit) bind keys such as `af` / `if` to .outer / .inner.
+
+; =================================================================
+; Headings (sectioning units)
+; =================================================================
+; A whole heading line is a "section header" object. Heading sections
+; (the heading plus its body content up to the next heading of equal or
+; higher level) are not directly expressible in tree-sitter without
+; additional grammar work; hosts can synthesise that from these captures.
+
+(heading_part) @class.outer
+(heading_part
+ content: (heading_content) @class.inner)
+
+(heading_segment) @class.outer
+(heading_segment
+ content: (heading_content) @class.inner)
+
+; =================================================================
+; Block elements (code / poem / block / group / table / quote)
+; =================================================================
+; Whole block including delimiters; raw_content is the inner.
+
+(code_block_curly) @function.outer
+(code_block_curly
+ content: (raw_content) @function.inner)
+
+(code_block_tic) @function.outer
+(code_block_tic
+ content: (raw_content) @function.inner)
+
+(poem_block_curly) @function.outer
+(poem_block_curly
+ content: (raw_content) @function.inner)
+
+(poem_block_tic) @function.outer
+(poem_block_tic
+ content: (raw_content) @function.inner)
+
+(block_block_curly) @function.outer
+(block_block_curly
+ content: (raw_content) @function.inner)
+
+(block_block_tic) @function.outer
+(block_block_tic
+ content: (raw_content) @function.inner)
+
+(group_block_curly) @function.outer
+(group_block_curly
+ content: (raw_content) @function.inner)
+
+(group_block_tic) @function.outer
+(group_block_tic
+ content: (raw_content) @function.inner)
+
+(table_block_curly) @function.outer
+(table_block_curly
+ content: (raw_content) @function.inner)
+
+(table_block_tic) @function.outer
+(table_block_tic
+ content: (raw_content) @function.inner)
+
+(quote_block_tic) @function.outer
+(quote_block_tic
+ content: (raw_content) @function.inner)
+
+(pipe_table) @function.outer
+
+; =================================================================
+; Footnotes and editor notes
+; =================================================================
+; Both share the same outer/inner shape; the inner skips the markers and
+; closing delimiters.
+
+(footnote) @comment.outer
+(footnote
+ (_)+ @comment.inner)
+
+(editor_note) @comment.outer
+(editor_note
+ (_)+ @comment.inner)
+
+; =================================================================
+; Links and images
+; =================================================================
+
+(link) @parameter.outer
+(link
+ text: (link_text) @parameter.inner)
+
+(image) @parameter.outer
+(image
+ spec: (image_spec) @parameter.inner)
+
+; =================================================================
+; Paragraph / inline-formatting runs
+; =================================================================
+
+(paragraph) @block.outer
+(paragraph
+ (_)+ @block.inner)
+
+; Inline formatting pairs - useful as fine-grained text objects.
+; The same delimiter character pattern (e.g. `*{` / `}*`) opens and
+; closes each, so .inner is everything between them.
+
+(emphasis) @assignment.outer
+(bold) @assignment.outer
+(italic) @assignment.outer
+(underline) @assignment.outer
+(citation_mark) @assignment.outer
+(superscript) @assignment.outer
+(subscript) @assignment.outer
+(inserted) @assignment.outer
+(strikethrough) @assignment.outer
+(monospace_inline) @assignment.outer
+
+; =================================================================
+; Book index entries
+; =================================================================
+
+(book_index) @attribute.outer
+(book_index
+ (index_content) @attribute.inner)
+
+; =================================================================
+; Header fields
+; =================================================================
+
+(header_field) @assignment.outer
+(header_field
+ value: (header_value) @assignment.inner)
+#+END_SRC
+
+* Emacs Syntax highlighting
** README
#+HEADER: :tangle "../sundry/editor-syntax-etc/emacs/README"
@@ -1914,18 +2546,36 @@ make:
#+HEADER: :tangle "../sundry/editor-syntax-etc/emacs/sisu-spine-mode-autoloads.el"
#+BEGIN_SRC elisp
(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))
+;; Regex / font-lock major mode. Fallback for Emacs < 29 and for users
+;; who have not installed the tree-sitter-sisu parser.
(autoload 'sisu-spine-mode "sisu-spine-mode" "\
Major mode for editing SiSU (spine) markup files.
SiSU (https://www.sisudoc.org/) document structuring, publishing
and search.
\(fn)" t nil)
-(add-to-list 'auto-mode-alist '("\\.sst\\'" . sisu-spine-mode))
-(add-to-list 'auto-mode-alist '("\\.ssm\\'" . sisu-spine-mode))
-(add-to-list 'auto-mode-alist '("\\.ssi\\'" . sisu-spine-mode))
+
+;; Tree-sitter major mode (Emacs 29+). When the parser is installed it
+;; is selected by `auto-mode-alist'; otherwise the regex mode is used.
+(autoload 'sisu-spine-ts-mode "sisu-spine-ts-mode" "\
+Tree-sitter major mode for editing SiSU (spine) markup files.
+
+\(fn)" t nil)
+(autoload 'sisu-spine-ts-install-grammar "sisu-spine-ts-mode" "\
+Install the tree-sitter-sisu grammar for `sisu-spine-ts-mode'.
+\(fn)" t nil)
+(defun sisu-spine-auto-mode ()
+ "Choose `sisu-spine-ts-mode' if the parser is installed, else fall back."
+ (if (and (fboundp 'treesit-ready-p) (treesit-ready-p 'sisu t))
+ (sisu-spine-ts-mode)
+ (sisu-spine-mode)))
+
+(add-to-list 'auto-mode-alist '("\\.sst\\'" . sisu-spine-auto-mode))
+(add-to-list 'auto-mode-alist '("\\.ssm\\'" . sisu-spine-auto-mode))
+(add-to-list 'auto-mode-alist '("\\.ssi\\'" . sisu-spine-auto-mode))
#+END_SRC
-** mode sisu-spine-mode.el
+** mode sisu-spine-mode.el (regex)
#+HEADER: :tangle "../sundry/editor-syntax-etc/emacs/sisu-spine-mode.el"
#+BEGIN_SRC elisp
@@ -2432,3 +3082,305 @@ URL `https://www.sisudoc.org/'"
;;; sisu-spine-mode.el ends here
#+END_SRC
+
+** mode sisu-spine-ts-mode.el (tree-sitter)
+
+#+HEADER: :tangle "../sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el"
+#+BEGIN_SRC elisp
+;;; sisu-spine-ts-mode.el --- Tree-sitter major mode for SiSU spine markup -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Free Software Foundation, Inc.
+
+;; Author: Ralph Amissah <ralph.amissah@gmail.com>
+;; Maintainer: Ralph Amissah <ralph.amissah@gmail.com>
+;; Keywords: text, syntax, processes, tools
+;; Version: 1.0.0
+;; URL: https://git.sisudoc.org/projects/sisudoc-spine/tree/sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el
+;; https://sisudoc.org/
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;;; Commentary:
+
+;; Tree-sitter-backed major mode for SiSU spine markup (.sst / .ssm /
+;; .ssi). Sibling to `sisu-spine-mode' (regex / font-lock); requires
+;; Emacs 29 or newer with `treesit' built in and the tree-sitter-sisu
+;; parser installed.
+;;
+;; To install the parser inside Emacs:
+;;
+;; M-x sisu-spine-ts-install-grammar RET
+;;
+;; or, equivalently:
+;;
+;; (add-to-list 'treesit-language-source-alist
+;; '(sisu "https://git.sisudoc.org/projects"
+;; :source-dir "tree-sitter-sisu/src"))
+;; M-x treesit-install-language-grammar RET sisu RET
+;;
+;; The mode is auto-enabled for .sst / .ssm / .ssi files when the parser
+;; is available. When it is not, `sisu-spine-mode' (the regex variant)
+;; remains available as a fallback.
+
+;;; Code:
+
+(require 'treesit nil t)
+
+(defgroup sisu-spine-ts nil
+ "Tree-sitter mode for SiSU spine markup."
+ :group 'text
+ :prefix "sisu-spine-ts-")
+
+;; ---------------------------------------------------------------------
+;; Faces (mirror the structural categories the highlights.scm assigns)
+;; ---------------------------------------------------------------------
+
+(defface sisu-spine-ts-heading-1-face
+ '((t (:inherit outline-1 :weight bold)))
+ "Face for :A~ headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-heading-2-face
+ '((t (:inherit outline-2 :weight bold)))
+ "Face for :B~ headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-heading-3-face
+ '((t (:inherit outline-3 :weight bold)))
+ "Face for :C~ / :D~ headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-heading-segment-face
+ '((t (:inherit outline-4)))
+ "Face for 1~ / 2~ / 3~ segment headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-block-delimiter-face
+ '((t (:inherit font-lock-keyword-face)))
+ "Face for block opening/closing delimiters."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-raw-content-face
+ '((t (:inherit font-lock-string-face)))
+ "Face for raw block content (code, table, etc.)."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-footnote-face
+ '((t (:inherit font-lock-doc-face)))
+ "Face for footnote and editor-note bodies."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-link-face
+ '((t (:inherit link)))
+ "Face for link text and target URLs."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-book-index-face
+ '((t (:inherit font-lock-preprocessor-face)))
+ "Face for book-index entries (={...})."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-marker-face
+ '((t (:inherit font-lock-builtin-face)))
+ "Face for inline-formatting delimiters and other punctuation markers."
+ :group 'sisu-spine-ts)
+
+;; ---------------------------------------------------------------------
+;; Font-lock rules
+;; ---------------------------------------------------------------------
+
+(defvar sisu-spine-ts--font-lock-settings
+ (when (fboundp 'treesit-font-lock-rules)
+ (treesit-font-lock-rules
+ :language 'sisu
+ :feature 'comment
+ '((version_comment) @font-lock-doc-face
+ (header_comment) @font-lock-comment-face
+ (body_comment) @font-lock-comment-face)
+
+ :language 'sisu
+ :feature 'header
+ '((header_field key: (header_key) @font-lock-keyword-face)
+ (header_field value: (header_value) @font-lock-string-face)
+ (header_continuation) @font-lock-string-face)
+
+ :language 'sisu
+ :feature 'heading
+ '(((heading_part marker: (part_marker) @m
+ content: (heading_content) @sisu-spine-ts-heading-1-face)
+ (:match "^:A~$" @m))
+ ((heading_part marker: (part_marker) @m
+ content: (heading_content) @sisu-spine-ts-heading-2-face)
+ (:match "^:B~$" @m))
+ ((heading_part marker: (part_marker) @m
+ content: (heading_content) @sisu-spine-ts-heading-3-face)
+ (:match "^:[CD]~$" @m))
+ (heading_part marker: (part_marker) @sisu-spine-ts-marker-face)
+ (heading_segment marker: (segment_marker) @sisu-spine-ts-marker-face
+ content: (heading_content) @sisu-spine-ts-heading-segment-face)
+ (segment_name) @font-lock-function-name-face
+ (suppress_marker) @sisu-spine-ts-marker-face)
+
+ :language 'sisu
+ :feature 'block
+ '((block_open) @sisu-spine-ts-block-delimiter-face
+ (block_close) @sisu-spine-ts-block-delimiter-face
+ (raw_content) @sisu-spine-ts-raw-content-face
+ (table_spec) @sisu-spine-ts-block-delimiter-face)
+
+ :language 'sisu
+ :feature 'inline
+ '((emphasis) @italic
+ (bold) @bold
+ (italic) @italic
+ (underline) @underline
+ (citation_mark) @font-lock-string-face
+ (superscript) @font-lock-type-face
+ (subscript) @font-lock-type-face
+ (inserted) @underline
+ (strikethrough) @shadow
+ (monospace_inline) @font-lock-constant-face)
+
+ :language 'sisu
+ :feature 'note
+ '((footnote) @sisu-spine-ts-footnote-face
+ (footnote_marker) @sisu-spine-ts-marker-face
+ (editor_note) @sisu-spine-ts-footnote-face)
+
+ :language 'sisu
+ :feature 'link
+ '((link text: (link_text) @sisu-spine-ts-link-face)
+ (link target: (url) @sisu-spine-ts-link-face)
+ (link target: (anchor_ref) @sisu-spine-ts-link-face)
+ (link target: (collection_path) @sisu-spine-ts-link-face)
+ (image spec: (image_spec) @sisu-spine-ts-link-face)
+ (auto_footnote_marker) @sisu-spine-ts-marker-face
+ (inline_anchor) @font-lock-function-name-face
+ (anchor_name) @font-lock-function-name-face)
+
+ :language 'sisu
+ :feature 'index
+ '((book_index) @sisu-spine-ts-book-index-face
+ (index_content) @font-lock-string-face)
+
+ :language 'sisu
+ :feature 'misc
+ '((paragraph_prefix) @sisu-spine-ts-marker-face
+ (page_break) @sisu-spine-ts-marker-face
+ (horizontal_rule) @sisu-spine-ts-marker-face
+ (line_break) @sisu-spine-ts-marker-face
+ (ocn_suppress) @font-lock-comment-face
+ (ocn_suppress_open) @font-lock-comment-face
+ (ocn_suppress_close) @font-lock-comment-face
+ (composite_include) @font-lock-preprocessor-face
+ (include_path) @font-lock-string-face)))
+ "Tree-sitter font-lock rules for `sisu-spine-ts-mode'.")
+
+;; ---------------------------------------------------------------------
+;; Imenu / navigation / things
+;; ---------------------------------------------------------------------
+
+(defvar sisu-spine-ts--imenu-settings
+ '(("Part headings"
+ "\\`heading_part\\'"
+ nil
+ sisu-spine-ts--imenu-name-part)
+ ("Segment headings"
+ "\\`heading_segment\\'"
+ nil
+ sisu-spine-ts--imenu-name-segment))
+ "`treesit-simple-imenu-settings' for `sisu-spine-ts-mode'.")
+
+(defun sisu-spine-ts--imenu-name-part (node)
+ "Return display name for a heading_part NODE."
+ (let ((c (treesit-node-child-by-field-name node "content"))
+ (m (treesit-node-child-by-field-name node "marker")))
+ (concat (and m (treesit-node-text m t)) " "
+ (and c (treesit-node-text c t)))))
+
+(defun sisu-spine-ts--imenu-name-segment (node)
+ "Return display name for a heading_segment NODE."
+ (let ((c (treesit-node-child-by-field-name node "content"))
+ (m (treesit-node-child-by-field-name node "marker")))
+ (concat (and m (treesit-node-text m t)) " "
+ (and c (treesit-node-text c t)))))
+
+(defvar sisu-spine-ts--thing-settings
+ '((sisu
+ (defun "\\`heading_\\(part\\|segment\\)\\'")
+ (sentence "\\`paragraph\\'")
+ (text "\\`\\(text\\|raw_content\\|heading_content\\)\\'")))
+ "`treesit-thing-settings' for `sisu-spine-ts-mode'.")
+
+;; ---------------------------------------------------------------------
+;; Grammar install helper
+;; ---------------------------------------------------------------------
+
+;;;###autoload
+(defun sisu-spine-ts-install-grammar ()
+ "Register and install the tree-sitter-sisu grammar.
+Convenience wrapper around `treesit-install-language-grammar' with the
+upstream URL and source directory pre-filled."
+ (interactive)
+ (unless (boundp 'treesit-language-source-alist)
+ (user-error "treesit not available; Emacs 29+ required"))
+ (add-to-list 'treesit-language-source-alist
+ '(sisu "https://git.sisudoc.org/projects"
+ :source-dir "tree-sitter-sisu/src"))
+ (treesit-install-language-grammar 'sisu))
+
+;; ---------------------------------------------------------------------
+;; Major mode
+;; ---------------------------------------------------------------------
+
+;;;###autoload
+(define-derived-mode sisu-spine-ts-mode text-mode "SiSU-Spine[ts]"
+ "Major mode for SiSU spine markup, backed by tree-sitter."
+ (unless (and (fboundp 'treesit-ready-p) (treesit-ready-p 'sisu))
+ (user-error
+ "tree-sitter-sisu parser not installed; run M-x sisu-spine-ts-install-grammar"))
+ (treesit-parser-create 'sisu)
+
+ ;; Comments
+ (setq-local comment-start "% "
+ comment-end ""
+ comment-start-skip "%[ \t]+")
+
+ ;; Font-lock
+ (setq-local treesit-font-lock-settings sisu-spine-ts--font-lock-settings)
+ (setq-local treesit-font-lock-feature-list
+ '((comment header heading)
+ (block inline note link index)
+ (misc)
+ ()))
+
+ ;; Imenu / navigation
+ (setq-local treesit-simple-imenu-settings sisu-spine-ts--imenu-settings)
+ (setq-local treesit-thing-settings sisu-spine-ts--thing-settings)
+ (setq-local treesit-defun-type-regexp "\\`heading_\\(part\\|segment\\)\\'")
+ (setq-local treesit-defun-name-function
+ (lambda (node)
+ (let ((c (treesit-node-child-by-field-name node "content")))
+ (and c (treesit-node-text c t)))))
+
+ (treesit-major-mode-setup))
+
+;;;###autoload
+(when (fboundp 'treesit-ready-p)
+ (dolist (ext '("\\.sst\\'" "\\.ssm\\'" "\\.ssi\\'"))
+ ;; Prefer the ts mode iff the parser is installed; otherwise fall
+ ;; back to `sisu-spine-mode'.
+ (add-to-list 'auto-mode-alist
+ (cons ext
+ (lambda ()
+ (if (treesit-ready-p 'sisu t)
+ (sisu-spine-ts-mode)
+ (sisu-spine-mode)))))))
+
+(provide 'sisu-spine-ts-mode)
+
+;;; sisu-spine-ts-mode.el ends here
+#+END_SRC
diff --git a/org/util_spine_markup_conversion_from_sisu.org b/org/util_spine_markup_conversion_from_sisu.org
index 42bdbe1..a4bcb5b 100644
--- a/org/util_spine_markup_conversion_from_sisu.org
+++ b/org/util_spine_markup_conversion_from_sisu.org
@@ -7,13 +7,13 @@
#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
#+LANGUAGE: en
#+STARTUP: content hideblocks hidestars noindent entitiespretty
-#+PROPERTY: header-args :exports code
-#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results silent
-#+PROPERTY: header-args+ :cache no
-#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :eval never-export :exports code
+#+PROPERTY: header-args+ :noweb yes :padline no
+#+PROPERTY: header-args+ :results silent :cache no
#+PROPERTY: header-args+ :mkdirp yes
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+- magic single double-quote → " ← FIX changes hilighting behavior (occuring
+ after it) in org document. INVESTIGATE (org-mode CONFIG?) FIND & FIX
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
@@ -21,14 +21,14 @@
** README
-#+HEADER: :tangle "../sundry/misc/util/d/tools/markup_conversion/README"
+#+HEADER: :tangle "../sundry/util/d/tools/markup_conversion/README"
#+BEGIN_SRC text
#+END_SRC
** endnotes, inline from binary
*** tangle
-#+HEADER: :tangle "../sundry/misc/util/d/tools/markup_conversion/endnotes_inline_from_binary.d"
+#+HEADER: :tangle "../sundry/util/d/tools/markup_conversion/endnotes_inline_from_binary.d"
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang #!/usr/bin/env rdmd
#+BEGIN_SRC d
@@ -208,7 +208,7 @@ if (endnotes.length == endnote_ref_count) {
** conversion from sisu (sisu bespoke headers) any binary to inline notes TODO
*** tangle
-#+HEADER: :tangle "../sundry/misc/util/d/tools/markup_conversion/markup_conversion_from_sisu_ruby_to_sisu_spine.d"
+#+HEADER: :tangle "../sundry/util/d/tools/markup_conversion/markup_conversion_from_sisu_ruby_to_sisu_spine.d"
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang #!/usr/bin/env rdmd
#+BEGIN_SRC d
@@ -669,7 +669,7 @@ foreach (paragraph; paragraphs) {
** conversion from sisu and multiple headers (sisu bespoke, sdlang, toml) incomplete
*** tangle
-#+HEADER: :tangle "../sundry/misc/util/d/tools/markup_conversion/markup_changes_header_and_content.d"
+#+HEADER: :tangle "../sundry/util/d/tools/markup_conversion/markup_changes_header_and_content.d"
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang #!/usr/bin/env rdmd
#+BEGIN_SRC d
diff --git a/src/sisudoc/io_out/latex.d b/src/sisudoc/io_out/latex.d
index 39dc932..8a1ae3e 100644
--- a/src/sisudoc/io_out/latex.d
+++ b/src/sisudoc/io_out/latex.d
@@ -679,7 +679,7 @@ template outputLaTeX() {
\pagenumbering{alph}
\setcounter{page}{1}
\markboth{%s}{%s}
-\br\linebreak Copyright {\begin{small}{\copyright\end{small}} %s \br\linebreak
+\br\linebreak Copyright \begin{small}\copyright\end{small} %s \br\linebreak
%s
\clearpage┃";
_txt = format(_tex_para,
@@ -1518,7 +1518,7 @@ template outputLaTeXstyStatic() {
\usepackage{multicol}
\setlength{\marginparsep}{4mm}
\setlength{\marginparwidth}{8mm}
-\usepackage[scaled]{dejavu}
+\usepackage{dejavu}
\renewcommand*\familydefault{\sfdefault}
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
@@ -1682,8 +1682,8 @@ template outputLaTeXstyStatic() {
}
\newcommand{\spaces}[1]{{\hspace*{#1ex}}}
\newcommand{\s}{\hspace*{1ex}}
-\renewcommand{\hardspace}{\hspace*{1ex}}
-\newcommand{\-}{\hspace*{1ex}}
+\newcommand{\hardspace}{\hspace*{1ex}}
+\renewcommand{\-}{\hspace*{1ex}}
\newcommand{\caret}{{\^{~}}}
\newcommand{\pipe}{{\textbar}}
\newcommand{\curlyOpen}{{}
diff --git a/src/sisudoc/io_out/odt.d b/src/sisudoc/io_out/odt.d
index 1d0e647..7a85bfb 100644
--- a/src/sisudoc/io_out/odt.d
+++ b/src/sisudoc/io_out/odt.d
@@ -892,7 +892,7 @@ template outputODT() {
}
return doc_odt;
}
-
+ ;
string odt_tail() {
string _odt_tail = format(q"┃<text:p text:style-name="P_normal">spine: &lt;<text:a xl:type="simple" xl:href="https://www.sisudoc.org">www.sisudoc.org</text:a>&gt; and &lt;<text:a xl:type="simple" xl:href="https://www.sisudoc.org">www.sisudoc.org</text:a>&gt;</text:p>
</office:text></office:body></office:document-content>┃",);
@@ -2117,7 +2117,6 @@ template outputODT() {
pth_odt.manifest_rdf("fs"); /+ (manifest.rdf) +/
pth_odt.settings_xml("fs"); /+ (settings.xml) +/
pth_odt.styles_xml("fs"); /+ (styles_xml) +/
-
pth_odt.content_xml("fs");
pth_odt.manifest_xml("fs");
pth_odt.meta_xml("fs");
diff --git a/src/sisudoc/io_out/source_pod.d b/src/sisudoc/io_out/source_pod.d
index 138f105..b015a04 100644
--- a/src/sisudoc/io_out/source_pod.d
+++ b/src/sisudoc/io_out/source_pod.d
@@ -195,29 +195,38 @@ template spinePod() {
}
} { // bundle abstraction .ssp file (only for --pod2)
if (doc_matters.opt.action.pod2) {
- import sisudoc.io_out.paths_output;
- auto out_pth = spineOutPaths!()(doc_matters.output_path, doc_matters.src.language);
- string abstraction_dir = ((out_pth.output_base.chainPath("abstraction")).asNormalizedPath).array;
- string ssp_filename = doc_matters.src.doc_uid_out ~ ".ssp";
- string fn_src_in = ((abstraction_dir.chainPath(ssp_filename)).asNormalizedPath).array.to!string;
- auto fn_src_out_pod_zip_base
- = pths_pod.abstraction_root(doc_matters.src.filename).zpod.to!string
- ~ "/" ~ ssp_filename;
- auto fn_src_out_filesystem
- = pths_pod.abstraction_root(doc_matters.src.filename).filesystem_open_zpod.to!string
- ~ "/" ~ ssp_filename;
- if (exists(fn_src_in)) {
- debug(io) { writeln("(io debug) src out found: ", fn_src_in); }
- { // take DIGEST write to pod file digests.txt
- auto data = (cast(byte[]) (fn_src_in).read);
- _digests[doc_matters.src.language]["ssp"] ~= data.sha256Of.toHexString
- ~ "::" ~ data.length.to!string ~ " - " ~ ssp_filename ~ "\n";
- }
- fn_src_in.copy(fn_src_out_filesystem);
- zip = podArchive("file_path_text", fn_src_in, fn_src_out_pod_zip_base, zip);
- } else {
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
- writeln("WARNING (io) src out NOT found (abstraction): ", fn_src_in);
+ if (doc_matters.src.language == doc_matters.pod.manifest_list_of_languages[$-1]) { // wait until all language versions of .ssp generated
+ import sisudoc.io_out.paths_output;
+ /+ doc_uid_out for any language follows the same pattern, differing
+ only in the trailing ".{lng}". Strip the current language to
+ reuse the base across all languages. +/
+ string _doc_uid_base
+ = doc_matters.src.doc_uid_out[0 .. $ - doc_matters.src.lng.length];
+ foreach (_lang; doc_matters.pod.manifest_list_of_languages) { // do for all language versions
+ auto out_pth_lng = spineOutPaths!()(doc_matters.output_path, _lang);
+ string abstraction_dir = ((out_pth_lng.output_base.chainPath("abstraction")).asNormalizedPath).array;
+ string ssp_filename = _doc_uid_base ~ _lang ~ ".ssp";
+ string fn_src_in = ((abstraction_dir.chainPath(ssp_filename)).asNormalizedPath).array.to!string;
+ auto fn_src_out_pod_zip_base
+ = pths_pod.abstraction_root(doc_matters.src.filename).zpod.to!string
+ ~ "/" ~ ssp_filename;
+ auto fn_src_out_filesystem
+ = pths_pod.abstraction_root(doc_matters.src.filename).filesystem_open_zpod.to!string
+ ~ "/" ~ ssp_filename;
+ if (exists(fn_src_in)) {
+ debug(io) { writeln("(io debug) src out found: ", fn_src_in); }
+ { // take DIGEST write to pod file digests.txt
+ auto data = (cast(byte[]) (fn_src_in).read);
+ _digests[_lang]["ssp"] ~= data.sha256Of.toHexString
+ ~ "::" ~ data.length.to!string ~ " - " ~ ssp_filename ~ "\n";
+ }
+ fn_src_in.copy(fn_src_out_filesystem);
+ zip = podArchive("file_path_text", fn_src_in, fn_src_out_pod_zip_base, zip);
+ } else {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
+ writeln("WARNING (io) src out NOT found (abstraction): ", fn_src_in);
+ }
+ }
}
}
}
diff --git a/src/sisudoc/io_out/sqlite.d b/src/sisudoc/io_out/sqlite.d
index b5c0f47..4ce5e0d 100644
--- a/src/sisudoc/io_out/sqlite.d
+++ b/src/sisudoc/io_out/sqlite.d
@@ -71,7 +71,12 @@ template SQLiteHubBuildTablesAndPopulate() {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
template SQLiteDbStatementComposite() {
void SQLiteDbStatementComposite(Db,D)(
@@ -85,7 +90,12 @@ template SQLiteHubBuildTablesAndPopulate() {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
_db_statement ~= SQLiteTablesReCreate!()();
SQLiteDbRun!()(db, _db_statement, doc.matters.opt.action, "TABLE RE-CREATE");
@@ -154,7 +164,12 @@ template SQLiteHubDiscreteBuildTablesAndPopulate() {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
auto db = Database(pth_sqlite.sqlite_file(doc.matters.src.filename));
template SQLiteDiscreteDbStatementComposite() {
@@ -1671,7 +1686,12 @@ template SQLiteTablesCreate() {
} else {
try {
pth_sqlite.base.mkdirRecurse;
- } catch (FileException ex) { }
+ } catch (FileException ex) {
+ stderr.writeln("FATAL: cannot create --sqlite-db-path directory: ", pth_sqlite.base);
+ stderr.writeln(" (", ex.msg, ")");
+ import core.runtime;
+ core.runtime.Runtime.terminate();
+ }
}
auto db = Database(pth_sqlite.sqlite_file);
{
diff --git a/src/sisudoc/meta/metadoc_from_src_functions.d b/src/sisudoc/meta/metadoc_from_src_functions.d
index e633ca1..bb3cd4e 100644
--- a/src/sisudoc/meta/metadoc_from_src_functions.d
+++ b/src/sisudoc/meta/metadoc_from_src_functions.d
@@ -1929,7 +1929,6 @@ template docAbstractionFunctions() {
return ret;
}
// ↑ - table
-
@system ST_flow_block_flag_line_empty flow_block_flag_line_empty_(B,CMM,Ts)(
char[] line,
string[string] an_object,
diff --git a/sundry/editor-syntax-etc/emacs/sisu-spine-mode-autoloads.el b/sundry/editor-syntax-etc/emacs/sisu-spine-mode-autoloads.el
index 4cc6332..098a28c 100644
--- a/sundry/editor-syntax-etc/emacs/sisu-spine-mode-autoloads.el
+++ b/sundry/editor-syntax-etc/emacs/sisu-spine-mode-autoloads.el
@@ -1,10 +1,28 @@
(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))
+;; Regex / font-lock major mode. Fallback for Emacs < 29 and for users
+;; who have not installed the tree-sitter-sisu parser.
(autoload 'sisu-spine-mode "sisu-spine-mode" "\
Major mode for editing SiSU (spine) markup files.
SiSU (https://www.sisudoc.org/) document structuring, publishing
and search.
\(fn)" t nil)
-(add-to-list 'auto-mode-alist '("\\.sst\\'" . sisu-spine-mode))
-(add-to-list 'auto-mode-alist '("\\.ssm\\'" . sisu-spine-mode))
-(add-to-list 'auto-mode-alist '("\\.ssi\\'" . sisu-spine-mode))
+
+;; Tree-sitter major mode (Emacs 29+). When the parser is installed it
+;; is selected by `auto-mode-alist'; otherwise the regex mode is used.
+(autoload 'sisu-spine-ts-mode "sisu-spine-ts-mode" "\
+Tree-sitter major mode for editing SiSU (spine) markup files.
+
+\(fn)" t nil)
+(autoload 'sisu-spine-ts-install-grammar "sisu-spine-ts-mode" "\
+Install the tree-sitter-sisu grammar for `sisu-spine-ts-mode'.
+\(fn)" t nil)
+(defun sisu-spine-auto-mode ()
+ "Choose `sisu-spine-ts-mode' if the parser is installed, else fall back."
+ (if (and (fboundp 'treesit-ready-p) (treesit-ready-p 'sisu t))
+ (sisu-spine-ts-mode)
+ (sisu-spine-mode)))
+
+(add-to-list 'auto-mode-alist '("\\.sst\\'" . sisu-spine-auto-mode))
+(add-to-list 'auto-mode-alist '("\\.ssm\\'" . sisu-spine-auto-mode))
+(add-to-list 'auto-mode-alist '("\\.ssi\\'" . sisu-spine-auto-mode))
diff --git a/sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el b/sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el
new file mode 100644
index 0000000..ef59d14
--- /dev/null
+++ b/sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el
@@ -0,0 +1,296 @@
+;;; sisu-spine-ts-mode.el --- Tree-sitter major mode for SiSU spine markup -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Free Software Foundation, Inc.
+
+;; Author: Ralph Amissah <ralph.amissah@gmail.com>
+;; Maintainer: Ralph Amissah <ralph.amissah@gmail.com>
+;; Keywords: text, syntax, processes, tools
+;; Version: 1.0.0
+;; URL: https://git.sisudoc.org/projects/sisudoc-spine/tree/sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el
+;; https://sisudoc.org/
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;;; Commentary:
+
+;; Tree-sitter-backed major mode for SiSU spine markup (.sst / .ssm /
+;; .ssi). Sibling to `sisu-spine-mode' (regex / font-lock); requires
+;; Emacs 29 or newer with `treesit' built in and the tree-sitter-sisu
+;; parser installed.
+;;
+;; To install the parser inside Emacs:
+;;
+;; M-x sisu-spine-ts-install-grammar RET
+;;
+;; or, equivalently:
+;;
+;; (add-to-list 'treesit-language-source-alist
+;; '(sisu "https://git.sisudoc.org/projects"
+;; :source-dir "tree-sitter-sisu/src"))
+;; M-x treesit-install-language-grammar RET sisu RET
+;;
+;; The mode is auto-enabled for .sst / .ssm / .ssi files when the parser
+;; is available. When it is not, `sisu-spine-mode' (the regex variant)
+;; remains available as a fallback.
+
+;;; Code:
+
+(require 'treesit nil t)
+
+(defgroup sisu-spine-ts nil
+ "Tree-sitter mode for SiSU spine markup."
+ :group 'text
+ :prefix "sisu-spine-ts-")
+
+;; ---------------------------------------------------------------------
+;; Faces (mirror the structural categories the highlights.scm assigns)
+;; ---------------------------------------------------------------------
+
+(defface sisu-spine-ts-heading-1-face
+ '((t (:inherit outline-1 :weight bold)))
+ "Face for :A~ headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-heading-2-face
+ '((t (:inherit outline-2 :weight bold)))
+ "Face for :B~ headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-heading-3-face
+ '((t (:inherit outline-3 :weight bold)))
+ "Face for :C~ / :D~ headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-heading-segment-face
+ '((t (:inherit outline-4)))
+ "Face for 1~ / 2~ / 3~ segment headings."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-block-delimiter-face
+ '((t (:inherit font-lock-keyword-face)))
+ "Face for block opening/closing delimiters."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-raw-content-face
+ '((t (:inherit font-lock-string-face)))
+ "Face for raw block content (code, table, etc.)."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-footnote-face
+ '((t (:inherit font-lock-doc-face)))
+ "Face for footnote and editor-note bodies."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-link-face
+ '((t (:inherit link)))
+ "Face for link text and target URLs."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-book-index-face
+ '((t (:inherit font-lock-preprocessor-face)))
+ "Face for book-index entries (={...})."
+ :group 'sisu-spine-ts)
+
+(defface sisu-spine-ts-marker-face
+ '((t (:inherit font-lock-builtin-face)))
+ "Face for inline-formatting delimiters and other punctuation markers."
+ :group 'sisu-spine-ts)
+
+;; ---------------------------------------------------------------------
+;; Font-lock rules
+;; ---------------------------------------------------------------------
+
+(defvar sisu-spine-ts--font-lock-settings
+ (when (fboundp 'treesit-font-lock-rules)
+ (treesit-font-lock-rules
+ :language 'sisu
+ :feature 'comment
+ '((version_comment) @font-lock-doc-face
+ (header_comment) @font-lock-comment-face
+ (body_comment) @font-lock-comment-face)
+
+ :language 'sisu
+ :feature 'header
+ '((header_field key: (header_key) @font-lock-keyword-face)
+ (header_field value: (header_value) @font-lock-string-face)
+ (header_continuation) @font-lock-string-face)
+
+ :language 'sisu
+ :feature 'heading
+ '(((heading_part marker: (part_marker) @m
+ content: (heading_content) @sisu-spine-ts-heading-1-face)
+ (:match "^:A~$" @m))
+ ((heading_part marker: (part_marker) @m
+ content: (heading_content) @sisu-spine-ts-heading-2-face)
+ (:match "^:B~$" @m))
+ ((heading_part marker: (part_marker) @m
+ content: (heading_content) @sisu-spine-ts-heading-3-face)
+ (:match "^:[CD]~$" @m))
+ (heading_part marker: (part_marker) @sisu-spine-ts-marker-face)
+ (heading_segment marker: (segment_marker) @sisu-spine-ts-marker-face
+ content: (heading_content) @sisu-spine-ts-heading-segment-face)
+ (segment_name) @font-lock-function-name-face
+ (suppress_marker) @sisu-spine-ts-marker-face)
+
+ :language 'sisu
+ :feature 'block
+ '((block_open) @sisu-spine-ts-block-delimiter-face
+ (block_close) @sisu-spine-ts-block-delimiter-face
+ (raw_content) @sisu-spine-ts-raw-content-face
+ (table_spec) @sisu-spine-ts-block-delimiter-face)
+
+ :language 'sisu
+ :feature 'inline
+ '((emphasis) @italic
+ (bold) @bold
+ (italic) @italic
+ (underline) @underline
+ (citation_mark) @font-lock-string-face
+ (superscript) @font-lock-type-face
+ (subscript) @font-lock-type-face
+ (inserted) @underline
+ (strikethrough) @shadow
+ (monospace_inline) @font-lock-constant-face)
+
+ :language 'sisu
+ :feature 'note
+ '((footnote) @sisu-spine-ts-footnote-face
+ (footnote_marker) @sisu-spine-ts-marker-face
+ (editor_note) @sisu-spine-ts-footnote-face)
+
+ :language 'sisu
+ :feature 'link
+ '((link text: (link_text) @sisu-spine-ts-link-face)
+ (link target: (url) @sisu-spine-ts-link-face)
+ (link target: (anchor_ref) @sisu-spine-ts-link-face)
+ (link target: (collection_path) @sisu-spine-ts-link-face)
+ (image spec: (image_spec) @sisu-spine-ts-link-face)
+ (auto_footnote_marker) @sisu-spine-ts-marker-face
+ (inline_anchor) @font-lock-function-name-face
+ (anchor_name) @font-lock-function-name-face)
+
+ :language 'sisu
+ :feature 'index
+ '((book_index) @sisu-spine-ts-book-index-face
+ (index_content) @font-lock-string-face)
+
+ :language 'sisu
+ :feature 'misc
+ '((paragraph_prefix) @sisu-spine-ts-marker-face
+ (page_break) @sisu-spine-ts-marker-face
+ (horizontal_rule) @sisu-spine-ts-marker-face
+ (line_break) @sisu-spine-ts-marker-face
+ (ocn_suppress) @font-lock-comment-face
+ (ocn_suppress_open) @font-lock-comment-face
+ (ocn_suppress_close) @font-lock-comment-face
+ (composite_include) @font-lock-preprocessor-face
+ (include_path) @font-lock-string-face)))
+ "Tree-sitter font-lock rules for `sisu-spine-ts-mode'.")
+
+;; ---------------------------------------------------------------------
+;; Imenu / navigation / things
+;; ---------------------------------------------------------------------
+
+(defvar sisu-spine-ts--imenu-settings
+ '(("Part headings"
+ "\\`heading_part\\'"
+ nil
+ sisu-spine-ts--imenu-name-part)
+ ("Segment headings"
+ "\\`heading_segment\\'"
+ nil
+ sisu-spine-ts--imenu-name-segment))
+ "`treesit-simple-imenu-settings' for `sisu-spine-ts-mode'.")
+
+(defun sisu-spine-ts--imenu-name-part (node)
+ "Return display name for a heading_part NODE."
+ (let ((c (treesit-node-child-by-field-name node "content"))
+ (m (treesit-node-child-by-field-name node "marker")))
+ (concat (and m (treesit-node-text m t)) " "
+ (and c (treesit-node-text c t)))))
+
+(defun sisu-spine-ts--imenu-name-segment (node)
+ "Return display name for a heading_segment NODE."
+ (let ((c (treesit-node-child-by-field-name node "content"))
+ (m (treesit-node-child-by-field-name node "marker")))
+ (concat (and m (treesit-node-text m t)) " "
+ (and c (treesit-node-text c t)))))
+
+(defvar sisu-spine-ts--thing-settings
+ '((sisu
+ (defun "\\`heading_\\(part\\|segment\\)\\'")
+ (sentence "\\`paragraph\\'")
+ (text "\\`\\(text\\|raw_content\\|heading_content\\)\\'")))
+ "`treesit-thing-settings' for `sisu-spine-ts-mode'.")
+
+;; ---------------------------------------------------------------------
+;; Grammar install helper
+;; ---------------------------------------------------------------------
+
+;;;###autoload
+(defun sisu-spine-ts-install-grammar ()
+ "Register and install the tree-sitter-sisu grammar.
+Convenience wrapper around `treesit-install-language-grammar' with the
+upstream URL and source directory pre-filled."
+ (interactive)
+ (unless (boundp 'treesit-language-source-alist)
+ (user-error "treesit not available; Emacs 29+ required"))
+ (add-to-list 'treesit-language-source-alist
+ '(sisu "https://git.sisudoc.org/projects"
+ :source-dir "tree-sitter-sisu/src"))
+ (treesit-install-language-grammar 'sisu))
+
+;; ---------------------------------------------------------------------
+;; Major mode
+;; ---------------------------------------------------------------------
+
+;;;###autoload
+(define-derived-mode sisu-spine-ts-mode text-mode "SiSU-Spine[ts]"
+ "Major mode for SiSU spine markup, backed by tree-sitter."
+ (unless (and (fboundp 'treesit-ready-p) (treesit-ready-p 'sisu))
+ (user-error
+ "tree-sitter-sisu parser not installed; run M-x sisu-spine-ts-install-grammar"))
+ (treesit-parser-create 'sisu)
+
+ ;; Comments
+ (setq-local comment-start "% "
+ comment-end ""
+ comment-start-skip "%[ \t]+")
+
+ ;; Font-lock
+ (setq-local treesit-font-lock-settings sisu-spine-ts--font-lock-settings)
+ (setq-local treesit-font-lock-feature-list
+ '((comment header heading)
+ (block inline note link index)
+ (misc)
+ ()))
+
+ ;; Imenu / navigation
+ (setq-local treesit-simple-imenu-settings sisu-spine-ts--imenu-settings)
+ (setq-local treesit-thing-settings sisu-spine-ts--thing-settings)
+ (setq-local treesit-defun-type-regexp "\\`heading_\\(part\\|segment\\)\\'")
+ (setq-local treesit-defun-name-function
+ (lambda (node)
+ (let ((c (treesit-node-child-by-field-name node "content")))
+ (and c (treesit-node-text c t)))))
+
+ (treesit-major-mode-setup))
+
+;;;###autoload
+(when (fboundp 'treesit-ready-p)
+ (dolist (ext '("\\.sst\\'" "\\.ssm\\'" "\\.ssi\\'"))
+ ;; Prefer the ts mode iff the parser is installed; otherwise fall
+ ;; back to `sisu-spine-mode'.
+ (add-to-list 'auto-mode-alist
+ (cons ext
+ (lambda ()
+ (if (treesit-ready-p 'sisu t)
+ (sisu-spine-ts-mode)
+ (sisu-spine-mode)))))))
+
+(provide 'sisu-spine-ts-mode)
+
+;;; sisu-spine-ts-mode.el ends here
diff --git a/sundry/editor-syntax-etc/nvim/README.md b/sundry/editor-syntax-etc/nvim/README.md
new file mode 100644
index 0000000..8e889e7
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/README.md
@@ -0,0 +1,87 @@
+# Neovim integration for SiSU spine markup
+
+Tree-sitter-backed syntax highlighting, folding, and structural
+navigation for `.sst` / `.ssm` / `.ssi` files in Neovim (>= 0.9).
+
+## What is in this directory
+
+```
+nvim/
+ ftdetect/sisu.lua - register .sst/.ssm/.ssi as filetype "sisu"
+ ftplugin/sisu.lua - per-buffer settings (commentstring, conceal)
+ lua/sisu-spine/init.lua - entry point: registers parser config
+ queries/sisu/ - tree-sitter queries (mirrors tree-sitter-sisu/queries/)
+ highlights.scm
+ folds.scm
+ injections.scm
+ textobjects.scm
+ indents.scm
+```
+
+## Install (manual)
+
+1. Symlink or copy this directory into your Neovim runtime path:
+
+ ```sh
+ ln -s /path/to/sisudoc-spine/sundry/editor-syntax-etc/nvim \
+ ~/.config/nvim/pack/sisu/start/sisu-spine
+ ```
+
+2. Tell `nvim-treesitter` how to fetch the parser. Add to your config
+ (`init.lua`):
+
+ ```lua
+ require("sisu-spine").setup()
+ require("nvim-treesitter.configs").setup({
+ ensure_installed = { "sisu" },
+ highlight = { enable = true },
+ indent = { enable = true },
+ fold = { enable = true },
+ textobjects = { select = { enable = true, lookahead = true } },
+ })
+ ```
+
+3. Build the parser:
+
+ ```vim
+ :TSInstall sisu
+ ```
+
+That is it. Open a `.sst` file - highlighting, folding, and textobject
+selection should all work.
+
+## Install (lazy.nvim)
+
+```lua
+{
+ dir = "/path/to/sisudoc-spine/sundry/editor-syntax-etc/nvim",
+ name = "sisu-spine",
+ ft = { "sisu" },
+ dependencies = { "nvim-treesitter/nvim-treesitter" },
+ config = function()
+ require("sisu-spine").setup()
+ end,
+}
+```
+
+## Sync queries from upstream
+
+The query files are duplicated from `tree-sitter-sisu/queries/` so that
+this Neovim drop-in works without depending on the parser repo's
+checkout layout. To refresh them after grammar changes:
+
+```sh
+cp ../../../sisudoc-spine-tools/tree-sitter-sisu/queries/*.scm \
+ queries/sisu/
+```
+
+(Path is relative to this README.)
+
+## Upstreaming the parser
+
+When the parser is publicly hosted under a stable URL it is worth
+submitting a config to `nvim-treesitter` so users can run `:TSInstall
+sisu` without the local `setup()` call. The required fields are in
+`lua/sisu-spine/init.lua` (`install_info` table); send a PR to
+<https://github.com/nvim-treesitter/nvim-treesitter> patching
+`lua/nvim-treesitter/parsers.lua`.
diff --git a/sundry/editor-syntax-etc/nvim/ftdetect/sisu.lua b/sundry/editor-syntax-etc/nvim/ftdetect/sisu.lua
new file mode 100644
index 0000000..51b4f2f
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/ftdetect/sisu.lua
@@ -0,0 +1,7 @@
+vim.filetype.add({
+ extension = {
+ sst = "sisu",
+ ssm = "sisu",
+ ssi = "sisu",
+ },
+})
diff --git a/sundry/editor-syntax-etc/nvim/ftplugin/sisu.lua b/sundry/editor-syntax-etc/nvim/ftplugin/sisu.lua
new file mode 100644
index 0000000..a531238
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/ftplugin/sisu.lua
@@ -0,0 +1,13 @@
+-- Buffer-local settings for SiSU spine markup.
+
+vim.bo.commentstring = "%% %s"
+vim.bo.comments = ":%"
+
+-- Soft wrap suits prose.
+vim.wo.wrap = true
+vim.wo.linebreak = true
+
+-- Conceal inline-formatting delimiters when the user opts in
+-- (`:set conceallevel=2`). See queries/sisu/highlights.scm for
+-- @conceal captures.
+vim.wo.conceallevel = vim.wo.conceallevel
diff --git a/sundry/editor-syntax-etc/nvim/lua/sisu-spine/init.lua b/sundry/editor-syntax-etc/nvim/lua/sisu-spine/init.lua
new file mode 100644
index 0000000..d1ae3df
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/lua/sisu-spine/init.lua
@@ -0,0 +1,43 @@
+-- Entry point for the SiSU spine markup Neovim integration.
+--
+-- Registers a tree-sitter parser config so users can run
+-- :TSInstall sisu
+-- to fetch and build the parser via nvim-treesitter.
+--
+-- The parser source lives can be found under the
+-- `projects/` namespace on git.sisudoc.org.
+
+local M = {}
+
+--- Register the `sisu` parser with nvim-treesitter and ensure that
+--- `.sst` / `.ssm` / `.ssi` are detected as filetype "sisu".
+---
+--- Call once from your init.lua before invoking `:TSInstall sisu`.
+function M.setup()
+ local ok, parsers = pcall(require, "nvim-treesitter.parsers")
+ if not ok then
+ vim.notify(
+ "sisu-spine: nvim-treesitter is not installed; "
+ .. "syntax highlighting will not be available.",
+ vim.log.levels.WARN
+ )
+ return
+ end
+
+ local parser_config = parsers.get_parser_configs()
+ parser_config.sisu = {
+ install_info = {
+ url = "https://git.sisudoc.org/projects/tree-sitter-sisu",
+ files = {
+ "src/parser.c",
+ "src/scanner.c",
+ },
+ branch = "main",
+ generate_requires_npm = false,
+ requires_generate_from_grammar = false,
+ },
+ filetype = "sisu",
+ }
+end
+
+return M
diff --git a/sundry/editor-syntax-etc/nvim/queries/sisu/folds.scm b/sundry/editor-syntax-etc/nvim/queries/sisu/folds.scm
new file mode 100644
index 0000000..69c44d2
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/queries/sisu/folds.scm
@@ -0,0 +1,23 @@
+; Code folding queries for SiSU Spine markup
+
+; Block elements are foldable
+(code_block_curly) @fold
+(code_block_tic) @fold
+(poem_block_curly) @fold
+(poem_block_tic) @fold
+(block_block_curly) @fold
+(block_block_tic) @fold
+(group_block_curly) @fold
+(group_block_tic) @fold
+(table_block_curly) @fold
+(table_block_tic) @fold
+(quote_block_tic) @fold
+
+; Multi-line book index entries are foldable
+(book_index) @fold
+
+; Pipe tables are foldable
+(pipe_table) @fold
+
+; Header fields with continuations are foldable
+(header_field) @fold
diff --git a/sundry/editor-syntax-etc/nvim/queries/sisu/highlights.scm b/sundry/editor-syntax-etc/nvim/queries/sisu/highlights.scm
new file mode 100644
index 0000000..3454bd4
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/queries/sisu/highlights.scm
@@ -0,0 +1,189 @@
+; Syntax highlighting queries for SiSU Spine markup
+; Compatible with tree-sitter highlight capture names from
+; https://tree-sitter.github.io/tree-sitter/syntax-highlighting
+
+; =================================================================
+; Comments
+; =================================================================
+(version_comment) @comment.documentation
+(header_comment) @comment
+(body_comment) @comment
+
+; =================================================================
+; Header (document metadata)
+; =================================================================
+(header_field
+ key: (header_key) @keyword)
+
+(header_field
+ value: (header_value) @string)
+
+(header_continuation) @string
+
+; =================================================================
+; Headings
+; =================================================================
+(part_marker) @keyword.directive
+(segment_marker) @keyword.directive
+
+(heading_part
+ content: (heading_content) @markup.heading)
+
+(heading_segment
+ content: (heading_content) @markup.heading)
+
+(segment_name) @label
+(suppress_marker) @punctuation.special
+
+; Heading levels for more specific styling
+(heading_part
+ marker: (part_marker) @markup.heading.1
+ (#match? @markup.heading.1 "^:A~$"))
+
+(heading_part
+ marker: (part_marker) @markup.heading.2
+ (#match? @markup.heading.2 "^:B~$"))
+
+(heading_part
+ marker: (part_marker) @markup.heading.3
+ (#match? @markup.heading.3 "^:C~$"))
+
+(heading_part
+ marker: (part_marker) @markup.heading.4
+ (#match? @markup.heading.4 "^:D~$"))
+
+(heading_segment
+ marker: (segment_marker) @markup.heading.5
+ (#match? @markup.heading.5 "^1~$"))
+
+(heading_segment
+ marker: (segment_marker) @markup.heading.6
+ (#match? @markup.heading.6 "^2~$"))
+
+; =================================================================
+; Inline formatting
+; =================================================================
+(emphasis) @markup.italic
+(bold) @markup.bold
+(italic) @markup.italic
+(underline) @markup.underline
+(citation_mark) @markup.quote
+(superscript) @markup.superscript
+(subscript) @markup.subscript
+(inserted) @markup.underline
+(strikethrough) @markup.strikethrough
+(monospace_inline) @markup.raw
+
+; Formatting delimiters
+["*{" "}*"] @punctuation.special
+["!{" "}!"] @punctuation.special
+["/{" "}/"] @punctuation.special
+["_{" "}_"] @punctuation.special
+["\"{" "}\""] @punctuation.special
+["^{" "}^"] @punctuation.special
+[",{" "},"] @punctuation.special
+["+{" "}+"] @punctuation.special
+["-{" "}-"] @punctuation.special
+["#{" "}#"] @punctuation.special
+
+; =================================================================
+; Footnotes and editor notes
+; =================================================================
+(footnote) @markup.link
+(footnote_marker) @punctuation.special
+(editor_note) @markup.link
+
+["~{" "}~"] @punctuation.special
+; Editor-note channel selector: ~[* (asterisk set) or ~[+ (plus set).
+; A distinct capture lets themes colour the two channels separately
+; from the generic footnote delimiters above.
+(editor_note_marker) @attribute
+["]~"] @punctuation.special
+
+; =================================================================
+; Links and images
+; =================================================================
+(link
+ text: (link_text) @markup.link.label)
+
+(link
+ target: (url) @markup.link.url)
+
+(link
+ target: (anchor_ref) @markup.link.url)
+
+(link
+ target: (collection_path) @markup.link.url)
+
+(auto_footnote_marker) @punctuation.special
+
+(image
+ spec: (image_spec) @markup.link.label)
+
+(url) @markup.link.url
+
+(inline_anchor) @label
+(anchor_name) @label
+
+; =================================================================
+; Block elements
+; =================================================================
+(block_open) @keyword.directive
+(block_close) @keyword.directive
+(raw_content) @markup.raw
+
+; Code blocks get more specific highlighting
+(code_block_curly
+ open: (block_open) @keyword.directive)
+(code_block_curly
+ content: (raw_content) @markup.raw.block)
+(code_block_curly
+ close: (block_close) @keyword.directive)
+
+(code_block_tic
+ open: (block_open) @keyword.directive)
+(code_block_tic
+ content: (raw_content) @markup.raw.block)
+(code_block_tic
+ close: (block_close) @keyword.directive)
+
+; =================================================================
+; Book index
+; =================================================================
+(book_index) @markup.list
+(index_content) @string
+
+; =================================================================
+; Paragraph prefixes
+; =================================================================
+(paragraph_prefix) @punctuation.special
+
+; =================================================================
+; Special markers
+; =================================================================
+(ocn_suppress) @comment
+(ocn_suppress_open) @comment
+(ocn_suppress_close) @comment
+
+(page_break) @punctuation.special
+(horizontal_rule) @punctuation.special
+
+; =================================================================
+; Composite includes
+; =================================================================
+(composite_include) @keyword.import
+(include_path) @string.special.path
+
+; =================================================================
+; Pipe table
+; =================================================================
+(table_spec) @keyword.directive
+(table_row) @markup.raw
+
+; =================================================================
+; Text
+; =================================================================
+(text) @spell
+
+; Line break
+(line_break) @punctuation.special
diff --git a/sundry/editor-syntax-etc/nvim/queries/sisu/indents.scm b/sundry/editor-syntax-etc/nvim/queries/sisu/indents.scm
new file mode 100644
index 0000000..aa73af8
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/queries/sisu/indents.scm
@@ -0,0 +1,48 @@
+; Indentation queries for SiSU Spine markup.
+;
+; SiSU markup is largely flat: paragraphs and headings live at column 0,
+; block bodies preserve their author-supplied indentation verbatim, and
+; nesting is by markers rather than by indent. So indents.scm is mostly a
+; no-op - the goal is to ensure that auto-indent on <CR> stays at column 0
+; for normal lines and respects existing indentation inside header
+; continuations and blocks.
+
+; Tree-sitter indent semantics (per nvim-treesitter and treesit):
+; @indent.begin - increases indent for the following line
+; @indent.end - matches the @indent.begin and decreases indent
+; @indent.zero - resets indent to column 0
+; @indent.align - aligns following lines with this node
+; @indent.branch - same level as the parent (for else/elif-style joins)
+
+; Top-level structures live at column 0 - reset to zero on the next line.
+(heading_part) @indent.zero
+(heading_segment) @indent.zero
+(paragraph) @indent.zero
+(book_index) @indent.zero
+(composite_include) @indent.zero
+(page_break) @indent.zero
+(horizontal_rule) @indent.zero
+(ocn_suppress_open) @indent.zero
+(ocn_suppress_close) @indent.zero
+(body_comment) @indent.zero
+
+; Block elements: opening line increases indent for the body, closing
+; line returns to zero. Editors that respect this will visually indent
+; raw content one step from the delimiter line, which is conventional.
+(code_block_curly) @indent.align
+(code_block_tic) @indent.align
+(poem_block_curly) @indent.align
+(poem_block_tic) @indent.align
+(block_block_curly) @indent.align
+(block_block_tic) @indent.align
+(group_block_curly) @indent.align
+(group_block_tic) @indent.align
+(table_block_curly) @indent.align
+(table_block_tic) @indent.align
+(quote_block_tic) @indent.align
+
+; Header continuation lines are indented by two spaces from column 0;
+; mark continuations as align so a host that chooses to auto-indent the
+; next continuation line matches the previous one.
+(header_field) @indent.align
+(header_continuation) @indent.align
diff --git a/sundry/editor-syntax-etc/nvim/queries/sisu/injections.scm b/sundry/editor-syntax-etc/nvim/queries/sisu/injections.scm
new file mode 100644
index 0000000..27f622b
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/queries/sisu/injections.scm
@@ -0,0 +1,16 @@
+; Language injection queries for SiSU Spine markup
+;
+; Code blocks could potentially inject language-specific highlighting,
+; but SiSU code blocks don't specify language. These queries are
+; provided as a starting point for future extension.
+
+; Code block content could be injected with a specific language
+; if the block type or context provides a hint.
+; For now, raw content in code blocks is left unhighlighted.
+
+; Example: if code blocks specified a language, e.g. code(d){
+; ((code_block_curly
+; open: (block_open) @_open
+; content: (raw_content) @injection.content)
+; (#match? @_open "code\\(d\\)")
+; (#set! injection.language "d"))
diff --git a/sundry/editor-syntax-etc/nvim/queries/sisu/textobjects.scm b/sundry/editor-syntax-etc/nvim/queries/sisu/textobjects.scm
new file mode 100644
index 0000000..0a82481
--- /dev/null
+++ b/sundry/editor-syntax-etc/nvim/queries/sisu/textobjects.scm
@@ -0,0 +1,140 @@
+; Text-object queries for SiSU Spine markup.
+;
+; Capture conventions follow nvim-treesitter/textobjects:
+; @<thing>.outer -> select including delimiters / surrounding whitespace
+; @<thing>.inner -> select content only
+;
+; Hosts that consume these (Neovim's nvim-treesitter-textobjects, Helix,
+; Emacs treesit) bind keys such as `af` / `if` to .outer / .inner.
+
+; =================================================================
+; Headings (sectioning units)
+; =================================================================
+; A whole heading line is a "section header" object. Heading sections
+; (the heading plus its body content up to the next heading of equal or
+; higher level) are not directly expressible in tree-sitter without
+; additional grammar work; hosts can synthesise that from these captures.
+
+(heading_part) @class.outer
+(heading_part
+ content: (heading_content) @class.inner)
+
+(heading_segment) @class.outer
+(heading_segment
+ content: (heading_content) @class.inner)
+
+; =================================================================
+; Block elements (code / poem / block / group / table / quote)
+; =================================================================
+; Whole block including delimiters; raw_content is the inner.
+
+(code_block_curly) @function.outer
+(code_block_curly
+ content: (raw_content) @function.inner)
+
+(code_block_tic) @function.outer
+(code_block_tic
+ content: (raw_content) @function.inner)
+
+(poem_block_curly) @function.outer
+(poem_block_curly
+ content: (raw_content) @function.inner)
+
+(poem_block_tic) @function.outer
+(poem_block_tic
+ content: (raw_content) @function.inner)
+
+(block_block_curly) @function.outer
+(block_block_curly
+ content: (raw_content) @function.inner)
+
+(block_block_tic) @function.outer
+(block_block_tic
+ content: (raw_content) @function.inner)
+
+(group_block_curly) @function.outer
+(group_block_curly
+ content: (raw_content) @function.inner)
+
+(group_block_tic) @function.outer
+(group_block_tic
+ content: (raw_content) @function.inner)
+
+(table_block_curly) @function.outer
+(table_block_curly
+ content: (raw_content) @function.inner)
+
+(table_block_tic) @function.outer
+(table_block_tic
+ content: (raw_content) @function.inner)
+
+(quote_block_tic) @function.outer
+(quote_block_tic
+ content: (raw_content) @function.inner)
+
+(pipe_table) @function.outer
+
+; =================================================================
+; Footnotes and editor notes
+; =================================================================
+; Both share the same outer/inner shape; the inner skips the markers and
+; closing delimiters.
+
+(footnote) @comment.outer
+(footnote
+ (_)+ @comment.inner)
+
+(editor_note) @comment.outer
+(editor_note
+ (_)+ @comment.inner)
+
+; =================================================================
+; Links and images
+; =================================================================
+
+(link) @parameter.outer
+(link
+ text: (link_text) @parameter.inner)
+
+(image) @parameter.outer
+(image
+ spec: (image_spec) @parameter.inner)
+
+; =================================================================
+; Paragraph / inline-formatting runs
+; =================================================================
+
+(paragraph) @block.outer
+(paragraph
+ (_)+ @block.inner)
+
+; Inline formatting pairs - useful as fine-grained text objects.
+; The same delimiter character pattern (e.g. `*{` / `}*`) opens and
+; closes each, so .inner is everything between them.
+
+(emphasis) @assignment.outer
+(bold) @assignment.outer
+(italic) @assignment.outer
+(underline) @assignment.outer
+(citation_mark) @assignment.outer
+(superscript) @assignment.outer
+(subscript) @assignment.outer
+(inserted) @assignment.outer
+(strikethrough) @assignment.outer
+(monospace_inline) @assignment.outer
+
+; =================================================================
+; Book index entries
+; =================================================================
+
+(book_index) @attribute.outer
+(book_index
+ (index_content) @attribute.inner)
+
+; =================================================================
+; Header fields
+; =================================================================
+
+(header_field) @assignment.outer
+(header_field
+ value: (header_value) @assignment.inner)
diff --git a/sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim b/sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim
index 2de0095..35a893e 100644
--- a/sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim
+++ b/sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim
@@ -1,12 +1,22 @@
-" SiSU Vim syntax file (sisu-spine)
+" SiSU Vim syntax file (sisu-spine) - Vim 8 fallback (regex)
" SiSU Maintainer: Ralph Amissah <ralph.amissah@gmail.com>
" SiSU Markup: SiSU (sisu-5.6.7)
" sisu-spine Markup: sisu-spine
-" Last Change: 2017-06-22, 2025-02-21
+" Last Change: 2017-06-22, 2025-02-21, 2026-05-09
" URL: <https://git.sisudoc.org/projects/sisudoc-spine/tree/sundry/editor-syntax-etc/vim/syntax/sisu-spine.vim>
" <https://git.sisudoc.org/projects/sisudoc-spine/tree/sundry/editor-syntax-etc/vim/syntax/sisu.vim>
" <https://sisudoc.org/>
"(originally looked at Ruby Vim by Mirko Nasato)
+"
+" Status: This is the regex-based Vim 8 fallback. For Neovim users, the
+" tree-sitter-sisu grammar provides structural highlighting, folding and
+" textobjects with strictly better behaviour on nested markup, multi-line
+" footnotes, block bodies, and segmented headings; see
+" sundry/editor-syntax-etc/nvim/README.md
+" Emacs 29+ users have an equivalent treesit-based mode at
+" sundry/editor-syntax-etc/emacs/sisu-spine-ts-mode.el
+" This file remains the supported path for classic Vim, where tree-sitter
+" is not available without third-party plugins.
if version < 600
syntax clear
diff --git a/sundry/editor-syntax-etc/vim/templates/ssi.tpl b/sundry/editor-syntax-etc/vim/templates/ssi.tpl
new file mode 100644
index 0000000..28e8101
--- /dev/null
+++ b/sundry/editor-syntax-etc/vim/templates/ssi.tpl
@@ -0,0 +1,30 @@
+# SiSU 8.0 insert
+
+title:
+ main: "#___#"
+ sub: "#___#"
+ language: "#___#"
+
+creator:
+ author: "#___#"
+
+date:
+ :published: "YYYY-MM-DD"
+
+rights:
+ copyright: "#___#"
+ license: "#___#"
+
+classify:
+ topic_register: "#___#"
+
+make:
+ breaks: "new=:B; break=1"
+# home_button_text: "#___#"
+# footer: "#___#"
+
+#% -- body ---
+
+:A~ @title @author
+
+1~ #___#
diff --git a/sundry/editor-syntax-etc/vim/templates/ssm.tpl b/sundry/editor-syntax-etc/vim/templates/ssm.tpl
new file mode 100644
index 0000000..579375f
--- /dev/null
+++ b/sundry/editor-syntax-etc/vim/templates/ssm.tpl
@@ -0,0 +1,30 @@
+# SiSU 8.0 master
+
+title:
+ main: "#___#"
+ sub: "#___#"
+ language: "#___#"
+
+creator:
+ author: "#___#"
+
+date:
+ :published: "YYYY-MM-DD"
+
+rights:
+ copyright: "#___#"
+ license: "#___#"
+
+classify:
+ topic_register: "#___#"
+
+make:
+ breaks: "new=:B; break=1"
+# home_button_text: "#___#"
+# footer: "#___#"
+
+#% -- body ---
+
+:A~ @title @author
+
+1~ #___#
diff --git a/sundry/editor-syntax-etc/vim/templates/sst.tpl b/sundry/editor-syntax-etc/vim/templates/sst.tpl
new file mode 100644
index 0000000..069d498
--- /dev/null
+++ b/sundry/editor-syntax-etc/vim/templates/sst.tpl
@@ -0,0 +1,30 @@
+# SiSU 8.0
+
+title:
+ main: "#___#"
+ sub: "#___#"
+ language: "#___#"
+
+creator:
+ author: "#___#"
+
+date:
+ :published: "YYYY-MM-DD"
+
+rights:
+ copyright: "#___#"
+ license: "#___#"
+
+classify:
+ topic_register: "#___#"
+
+make:
+ breaks: "new=:B; break=1"
+# home_button_text: "#___#"
+# footer: "#___#"
+
+#% -- body ---
+
+:A~ @title @author
+
+1~ #___#
diff --git a/test/reference/abstraction/not_without_help.austin_amissah.en.ssp b/test/reference/abstraction/not_without_help.austin_amissah.en.ssp
index e19a060..bdb2619 100644
--- a/test/reference/abstraction/not_without_help.austin_amissah.en.ssp
+++ b/test/reference/abstraction/not_without_help.austin_amissah.en.ssp
@@ -5186,8 +5186,8 @@
.part: body
.ocn_off: true
.is_of_type: para
-.sha256: 4F233B87A3D3544DA570F2AA866958ABD50C36DEB08EA474BA2ADC95DAF597B5
-| The other people with whom I spent some time were not Israeli but Dutch. They were the Arienses, who had been in Ghana in the early 70s. Krick Ariens was Ambassador of the Netherlands to Ghana. He and his wife, Roberta, had been very gracious hosts to many Ghanaian friends. Krick joined with a number of Ghanaians to play tennis on Wednesdays at the court in the residence of his second in command, Joris Vos, later to become Ambassador to Australia, then the Soviet Union and then Ambassador to Russia and to a number of the States into which the Soviet Union broke afterwards. After being Secretary to the Minister of Foreign Affairs, he became Ambassador to the United States. But these were early days for Joris. I got in touch with the Arienses when I arrived in Israel. They were living in Jerusalem and invited me to dinner a couple of times and also took me on one occasion to a hospital to which the people of Holland had sent a planeload of tulips. Holland maintained very close relations with the Israelis at the time and, as stated earlier, it was the only country which had its Embassy in Jerusalem. Krick asked how the Wednesday tennis group was going. I told a long story of how the group continued to thrive after Joris Vos was replaced by Jaap de Hoop Schaffer. The group had at various times included Kwame Pianim, who was so strong, he played singles with Jaap before the rest of us turned up to join them in our usual doubles games; Francis Nkrumah, a paediatrician specialist and son of our first Prime Minister and President, later to become a Professor of the Medical School and head of the Noguchi Institute; the late Kwamena Phillips, a delightful companion and diplomat; Kofi Annan, a diplomat, then on assignment with the Tourist Company in Ghana, later to become Secretary-General of the United Nations; Issa Egala, a paediatrician specialist, then with the Police Hospital, Roger Korsah, a judge of the High Court, later to be judge of the Supreme Court of Zimbabwe; Miguel Ribeiro, a lawyer in private practice; Osafo Sampong, a lawyer with the Attorney-General's Office; Commander Kyeremeh, a naval officer, but then, I believe a member of the Government with responsibility for the Cocoa Marketing Board; and myself. But when Jaap was in turn succeeded by Christian Kroner, he put an end to the group with the cryptic remark that “friends are made, not inherited”. Roberta asked who this was and, when I told her, she summarily dismissed him by saying, “oh, he is not important”. Kroner's remark, though unimpeachable in this case, later caused him some embarrassment. He did not know who those using the tennis court in his residence were. He had obviously come in with the idea of making his own life without interferences from the past. When he later learnt who we were, he asked Kwame Pianim to persuade us to come back to his court. Not one of us accepted. By then, some of us were using the court of the Canadian High Commissioner down the road.
+.sha256: 3236AC8C5D4578179D719853CC9F5572C3A6D5DC9DFE524C45EED91305EA5A33
+| The other people with whom I spent some time were not Israeli but Dutch. They were the Arienses, who had been in Ghana in the early 70s. Krick Ariens was Ambassador of the Netherlands to Ghana. He and his wife, Roberta, had been very gracious hosts to many Ghanaian friends. Krick joined with a number of Ghanaians to play tennis on Wednesdays at the court in the residence of his second in command, Joris Vos, later to become Ambassador to Australia, then the Soviet Union and then Ambassador to Russia and to a number of the States into which the Soviet Union broke afterwards. After being Secretary to the Minister of Foreign Affairs, he became Ambassador to the United States. But these were early days for Joris. I got in touch with the Arienses when I arrived in Israel. They were living in Jerusalem and invited me to dinner a couple of times and also took me on one occasion to a hospital to which the people of Holland had sent a planeload of tulips. Holland maintained very close relations with the Israelis at the time and, as stated earlier, it was the only country which had its Embassy in Jerusalem. Krick asked how the Wednesday tennis group was going. I told a long story of how the group continued to thrive after Joris Vos was replaced by Jaap de Hoop Scheffer. The group had at various times included Kwame Pianim, who was so strong, he played singles with Jaap before the rest of us turned up to join them in our usual doubles games; Francis Nkrumah, a paediatrician specialist and son of our first Prime Minister and President, later to become a Professor of the Medical School and head of the Noguchi Institute; the late Kwamena Phillips, a delightful companion and diplomat; Kofi Annan, a diplomat, then on assignment with the Tourist Company in Ghana, later to become Secretary-General of the United Nations; Issa Egala, a paediatrician specialist, then with the Police Hospital, Roger Korsah, a judge of the High Court, later to be judge of the Supreme Court of Zimbabwe; Miguel Ribeiro, a lawyer in private practice; Osafo Sampong, a lawyer with the Attorney-General's Office; Commander Kyeremeh, a naval officer, but then, I believe a member of the Government with responsibility for the Cocoa Marketing Board; and myself. But when Jaap was in turn succeeded by Christian Kroner, he put an end to the group with the cryptic remark that “friends are made, not inherited”. Roberta asked who this was and, when I told her, she summarily dismissed him by saying, “oh, he is not important”. Kroner's remark, though unimpeachable in this case, later caused him some embarrassment. He did not know who those using the tennis court in his residence were. He had obviously come in with the idea of making his own life without interferences from the past. When he later learnt who we were, he asked Kwame Pianim to persuade us to come back to his court. Not one of us accepted. By then, some of us were using the court of the Canadian High Commissioner down the road.
[654] para
.part: body
diff --git a/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp b/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp
index 22f01c3..be1aa1b 100644
--- a/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp
+++ b/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp
@@ -599,8 +599,8 @@
.part: body
.ocn_off: true
.is_of_type: para
-.sha256: C4B6301574EFFA88E9488D08044D3674D08CEC0C4307664BD86BDBA30C049FCE
-| Within the traditional municipal order a limited degree of autonomy is available in contract. Autonomy is here used in the sense of reducing the relevance of specific national laws. This is achieved as discussed through: the selection of the law of a state that applies uniform law; the use of uniform rules and principles; and/or the use of negotiated standard contracts. There are problems however, with state's judiciaries' limited ability to disengage themselves from their traditional legal process, methods of legal reasoning, use of sources, and interpretation of uniform law, principles, rules and contracts. In addition to these there are problems associated with the enforcement of claims in other states world-wide as required for international commerce. These constraints have long represented a hindrance to the business community that has sought and found a preferable solution in international commercial arbitration. This may be further enhanced through the selection of a-national law as the governing law of the contract under arbitration, such as ⑆/┨ lex mercatoria ┣/. This a-national regulatory order is made possible by: ⑆*┨ (a) ┣* States' acceptance of ⑆_┨freedom of contract┣_ (⑆/┨ odre public ┣/ or public policy excepted). ⑆*┨ (b) ┣* Sanctity of contract embodied in the principle ⑆/┨ ⑆_┨pacta sunt servanda┣_ ┣/. ⑆*┨ (c) ┣* Written contractual selection of dispute resolution by ⑆_┨international commercial arbitration┣_ - ⑆/┨ ad hoc ┣/ or institutional, usually under internationally accepted arbitration rules. ⑆*┨ (d) ┣* Enforcement: arbitration where necessary borrowing the state apparatus for ⑆_┨law enforcement through the ⑆/┨ New York Convention┣_ on Recognition and Enforcement of Arbitral Awards 1958 ┣/. ⑆*┨ (e) ┣* Greater transnational effect is achieved through the exclusion of state law as governing the contract. Usually substituting the choice of general principles of law or ⑆/┨ ⑆_┨lex mercatoria┣_ ┣/ as governing the contract, or calling upon the arbitrators to act as ⑆/┨ amiable compositeur ┣/ or ⑆/┨ ex aequo et bono ┣/. For increased predictability preferably through application of the ⑆/┨ UNIDROIT Principles ┣/.
+.sha256: B784E23AE45968CFE43BFA2AA417E1F1553A763C0A2D8EC7FA3E2758BE8C92A0
+| Within the traditional municipal order a limited degree of autonomy is available in contract. Autonomy is here used in the sense of reducing the relevance of specific national laws. This is achieved as discussed through: the selection of the law of a state that applies uniform law; the use of uniform rules and principles; and/or the use of negotiated standard contracts. There are problems however, with state's judiciaries' limited ability to disengage themselves from their traditional legal process, methods of legal reasoning, use of sources, and interpretation of uniform law, principles, rules and contracts. In addition to these there are problems associated with the enforcement of claims in other states world-wide as required for international commerce. These constraints have long represented a hindrance to the business community that has sought and found a preferable solution in international commercial arbitration. This may be further enhanced through the selection of a-national law as the governing law of the contract under arbitration, such as ⑆/┨ lex mercatoria ┣/. This a-national regulatory order is made possible by: ⑆*┨ (a) ┣* States' acceptance of ⑆_┨freedom of contract┣_ (⑆/┨ odre public ┣/ or public policy excepted). ⑆*┨ (b) ┣* Sanctity of contract embodied in the principle ⑆/┨ ⑆_┨pacta sunt servanda┣_ ┣/. ⑆*┨ (c) ┣* Written contractual selection of dispute resolution by ⑆_┨international commercial arbitration┣_ - ⑆/┨ ad hoc ┣/ or institutional, usually under internationally accepted arbitration rules. ⑆*┨ (d) ┣* Enforcement: arbitration where necessary borrowing the state apparatus for law enforcement through the ⑆/┨ ⑆_┨New York Convention┣_ on Recognition and Enforcement of Arbitral Awards 1958 ┣/. ⑆*┨ (e) ┣* Greater transnational effect is achieved through the exclusion of state law as governing the contract. Usually substituting the choice of general principles of law or ⑆/┨ ⑆_┨lex mercatoria┣_ ┣/ as governing the contract, or calling upon the arbitrators to act as ⑆/┨ amiable compositeur ┣/ or ⑆/┨ ex aequo et bono ┣/. For increased predictability preferably through application of the ⑆/┨ UNIDROIT Principles ┣/.
[30] heading :3
.part: body
diff --git a/test/test-abstraction-ssp.sh b/test/test-abstraction-ssp.sh
index 28502ea..d03f70c 100755
--- a/test/test-abstraction-ssp.sh
+++ b/test/test-abstraction-ssp.sh
@@ -22,7 +22,12 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SPINE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
-SAMPLES_DIR="$SPINE_DIR/../sisudoc-spine-samples/markup/pod-samples/pod"
+SAMPLES_RAW="$SPINE_DIR/$SpinePOD"
+if [ -d "$SAMPLES_RAW" ]; then
+ SAMPLES_DIR="$(cd "$SAMPLES_RAW" && pwd)"
+else
+ SAMPLES_DIR="$SAMPLES_RAW"
+fi
REF_DIR="$SCRIPT_DIR/reference/abstraction"
TMP_DIR="$SCRIPT_DIR/current/abstraction"