aboutsummaryrefslogtreecommitdiffhomepage
path: root/org
diff options
context:
space:
mode:
Diffstat (limited to 'org')
-rw-r--r--org/compile_time_info.org35
-rw-r--r--org/config_d_cfte.org2
-rw-r--r--org/config_dub.org37
-rw-r--r--org/config_env.org80
-rw-r--r--org/config_git.org6
-rw-r--r--org/config_make.org38
-rw-r--r--org/config_meson.org37
-rw-r--r--org/config_misc.org2
-rw-r--r--org/config_nix.org137
-rw-r--r--org/default_imports.org81
-rw-r--r--org/default_misc.org56
-rw-r--r--org/default_paths.org126
-rw-r--r--org/default_regex.org42
-rw-r--r--org/default_shared_snippets.org43
-rw-r--r--org/doc-reform.org2
-rw-r--r--org/in_source_files.org106
-rw-r--r--org/meta_conf_make_meta.org178
-rw-r--r--org/meta_debugs.org55
-rw-r--r--org/nix-develop-dlang-shared.org257
-rw-r--r--org/nixpkgs_overlays_d_related.org518
-rw-r--r--org/ocda.org75
-rw-r--r--org/ocda_functions.org58
-rw-r--r--org/ocda_obj_setter.org117
-rw-r--r--org/out_curate_metadata.org85
-rw-r--r--org/out_latex.org86
-rw-r--r--org/out_metadata.org45
-rw-r--r--org/out_odt.org280
-rw-r--r--org/out_skel.org324
-rw-r--r--org/out_sqlite.org46
-rw-r--r--org/out_src_pod.org113
-rw-r--r--org/out_text.org565
-rw-r--r--org/out_xmls.org86
-rw-r--r--org/out_xmls_css.org13
-rw-r--r--org/out_zip.org30
-rw-r--r--org/output_hub.org59
-rw-r--r--org/output_show.org51
-rw-r--r--org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org9
-rw-r--r--org/spine.org402
-rw-r--r--org/spine_info.org65
-rw-r--r--org/spine_markup_sample.org4
-rw-r--r--org/util_spine_markup_conversion_from_sisu.org2
-rw-r--r--org/util_spine_syntax_highlighting_emacs.org2
-rw-r--r--org/util_spine_syntax_highlighting_vim.org2
43 files changed, 3148 insertions, 1209 deletions
diff --git a/org/compile_time_info.org b/org/compile_time_info.org
index 1332c2c..aca03d1 100644
--- a/org/compile_time_info.org
+++ b/org/compile_time_info.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -42,14 +42,6 @@ template CompileTimeInfo() {
}
#+END_SRC
-*** document header including copyright & license
-
-#+NAME: doc_header_including_copyright_and_license
-#+HEADER: :noweb yes
-#+BEGIN_SRC emacs-lisp
-<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
-#+END_SRC
-
** complile time os
OS type shows during compilation
@@ -122,4 +114,29 @@ version(D_LP64) {
}
#+END_SRC
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
* __END__
diff --git a/org/config_d_cfte.org b/org/config_d_cfte.org
index 2797609..d74dd66 100644
--- a/org/config_d_cfte.org
+++ b/org/config_d_cfte.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
diff --git a/org/config_dub.org b/org/config_dub.org
index 043e62c..ccfc822 100644
--- a/org/config_dub.org
+++ b/org/config_dub.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -17,14 +17,6 @@
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
-** spine project VERSION :version:set:project:
-
-#+NAME: spine_version
-#+HEADER: :noweb yes
-#+BEGIN_SRC emacs-lisp
-<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
-#+END_SRC
-
** dub
- https://github.com/dlang/dub/
@@ -181,3 +173,30 @@
"defaultCompiler": "ldc"
}
#+END_SRC
+
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
+* __END__
diff --git a/org/config_env.org b/org/config_env.org
index 9913dce..2fa1f25 100644
--- a/org/config_env.org
+++ b/org/config_env.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -33,12 +33,15 @@ fi
#+NAME: envrc
#+HEADER: :tangle ../.envrc
+#+HEADER: :shebang "# -*- mode: sh -*-"
#+BEGIN_SRC shell
if [ -f .envrc-git-init ]; then
source_env_if_exists .envrc-git-init || source .envrc-git-init
fi
if [ -f .envrc-local ]; then
source_env_if_exists .envrc-local || source .envrc-local
+elif [ -f .envrc-local_ ]; then
+ source_env_if_exists .envrc-local_ || source .envrc-local_
fi
if [ -f .envrc-nix ]; then
source_env_if_exists .envrc-nix || source .envrc-nix
@@ -53,6 +56,7 @@ fi
- ${NixDirEnvVersion}
#+HEADER: :tangle ../.envrc-nix
+#+HEADER: :shebang "# -*- mode: nix -*-"
#+BEGIN_SRC shell
NIX_ENFORCE_PURITY=1
# - https://github.com/nix-community/nix-direnv
@@ -80,11 +84,11 @@ echo '
• nix develop
❯❯ nix develop ".#" --print-build-logs -c zsh
• nix develop using nixpkgs
- ❯❯ nix develop ".#dsh-nixpkgs-dmd-dub" --print-build-logs -c zsh
- ❯❯ nix develop ".#dsh-nixpkgs-ldc-dub" --print-build-logs -c zsh
- • nix develop using package overlays: (dmd-<<dmd_version>>, ldc-<<ldc_version>>, dub-<<dub_version>>)
- ❯❯ nix develop ".#dsh-overlay-dmd-dub" --print-build-logs -c zsh
- ❯❯ nix develop ".#dsh-overlay-ldc-dub" --print-build-logs -c zsh
+ ❯❯ nix develop ".#dsh-nixpkgs-dmd" --print-build-logs -c zsh
+ ❯❯ nix develop ".#dsh-nixpkgs-ldc" --print-build-logs -c zsh
+ • nix develop using package overlays: (dmd-<<dmd_version>>, ldc-<<ldc_version>>, dub-<<dub_version>>, dtools-<<dtools_version>>)
+ ❯❯ nix develop ".#dsh-overlay-dmd" --print-build-logs -c zsh
+ ❯❯ nix develop ".#dsh-overlay-ldc" --print-build-logs -c zsh
❯❯ nix flake show
• to build project:
@@ -96,16 +100,16 @@ echo '
• nix build using nixpkgs
❯❯ nix build ".#spine-nixpkgs-dmd" --print-build-logs
❯❯ nix build ".#spine-nixpkgs-ldc" --print-build-logs
- • nix build using package overlays: (dmd-<<dmd_version>>, ldc-<<ldc_version>>, dub-<<dub_version>>)
+ • nix build using package overlays: (dmd-<<dmd_version>>, ldc-<<ldc_version>>, dub-<<dub_version>>, dtools-<<dtools_version>>)
❯❯ nix build ".#spine-overlay-dmd" --print-build-logs
❯❯ nix build ".#spine-overlay-ldc" --print-build-logs
• to build using dub on nix (get dependencies by setting your development environment):
- ❯❯ nix develop ".#dsh-nixpkgs-dmd-dub" --print-build-logs -c zsh
+ ❯❯ nix develop ".#dsh-nixpkgs-dmd" --print-build-logs -c zsh
❯❯ dub --verbose --compiler=dmd --config=dmd
- ❯❯ nix develop ".#dsh-nixpkgs-ldc-dub" --print-build-logs -c zsh
+ ❯❯ nix develop ".#dsh-nixpkgs-ldc" --print-build-logs -c zsh
❯❯ dub --verbose --compiler=ldmd2 --config=ldmd2
• for develop environment & build options
@@ -119,6 +123,11 @@ echo '
❯❯ ${SpineBIN} -v --source --pod --epub --html --html-link-curate --html-link-markup --curate --output=${SpineOUT} ${SpinePOD}/*
❯❯ ${SpineBIN} -v --source --pod --latex --latex-init --epub --html --html-link-pdf --html-link-curate --html-link-markup --curate --output=${SpineOUT} ${SpinePOD}/*
+
+ ❯❯ ${SpineBIN} -v --sqlite-db-create --sqlite-db-filename=${SpineSQLdb} --sqlite-db-path=./_tmp-db
+ ❯❯ ${SpineBIN} -v --sqlite-update --sqlite-db-filename=${SpineSQLdb} --sqlite-db-path=./_tmp-db ${SpinePOD}/*
+
+ ❯❯ ${SpineBIN} --source --pod --curate --text --latex --epub --html --manifest --html-link-search --html-link-pdf --html-link-text --html-link-curate --html-link-markup --html-link-source --html-link-pod --html-link-metadata --cgi-sqlite-search-filename="${SpineCGIform}" --cgi-url-action="${SpineSearchActionRemote}" --sqlite-db-path="${SpineDBpath}" --sqlite-db-filename="${SpineSQLdb}" --www-url-doc-root=${SpineURLdocRoot} --set-papersize="a4,letter" --output=${SpineOUT} ${SpinePOD}/*
'
echo "•
❯❯ ${SpineBIN} -v --source --pod --epub --html --html-link-curate --html-link-markup --curate --output=${SpineOUT} ${SpinePOD}/*
@@ -129,6 +138,7 @@ echo "•
** .envrc-git-init
#+HEADER: :tangle ../.envrc-git-init
+#+HEADER: :shebang "# -*- mode: sh -*-"
#+HEADER: :noweb yes
#+BEGIN_SRC shell
if [[ ! -d ./.git ]]; then
@@ -137,11 +147,25 @@ if [[ ! -d ./.git ]]; then
fi
#+END_SRC
+** ,version (project & git version info)
+
+#+HEADER: :tangle ../,version
+#+HEADER: :noweb yes
+#+HEADER: :tangle-mode (identity #o755)
+#+HEADER: :shebang #!/usr/bin/env sh
+#+BEGIN_SRC shell
+SpineProjVer=`rg "Version\((\d+), (\d+), (\d+)\)" views/version.txt | sed -E 's/.*([0-9]+), ([0-9]+), ([0-9]+).*/spine-v\1.\2.\3/'` && \
+ SpineGitVer=`git describe | sed "s/^[a-z_-]\+\([0-9.]\+\)/\1/" | sed "s/\([^-]*-g\)/r\1/" | sed "s/-/./g"` && \
+ SpineGitBranch=`git branch --show-current` && \
+ echo "❯❯ $SpineProjVer - ($SpineGitBranch: $SpineGitVer)"
+#+END_SRC
+
** .envrc-local CHECK MODIFY
- bespoke modify appropriately and generate if needed
#+HEADER: :tangle ../.envrc-local_
+#+HEADER: :shebang "# -*- mode: sh -*-"
#+HEADER: :noweb yes
#+BEGIN_SRC shell
export SpineVER=$(git describe --long --tags | sed 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g')
@@ -154,13 +178,17 @@ export SpineBIN=./result/bin/spine
#export SpineBIN=./bin/spine-dmd
# ❯❯ location of source files:
export SpineDOC=../sisudoc-spine-samples
+#export SpineDOC=./sisudoc-spine-samples
# ❯❯ location of source files pod:
-export SpinePOD=${SpineDOC}/markup/pod
+export SpinePOD=${SpineDOC}/markup/pod-samples/pod
# ❯❯ sisudoc-spine output processing path:
export SpineOUT=./OUTPUT_TEST_sisudocSpine
# ❯❯ sisudoc-spine output processing path (web server e.g.):
#export SpineOUT=/srv/www/spine
#export SpineOUTversioned=${SpineOUT}/${SpineVER}
+# ❯❯ www url doc root
+export SpineURLdocRoot='http://localhost'
+# export SpineURLdocRoot='https://sisudoc.org'
# ❯❯ path configured for cgi search form:
export SpineSearchActionLocal='http://localhost/spine_search'
export SpineSearchActionRemote='https://sisudoc.org/spine_search'
@@ -175,7 +203,7 @@ export SpineDBpath=/var/www/sqlite
#export SpineDBpath=/srv/www/spine/sqlite
#+END_SRC
-* SHARED versions
+* org includes - versions GET
** direnv
#+NAME: direnv_version
@@ -190,14 +218,6 @@ export SpineDBpath=/var/www/sqlite
<<./nix-develop-dlang-shared.org:direnv-hash()>>
#+END_SRC
-** spine project VERSION :version:set:project:
-
-#+NAME: spine_version
-#+HEADER: :noweb yes
-#+BEGIN_SRC emacs-lisp
-<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
-#+END_SRC
-
** dlang overlays
*** ldc
@@ -231,4 +251,26 @@ export SpineDBpath=/var/www/sqlite
<<./nix-develop-dlang-shared.org:dtools-version()>>
#+END_SRC
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
* __END__
diff --git a/org/config_git.org b/org/config_git.org
index b997923..771f7bc 100644
--- a/org/config_git.org
+++ b/org/config_git.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -37,8 +37,6 @@
!.envrc
!.envrc-nix
!.envrc-git-init
-!.env
-!.env/**
!nix-overlays
!nix-overlays/**
!README.md
@@ -47,9 +45,11 @@
!CHANGELOG
!makefile
!version.txt
+!,version
!configuration.txt
!*.json
!*.sdl
+!*.md
!meson.build
!tangle
!*.org
diff --git a/org/config_make.org b/org/config_make.org
index 286842b..2509fa1 100644
--- a/org/config_make.org
+++ b/org/config_make.org
@@ -9,23 +9,13 @@
#+STARTUP: show4levels hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
- [[./doc-reform.org][doc-reform.org]] [[../org/][org/]]
-* project
-** version info SET VERSION :version:set:project:
-*** project VERSION
-
-#+NAME: spine_version
-#+HEADER: :noweb yes
-#+BEGIN_SRC emacs-lisp
-<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
-#+END_SRC
-
*** build tools if specified
- meson
@@ -1360,3 +1350,29 @@ version_tag:
tangle gitsnapshot
#+END_SRC
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
+* __END__
diff --git a/org/config_meson.org b/org/config_meson.org
index 60690cc..1079fb8 100644
--- a/org/config_meson.org
+++ b/org/config_meson.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -19,14 +19,6 @@
* spine
** version info SET VERSION :version:set:project:
-*** spine project VERSION :version:set:project:
-
-#+NAME: spine_version
-#+HEADER: :noweb yes
-#+BEGIN_SRC emacs-lisp
-<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
-#+END_SRC
-
*** subprojects
- d2sqlite3
@@ -490,3 +482,30 @@ tinyendian_dep = declare_dependency(
include_directories: [src_dir]
)
#+END_SRC
+
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
+* __END__
diff --git a/org/config_misc.org b/org/config_misc.org
index cf79a58..c83a456 100644
--- a/org/config_misc.org
+++ b/org/config_misc.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
diff --git a/org/config_nix.org b/org/config_nix.org
index 54ec0ec..167a406 100644
--- a/org/config_nix.org
+++ b/org/config_nix.org
@@ -9,7 +9,7 @@
#+STARTUP: show4levels hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -44,9 +44,10 @@
runHook postCheck
'';
localOverlay = (final: prev: {
- ldc = prev.callPackage ./nix-overlays/ldc { };
- dmd = prev.callPackage ./nix-overlays/dmd { };
- dub = prev.callPackage ./nix-overlays/dub { };
+ ldc = prev.callPackage ./nix-overlays/ldc { }; # -> ok <<ldc_version>>
+ dmd = prev.callPackage ./nix-overlays/dmd { }; # -> ok <<dmd_version>>
+ dub = prev.callPackage ./nix-overlays/dub { }; # -> ? <<dub_version>>
+ dtools = prev.callPackage ./nix-overlays/dtools { }; # -> ok <<dtools_version>>
#gdc = prev.callPackage ./nix-overlays/gdc { };
});
pkgsForSystem = system: import nixpkgs {
@@ -56,7 +57,8 @@
inherit system;
};
preBuild = ''
- export HOME=$(pwd)
+ export HOME=$TMPDIR
+ #export HOME=$(pwd)
'';
installPhase = ''
runHook preInstall
@@ -65,7 +67,9 @@
runHook postInstall
'';
postInstall = ''
+ echo "❯❯ ./result/bin/spine -v --source --pod --text --epub --html --html-link-pdf --html-link-curate --html-link-markup --curate --output=./OUTPUT_TEST_sisudocSpine ../sisu-spine-samples/markup/pod/*";
echo `ls -la $out/bin/spine`
+ echo "❯❯ spine-v${version} (rev: ${self.shortRev or "unknown"})"
$out/bin/spine -v
'';
in {
@@ -230,68 +234,90 @@
pkgs-ovl = pkgsForSystem system;
pkgs-nix = nixpkgsFor.${system};
shellHook = ''
- export Date=`date "+%Y%m%d"`
+ #export Date=`date "+%Y%m%d"`
## set local values in .envrc-local (or here if you must)
- echo " ❯❯ ./result/bin/spine -v --source --pod --epub --html --html-link-pdf --html-link-curate --html-link-markup --curate --output=./OUTPUT_TEST_sisudocSpine ../sisu-spine-samples/markup/pod/*";
+ echo '❯❯ nix build';
+ ## ImPure Nix environment
+ SpineGitVer=`git describe | sed "s/^[a-z_-]\+\([0-9.]\+\)/\1/" | sed "s/\([^-]*-g\)/r\1/" | sed "s/-/./g"` && \
+ SpineGitBranch=`git branch --show-current` && \
+ echo "❯❯ spine-v${version} - ($SpineGitBranch: $SpineGitVer)"
+ ## Pure Nix environment - version info from flake inputs
+ #echo "❯❯ spine-v${version} (rev: ${self.shortRev or "unknown"})"
+ echo '❯❯ $SpineBIN -v --source --pod --text --epub --html --html-link-pdf --html-link-curate --html-link-markup --curate --output=$SpineOUT $SpinePOD/*';
+ echo "❯❯ $SpineBIN -v --source --pod --text --epub --html --html-link-pdf --html-link-curate --html-link-markup --curate --output=$SpineOUT $SpinePOD/*";
+ echo '❯❯ nix flake update && nix flake check && nix flake show';
'';
in
with pkgs-nix; {
dsh-overlay = mkShell {
- name = "spine-<<spine_version>> base dev shell, ldc-<<ldc_version>>, dub-<<dub_version>>";
+ name = "spine-<<spine_version>> base dev shell, ldc-<<ldc_version>>, dub-<<dub_version>> - dtools-<<dtools_version>>";
inherit shell;
inherit devEnv;
packages = with pkgs-ovl; [
ldc
#dmd
dub
+ dtools
gnumake
sqlite
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
- dsh-nixpkgs-dmd-dub = mkShell {
+ dsh-nixpkgs-dmd = mkShell {
name = "spine-<<spine_version>> base dev shell";
inherit shell;
inherit devEnv;
packages = [
dmd
dub
+ dtools
gnumake
sqlite
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
- dsh-nixpkgs-ldc-dub = mkShell {
+ dsh-nixpkgs-ldc = mkShell {
name = "spine-<<spine_version>> base dev shell";
inherit shell;
inherit devEnv;
packages = [
ldc
dub
+ dtools
gnumake
sqlite
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
- dsh-overlay-dmd-dub = mkShell {
- name = "spine-<<spine_version>> base dev shell, dmd-<<dmd_version>>, dub-<<dub_version>>";
+ dsh-overlay-dmd = mkShell {
+ name = "spine-<<spine_version>> base dev shell, dmd-<<dmd_version>>, dub-<<dub_version>> - dtools-<<dtools_version>>";
inherit shell;
inherit devEnv;
packages = with pkgs-ovl; [
dmd
dub
+ dtools
gnumake
sqlite
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
- dsh-overlay-ldc-dub = mkShell {
- name = "spine-<<spine_version>> base dev shell, ldc-<<ldc_version>>, dub-<<dub_version>>";
+ dsh-overlay-ldc = mkShell {
+ name = "spine-<<spine_version>> base dev shell, ldc-<<ldc_version>>, dub-<<dub_version>> - dtools-<<dtools_version>>";
inherit shell;
inherit devEnv;
packages = with pkgs-ovl; [
ldc
dub
+ dtools
gnumake
sqlite
];
@@ -305,6 +331,7 @@
ldc
#dmd
dub
+ dtools
gnumake
sqlite
libxml2
@@ -322,6 +349,8 @@
calibre #(suite includes: ebook-viewer)
koreader
foliate
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
@@ -333,6 +362,7 @@
ldc
#dmd
dub
+ dtools
gnumake
sqlite
# ❯❯ text-mode web browsers
@@ -342,6 +372,8 @@
w3m
# ❯❯ light graphical
#dillo
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
@@ -353,11 +385,14 @@
ldc
#dmd
dub
+ dtools
gnumake
source-sans-pro
source-serif-pro
source-code-pro
texlive.combined.scheme-full
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
@@ -369,8 +404,11 @@
ldc
#dmd
dub
+ dtools
gnumake
sqlite
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
@@ -382,9 +420,12 @@
ldc
#dmd
dub
+ dtools
gnumake
sqlite
perl538Packages.Po4a
+ gnugrep gnused
+ ripgrep
];
inherit shellHook;
};
@@ -499,6 +540,7 @@ with pkgs;
# ❯❯❯ dev
gnumake
ps
+ dtools
# ❯❯❯ d_build_related
# ❯❯ package manager
dub
@@ -705,7 +747,7 @@ github:nixos/nixpkgs
** .env/echo-nixNote CHECK MODIFY
*** notes on nix commands
-#+HEADER: :tangle ../.env/nix-commands
+#+HEADER: :tangle-NO ../.env/nix-commands
#+BEGIN_SRC text
- nix flake update && nix flake check --show-trace && nix flake show && nix develop .#devShell
@@ -730,7 +772,7 @@ nix-shell '<nixpkgs>' -A nix --pure
*** echo-nixNote
-#+HEADER: :tangle ../.env/echo-nixNote
+#+HEADER: :tangle-NO ../.env/echo-nixNote
#+BEGIN_SRC shell
echo '-*- mode: org -*-
@@ -880,13 +922,13 @@ $SpineBIN/spine --show-config --output="$SpineOUTversioned" $SpinePOD
,#+BEGIN_SRC shell
$SpineBIN/spine --very-verbose --sqlite-db-create --output="$SpineOUT" $SpinePOD/*
-$SpineBIN/spine -v --cgi-search-form-codegen --output=$SpineOUT $SpinePOD/*
+# CGI search form is built separately in sisudoc-spine-search-cgi/
$SpineBIN/spine -v --show-config --config=$SpinePOD/.dr
$SpineBIN/spine --html $SpinePOD/*
-$SpineBIN/spine -v --cgi-search-form-codegen --config=$SpinePOD/.dr/config_local_site
+# See sisudoc-spine-search-cgi/README.md for CGI search form build instructions
,#+END_SRC
,*** generate html linked to search form
@@ -955,7 +997,7 @@ webserv:
,*** make search form
,#+BEGIN_SRC shell
-$SpineBIN/spine -v --cgi-search-form-codegen --config=$SpinePOD/.dr/config_local_site
+# CGI search form is built separately - see sisudoc-spine-search-cgi/README.md
,#+END_SRC
,*** latex
@@ -1020,18 +1062,9 @@ postInstall:
echo `ls -la $${out}/bin/spine`
#+END_SRC
-* SHARED
-** versions
-*** spine project VERSION :version:set:project:
-
-#+NAME: spine_version
-#+HEADER: :noweb yes
-#+BEGIN_SRC emacs-lisp
-<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
-#+END_SRC
-
-*** dlang overlays
-**** ldc
+* versions GET
+** dlang overlays
+*** ldc
#+NAME: ldc_version
#+HEADER: :noweb yes
@@ -1039,7 +1072,7 @@ postInstall:
<<./nix-develop-dlang-shared.org:ldc-version()>>
#+END_SRC
-**** dmd
+*** dmd
#+NAME: dmd_version
#+HEADER: :noweb yes
@@ -1047,7 +1080,7 @@ postInstall:
<<./nix-develop-dlang-shared.org:dmd-version()>>
#+END_SRC
-**** dub
+*** dub
#+NAME: dub_version
#+HEADER: :noweb yes
@@ -1055,7 +1088,7 @@ postInstall:
<<./nix-develop-dlang-shared.org:dub-version()>>
#+END_SRC
-**** dtools
+*** dtools
#+NAME: dtools_version
#+HEADER: :noweb yes
@@ -1063,15 +1096,41 @@ postInstall:
<<./nix-develop-dlang-shared.org:dtools-version()>>
#+END_SRC
-*** empty sha56 hash
+** sha256 blank hash
-#+NAME: blank_hash
+#+NAME: sha256-blank
#+BEGIN_SRC nix
-sha256-0000000000000000000000000000000000000000000=
+<<./nix-develop-dlang-shared.org:sha256-blank()>>
#+END_SRC
-#+NAME: assumed_hash
+#+NAME: blank_hash
#+BEGIN_SRC nix
-sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+<<./nix-develop-dlang-shared.org:sha256-blank()>>
+#+END_SRC
+
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
#+END_SRC
+* __END__
diff --git a/org/default_imports.org b/org/default_imports.org
index d708124..b719d37 100644
--- a/org/default_imports.org
+++ b/org/default_imports.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -32,20 +32,18 @@ module sisudoc.meta;
#+NAME: imports_for_meta_general
#+BEGIN_SRC d
-public import
- sisudoc.meta.defaults;
+public import sisudoc.meta.defaults;
/+ std +/
-public import
- std.array,
- std.exception,
- std.range,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- // std.uni,
- std.utf,
- std.conv : to;
+public import std.array;
+public import std.exception;
+public import std.range;
+public import std.regex;
+public import std.stdio;
+public import std.string;
+public import std.typecons;
+// public import std.uni;
+public import std.utf;
+public import std.conv : to;
#+END_SRC
* imports for _output_ :output:
@@ -63,28 +61,43 @@ module sisudoc.io_out;
#+NAME: imports_for_output_general
#+BEGIN_SRC d
-public import
- std.algorithm,
- std.array,
- std.container,
- std.exception,
- std.path,
- std.process,
- std.range,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- // std.uni,
- std.utf;
-public import
- sisudoc.share.defaults,
- sisudoc.io_in.paths_source,
- sisudoc.io_out.defaults,
- sisudoc.io_out.paths_output;
+public import std.algorithm;
+public import std.array;
+public import std.container;
+public import std.exception;
+public import std.path;
+public import std.process;
+public import std.range;
+public import std.regex;
+public import std.stdio;
+public import std.string;
+public import std.typecons;
+// public import std.uni;
+public import std.utf;
+public import sisudoc.share.defaults;
+public import sisudoc.io_in.paths_source;
+public import sisudoc.io_out.defaults;
+public import sisudoc.io_out.paths_output;
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/default_misc.org b/org/default_misc.org
index baa7a81..8fab9fc 100644
--- a/org/default_misc.org
+++ b/org/default_misc.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -190,24 +190,23 @@ module sisudoc.io_out.defaults;
#+NAME: defaults_imports
#+BEGIN_SRC d
-import
- std.algorithm,
- std.array,
- std.container,
- std.exception,
- std.file,
- std.getopt,
- std.json,
- std.path,
- std.process,
- std.range,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.uni,
- std.utf,
- std.conv : to;
+import std.algorithm;
+import std.array;
+import std.container;
+import std.exception;
+import std.file;
+import std.getopt;
+import std.json;
+import std.path;
+import std.process;
+import std.range;
+import std.regex;
+import std.stdio;
+import std.string;
+import std.typecons;
+import std.uni;
+import std.utf;
+import std.conv : to;
#+END_SRC
** defaults shared by meta & output (generic)
@@ -360,7 +359,24 @@ template spineLanguageCodes() {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/default_paths.org b/org/default_paths.org
index 3cdb909..f73a9ef 100644
--- a/org/default_paths.org
+++ b/org/default_paths.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -31,16 +31,14 @@
+/
module sisudoc.io_in.paths_source;
@safe:
-import
- std.array,
- std.file,
- std.path,
- std.regex,
- std.stdio,
- std.conv : to;
-import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx_files;
+import std.array;
+import std.file;
+import std.path;
+import std.regex;
+import std.stdio;
+import std.conv : to;
+import sisudoc.meta.defaults;
+import sisudoc.meta.rgx_files;
<<template_paths_src_0>>
<<template_paths_src_1>>
<<template_paths_src_2>>
@@ -80,8 +78,10 @@ template PodManifest() {
_manifest_path = m.captures["podpath"];
}
} else {
- if (_opt_action.vox_gt1 || _opt_action.debug_do) {
- writeln("WARNING, src is not a pod, issue with manifest_path: ", _pth); // remove? unless can distinguish pod
+ if (_opt_action.vox_gt_3 || _opt_action.debug_do) {
+ if (exists(_pth) == 0 && (_pth.isFile)) {
+ writeln("WARNING, src file is not .sst or .ssm (nor is it a pod directory): ", _pth); // remove? unless can distinguish pod
+ }
}
_manifest_path = "";
}
@@ -98,7 +98,7 @@ template PodManifest() {
_k = pod_manifest_path;
}
if (exists(_k)==0) {
- writeln("ERROR >> Processing Skipped! Manifest not found: ", _k);
+ // writeln("ERROR >> Processing Skipped! Manifest not found: ", _k);
_k = null;
}
return _k;
@@ -974,13 +974,11 @@ template spinePathsPods() {
+/
module sisudoc.io_out.paths_output;
@safe:
-import
- std.array,
- std.path,
- std.regex,
- std.stdio;
-import
- sisudoc.meta.rgx_files;
+import std.array;
+import std.path;
+import std.regex;
+import std.stdio;
+import sisudoc.meta.rgx_files;
<<template_paths_out_0>>
<<template_paths_out_1>>
<<template_paths_url>>
@@ -995,6 +993,8 @@ import
<<template_paths_sqlite_0>>
<<template_paths_sqlite_1>>
<<template_paths_sqlite_2>>
+<<template_paths_text>>
+<<template_paths_skel>>
#+END_SRC
** shared out path, base directory :out:
@@ -1459,7 +1459,7 @@ template spinePathsODT() {
auto spinePathsODT(M)(
M doc_matters,
) {
- auto out_pth = spineOutPaths!()( doc_matters.output_path, doc_matters.src.language);
+ auto out_pth = spineOutPaths!()(doc_matters.output_path, doc_matters.src.language);
string base_dir = "odf";
struct _PathsStruct {
string base_pth() { // dir will contain odt document file (also debug file tree)
@@ -1520,6 +1520,7 @@ template spinePathsODT() {
#+END_SRC
** _latex_ :latex:
+*** latex
#+NAME: template_paths_latex
#+BEGIN_SRC d
@@ -1569,6 +1570,8 @@ template spinePathsLaTeX() {
}
#+END_SRC
+*** latex_sty
+
#+NAME: template_paths_latex_sty
#+BEGIN_SRC d
template spinePathsLaTeXsty() {
@@ -1687,7 +1690,84 @@ template spinePathsSQLite() {
}
#+END_SRC
-* document header including copyright & license
+** _text_ :text:
+
+#+NAME: template_paths_text
+#+BEGIN_SRC d
+template spinePathsText() {
+ import std.conv;
+ auto spinePathsText(M)(
+ M doc_matters,
+ ) {
+ auto out_pth = spineOutPaths!()(doc_matters.output_path, doc_matters.src.language);
+ string base_dir = "text";
+ struct _PathsStruct {
+ string base_pth() {
+ return (((out_pth.output_base).chainPath(base_dir)).asNormalizedPath).array;
+ }
+ string base_filename(string fn_src) {
+ return fn_src.baseName.stripExtension;
+ }
+ string text_file() {
+ return ((base_pth.chainPath(doc_matters.src.doc_uid_out ~ ".txt")).asNormalizedPath).array;
+ }
+ string dirtop() {
+ return "".chainPath("").array;
+ }
+ }
+ return _PathsStruct();
+ }
+}
+#+END_SRC
+
+** _skel_ :skel:
+
+#+NAME: template_paths_skel
+#+BEGIN_SRC d
+template spinePathsSkel() {
+ import std.conv;
+ auto spinePathsSkel(M)(
+ M doc_matters,
+ ) {
+ auto out_pth = spineOutPaths!()(doc_matters.output_path, doc_matters.src.language);
+ string base_dir = "skel";
+ struct _PathsStruct {
+ string base_pth() {
+ return (((out_pth.output_base).chainPath(base_dir)).asNormalizedPath).array;
+ }
+ string base_filename(string fn_src) {
+ return fn_src.baseName.stripExtension;
+ }
+ string skel_file() {
+ return ((base_pth.chainPath(doc_matters.src.doc_uid_out ~ ".skel")).asNormalizedPath).array;
+ }
+ string dirtop() {
+ return "".chainPath("").array;
+ }
+ }
+ return _PathsStruct();
+ }
+}
+#+END_SRC
+
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/default_regex.org b/org/default_regex.org
index dc70056..1c0ca2f 100644
--- a/org/default_regex.org
+++ b/org/default_regex.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -308,9 +308,9 @@ static table_col_separator_nl = ctRegex!(`[┊]$`, "mg");
#+BEGIN_SRC d
/+ inline markup footnotes endnotes +/
static inline_notes_curly_gen = ctRegex!(`~\{.+?\}~`, "m");
-static inline_notes_curly = ctRegex!(`~\{\s*(.+?)\}~`, "mg");
-static inline_notes_curly_sp_asterisk = ctRegex!(`~\{[*]+\s+(.+?)\}~`, "m");
-static inline_notes_curly_sp_plus = ctRegex!(`~\{[+]+\s+(.+?)\}~`, "m");
+static inline_notes_curly = ctRegex!(`~\{\s*(.+?)\s*\}~`, "mg");
+static inline_notes_curly_sp_asterisk = ctRegex!(`~\{[*]+\s+(.+?)\s*\}~`, "m");
+static inline_notes_curly_sp_plus = ctRegex!(`~\{[+]+\s+(.+?)\s*\}~`, "m");
static note_ref = ctRegex!(`^\S+?noteref_(?P<ref>[0-9]+)`, "mg"); // {^{73.}^}#noteref_73
#+END_SRC
@@ -331,8 +331,8 @@ static smid_inline_url_generic = ctRegex!(`(?:^|[}(\[ ])(
static smid_inline_url = ctRegex!(`((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_]\S*)`, "mg");
static smid_inline_link_naked_url = ctRegex!(`(?P<pre>^|[ (\[])(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤)\S+?)(?=[.,;:?!'"]?([ )\]]|$))`, "mg");
static smid_inline_link_markup_regular = ctRegex!(`(?P<pre>^|[ (\[])\{\s*(?P<content>.+?)\s*\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?=[;:!,?.]?([ )\]]|$))`, "mg");
-static smid_inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(?P<content>.+?)\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?=[.,;:?!]?([ ]|$))`, "mg");
-static smid_inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(?P<content>.+?)\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+)`, "mg");
+static smid_inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(?P<content>.+?)\s*\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?=[.,;:?!]?([ ]|$))`, "mg");
+static smid_inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(?P<content>.+?)\s*\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+)`, "mg");
#+END_SRC
#+BEGIN_SRC d
@@ -507,7 +507,6 @@ static make_breakcolumn = ctRegex!(`break=(?P<breakcolum
#+END_SRC
* 2. ctRegex defaults shared by meta & output (generic)
-
** meta
#+NAME: prgmkup_rgx_meta
@@ -545,9 +544,9 @@ static middle_dot = ctRegex!(`·`, "mg");
static br_empty_line = ctRegex!(`\n[ ]*\n`, "mg");
static br_linebreaks_newlines = ctRegex!(`[\n┘┙]`, "mg");
static br_linebreaks = ctRegex!(`[┘┙]`, "mg");
-static br_line = ctRegex!(`┘`, "mg");
-static br_line_inline = ctRegex!(`┙`, "mg");
-static br_line_spaced = ctRegex!(`┚`, "mg");
+static br_line = ctRegex!(`\s*┘\s*`, "mg");
+static br_line_inline = ctRegex!(`\s*┙\s*`, "mg");
+static br_line_spaced = ctRegex!(`\s*┚\s*`, "mg");
#+END_SRC
#+BEGIN_SRC d
@@ -609,6 +608,7 @@ static inline_al_delimiter_open_regular = ctRegex!(`【\s`, "m");
static inline_al_delimiter_open_symbol_star = ctRegex!(`【[*]\s`, "m");
static inline_al_delimiter_open_symbol_plus = ctRegex!(`【[+]\s`, "m");
static inline_text_and_note_al_ = ctRegex!(`(.+?(?:【[*+]*\s+.+?】|.+))`, "mg");
+static endnote_section_note = ctRegex!(`┥\s*⑆\^┨(?P<notenumber>\d+)\.┣\^┝┤(?P<link>¤?.+?)├.+`, "mg");
#+END_SRC
#+BEGIN_SRC d
@@ -634,6 +634,7 @@ static inline_link_hash = ctRegex!(`┥(?P<text>.+?)┝
static inline_link_seg_and_hash = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>(?P<seg>[^/#├]*)#(?P<hash>.+?))├`, "mg");
static inline_link_clean = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");
static inline_link_toc_to_backmatter = ctRegex!(`┤#(?P<link>endnotes|bibliography|bookindex|glossary|blurb)├`, "mg");
+static find_bookindex_ocn_link_and_comma = ctRegex!(`[, ]*┥.+?┝┤#?\S+?├`, "mg");
static url = ctRegex!(`https?://`, "mg");
static uri = ctRegex!(`(?:https?|git)://`, "mg");
static uri_identify_components = ctRegex!(`(?P<type>(?:https?|git)://)(?P<path>\S+?/)(?P<file>[^/]+)$`, "mg");
@@ -711,7 +712,7 @@ static src_formalised_file_path_parts = ctRegex!(`(?P<pth>(?:[/a-zA-Z0
** _module template yaml tags
-#+HEADER: :tangle "../src/sisudoc/meta/rgx_yaml_tags.d"
+#+HEADER: :tangle "../src/sisudoc/meta/rgx_yaml.d"
#+HEADER: :noweb yes
#+BEGIN_SRC d
<<doc_header_including_copyright_and_license>>
@@ -799,7 +800,24 @@ static latex_clean_internal_link = ctRegex!(`^(?:#|¤\S+?#)`, "m"
static latex_clean_bookindex_linebreak = ctRegex!(`\s*\\\\\\\\\s*`, "m");
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/default_shared_snippets.org b/org/default_shared_snippets.org
index 3cdcb7d..96d7e2d 100644
--- a/org/default_shared_snippets.org
+++ b/org/default_shared_snippets.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -27,16 +27,14 @@
module sisudoc.io_out.html_snippet;
@safe:
template htmlSnippet() {
- import
- std.file,
- std.outbuffer,
- std.format,
- std.uri,
- std.conv : to;
- import
- sisudoc.io_out.rgx,
- sisudoc.meta.rgx_files,
- sisudoc.io_out.rgx_xhtml;
+ import std.file;
+ import std.outbuffer;
+ import std.format;
+ import std.uri;
+ import std.conv : to;
+ import sisudoc.io_out.rgx;
+ import sisudoc.meta.rgx_files;
+ import sisudoc.io_out.rgx_xhtml;
auto format_html_blank_page_guide_home()(
string css_style,
string home_url,
@@ -104,12 +102,12 @@ template Msg() {
auto Msg(I)(I doc_matters) {
struct Msg_ {
void v()(string message) {
- if (doc_matters.opt.action.vox_gt1) {
+ if (doc_matters.opt.action.vox_gt_2) {
writeln(message);
}
}
void vv()(string message) {
- if (doc_matters.opt.action.vox_gt2) {
+ if (doc_matters.opt.action.vox_gt_3) {
writeln(message);
}
}
@@ -119,7 +117,24 @@ template Msg() {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/doc-reform.org b/org/doc-reform.org
index ee39909..454209f 100644
--- a/org/doc-reform.org
+++ b/org/doc-reform.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
diff --git a/org/in_source_files.org b/org/in_source_files.org
index cdd220f..bc70794 100644
--- a/org/in_source_files.org
+++ b/org/in_source_files.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -31,14 +31,12 @@
+/
module sisudoc.io_in.read_config_files;
@safe:
-import
- std.file,
- std.path;
-import
- sisudoc.meta,
- sisudoc.io_in.paths_source,
- sisudoc.meta.rgx_files,
- sisudoc.meta.rgx;
+import std.file;
+import std.path;
+import sisudoc.meta;
+import sisudoc.io_in.paths_source;
+import sisudoc.meta.rgx_files;
+import sisudoc.meta.rgx;
<<meta_config_file_hub_read_site_config>>
<<meta_config_file_hub_read_document_config>>
<<meta_config_file_hub_read_site_yaml>>
@@ -129,7 +127,7 @@ webserv:
try {
if (exists(conf_file)) {
if (conf_file.getLinkAttributes.attrIsFile) {
- if (_opt_action.vox_gt1 || _opt_action.debug_do) {
+ if (_opt_action.vox_gt_2 || _opt_action.debug_do) {
writeln("config file used: \"", conf_file, "\" (cli flag settings override config file's individual settings)");
}
config_file_str = conf_file.readText;
@@ -186,14 +184,12 @@ webserv:
#+HEADER: :noweb yes
#+BEGIN_SRC d
static template readConfigDoc() {
- import
- std.file,
- std.path;
- import
- sisudoc.meta,
- sisudoc.io_in.paths_source,
- sisudoc.meta.rgx_files,
- sisudoc.meta.rgx;
+ import std.file;
+ import std.path;
+ import sisudoc.meta;
+ import sisudoc.io_in.paths_source;
+ import sisudoc.meta.rgx_files;
+ import sisudoc.meta.rgx;
@system final auto readConfigDoc(M,E)(M _manifested, E _env) {
mixin spineRgxIn;
static auto rgx = RgxI();
@@ -249,14 +245,12 @@ static template readConfigDoc() {
#+HEADER: :noweb yes
#+BEGIN_SRC d
static template configReadSiteYAML() {
- import
- std.file,
- std.path;
- import
- sisudoc.meta,
- sisudoc.io_in.paths_source,
- sisudoc.meta.rgx_files,
- sisudoc.meta.rgx;
+ import std.file;
+ import std.path;
+ import sisudoc.meta;
+ import sisudoc.io_in.paths_source;
+ import sisudoc.meta.rgx_files;
+ import sisudoc.meta.rgx;
final YAMLDocument configReadSiteYAML(M,E)(M _manifested, E _env) {
string _configuration = configReadInSiteYAML!()(_manifested, _env);
auto _conf_file_details = configFilePaths!()(_manifested, _env);
@@ -266,12 +260,10 @@ static template configReadSiteYAML() {
}
}
static template configReadDocYAML() {
- import
- std.file,
- std.path;
- import
- sisudoc.meta,
- sisudoc.io_in.paths_source;
+ import std.file;
+ import std.path;
+ import sisudoc.meta;
+ import sisudoc.io_in.paths_source;
final YAMLDocument configReadDocYAML(M,E)(M _manifested, E _env) {
string _configuration = configReadInDocYAML!()(_manifested, _env);
auto _conf_file_details = configFilePaths!()(_manifested, _env);
@@ -297,15 +289,13 @@ static template configReadDocYAML() {
module sisudoc.io_in.read_source_files;
@safe:
template spineRawMarkupContent() {
- import
- std.digest.sha,
- std.file,
- std.path;
- import
- sisudoc.meta,
- sisudoc.io_in.paths_source,
- sisudoc.meta.rgx_files,
- sisudoc.meta.rgx;
+ import std.digest.sha;
+ import std.file;
+ import std.path;
+ import sisudoc.meta;
+ import sisudoc.io_in.paths_source;
+ import sisudoc.meta.rgx_files;
+ import sisudoc.meta.rgx;
mixin spineRgxIn;
static auto rgx = RgxI();
mixin spineRgxFiles;
@@ -374,7 +364,7 @@ template spineRawMarkupContent() {
sourcefile_body_content = _cii.contents;
insert_file_list_get = _cii.insert_files.dup;
images_list_get = _cii.images.dup;
- } else if (_opt_action.source || _opt_action.pod) {
+ } else if (_opt_action.source_or_pod) {
auto ins = Inserts();
ST_contents_inserts_images _cii
= ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src);
@@ -399,9 +389,8 @@ template spineRawMarkupContent() {
}
}
struct MarkupRawUnit {
- import
- std.digest.sha,
- std.file;
+ import std.digest.sha;
+ import std.file;
<<meta_markup_source_raw_read_file_source_string>>
<<meta_markup_source_raw_doc_header_and_content_split>>
<<meta_markup_source_raw_source_line_array>>
@@ -630,7 +619,7 @@ if (code_block_status == codeBlock.curly) {
markup_sourcesubfile_insert_content.length
);
}
- if (_opt_action.source || _opt_action.pod) {
+ if (_opt_action.source_or_pod) {
_images ~= _extract_images(markup_sourcesubfile_insert_content);
}
auto ins = Inserts();
@@ -646,7 +635,7 @@ if (code_block_status == codeBlock.curly) {
+/
} else {
contents_insert ~= line; // images to extract for image list?
- if (_opt_action.source || _opt_action.pod) {
+ if (_opt_action.source_or_pod) {
string[] _image_linelist = _extract_images(line);
if (_image_linelist.length > 0) {
_images ~= _image_linelist;
@@ -735,7 +724,7 @@ if (code_block_status == codeBlock.curly) {
fn_src_insert.to!string
);
contents ~= contents_insert_st.insert_contents;
- if (_opt_action.source || _opt_action.pod) {
+ if (_opt_action.source_or_pod) {
string[] _image_linelist = _extract_images(contents_insert_st.images);
if (_image_linelist.length > 0) {
_images ~= _image_linelist;
@@ -753,7 +742,7 @@ if (code_block_status == codeBlock.curly) {
+/
} else {
contents ~= line;
- if (_opt_action.source || _opt_action.pod) {
+ if (_opt_action.source_or_pod) {
string[] _image_linelist = _extract_images(line);
if (_image_linelist.length > 0) {
_images ~= _image_linelist;
@@ -783,7 +772,24 @@ ST_contents_inserts_images ret;
return ret;
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org
index 00bc3d3..71b0601 100644
--- a/org/meta_conf_make_meta.org
+++ b/org/meta_conf_make_meta.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :noweb yes
#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -197,24 +197,23 @@ webserv:
#+NAME: meta_defaults_imports
#+BEGIN_SRC d
-import
- std.algorithm,
- std.array,
- std.container,
- std.exception,
- std.file,
- std.getopt,
- std.json,
- std.path,
- std.process,
- std.range,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.uni,
- std.utf,
- std.conv : to;
+import std.algorithm;
+import std.array;
+import std.container;
+import std.exception;
+import std.file;
+import std.getopt;
+import std.json;
+import std.path;
+import std.process;
+import std.range;
+import std.regex;
+import std.stdio;
+import std.string;
+import std.typecons;
+import std.uni;
+import std.utf;
+import std.conv : to;
import sisudoc.meta.conf_make_meta_structs;
#+END_SRC
@@ -239,20 +238,18 @@ module sisudoc.meta.conf_make_meta_structs;
#+NAME: meta_defaults_template_structs_init
#+BEGIN_SRC d
-import
- std.exception,
- std.json,
- std.path,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.utf,
- std.conv : to;
-import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx_yaml,
- sisudoc.meta.rgx;
+import std.exception;
+import std.json;
+import std.path;
+import std.regex;
+import std.stdio;
+import std.string;
+import std.typecons;
+import std.utf;
+import std.conv : to;
+import sisudoc.meta.defaults;
+import sisudoc.meta.rgx_yaml;
+import sisudoc.meta.rgx;
mixin spineRgxIn;
static auto rgx = RgxI();
mixin spineRgxYamlTags;
@@ -621,22 +618,20 @@ string check_input_markup()(
module sisudoc.meta.conf_make_meta_yaml;
@safe:
template contentYAMLtoSpineStruct() {
- import
- std.algorithm,
- std.array,
- std.exception,
- std.path,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.utf,
- std.conv : to;
- import
- sisudoc.meta.conf_make_meta_structs,
- sisudoc.meta.defaults,
- sisudoc.meta.rgx_yaml,
- sisudoc.meta.rgx;
+ import std.algorithm;
+ import std.array;
+ import std.exception;
+ import std.path;
+ import std.regex;
+ import std.stdio;
+ import std.string;
+ import std.typecons;
+ import std.utf;
+ import std.conv : to;
+ import sisudoc.meta.conf_make_meta_structs;
+ import sisudoc.meta.defaults;
+ import sisudoc.meta.rgx_yaml;
+ import sisudoc.meta.rgx;
ConfComposite _struct_composite;
@system ConfComposite contentYAMLtoSpineStruct(C,Y,M,O,Cfg)(
C _struct_composite,
@@ -1448,21 +1443,19 @@ if ("rights" in _yaml
module sisudoc.meta.conf_make_meta_json;
@safe:
static template contentJSONtoSpineStruct() {
- import
- std.algorithm,
- std.array,
- std.exception,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.utf,
- std.conv : to;
- import
- sisudoc.meta.conf_make_meta_structs,
- sisudoc.meta.conf_make_meta_json,
- sisudoc.meta.defaults,
- sisudoc.meta.rgx;
+ import std.algorithm;
+ import std.array;
+ import std.exception;
+ import std.regex;
+ import std.stdio;
+ import std.string;
+ import std.typecons;
+ import std.utf;
+ import std.conv : to;
+ import sisudoc.meta.conf_make_meta_structs;
+ import sisudoc.meta.conf_make_meta_json;
+ import sisudoc.meta.defaults;
+ import sisudoc.meta.rgx;
ConfComposite _struct_composite;
auto contentJSONtoSpineStruct(C,J,M)(C _struct_composite, J _json, M _manifested, string _identifier) {
mixin spineRgxIn;
@@ -2116,9 +2109,8 @@ if ("rights" in _json.object) {
#+BEGIN_SRC d
template configParseYAMLreturnSpineStruct() {
import dyaml;
- import
- sisudoc.meta.conf_make_meta_structs,
- sisudoc.meta.conf_make_meta_json;
+ import sisudoc.meta.conf_make_meta_structs;
+ import sisudoc.meta.conf_make_meta_json;
mixin contentYAMLtoSpineStruct;
@system ConfComposite configParseYAMLreturnSpineStruct(T,M,O,Cfg)(
T _document_struct,
@@ -2154,21 +2146,18 @@ template configParseYAMLreturnSpineStruct() {
#+NAME: doc_header_convert_to_struct
#+BEGIN_SRC d
template docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct() {
- import
- std.exception,
- std.regex,
- std.stdio,
- // std.traits,
- std.typecons,
- std.utf,
- std.conv : to;
- import
- dyaml;
- import
- sisudoc.meta.conf_make_meta_structs,
- sisudoc.meta.conf_make_meta_json,
- sisudoc.meta.rgx_yaml,
- sisudoc.meta.rgx;
+ import std.exception;
+ import std.regex;
+ import std.stdio;
+ // import std.traits;
+ import std.typecons;
+ import std.utf;
+ import std.conv : to;
+ import dyaml;
+ import sisudoc.meta.conf_make_meta_structs;
+ import sisudoc.meta.conf_make_meta_json;
+ import sisudoc.meta.rgx_yaml;
+ import sisudoc.meta.rgx;
mixin spineRgxIn;
mixin contentJSONtoSpineStruct;
static auto rgx = RgxI();
@@ -2196,7 +2185,24 @@ template docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct() {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
@@ -2286,7 +2292,11 @@ header.
** dlang rgx example
#+BEGIN_SRC d
-import std.conv, std.regex, std.range, std.file, std.stdio;
+import std.conv;
+import std.regex;
+import std.range;
+import std.file;
+import std.stdio;
import std.string : format;
void main(string[] argv) {
immutable ratio = 1.5824; // UK pounds to US dollar as of this writing
diff --git a/org/meta_debugs.org b/org/meta_debugs.org
index b5948eb..cd22061 100644
--- a/org/meta_debugs.org
+++ b/org/meta_debugs.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -52,24 +52,22 @@ template spineDebugs() {
#+NAME: debug_imports
#+BEGIN_SRC d
-import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx_files;
-import
- std.algorithm,
- std.array,
- std.container,
- std.exception,
- std.json,
- std.stdio,
- std.file,
- std.path,
- std.range,
- std.regex,
- std.string,
- std.typecons,
- std.utf,
- std.conv : to;
+import sisudoc.meta.defaults;
+import sisudoc.meta.rgx_files;
+import std.algorithm;
+import std.array;
+import std.container;
+import std.exception;
+import std.json;
+import std.stdio;
+import std.file;
+import std.path;
+import std.range;
+import std.regex;
+import std.string;
+import std.typecons;
+import std.utf;
+import std.conv : to;
#+END_SRC
** initialize :report:
@@ -867,7 +865,24 @@ debug(checkdoc) {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/nix-develop-dlang-shared.org b/org/nix-develop-dlang-shared.org
index 5623f63..52f2ec3 100644
--- a/org/nix-develop-dlang-shared.org
+++ b/org/nix-develop-dlang-shared.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :noweb yes
#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -17,20 +17,51 @@
* nix
** direnv
+*** NOTES to update direnv in .envrc-nix
+
+- https://github.com/nix-community/nix-direnv
+
+check for latest version:
+
+- https://github.com/nix-community/nix-direnv/releases
+
+update direnv version and sha hash:
+- emacs org/nix-develop-dlang-shared.org
+
+re-tangle file:
+
+- emacs org/config_env.org
+ updates: .envrc-nix
+
+update flake.lock:
+- nix flake update && nix flake check && nix flake show
+
*** version SET
#+NAME: direnv-version
#+BEGIN_SRC org
-<<direnv_version_3_0_6>>
+<<direnv_version_3_0_7>>
#+END_SRC
#+NAME: direnv-hash
#+BEGIN_SRC org
-<<direnv_hash_3_0_6>>
+<<direnv_hash_3_0_7>>
#+END_SRC
*** versions
+**** 3.0.7
+
+#+NAME: direnv_version_3_0_7
+#+BEGIN_SRC org
+3.0.7
+#+END_SRC
+
+#+NAME: direnv_hash_3_0_7
+#+BEGIN_SRC org
+sha256-bn8WANE5a91RusFmRI7kS751ApelG02nMcwRekC/qzc=
+#+END_SRC
+
**** 3.0.6
#+NAME: direnv_version_3_0_6
@@ -81,6 +112,40 @@ sha256-XQzUAvL6pysIJnRJyR7uVpmUSZfc7LSgWQwq/4mBr1U=
* dlang
** ldc
+*** tags link
+
+- https://github.com/ldc-developers/ldc/tags
+
+*** NOTES to update ldc
+
+check for latest version:
+
+update ldc version and sha hash:
+- emacs ./org/nix-develop-dlang-shared.org
+
+re-tangle files:
+- emacs ./org/nixpkgs_overlays_d_related.org
+ updates: nix-overlays/ldc/package.nix
+- emacs ./org/config_nix.org
+ updates: flake.nix
+- emacs ./org/config_env.org
+ updates: .envrc-nix
+
+update flake.lock:
+- nix flake update && nix flake check && nix flake show
+
+build:
+- nix build ".#spine-overlay-ldc" --print-build-logs
+
+adjust nix overlay if required (to get started):
+- git clone --depth 1 https://github.com/NixOS/nixpkgs
+- find ./nixpkgs/pkgs/ -type d -name "ldc"
+ ./nixpkgs/pkgs/by-name/ld/ldc
+- compare with overlay:
+ ./nix-overlays/ldc
+- overlay is tangled from:
+ emacs ./org/nixpkgs_overlays_d_related.org
+
*** version SET
**** version & sha256 nix composite
@@ -94,24 +159,65 @@ sha256 = "<<ldc-hash>>";
#+NAME: ldc-version
#+BEGIN_SRC org
-<<ldc_version_1_40_0>>
+<<ldc_version_1_41_0>>
#+END_SRC
#+NAME: ldc-hash
#+BEGIN_SRC org
-<<ldc_hash_1_40_0>>
+<<ldc_hash_1_41_0>>
#+END_SRC
#+NAME: ldc-llvm-set
#+BEGIN_SRC org
-<<ldc_llvm_set_1_40_0>>
+<<ldc_llvm_set_1_41_0>>
#+END_SRC
*** versions
+**** 1.41 OK ✓
+***** 1.41.0 OK ✓
+
+ - nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.41.0.tar.gz
+ - nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz
+
+#+NAME: ldc_version_1_41_0
+#+BEGIN_SRC nix
+1.41.0
+#+END_SRC
+
+#+NAME: ldc_hash_1_41_0
+#+BEGIN_SRC nix
+sha256-6LcpY3LSFK4KgEiGrFp/LONu5Vr+/+vI04wEEpF3s+s=
+#+END_SRC
+
+#+NAME: ldc_llvm_set_1_41_0
+#+BEGIN_SRC nix
+llvm_20
+#+END_SRC
+
**** 1.40 OK ✓
+***** 1.40.1 OK ✓
+
+ - nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.40.1.tar.gz
+ - nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz
+
+#+NAME: ldc_version_1_40_1
+#+BEGIN_SRC nix
+1.40.1
+#+END_SRC
+
+#+NAME: ldc_hash_1_40_1
+#+BEGIN_SRC nix
+sha256-WdnwdH25A5oMNNY3uWG2hxnaAT+S1hNuP7LElH3uuuk=
+#+END_SRC
+
+#+NAME: ldc_llvm_set_1_40_1
+#+BEGIN_SRC nix
+llvm_19
+#+END_SRC
+
***** 1.40.0 OK ✓
- - nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.40.0-beta6.tar.gz
+ - nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.40.0.tar.gz
- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz
#+NAME: ldc_version_1_40_0
@@ -222,24 +328,68 @@ sha256-/bs3bwgkLZF5IqaiKnc5gCF/r6MQBG/F1kWUkK8j2s0=
#+END_SRC
** dmd
+*** tags link
+
+- https://github.com/dlang/dmd/tags
+
*** version SET
#+NAME: dmd-version
#+BEGIN_SRC org
-<<dmd_version_2_109_1>>
+<<dmd_version_2_111_0>>
#+END_SRC
#+NAME: dmd-hash
#+BEGIN_SRC org
-<<dmd_hash_2_109_1>>
+<<dmd_hash_2_111_0>>
#+END_SRC
#+NAME: phobos-hash
#+BEGIN_SRC org
-<<phobos_hash_2_109_1>>
+<<phobos_hash_2_111_0>>
#+END_SRC
*** versions
+**** 2.111.0 OK ✓
+
+- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.111.0.tar.gz
+- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.111.0.tar.gz
+
+#+NAME: dmd_version_2_111_0
+#+BEGIN_SRC nix
+2.111.0
+#+END_SRC
+
+#+NAME: phobos_hash_2_111_0
+#+BEGIN_SRC nix
+sha256-9jySZbODoL8sULhYKj/l4+c/uiG5xY2dO240k9XQtPk=
+#+END_SRC
+
+#+NAME: dmd_hash_2_111_0
+#+BEGIN_SRC nix
+sha256-2bjsGa9nTny818dLRV6LKkes+Ycq8W+PFjwhGVrD5TM=
+#+END_SRC
+
+**** 2.110.0 OK ✓
+
+- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.110.0.tar.gz
+- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.110.0.tar.gz
+
+#+NAME: dmd_version_2_110_0
+#+BEGIN_SRC nix
+2.110.0
+#+END_SRC
+
+#+NAME: phobos_hash_2_110_0
+#+BEGIN_SRC nix
+sha256-CmJpcHM+sIsaYBlpALCFoQFG+93s8gUyWmM0tYqjXkk=
+#+END_SRC
+
+#+NAME: dmd_hash_2_110_0
+#+BEGIN_SRC nix
+sha256-icXp9xWF2AI2gp7z/lQFAChmXfQePe9b5pbpQ9Mn19Y=
+#+END_SRC
+
**** 2.109.1 OK ✓
- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.109.1.tar.gz
@@ -356,20 +506,54 @@ sha256-yRL9ub3u4mREG9PVxBvgQ/LDXD57RadPTZ2h08qyh/s=
#+END_SRC
** dub
+*** tags link
+
+- https://github.com/dlang/dub/releases
+
*** version SET
#+NAME: dub-version
#+HEADER: :noweb yes
#+BEGIN_SRC org
-<<dub_version_1_38_1>>
+<<dub_version_1_40_0>>
#+END_SRC
#+NAME: dub-hash
#+BEGIN_SRC org
-<<dub_hash_1_38_1>>
+<<dub_hash_1_40_0>>
#+END_SRC
*** versions
+**** 1.40 OK ✓
+***** 1.40.0
+
+- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.40.0.tar.gz
+
+#+NAME: dub_version_1_40_0
+#+BEGIN_SRC nix
+1.40.0
+#+END_SRC
+
+#+NAME: dub_hash_1_40_0
+#+BEGIN_SRC nix
+sha256-OirchEKf66gis70gCSTOYcrHLyHhCsyt/rTEGT83Vcc=
+#+END_SRC
+
+**** 1.39 OK ✓
+***** 1.39.0
+
+- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.39.0.tar.gz
+
+#+NAME: dub_version_1_39_0
+#+BEGIN_SRC nix
+1.39.0
+#+END_SRC
+
+#+NAME: dub_hash_1_39_0
+#+BEGIN_SRC nix
+sha256-73b15A9+hClD6IbuxTy9QZKpTKjUFYBuqGOclUyhrnM=
+#+END_SRC
+
**** 1.38 OK ✓
***** 1.38.1
@@ -482,66 +666,71 @@ sha256-5pW3Fu3PQ1ZLJnsuh7fPpEBNbVQgGfFyiuMrAVOJKQA=
#+NAME: dtools-version
#+BEGIN_SRC org
-<<dtools_version_2_103_1>>
+<<dtools_version_2_110_0>>
#+END_SRC
#+NAME: dtools-hash
#+BEGIN_SRC org
-<<dtools_hash_2_103_1>>
+<<dtools_hash_2_110_0>>
#+END_SRC
*** versions
-**** 2.103.1 OK ✓
+**** 2.110.0 OK ✓
-- https://github.com/dlang/tools/releases/tag/v2.103.1
+- https://github.com/dlang/tools/releases/tag/v2.110.0
-#+NAME: dtools_version_2_103_1
+#+NAME: dtools_version_2_110_0
#+BEGIN_SRC nix
-2.103.1
+2.110.0
#+END_SRC
-#+NAME: dtools_hash_2_103_1
+#+NAME: dtools_hash_2_110_0
#+BEGIN_SRC nix
-sha256-XM4gUxcarQCOBR8W/o0iWAI54PyLDkH6CsDce22Cnu4=
+sha256-xMEHnrstL5hAkhp8+/z1I2KZWZ7eztWZnUGLTKCfbBI=
#+END_SRC
-**** 2.102.2
+**** 2.109.1 OK ✓
-- https://github.com/dlang/tools/releases/tag/v2.102.2
+- https://github.com/dlang/tools/releases/tag/v2.109.1
-#+NAME: dtools_version_2_102_2
+#+NAME: dtools_version_2_109_1
#+BEGIN_SRC nix
-2.102.2
+2.109.1
#+END_SRC
-#+NAME: dtools_hash_2_102_2
+#+NAME: dtools_hash_2_109_1
#+BEGIN_SRC nix
-sha256-XM4gUxcarQCOBR8W/o0iWAI54PyLDkH6CsDce22Cnu4=
+sha256-Pfj8Kwf5AlcrHhLs5A/0vIFWLZaNR3ro+esbs7oWN9I=
#+END_SRC
-**** 2.095.1
+**** 2.104.1 OK ✓
-- https://github.com/dlang/tools/releases/tag/v2.095.1
+- https://github.com/dlang/tools/releases/tag/v2.104.2
-#+NAME: dtools_version_2_095_1
+#+NAME: dtools_version_2_104_2
#+BEGIN_SRC nix
-2.095.1
+2.104.2
#+END_SRC
-#+NAME: dtools_hash_2_095_1
+#+NAME: dtools_hash_2_104_2
#+BEGIN_SRC nix
-sha256:0rdfk3mh3fjrb0h8pr8skwlq6ac9hdl1fkrkdl7n1fa2806b740b
+sha256-Pfj8Kwf5AlcrHhLs5A/0vIFWLZaNR3ro+esbs7oWN9I=
#+END_SRC
** sha256 blank_hash
#+NAME: blank_hash
-#+BEGIN_SRC nix
+#+BEGIN_SRC org
+<<sha256-blank>>
+#+END_SRC
+
+#+NAME: sha256-blank
+#+BEGIN_SRC org
sha256-0000000000000000000000000000000000000000000=
#+END_SRC
#+NAME: assumed_hash
-#+BEGIN_SRC nix
+#+BEGIN_SRC org
sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
#+END_SRC
diff --git a/org/nixpkgs_overlays_d_related.org b/org/nixpkgs_overlays_d_related.org
index 665c448..b8a0144 100644
--- a/org/nixpkgs_overlays_d_related.org
+++ b/org/nixpkgs_overlays_d_related.org
@@ -10,7 +10,7 @@
#+STARTUP: show3levels hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -291,12 +291,6 @@ use flake .
#use flake .#default
#+END_SRC
-#+BEGIN_SRC shell
-- https://github.com/nix-community/nix-direnv
-NixDirEnvSHA="sha256-0000000000000000000000000000000000000000000="
-direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${NixDirEnvVersion}/direnvrc
-#+END_SRC
-
** .nix
*** flake.nix
@@ -356,32 +350,34 @@ direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${Nix
inherit shell;
inherit devEnv;
packages = [
- gnumake
ldc
dub
dtools
+ gnumake
];
inherit shellHook;
};
dsh-overlay-ldc-dub = mkShell {
- name = "overlay - ldc-<<ldc_version>> - dub-<<dub_version>>";
+ name = "overlay - ldc-<<ldc_version>> - dub-<<dub_version>> - dtools-<<dtools_version>>";
inherit shell;
inherit devEnv;
packages = [
- gnumake
ldc
dub
+ dtools
+ gnumake
];
inherit shellHook;
};
dsh-overlay-dmd-dub = mkShell {
- name = "overlay - dmd-<<dmd_version>> - dub-<<dub_version>>";
+ name = "overlay - dmd-<<dmd_version>> - dub-<<dub_version>> - dtools-<<dtools_version>>";
inherit shell;
inherit devEnv;
packages = [
- gnumake
dmd
dub
+ dtools
+ gnumake
];
inherit shellHook;
};
@@ -390,11 +386,12 @@ direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${Nix
inherit shell;
inherit devEnv;
packages = [
- gnumake
ldc
gtkd
tilix
dub
+ dtools
+ gnumake
];
inherit shellHook;
};
@@ -403,9 +400,10 @@ direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${Nix
# inherit shell;
# inherit devEnv;
# packages = [
- # gnumake
# gdc
# dub
+ # dtools
+ # gnumake
# ];
# inherit shellHook;
#};
@@ -416,6 +414,7 @@ direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${Nix
packages = with pkgs-nix; [
ldc
dub
+ dtools
gnumake
];
inherit shellHook;
@@ -427,6 +426,7 @@ direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${Nix
packages = with pkgs-nix; [
dmd
dub
+ dtools
gnumake
];
inherit shellHook;
@@ -503,45 +503,43 @@ pkgs.callPackage ./shell.nix {}
- version in nixpkgs:
- https://search.nixos.org/packages?channel=unstable&show=ldc&from=0&size=100&sort=relevance&type=packages&query=ldc
-**** notes
-
-- OK ldc 1.32.2 tested
-
-*** overlays
-**** default.nix OK ✓
+*** overlays OK ✓
+**** default.nix
#+HEADER: :tangle "../nix-overlays/ldc/default.nix"
#+BEGIN_SRC nix
import ./package.nix
#+END_SRC
-**** package.nix OK ✓ (unaltered)
+**** package.nix OK ✓
#+HEADER: :tangle "../nix-overlays/ldc/package.nix"
#+BEGIN_SRC nix
-{ lib
-, stdenv
-, fetchFromGitHub
-, cmake
-, ninja
-, <<ldc_llvm_set>>
-, curl
-, tzdata
-, lit
-, gdb
-, unzip
-, darwin
-, callPackage
-, makeWrapper
-, runCommand
-, writeText
-, targetPackages
-
-, ldcBootstrap ? callPackage ./bootstrap.nix { }
+{
+ lib,
+ stdenv,
+ fetchFromGitHub,
+ fetchpatch,
+ callPackage,
+ makeWrapper,
+ removeReferencesTo,
+ runCommand,
+ writeText,
+ targetPackages,
+ cmake,
+ ninja,
+ <<ldc_llvm_set>>,
+ curl,
+ tzdata,
+ lit,
+ gdb,
+ unzip,
+
+ ldcBootstrap ? callPackage ./bootstrap.nix { },
}:
let
- pathConfig = runCommand "ldc-lib-paths" {} ''
+ pathConfig = runCommand "ldc-lib-paths" { } ''
mkdir $out
echo ${tzdata}/share/zoneinfo/ > $out/TZDatabaseDirFile
echo ${curl.out}/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} > $out/LibcurlPathFile
@@ -584,8 +582,6 @@ stdenv.mkDerivation (finalAttrs: {
nativeBuildInputs = [
cmake ldcBootstrap lit lit.python <<ldc_llvm_set>>.dev makeWrapper ninja unzip
- ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
- darwin.apple_sdk.frameworks.Foundation
] ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
# https://github.com/NixOS/nixpkgs/pull/36378#issuecomment-385034818
gdb
@@ -627,8 +623,7 @@ stdenv.mkDerivation (finalAttrs: {
'';
# https://github.com/ldc-developers/ldc/issues/2497#issuecomment-459633746
- additionalExceptions = lib.optionalString stdenv.hostPlatform.isDarwin
- "|druntime-test-shared";
+ additionalExceptions = lib.optionalString stdenv.hostPlatform.isDarwin "|druntime-test-shared";
checkPhase = ''
# Build default lib test runners
@@ -656,6 +651,12 @@ stdenv.mkDerivation (finalAttrs: {
--set-default CC ${targetPackages.stdenv.cc}/bin/cc
'';
+ preFixup = ''
+ find $out/bin -type f -exec ${removeReferencesTo}/bin/remove-references-to -t ${ldcBootstrap} '{}' +
+ '';
+
+ disallowedReferences = [ ldcBootstrap ];
+
meta = with lib; {
description = "LLVM-based D compiler";
homepage = "https://github.com/ldc-developers/ldc";
@@ -668,34 +669,35 @@ stdenv.mkDerivation (finalAttrs: {
};
passthru.ldcBootstrap = ldcBootstrap;
- passthru.tests = let
- ldc = finalAttrs.finalPackage;
- helloWorld = stdenv.mkDerivation (finalAttrs: {
- name = "ldc-hello-world";
- src = writeText "hello_world.d" ''
- module hello_world;
- import std.stdio;
- void main() {
- writeln("Hello, world!");
- }
- '';
- dontUnpack = true;
- buildInputs = [ ldc ];
- dFlags = [];
- buildPhase = ''
- ldc2 ${lib.escapeShellArgs finalAttrs.dFlags} -of=test $src
- '';
- installPhase = ''
- mkdir -p $out/bin
- mv test $out/bin
- '';
- });
- in {
- # Without -shared, built binaries should not contain
- # references to the compiler binaries.
- no-references-to-compiler = helloWorld.overrideAttrs {
- disallowedReferences = [ ldc ];
- dFlags = ["-g"];
+ passthru.tests =
+ let
+ ldc = finalAttrs.finalPackage;
+ helloWorld = stdenv.mkDerivation (finalAttrs: {
+ name = "ldc-hello-world";
+ src = writeText "hello_world.d" ''
+ module hello_world;
+ import std.stdio;
+ void main() {
+ writeln("Hello, world!");
+ }
+ '';
+ dontUnpack = true;
+ buildInputs = [ ldc ];
+ dFlags = [ ];
+ buildPhase = ''
+ ldc2 ${lib.escapeShellArgs finalAttrs.dFlags} -of=test $src
+ '';
+ installPhase = ''
+ mkdir -p $out/bin
+ mv test $out/bin
+ '';
+ });
+ in {
+ # Without -shared, built binaries should not contain
+ # references to the compiler binaries.
+ no-references-to-compiler = helloWorld.overrideAttrs {
+ disallowedReferences = [ ldc ];
+ dFlags = ["-g"];
};
};
})
@@ -707,13 +709,22 @@ stdenv.mkDerivation (finalAttrs: {
#+HEADER: :tangle "../nix-overlays/ldc/bootstrap.nix"
#+BEGIN_SRC nix
-{ lib, stdenv, fetchurl, curl, tzdata, autoPatchelfHook, fixDarwinDylibNames, libxml2 }:
+{
+ lib,
+ stdenv,
+ fetchurl,
+ curl,
+ tzdata,
+ autoPatchelfHook,
+ fixDarwinDylibNames,
+ libxml2,
+}:
let
inherit (stdenv) hostPlatform;
OS = if hostPlatform.isDarwin then "osx" else hostPlatform.parsed.kernel.name;
ARCH = if hostPlatform.isDarwin && hostPlatform.isAarch64 then "arm64" else hostPlatform.parsed.cpu.name;
- <<ldc_bootstrap_1-25-0_hashes>>
+ <<ldc_bootstrap_1-41-0_hashes>>
in stdenv.mkDerivation {
pname = "ldc-bootstrap";
inherit version;
@@ -753,17 +764,17 @@ in stdenv.mkDerivation {
#+END_SRC
***** bootstrap.nix version SELECT
-****** bootstrap.nix ldc2-1.25.0
+****** bootstrap.nix ldc2-1.41.0
-#+NAME: ldc_bootstrap_1-25-0_hashes
+#+NAME: ldc_bootstrap_1-41-0_hashes
#+BEGIN_SRC nix
-version = "1.25.0";
+version = "1.41.0";
hashes = {
- # Get these from `nix store prefetch-file https://github.com/ldc-developers/ldc/releases/download/v1.25.0/ldc2-1.25.0-osx-x86_64.tar.xz` etc..
- osx-x86_64 = "sha256-6iKnbS+oalLKmyS8qYD/wS21b7+O+VgsWG2iT4PrWPU=";
- linux-x86_64 = "sha256-sfg47RdlsIpryc3iZvE17OtLweh3Zw6DeuNJYgpuH+o=";
- linux-aarch64 = "sha256-UDZ43x4flSo+SfsPeE8juZO2Wtk2ZzwySk0ADHnvJBI=";
- osx-arm64 = "sha256-O/x0vy0wwQFaDc4uWSeMhx+chJKqbQb6e5QNYf+7DCw=";
+ # Get these from `nix store prefetch-file https://github.com/ldc-developers/ldc/releases/download/v1.41.0/ldc2-1.41.0-osx-x86_64.tar.xz` etc..
+ osx-x86_64 = "sha256-W8/0i2PFakXbqs2wxb3cjqa+htSgx7LHyDGOBH9yEYE=";
+ linux-x86_64 = "sha256-SkOUV/D+WeadAv1rV1Sfw8h60PVa2fueQlB7b44yfI8=";
+ linux-aarch64 = "sha256-HEuVChPVM3ntT1ZDZsJ+xW1iYeIWhogNcMdIaz6Me6g=";
+ osx-arm64 = "sha256-FXJnBC8QsEchBhkxSqcZtPC/iHYB6TscY0qh7LPFRuQ=";
};
#+END_SRC
@@ -781,6 +792,20 @@ hashes = {
};
#+END_SRC
+****** bootstrap.nix ldc2-1.25.0
+
+#+NAME: ldc_bootstrap_1-25-0_hashes
+#+BEGIN_SRC nix
+version = "1.25.0";
+hashes = {
+ # Get these from `nix store prefetch-file https://github.com/ldc-developers/ldc/releases/download/v1.25.0/ldc2-1.25.0-osx-x86_64.tar.xz` etc..
+ osx-x86_64 = "sha256-6iKnbS+oalLKmyS8qYD/wS21b7+O+VgsWG2iT4PrWPU=";
+ linux-x86_64 = "sha256-sfg47RdlsIpryc3iZvE17OtLweh3Zw6DeuNJYgpuH+o=";
+ linux-aarch64 = "sha256-UDZ43x4flSo+SfsPeE8juZO2Wtk2ZzwySk0ADHnvJBI=";
+ osx-arm64 = "sha256-O/x0vy0wwQFaDc4uWSeMhx+chJKqbQb6e5QNYf+7DCw=";
+};
+#+END_SRC
+
** dmd OK ✓
*** info
**** links
@@ -795,18 +820,19 @@ hashes = {
- version in nixpkgs:
- https://search.nixos.org/packages?channel=unstable&show=dmd&from=0&size=100&sort=relevance&type=packages&query=dmd
-**** notes KO ✗
-
-- dmd nixpkg modified and appears to build ok
-
-- ISSUES dmd on nixos FAILS to build (my working projects), appears not to find parts of itself
-
*** overlays
**** default.nix
-***** default.nix >=2.108.0)
#+HEADER: :tangle "../nix-overlays/dmd/default.nix"
#+BEGIN_SRC nix
+import ./package.nix
+#+END_SRC
+
+**** package.nix OK ✓
+***** package.nix >=2.108.0)
+
+#+HEADER: :tangle "../nix-overlays/dmd/package.nix"
+#+BEGIN_SRC nix
import ./generic.nix {
version = "<<dmd_version>>";
dmdHash = "<<dmd_hash>>";
@@ -814,10 +840,9 @@ import ./generic.nix {
}
#+END_SRC
-***** default.nix < 2.108.0)
-
+***** package.nix < 2.108.0)
-#+HEADER: :tangle-NO "../nix-overlays/dmd/default.nix"
+#+HEADER: :tangle-NO "../nix-overlays/dmd/package.nix"
#+BEGIN_SRC nix
import ./generic.nix {
version = "<<dmd_version>>";
@@ -830,31 +855,33 @@ import ./generic.nix {
#+HEADER: :tangle "../nix-overlays/dmd/generic.nix"
#+BEGIN_SRC nix
-{ version
-, dmdHash
-, phobosHash
+{
+ version,
+ dmdHash,
+ phobosHash,
}:
-{ stdenv
-, lib
-, fetchFromGitHub
-, removeReferencesTo
-, makeWrapper
-, which
-, writeTextFile
-, curl
-, tzdata
-, gdb
-#, Foundation
-, callPackage
-, targetPackages
-, fetchpatch
-, bash
-, installShellFiles
-, git
-, unzip
-, dmdBootstrap ? callPackage ./bootstrap.nix { }
-, dmdBin ? "${dmdBootstrap}/bin"
+{
+ stdenv,
+ lib,
+ fetchFromGitHub,
+ removeReferencesTo,
+ makeWrapper,
+ which,
+ writeTextFile,
+ curl,
+ tzdata,
+ gdb,
+ # Foundation,
+ callPackage,
+ targetPackages,
+ fetchpatch,
+ bash,
+ installShellFiles,
+ git,
+ unzip,
+ dmdBootstrap ? callPackage ./bootstrap.nix { },
+ dmdBin ? "${dmdBootstrap}/bin",
}:
let
@@ -868,11 +895,8 @@ let
};
bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
- osname =
- if stdenv.hostPlatform.isDarwin then
- "osx"
- else
- stdenv.hostPlatform.parsed.kernel.name;
+ osname = if stdenv.hostPlatform.isDarwin then "osx"
+ else stdenv.hostPlatform.parsed.kernel.name;
pathToDmd = "\${NIX_BUILD_TOP}/dmd/generated/${osname}/release/${bits}/dmd";
in
@@ -929,7 +953,9 @@ stdenv.mkDerivation (finalAttrs: {
rm dmd/compiler/test/runnable/gdb4149.d
rm dmd/compiler/test/runnable/gdb4181.d
rm dmd/compiler/test/compilable/ddocYear.d
- rm dmd/compiler/test/fail_compilation/needspkgmod.d
+ rm dmd/compiler/test/compilable/sarif_success_test.d
+ rm dmd/compiler/test/fail_compilation/sarif_test.d
+ rm dmd/compiler/test/fail_compilation/sarifmultiple_test.d
# Disable tests that rely on objdump whitespace until fixed upstream:
# https://issues.dlang.org/show_bug.cgi?id=23317
@@ -941,9 +967,9 @@ stdenv.mkDerivation (finalAttrs: {
substituteInPlace dmd/compiler/test/dshell/test6952.d --replace-fail "/usr/bin/env bash" "${bash}/bin/bash"
'' + lib.optionalString stdenv.hostPlatform.isLinux ''
substituteInPlace phobos/std/socket.d --replace-fail "assert(ih.addrList[0] == 0x7F_00_00_01);" ""
- '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
- substituteInPlace phobos/std/socket.d --replace-fail "foreach (name; names)" "names = []; foreach (name; names)"
- '';
+ ''; # + lib.optionalString stdenv.hostPlatform.isDarwin ''
+ # substituteInPlace phobos/std/socket.d --replace-fail "foreach (name; names)" "names = []; foreach (name; names)"
+ #'';
nativeBuildInputs = [
makeWrapper
@@ -1173,37 +1199,27 @@ stdenv.mkDerivation {
- version in nixpkgs:
- https://search.nixos.org/packages?channel=unstable&show=dub&from=0&size=100&sort=relevance&type=packages&query=dub
-**** notes
-
-- OK dub == current OK ✓
-
-- NOTES for dub 1.33.0 >= 1.31.0 KO ✗
- - dub builds test tilix which calls in gtkd
- - ISSUES dub FAILS to build project from local disk that has built without issue
- since dub v1.23.0
- - BROKEN breaks on subproject ends up in nix: Error /homeless-shelter:
- Permission denied
-
-- OK dub == 1.30.0 OK ✓
-
*** overlays
-**** default.nix OK ✓
+**** default.nix
#+HEADER: :tangle "../nix-overlays/dub/default.nix"
#+BEGIN_SRC nix
import ./package.nix
#+END_SRC
+**** package.nix OK ✓
+
#+HEADER: :tangle "../nix-overlays/dub/package.nix"
#+BEGIN_SRC nix
-{ lib
-, stdenv
-, fetchFromGitHub
-, curl
-, <<dcompiler>>
-, dcompiler ? <<dcompiler>>
-, libevent
-, rsync
+{
+ lib,
+ stdenv,
+ fetchFromGitHub,
+ curl,
+ <<dcompiler>>,
+ dcompiler ? <<dcompiler>>,
+ libevent,
+ rsync,
}:
assert dcompiler != null;
@@ -1267,6 +1283,7 @@ stdenv.mkDerivation (finalAttrs: {
rm -rf test/pr2642-cache-db # added to build v1.34.0
rm -rf test/pr2644-describe-artifact-path # added to build v1.36.0
rm -rf test/pr2647-build-deep # added to build v1.36.0
+ rm -rf test/issue2698-cimportpaths-broken-with-dmd-ldc # added to build v1.40.0
./test/run-unittest.sh
runHook postCheck
@@ -1289,7 +1306,7 @@ stdenv.mkDerivation (finalAttrs: {
})
#+END_SRC
-*** dcompiler SET
+*** dcompiler
#+NAME: dcompiler
#+BEGIN_SRC nix
@@ -1323,62 +1340,188 @@ dmd
#+HEADER: :tangle "../nix-overlays/dtools/default.nix"
#+BEGIN_SRC nix
-{ stdenv, lib, fetchFromGitHub, fetchpatch, ldc, curl, gnumake42 }:
+import ./package.nix
+#+END_SRC
+
+**** package.nix
-stdenv.mkDerivation rec {
+#+HEADER: :tangle "../nix-overlays/dtools/package.nix"
+#+BEGIN_SRC nix
+{
+ lib,
+ stdenv,
+ fetchFromGitHub,
+ ldc,
+ curl,
+}:
+
+stdenv.mkDerivation (finalAttrs: {
pname = "dtools";
version = "<<dtools_version>>";
src = fetchFromGitHub {
owner = "dlang";
repo = "tools";
- rev = "v${version}";
- sha256 = "<<dtools_hash>>";
+ rev = "v${finalAttrs.version}";
+ hash = "<<dtools_hash>>";
name = "dtools";
};
patches = [
- (fetchpatch {
- # part of https://github.com/dlang/tools/pull/441
- url = "https://github.com/dlang/tools/commit/6c6a042d1b08e3ec1790bd07a7f69424625ee866.patch"; # Fix LDC arm64 build
- sha256 = "sha256-x6EclTYN1Y5FG57KLhbBK0BZicSYcZoWO7MTVcP4T18=";
- })
+ # Disable failing tests
+ ./disabled-tests.diff
+ # Fix LDC arm64 build
+ ./fix-ldc-arm64.diff
];
- nativeBuildInputs = [ ldc gnumake42 ]; # fails with make 4.4
+ nativeBuildInputs = [ ldc ];
buildInputs = [ curl ];
- makeCmd = ''
- make -f posix.mak all DMD_DIR=dmd DMD=${ldc.out}/bin/ldmd2 CC=${stdenv.cc}/bin/cc
- '';
+ makeFlags = [
+ "CC=${stdenv.cc}/bin/cc"
+ "DMD=${ldc.out}/bin/ldmd2"
+ "INSTALL_DIR=$(out)"
+ ];
- buildPhase = ''
- $makeCmd
- '';
+ enableParallelBuilding = true;
doCheck = true;
-
- checkPhase = ''
- $makeCmd test_rdmd
- '';
-
- installPhase = ''
- $makeCmd INSTALL_DIR=$out install
- '';
+ checkTarget = "test_rdmd";
meta = with lib; {
- description = "Ancillary tools for the D programming language compiler";
+ description = "Ancillary tools for the D programming language";
homepage = "https://github.com/dlang/tools";
- license = lib.licenses.boost;
- maintainers = with maintainers; [ ThomasMader ];
- platforms = lib.platforms.unix;
+ license = licenses.boost;
+ maintainers = with maintainers; [ jtbx ];
+ platforms = platforms.unix;
};
-}
+})
+#+END_SRC
+
+#+HEADER: :tangle "../nix-overlays/dtools/disabled-tests.diff"
+#+BEGIN_SRC diff
+--- a/rdmd_test.d
++++ b/rdmd_test.d
+@@ -616,7 +616,7 @@ void runTests(string rdmdApp, string compiler, string model)
+ enforce(res.status == 1, res.output);
+ }
+
+- version (Posix)
++ version (none)
+ {
+ import std.conv : to;
+ auto makeVersion = execute(["make", "--version"]).output.splitLines()[0];
+#+END_SRC
+
+#+HEADER: :tangle "../nix-overlays/dtools/fix-ldc-arm64.diff"
+#+BEGIN_SRC diff
+Adapted from https://github.com/dlang/tools/commit/6c6a042d1b08e3ec1790bd07a7f69424625ee866.patch
+--- /dev/null
++++ b/osmodel.mak
+@@ -0,0 +1,75 @@
++# osmodel.mak
++#
++# Detects and sets the macros:
++#
++# OS = one of {osx,linux,freebsd,openbsd,netbsd,dragonflybsd,solaris}
++# MODEL = one of { 32, 64 }
++# MODEL_FLAG = one of { -m32, -m64 }
++# ARCH = one of { x86, x86_64, aarch64 }
++#
++# Note:
++# Keep this file in sync between druntime, phobos, and dmd repositories!
++# Source: https://github.com/dlang/dmd/blob/master/src/osmodel.mak
++
++
++ifeq (,$(OS))
++ uname_S:=$(shell uname -s)
++ ifeq (Darwin,$(uname_S))
++ OS:=osx
++ endif
++ ifeq (Linux,$(uname_S))
++ OS:=linux
++ endif
++ ifeq (FreeBSD,$(uname_S))
++ OS:=freebsd
++ endif
++ ifeq (OpenBSD,$(uname_S))
++ OS:=openbsd
++ endif
++ ifeq (NetBSD,$(uname_S))
++ OS:=netbsd
++ endif
++ ifeq (DragonFly,$(uname_S))
++ OS:=dragonflybsd
++ endif
++ ifeq (Solaris,$(uname_S))
++ OS:=solaris
++ endif
++ ifeq (SunOS,$(uname_S))
++ OS:=solaris
++ endif
++ ifeq (,$(OS))
++ $(error Unrecognized or unsupported OS for uname: $(uname_S))
++ endif
++endif
++
++# When running make from XCode it may set environment var OS=MACOS.
++# Adjust it here:
++ifeq (MACOS,$(OS))
++ OS:=osx
++endif
++
++ifeq (,$(MODEL))
++ ifeq ($(OS), solaris)
++ uname_M:=$(shell isainfo -n)
++ else
++ uname_M:=$(shell uname -m)
++ endif
++ ifneq (,$(findstring $(uname_M),x86_64 amd64))
++ MODEL:=64
++ ARCH:=x86_64
++ endif
++ ifneq (,$(findstring $(uname_M),aarch64 arm64))
++ MODEL:=64
++ ARCH:=aarch64
++ endif
++ ifneq (,$(findstring $(uname_M),i386 i586 i686))
++ MODEL:=32
++ ARCH:=x86
++ endif
++ ifeq (,$(MODEL))
++ $(error Cannot figure 32/64 model and arch from uname -m: $(uname_M))
++ endif
++endif
++
++MODEL_FLAG:=-m$(MODEL)
+--- a/Makefile
++++ b/Makefile
+@@ -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
-** versions SET
+** versions GET
*** direnv
-***** select version SET OK ✓
+***** select version
#+NAME: direnv_version
#+HEADER: :noweb yes
@@ -1399,7 +1542,7 @@ stdenv.mkDerivation rec {
<<./nix-develop-dlang-shared.org:ldc-version-info()>>
#+END_SRC
-***** select version SET OK ✓
+***** selected version
#+NAME: ldc_version
#+HEADER: :noweb yes
@@ -1418,6 +1561,7 @@ stdenv.mkDerivation rec {
#+END_SRC
*** dmd
+**** selected version
#+NAME: dmd_version
#+HEADER: :noweb yes
@@ -1436,6 +1580,7 @@ stdenv.mkDerivation rec {
#+END_SRC
*** dub
+**** selected version
#+NAME: dub_version
#+HEADER: :noweb yes
@@ -1449,6 +1594,7 @@ stdenv.mkDerivation rec {
#+END_SRC
*** dtools
+**** selected version
#+NAME: dtools_version
#+HEADER: :noweb yes
@@ -1461,4 +1607,16 @@ stdenv.mkDerivation rec {
<<./nix-develop-dlang-shared.org:dtools-hash()>>
#+END_SRC
+** sha256 blank_hash
+
+#+NAME: sha256-blank
+#+BEGIN_SRC emacs-lisp
+<<./nix-develop-dlang-shared.org:sha256-blank()>>
+#+END_SRC
+
+#+NAME: blank_hash
+#+BEGIN_SRC emacs-lisp
+<<./nix-develop-dlang-shared.org:sha256-blank()>>
+#+END_SRC
+
* __END__
diff --git a/org/ocda.org b/org/ocda.org
index 148edf8..ee24570 100644
--- a/org/ocda.org
+++ b/org/ocda.org
@@ -1,6 +1,7 @@
-*- mode: org -*-
#+TITLE: sisudoc spine (doc_reform) object-centric document abstraction
#+DESCRIPTION: documents - structuring, publishing in multiple formats & search
+#+SUMMARY: process markup document, create document abstraction
#+FILETAGS: :spine:abstraction:
#+AUTHOR: Ralph Amissah
#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
@@ -9,7 +10,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :noweb yes
#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -18,7 +19,8 @@
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
* (Object-Centric) Document Abstraction
-Process markup document, create document abstraction.
+
+- Process markup document, create document abstraction
** _module template_ :module:metadoc_from_src:
@@ -51,25 +53,23 @@ template docAbstraction() {
#+HEADER: :noweb yes
#+BEGIN_SRC d
// ↓ abstraction imports
-import
- std.algorithm,
- std.container,
- std.digest.sha,
- std.file,
- std.json,
- std.path;
-import
- sisudoc.meta,
- sisudoc.meta.defaults,
- sisudoc.meta.rgx,
- sisudoc.meta.metadoc_object_setter,
- sisudoc.meta.rgx;
+import std.algorithm;
+import std.container;
+import std.digest.sha;
+import std.file;
+import std.json;
+import std.path;
+import sisudoc.meta;
+import sisudoc.meta.defaults;
+import sisudoc.meta.rgx;
+import sisudoc.meta.metadoc_object_setter;
+import sisudoc.meta.rgx;
public import sisudoc.meta.metadoc_from_src_functions;
mixin docAbstractionFunctions;
#+END_SRC
** docAbstraction
-*** abstraction summary
+*** _toc_ abstraction summary
#+NAME: docAbstraction
#+HEADER: :noweb yes
@@ -219,7 +219,7 @@ int cnt1 = 1; int cnt2 = 1; int cnt3 = 1;
// abstraction init ↑
#+END_SRC
-*** abstraction init substitutions
+*** debug abstraction init substitutions
#+NAME: docAbstractionInitSubstitutionsDebug
#+HEADER: :noweb yes
@@ -231,8 +231,8 @@ debug (substitutions) {
}
if (conf_make_meta.make.substitute) {
foreach(substitution_pair; conf_make_meta.make.substitute) {
- writeln("regex to match: ", substitution_pair[Substitute.match]);
- writeln("substitution to make: ", substitution_pair[Substitute.markup]);
+ writeln("regex to match: ", substitution_pair[Substitute.match]);
+ writeln("substitution to make: ", substitution_pair[Substitute.markup]);
}
}
if (conf_make_meta.make.bold) {
@@ -250,7 +250,7 @@ debug (substitutions) {
}
#+END_SRC
-*** loop source by line (large block)
+*** _loop_ source by line (large block)
#+NAME: docAbstractionMainLoopSrcByLine
#+HEADER: :noweb yes
@@ -796,7 +796,7 @@ _loopMarkupSrcByLineStruct loopMarkupSrcByLine(
comp_obj_.has.inline_links = substantive_obj_misc_struct.has_links;
comp_obj_.has.image_without_dimensions = substantive_obj_misc_struct.has_images_without_dimensions;
the_document_body_section ~= comp_obj_;
- tag_assoc = an_object.inline_para_link_anchor(tag_in_seg, tag_assoc);
+ tag_assoc = an_object.inline_para_link_anchor(tag_in_seg, tag_assoc);
{
ST_txt_by_line_common_reset _get = txt_by_line_common_reset_(line_occur, an_object, pith);
{
@@ -883,7 +883,7 @@ _loopMarkupSrcByLineStruct loopMarkupSrcByLine(
}
#+END_SRC
-*** post loop (consider and segment/break up further in code & org)
+*** _post loop_ (consider and segment/break up further in code & org)
#+NAME: docAbstractionPostMainLoop
#+HEADER: :noweb yes
@@ -972,7 +972,7 @@ ST_endnotes en_st = note_section.backmatter_endnote_objects(obj_cite_digits, opt
}
{ // document segnames
ST_segnames get_segnames;
- get_segnames = the_document_body_section.after_doc_determine_segnames(the_document_endnotes_section, the_document_glossary_section, the_document_bibliography_section, the_document_bookindex_section, the_document_blurb_section, segnames, html_segnames_ptr_cntr, html_segnames_ptr); //
+ get_segnames = the_document_body_section.after_doc_determine_segnames(the_document_endnotes_section, the_document_glossary_section, the_document_bibliography_section, the_document_bookindex_section, the_document_blurb_section, segnames, html_segnames_ptr_cntr, html_segnames_ptr);
segnames = get_segnames.segnames;
html_segnames_ptr_cntr = get_segnames.html_segnames_ptr_cntr;
html_segnames_ptr = get_segnames.html_segnames_ptr;
@@ -1409,36 +1409,42 @@ string[][string] document_section_keys_sequenced = [
"scroll": ["head", "toc", "body",],
"seg": ["head", "toc", "body",],
"sql": ["head", "body",],
- "latex": ["head", "toc", "body",]
+ "latex": ["head", "toc", "body",],
+ "text": ["head", "toc", "body",],
];
if (document_the["endnotes"].length > 1) {
document_section_keys_sequenced["scroll"] ~= "endnotes";
document_section_keys_sequenced["seg"] ~= "endnotes";
document_section_keys_sequenced["latex"] ~= "endnotes";
+ document_section_keys_sequenced["text"] ~= "endnotes";
}
if (document_the["glossary"].length > 1) {
document_section_keys_sequenced["scroll"] ~= "glossary";
document_section_keys_sequenced["seg"] ~= "glossary";
document_section_keys_sequenced["sql"] ~= "glossary";
document_section_keys_sequenced["latex"] ~= "glossary";
+ document_section_keys_sequenced["text"] ~= "glossary";
}
if (document_the["bibliography"].length > 1) {
document_section_keys_sequenced["scroll"] ~= "bibliography";
document_section_keys_sequenced["seg"] ~= "bibliography";
document_section_keys_sequenced["sql"] ~= "bibliography";
document_section_keys_sequenced["latex"] ~= "bibliography";
+ document_section_keys_sequenced["text"] ~= "bibliography";
}
if (document_the["bookindex"].length > 1) {
document_section_keys_sequenced["scroll"] ~= "bookindex";
document_section_keys_sequenced["seg"] ~= "bookindex";
document_section_keys_sequenced["sql"] ~= "bookindex";
document_section_keys_sequenced["latex"] ~= "bookindex";
+ document_section_keys_sequenced["text"] ~= "bookindex";
}
if (document_the["blurb"].length > 1) {
document_section_keys_sequenced["scroll"] ~= "blurb";
document_section_keys_sequenced["seg"] ~= "blurb";
document_section_keys_sequenced["sql"] ~= "blurb";
document_section_keys_sequenced["latex"] ~= "blurb";
+ document_section_keys_sequenced["text"] ~= "blurb";
}
if ((opt_action.html)
|| (opt_action.html_scroll)
@@ -1456,7 +1462,7 @@ debug(segnames) {
}
#+END_SRC
-*** return structure
+*** _return structure_
#+NAME: docAbstractionReturnsStruct
#+HEADER: :noweb yes
@@ -1550,7 +1556,24 @@ ST_docAbstraction ret;
return ret;
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/ocda_functions.org b/org/ocda_functions.org
index baae83e..0b997b7 100644
--- a/org/ocda_functions.org
+++ b/org/ocda_functions.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :noweb yes
#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -2747,10 +2747,8 @@ static struct ObjInlineMarkup {
CMM conf_make_meta,
Flag!"_new_doc" _new_doc
) {
- obj_txt["munge"] = obj_[obj_key_].dup;
- obj_txt["munge"] = (obj_["is"].match(ctRegex!(`verse|code`)))
- ? obj_txt["munge"]
- : obj_txt["munge"].strip;
+ obj_txt["munge"] = obj_[obj_key_].dup;
+ obj_txt["munge"] = (obj_["is"].match(ctRegex!(`verse|code`))) ? obj_txt["munge"] : obj_txt["munge"].strip;
if (_new_doc) {
anchor_tag = "";
}
@@ -2769,8 +2767,8 @@ static struct ObjInlineMarkup {
|| (obj_["is"] == "group")
|| (obj_["is"] == "block")
|| (obj_["is"] == "verse")) {
- obj_txt["munge"] = (obj_txt["munge"]).inline_markup_faces;
- obj_txt["munge"] = (obj_txt["munge"]).links_and_images;
+ obj_txt["munge"] = (obj_txt["munge"]).inline_markup_faces;
+ obj_txt["munge"] = (obj_txt["munge"]).links_and_images;
}
switch (obj_["is"]) {
case "heading":
@@ -3553,8 +3551,8 @@ ubyte[32] obj_digest()(
// ↓ - endnotes
struct NotesSection {
string[string] object_notes;
- int previous_count;
- int mkn;
+ int previous_count;
+ int mkn;
static auto rgx = RgxI();
private auto gather_notes_for_endnote_section(
ObjGenericComposite[] contents_am,
@@ -4455,11 +4453,31 @@ ST_the_section build_the_blurb_section(Opt) (
int html_segnames_ptr_cntr,
int html_segnames_ptr,
) {
+ string[string][string] notes_;
+ if (the_document_body_section.length > 1) {
+ string _notes;
+ foreach (ref obj; the_document_body_section) {
+ if (obj.has.inline_notes_reg) {
+ if ((obj.text).matchFirst(rgx.inline_notes_al_gen)) {
+ foreach (m; (obj.text).matchAll(rgx.inline_notes_al_regular_number_note)) {
+ _notes ~= "\n\n" ~ m["num"] ~ ". " ~ m["note"];
+ notes_[(m["num"])]["ocn"] = obj.metainfo.ocn.to!string;
+ }
+ }
+ }
+ }
+ }
if (the_document_endnotes_section.length > 1) {
segnames["html"] ~= "endnotes";
segnames["epub"] ~= "endnotes";
html_segnames_ptr = html_segnames_ptr_cntr;
foreach (ref obj; the_document_endnotes_section) {
+ auto matches = (obj.text).matchAll(rgx.endnote_section_note);
+ foreach (m; matches) {
+ obj.metainfo.parent_ocn = notes_[(m["notenumber"])]["ocn"].to!int;
+ }
+ }
+ foreach (ref obj; the_document_endnotes_section) {
if (obj.metainfo.is_a == "heading") {
obj.metainfo.parent_ocn = obj.metainfo.markedup_ancestors[obj.metainfo.parent_lev_markup];
}
@@ -5652,12 +5670,32 @@ auto docSectKeysSeq(string[][string] document_section_keys_sequenced) {
string[] latex() {
return document_section_keys_sequenced["latex"];
}
+ string[] text() {
+ return document_section_keys_sequenced["text"];
+ }
}
return doc_sect_keys_seq();
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/ocda_obj_setter.org b/org/ocda_obj_setter.org
index f37df13..f90f44c 100644
--- a/org/ocda_obj_setter.org
+++ b/org/ocda_obj_setter.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :noweb yes
#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -50,23 +50,23 @@ template ObjectSetter() {
#+NAME: meta_structs_docObjectMeta
#+BEGIN_SRC d
struct DocObj_MetaInfo_ {
- string is_of_part = ""; // frontmatter, body, backmatter
- string is_of_section = ""; // toc, body, glossary, biography, book index, blurb
- string is_of_type = ""; // para, block ?
- string is_a = ""; // heading, para, table, code block, group, verse/poem ...
- alias of_part = is_of_part;
- alias of_section = is_of_section;
- alias is_of = is_of_type;
- string attrib = "";
- string lang = ""; // blocks: group, block, quote; not codeblock;
- string syntax = ""; // codeblock only
+ string is_of_part = ""; // frontmatter, body, backmatter
+ string is_of_section = ""; // toc, body, glossary, biography, book index, blurb
+ string is_of_type = ""; // para, block ?
+ string is_a = ""; // heading, para, table, code block, group, verse/poem ...
+ alias of_part = is_of_part;
+ alias of_section = is_of_section;
+ alias is_of = is_of_type;
+ string attrib = "";
+ string lang = ""; // blocks: group, block, quote; not codeblock;
+ string syntax = ""; // codeblock only
/+ o_n +/
- int o_n_substantive = 0;
- int o_n_non_substantive = 0;
- int o_n_glossary = 0;
- int o_n_bibliography = 0;
- int o_n_book_index = 0;
- int o_n_blurb = 0;
+ int o_n_substantive = 0;
+ int o_n_non_substantive = 0;
+ int o_n_glossary = 0;
+ int o_n_bibliography = 0;
+ int o_n_book_index = 0;
+ int o_n_blurb = 0;
string object_number_substantive() const @property {
return (o_n_substantive == 0) ? "" : o_n_substantive.to!string;
}
@@ -130,49 +130,49 @@ struct DocObj_MetaInfo_ {
#+NAME: meta_structs_docObjects
#+BEGIN_SRC d
struct DocObj_TxtAttrib_ {
- int indent_base = 0;
- int indent_hang = 0;
- bool bullet = false;
- string language = "";
+ int indent_base = 0;
+ int indent_hang = 0;
+ bool bullet = false;
+ string language = "";
}
struct DocObj_Has_ {
- bool inline_links = false;
- bool inline_notes_reg = false;
- bool inline_notes_star = false;
- bool images = false;
- bool image_without_dimensions = false;
+ bool inline_links = false;
+ bool inline_notes_reg = false;
+ bool inline_notes_star = false;
+ bool images = false;
+ bool image_without_dimensions = false;
}
struct DocObj_Table_ {
- int number_of_columns = 0;
- double[] column_widths = [];
- string[] column_aligns = [];
- bool heading = false;
- bool walls = false;
+ int number_of_columns = 0;
+ double[] column_widths = [];
+ string[] column_aligns = [];
+ bool heading = false;
+ bool walls = false;
}
struct DocObj_CodeBlock_ {
- string syntax = "";
- bool linenumbers = false;
+ string syntax = "";
+ bool linenumbers = false;
}
struct DocObj_Stow_ {
- string[] link = [];
+ string[] link = [];
}
struct DocObj_Pointer_ {
- int doc_object = 0;
- int html_segnames = 0;
- int heading = 0;
+ int doc_object = 0;
+ int html_segnames = 0;
+ int heading = 0;
}
struct DocObj_Tags_ {
- string[] heading_ancestors_text = [ "", "", "", "", "", "", "", "", ];
- string anchor_tag_html = "";
- string in_segment_html = "";
- string segment_anchor_tag_epub = "";
- string html_segment_anchor_tag_is = "";
- string epub_segment_anchor_tag_is = "";
- string heading_lev_anchor_tag = "";
- string segname_prev = "";
- string segname_next = "";
- string[] lev4_subtoc = [];
- string[] anchor_tags = [];
+ string[] heading_ancestors_text = [ "", "", "", "", "", "", "", "", ];
+ string anchor_tag_html = "";
+ string in_segment_html = "";
+ string segment_anchor_tag_epub = "";
+ string html_segment_anchor_tag_is = "";
+ string epub_segment_anchor_tag_is = "";
+ string heading_lev_anchor_tag = "";
+ string segname_prev = "";
+ string segname_next = "";
+ string[] lev4_subtoc = [];
+ string[] anchor_tags = [];
}
#+END_SRC
@@ -181,7 +181,7 @@ struct DocObj_Tags_ {
#+NAME: meta_structs_doc
#+BEGIN_SRC d
struct ObjGenericComposite {
- string text = "";
+ string text = "";
DocObj_MetaInfo_ metainfo;
DocObj_TxtAttrib_ attrib;
DocObj_Tags_ tags;
@@ -444,7 +444,24 @@ static auto eN() {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_curate_metadata.org b/org/out_curate_metadata.org
index f01229a..e61b546 100644
--- a/org/out_curate_metadata.org
+++ b/org/out_curate_metadata.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -50,19 +50,17 @@ template spineMetaDocCurate() {
#+NAME: metadoc_curate_imports
#+BEGIN_SRC d
-import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx;
-import
- std.array,
- std.exception,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.uni,
- std.utf,
- std.conv : to;
+import sisudoc.meta.defaults;
+import sisudoc.meta.rgx;
+import std.array;
+import std.exception;
+import std.regex;
+import std.stdio;
+import std.string;
+import std.typecons;
+import std.uni;
+import std.utf;
+import std.conv : to;
#+END_SRC
*** initialize :report:
@@ -127,17 +125,15 @@ return hvst.curate;
<<doc_header_including_copyright_and_license>>
module sisudoc.meta.metadoc_curate_topics;
@safe:
- import
- std.algorithm,
- std.array,
- std.exception,
- std.regex,
- std.stdio,
- std.string,
- std.conv : to;
- import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx;
+ import std.algorithm;
+ import std.array;
+ import std.exception;
+ import std.regex;
+ import std.stdio;
+ import std.string;
+ import std.conv : to;
+ import sisudoc.meta.defaults;
+ import sisudoc.meta.rgx;
mixin spineCurateMetadata;
mixin InternalMarkup;
template spineMetaDocCuratesTopics() {
@@ -472,17 +468,15 @@ try {
<<doc_header_including_copyright_and_license>>
module sisudoc.meta.metadoc_curate_authors;
@safe:
- import
- std.algorithm,
- std.array,
- std.exception,
- std.regex,
- std.stdio,
- std.string,
- std.conv : to;
- import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx;
+ import std.algorithm;
+ import std.array;
+ import std.exception;
+ import std.regex;
+ import std.stdio;
+ import std.string;
+ import std.conv : to;
+ import sisudoc.meta.defaults;
+ import sisudoc.meta.rgx;
mixin spineCurateMetadata;
mixin InternalMarkup;
template spineMetaDocCuratesAuthors() {
@@ -1018,7 +1012,24 @@ string inline_search_form(M)(
┃") ~ "\n";
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_latex.org b/org/out_latex.org
index 9767286..1d5336e 100644
--- a/org/out_latex.org
+++ b/org/out_latex.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -41,9 +41,8 @@ module sisudoc.io_out.latex;
#+HEADER: :noweb yes
#+BEGIN_SRC d
template paperLaTeX() {
- import
- std.format,
- std.conv : to;
+ import std.format;
+ import std.conv : to;
auto paperLaTeX() {
<<Struct_shared_geometry_paper_dimensions>>
return PaperType();
@@ -73,6 +72,7 @@ template outputLaTeX() {
<<Function_shared_para>>
<<Function_shared_bookindex>>
<<Function_shared_heading>>
+<<Function_shared_quote>>
<<Function_shared_group>>
<<Function_shared_block>>
<<Function_shared_verse>>
@@ -192,7 +192,7 @@ void writeOutputLaTeX(T,M)(
try {
{ /+ debug +/
if (doc_matters.opt.action.debug_do_latex
- && doc_matters.opt.action.vox_gt1) {
+ && doc_matters.opt.action.vox_gt_2) {
writeln(latex_content.head);
writeln(latex_content.content);
writeln(latex_content.tail);
@@ -201,7 +201,7 @@ void writeOutputLaTeX(T,M)(
if (!exists(pth_latex.latex_path_stuff)) {
(pth_latex.latex_path_stuff).mkdirRecurse;
}
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(" ", pth_latex.latex_file_with_path(paper_size_orientation));
}
{
@@ -274,7 +274,7 @@ void outputLaTeX(D,M)(
string content;
string tail;
}
- auto latex = LaTeX();
+ LaTeX latex = LaTeX();
foreach (paper_size_orientation; doc_matters.conf_make_meta.conf.set_papersize) {
latex.head = latex_head(doc_matters, paper_size_orientation);
latex.content = latex_body(doc_abstraction, doc_matters, paper_size_orientation);
@@ -289,9 +289,8 @@ void outputLaTeX(D,M)(
#+NAME: Initialize_output_style
#+BEGIN_SRC d
-import
- std.format,
- std.conv : to;
+import std.format;
+import std.conv : to;
#+END_SRC
**** write latex styles output :latex:out:
@@ -663,15 +662,13 @@ fonts to try:
#+NAME: ImportsAndMixins_imports
#+BEGIN_SRC d
-import
- std.file,
- std.outbuffer,
- std.uri,
- std.conv : to;
-import
- sisudoc.io_out,
- sisudoc.io_out.rgx,
- sisudoc.io_out.rgx_latex;
+import std.file;
+import std.outbuffer;
+import std.uri;
+import std.conv : to;
+import sisudoc.io_out;
+import sisudoc.io_out.rgx;
+import sisudoc.io_out.rgx_latex;
mixin spineRgxOut;
static auto rgx = RgxO();
mixin spineRgxLSC;
@@ -1566,6 +1563,30 @@ string bullets_and_indentation(O)(
#+END_SRC
*** grouped text
+**** quote
+
+#+NAME: Function_shared_quote
+#+BEGIN_SRC d
+ string quote(O,M)(
+ string _txt,
+ O obj,
+ M doc_matters,
+ ) {
+ if (obj.metainfo.is_a == "quote") {
+ string _tex_para;
+ _tex_para = q"┃\ocn{%s}\objBlockOpen
+"%s"
+\objBlockClose
+┃";
+ _txt = format(_tex_para,
+ obj.metainfo.object_number,
+ _txt.nbsp_char.footnotes.split(rgx.br_linebreaks_newlines).join("\\br\n").strip
+ ).strip;
+ }
+ return _txt;
+ }
+#+END_SRC
+
**** group
- (hardspace not honored) clear hardspace marker
@@ -1585,7 +1606,7 @@ string bullets_and_indentation(O)(
┃";
_txt = format(_tex_para,
obj.metainfo.object_number,
- _txt.footnotes.split(rgx.br_line_spaced).join("\\brl{1}").strip // provides more control (more noise, not as tidy)
+ _txt.footnotes.split(rgx.br_line_spaced).join(" \\brl{1} ").strip // provides more control (more noise, not as tidy)
// _txt.footnotes.split(rgx.br_line_spaced).join("") // this works using a line-space, looks tidy, keep ref.
).strip;
}
@@ -2232,7 +2253,9 @@ case "body": assert(part == "body" || "head"); // surprise
case "block":
switch (obj.metainfo.is_a) {
case "quote":
- goto default; // TODO
+ _txt = _txt.quote(obj, doc_matters)
+ .links_and_images(obj, doc_matters);
+ goto default;
case "group": /+ (hardspaces not honored) [remove any hardspace marker] +/
_txt = _txt.group(obj, doc_matters)
.links_and_images(obj, doc_matters);
@@ -2331,7 +2354,7 @@ case "backmatter":
default:
{ /+ debug +/
if (doc_matters.opt.action.debug_do_latex
- && doc_matters.opt.action.vox_gt1) {
+ && doc_matters.opt.action.vox_gt_2) {
writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part);
writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a);
writeln(__FILE__, ":", __LINE__, ": ", obj.text);
@@ -2401,7 +2424,24 @@ string _latex_tail = format(q"┃
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_metadata.org b/org/out_metadata.org
index 92f3eda..d92ff92 100644
--- a/org/out_metadata.org
+++ b/org/out_metadata.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -47,11 +47,10 @@ template outputMetadata() {
#+NAME: output_imports
#+BEGIN_SRC d
-import
- std.digest.crc,
- std.digest.sha,
- std.file,
- std.format;
+import std.digest.crc;
+import std.digest.sha;
+import std.file;
+import std.format;
import sisudoc.io_out;
mixin InternalMarkup;
char[] metadata_;
@@ -84,6 +83,7 @@ if (doc_matters.opt.action.debug_do) {
}
auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language);
auto pth_epub = spinePathsEPUB!()(doc_matters.output_path, doc_matters.src.language);
+auto pth_text = spinePathsText!()(doc_matters);
auto pth_pdf = spinePathsPDF!()(doc_matters);
auto pth_pod = spinePathsPods!()(doc_matters);
metadata_ ~= format(q"┃<body lang="en" xml:lang="en">
@@ -109,7 +109,7 @@ if (doc_matters.opt.action.html_link_curate) {
metadata_ ~= "</div>" ~ inline_search_form(doc_matters) ~ "</div><hr />";
if (!(doc_matters.conf_make_meta.meta.title_full.empty)) {
metadata_ ~= "<p class=\"lev0\">Title: <b><a href=\"" ~ doc_matters.src.filename_base ~ "/toc.html\">" ~ doc_matters.conf_make_meta.meta.title_full ~ "</a></b></p>";
-} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
+} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
writeln("ERROR no Title information provided in document header ", doc_matters.src.filename_base);
}
if (!(doc_matters.conf_make_meta.meta.creator_author.empty)) {
@@ -120,18 +120,18 @@ if (!(doc_matters.conf_make_meta.meta.creator_author.empty)) {
metadata_ ~= "<p class=\"lev1\">Author: <b>"
~ doc_matters.conf_make_meta.meta.creator_author ~ "</b></p>";
}
-} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
+} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
writeln("ERROR no Author information provided in document header ", doc_matters.src.filename_base);
}
metadata_ ~= "<p class=\"lev1\">Published: " ~ doc_matters.conf_make_meta.meta.date_published ~ "</p>";
if (!(doc_matters.conf_make_meta.meta.rights_copyright.empty)) {
metadata_ ~= "<p class=\"lev1\">Copyright: " ~ special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright) ~ "</p>";
-} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
+} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
writeln("WARNING no Copyright information provided in document header ", doc_matters.src.filename_base);
}
if (!(doc_matters.conf_make_meta.meta.rights_license.empty)) {
metadata_ ~= "<p class=\"lev1\">License: " ~ special_characters_text(doc_matters.conf_make_meta.meta.rights_license) ~ "</p>";
-} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
+} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
writeln("WARNING no License information provided in document header ", doc_matters.src.filename_base);
}
if (!(doc_matters.conf_make_meta.meta.notes_summary.empty)) {
@@ -165,6 +165,10 @@ if ((doc_matters.opt.action.html_link_pdf) || (doc_matters.opt.action.html_link_
~ "." ~ doc_matters.src.language ~ ".letter.portrait.pdf\" class=\"lnkicon\">"
~ "&nbsp;□&nbsp;pdf&nbsp;(U.S.&nbsp;letter)&nbsp;</a>]&nbsp";
}
+if (doc_matters.opt.action.html_link_text) {
+ metadata_ ~= "&nbsp;&nbsp;[<a href=\"../" ~ "text/" ~ doc_matters.src.filename_base ~ "." ~ doc_matters.src.language ~ ".txt\" class=\"lnkicon\">"
+ ~ "&nbsp;□&nbsp;txt&nbsp;</a>]&nbsp";
+}
metadata_ ~= "</p>";
if (doc_matters.opt.action.html_link_markup_source) {
metadata_ ~= "<hr /><p class=\"lev1\">source: " ~ doc_matters.src.filename_base ~ "</p>";
@@ -319,7 +323,7 @@ void metadata_write_output(M)(M doc_matters, char[] metadata_) {
} catch (ErrnoException ex) {
// Handle error
}
- if (doc_matters.opt.action.vox_gt0) { writeln(" ", pth_html.fn_scroll("metadata." ~ doc_matters.src.filename)); }
+ if (doc_matters.opt.action.vox_gt_1) { writeln(" ", pth_html.fn_scroll("metadata." ~ doc_matters.src.filename)); }
}
#+END_SRC
@@ -688,7 +692,24 @@ string inline_search_form(M)(
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_odt.org b/org/out_odt.org
index 75ea565..363218d 100644
--- a/org/out_odt.org
+++ b/org/out_odt.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -48,7 +48,7 @@
#+HEADER: :tangle "../src/sisudoc/io_out/odt.d" :noweb yes
#+HEADER: :noweb yes
-#+BEGIN_SRC d
+#+BEGIN_SRC org
<<doc_header_including_copyright_and_license>>
module sisudoc.io_out.odt;
@safe:
@@ -100,10 +100,10 @@ template outputODT() {
<<output_odt_variable_content_xml_3>>
<<output_odt_variable_content_xml_4>>
<<output_odt_variable_content_xml_5>>
- <<output_odt_variable_content_xml_6>>
- <<output_odt_variable_content_xml_7>>
- <<output_odt_variable_content_xml_8>>
- <<output_odt_variable_content_xml_9>>
+ <<output_odt_variable_content_xml_6>>
+ <<output_odt_variable_content_xml_7>>
+ <<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_12>>
@@ -969,7 +969,7 @@ string table(O,M)(
}
}
}
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(" ", pth_odt.odt_file);
}
}
@@ -1041,20 +1041,17 @@ void outputODT(D,I)(
#+NAME: output_imports
#+BEGIN_SRC d
-import
- sisudoc.io_out,
- sisudoc.io_out.rgx,
- sisudoc.io_out.rgx_xhtml;
-import
- std.file,
- std.outbuffer,
- std.uri,
- std.zip,
- std.conv : to;
-import
- sisudoc.io_out.create_zip_file,
- sisudoc.io_out.xmls,
- sisudoc.io_out.xmls_css;
+import sisudoc.io_out;
+import sisudoc.io_out.rgx;
+import sisudoc.io_out.rgx_xhtml;
+import std.file;
+import std.outbuffer;
+import std.uri;
+import std.zip;
+import std.conv : to;
+import sisudoc.io_out.create_zip_file;
+import sisudoc.io_out.xmls;
+import sisudoc.io_out.xmls_css;
#+END_SRC
*** make directory tree
@@ -2323,135 +2320,135 @@ string odt_body(D,I)(
#+NAME: output_odt_variable_content_xml_6
#+BEGIN_SRC d
- foreach (part; doc_matters.has.keys_seq.scroll) {
- foreach (obj; doc_abstraction[part]) {
- switch (obj.metainfo.is_of_part) {
+foreach (part; doc_matters.has.keys_seq.scroll) {
+ foreach (obj; doc_abstraction[part]) {
+ switch (obj.metainfo.is_of_part) {
#+END_SRC
****** frontmatter
#+NAME: output_odt_variable_content_xml_7
#+BEGIN_SRC d
- case "frontmatter": assert(part == "head" || "toc");
- switch (obj.metainfo.is_of_type) {
- case "para":
- switch (obj.metainfo.is_a) {
- case "heading":
- _txt = delimit ~ odt_format.heading(obj, doc_matters);
- goto default;
- case "toc":
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- default:
- doc_odt ~= _txt;
- _txt = "";
- break;
- }
- break;
- default: break;
- }
- break;
+case "frontmatter": assert(part == "head" || "toc");
+ switch (obj.metainfo.is_of_type) {
+ case "para":
+ switch (obj.metainfo.is_a) {
+ case "heading":
+ _txt = delimit ~ odt_format.heading(obj, doc_matters);
+ goto default;
+ case "toc":
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ default:
+ doc_odt ~= _txt;
+ _txt = "";
+ break;
+ }
+ break;
+ default: break;
+ }
+ break;
#+END_SRC
****** body
#+NAME: output_odt_variable_content_xml_8
#+BEGIN_SRC d
- case "body": assert(part == "body" || "head"); // surprise
- switch (obj.metainfo.is_of_type) {
- case "para":
- switch (obj.metainfo.is_a) {
- case "heading":
- _txt = delimit ~ odt_format.heading(obj, doc_matters);
- goto default;
- case "para":
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- default:
- doc_odt ~= _txt;
- _txt = "";
- break;
- }
- break;
- case "block":
- switch (obj.metainfo.is_a) {
- case "quote":
- _txt = odt_format.quote(obj, doc_matters);
- goto default;
- case "group":
- _txt = odt_format.group(obj, doc_matters);
- goto default;
- case "block":
- _txt = odt_format.block(obj, doc_matters);
- goto default;
- case "verse":
- _txt = odt_format.verse(obj, doc_matters);
- goto default;
- case "code":
- _txt = odt_format.code(obj, doc_matters);
- goto default;
- case "table":
- _txt = odt_format.table(obj, doc_matters);
- goto default;
- default:
- doc_odt ~= _txt;
- _txt = "";
- break;
- }
- break;
- default: break;
- }
- break;
+case "body": assert(part == "body" || "head"); // surprise
+ switch (obj.metainfo.is_of_type) {
+ case "para":
+ switch (obj.metainfo.is_a) {
+ case "heading":
+ _txt = delimit ~ odt_format.heading(obj, doc_matters);
+ goto default;
+ case "para":
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ default:
+ doc_odt ~= _txt;
+ _txt = "";
+ break;
+ }
+ break;
+ case "block":
+ switch (obj.metainfo.is_a) {
+ case "quote":
+ _txt = odt_format.quote(obj, doc_matters);
+ goto default;
+ case "group":
+ _txt = odt_format.group(obj, doc_matters);
+ goto default;
+ case "block":
+ _txt = odt_format.block(obj, doc_matters);
+ goto default;
+ case "verse":
+ _txt = odt_format.verse(obj, doc_matters);
+ goto default;
+ case "code":
+ _txt = odt_format.code(obj, doc_matters);
+ goto default;
+ case "table":
+ _txt = odt_format.table(obj, doc_matters);
+ goto default;
+ default:
+ doc_odt ~= _txt;
+ _txt = "";
+ break;
+ }
+ break;
+ default: break;
+ }
+ break;
#+END_SRC
****** backmatter
#+NAME: output_odt_variable_content_xml_9
#+BEGIN_SRC d
- case "backmatter":
- assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
- switch (obj.metainfo.is_of_type) {
- case "para":
- switch (obj.metainfo.is_a) {
- case "heading":
- _txt = delimit ~ odt_format.heading(obj, doc_matters);
- goto default;
- case "endnote": assert(part == "endnotes");
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- case "glossary": assert(part == "glossary");
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- case "bibliography": assert(part == "bibliography");
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- case "bookindex": assert(part == "bookindex");
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- case "blurb": assert(part == "blurb");
- _txt = odt_format.para(obj, doc_matters);
- goto default;
- default:
- doc_odt ~= _txt;
- _txt = "";
- break;
- }
- break;
- default: break;
- }
- break;
- case "comment":
- break;
- default:
- { /+ debug +/
- if (doc_matters.opt.action.debug_do
- && doc_matters.opt.action.vox_gt1) {
- writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part);
- writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a);
- writeln(__FILE__, ":", __LINE__, ": ", obj.text);
- }
- }
- break;
+case "backmatter":
+ assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
+ switch (obj.metainfo.is_of_type) {
+ case "para":
+ switch (obj.metainfo.is_a) {
+ case "heading":
+ _txt = delimit ~ odt_format.heading(obj, doc_matters);
+ goto default;
+ case "endnote": assert(part == "endnotes");
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ case "glossary": assert(part == "glossary");
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ case "bibliography": assert(part == "bibliography");
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ case "bookindex": assert(part == "bookindex");
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ case "blurb": assert(part == "blurb");
+ _txt = odt_format.para(obj, doc_matters);
+ goto default;
+ default:
+ doc_odt ~= _txt;
+ _txt = "";
+ break;
+ }
+ break;
+ default: break;
+ }
+ break;
+case "comment":
+ break;
+default:
+ { /+ debug +/
+ if (doc_matters.opt.action.debug_do
+ && doc_matters.opt.action.vox_gt_2) {
+ writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part);
+ writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a);
+ writeln(__FILE__, ":", __LINE__, ": ", obj.text);
+ }
+ }
+ break;
#+END_SRC
***** closings & post loop
@@ -2602,7 +2599,24 @@ void images_cp(M)(
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_skel.org b/org/out_skel.org
new file mode 100644
index 0000000..43be371
--- /dev/null
+++ b/org/out_skel.org
@@ -0,0 +1,324 @@
+-*- mode: org -*-
+#+TITLE: sisudoc spine (doc_reform) output xmls
+#+DESCRIPTION: documents - structuring, publishing in multiple formats & search
+#+FILETAGS: :spine:output:skel:
+#+AUTHOR: Ralph Amissah
+#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
+#+COPYRIGHT: Copyright (C) 2015 - 2025 Ralph Amissah
+#+LANGUAGE: en
+#+STARTUP: content hideblocks hidestars noindent entitiespretty
+#+PROPERTY: header-args :exports code
+#+PROPERTY: header-args+ :noweb yes
+#+PROPERTY: header-args+ :results output none
+#+PROPERTY: header-args+ :cache no
+#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :mkdirp yes
+#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+
+- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
+- [[./output_hub.org][output_hub]]
+
+* Skel
+** outputSkel template
+
+#+HEADER: :tangle "../src/sisudoc/io_out/skel.d"
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+<<doc_header_including_copyright_and_license>>
+module sisudoc.io_out.skel;
+@safe:
+template outputSkel() {
+ <<munge>>
+ <<the_document>>
+ void outputSkel(D,M) (
+ const D doc_abstraction,
+ M doc_matters,
+ ) {
+ import std.stdio;
+ import sisudoc.io_out;
+ <<skel_out>>
+ skel_out(doc_abstraction, doc_matters);
+ }
+}
+#+END_SRC
+
+** Output
+
+#+NAME: skel_out
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+void skel_out(D,M)(
+ const D doc_abstraction,
+ M doc_matters,
+) {
+ struct Skel {
+ string head;
+ string content;
+ string tail;
+ }
+ auto skel = Skel();
+ skel.head = theDocument!().skel_head(doc_matters);
+ skel.content = theDocument!().skel_body(doc_abstraction, doc_matters);
+ skel.tail = theDocument!().skel_tail(doc_matters);
+ auto pth_skel = spinePathsSkel(doc_matters);
+ try {
+ import std.file;
+ if (!exists(pth_skel.base_pth)) {
+ (pth_skel.base_pth).mkdirRecurse;
+ }
+ } catch (ErrnoException ex) {
+ }
+ if (doc_matters.opt.action.vox_gt_1) {
+ writeln(" ", pth_skel.skel_file);
+ }
+ // writeln(pth_skel.base_pth);
+ auto f = File(pth_skel.skel_file, "w");
+ f.writeln(skel.head);
+ f.writeln(skel.content);
+ f.writeln(skel.tail);
+}
+#+END_SRC
+
+* The Document
+** theDocument template
+
+#+NAME: the_document
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+template theDocument() {
+ import std.stdio;
+ import sisudoc.io_out;
+ <<skel_head>>
+ <<skel_body_assign_munge>>
+ <<skel_tail>>
+}
+#+END_SRC
+
+** the Document (assign munge)
+*** Head
+
+#+NAME: skel_head
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+// static auto rgx = RgxO();
+string skel_head(M)(
+ M doc_matters,
+) {
+ return "head";
+}
+#+END_SRC
+
+*** Body munge assign
+
+#+NAME: skel_body_assign_munge
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+string skel_body(D,M)(
+ const D doc_abstraction,
+ M doc_matters,
+) {
+ string doc_object = "";
+ foreach (section; doc_matters.has.keys_seq.scroll) {
+ foreach (obj; doc_abstraction[section]) {
+ if (obj.metainfo.is_a == "toc") { doc_object ~= munge!().toc(obj); }
+ if (obj.metainfo.is_a == "heading") { doc_object ~= munge!().heading(obj); }
+ if (obj.metainfo.is_a == "para") { doc_object ~= munge!().para(obj); }
+ if (obj.metainfo.is_a == "group") { doc_object ~= munge!().group(obj); }
+ if (obj.metainfo.is_a == "block") { doc_object ~= munge!().block(obj); }
+ if (obj.metainfo.is_a == "poem") { doc_object ~= munge!().poem(obj); }
+ if (obj.metainfo.is_a == "verse") { doc_object ~= munge!().verse(obj); }
+ if (obj.metainfo.is_a == "code") { doc_object ~= munge!().code(obj); }
+ if (obj.metainfo.is_a == "quote") { doc_object ~= munge!().quote(obj); }
+ if (obj.metainfo.is_a == "table") { doc_object ~= munge!().table(obj); }
+ if (obj.metainfo.is_a == "endnote") { doc_object ~= munge!().endnote(obj); }
+ if (obj.metainfo.is_a == "bookindex") { doc_object ~= munge!().bookindex(obj); }
+ if (obj.metainfo.is_a == "bibliography") { doc_object ~= munge!().bibliography(obj); }
+ if (obj.metainfo.is_a == "glossary") { doc_object ~= munge!().glossary(obj); }
+ if (obj.metainfo.is_a == "blurb") { doc_object ~= munge!().blurb(obj); }
+ if (obj.metainfo.is_a == "comment") { doc_object ~= munge!().comment(obj); }
+ }
+ }
+ return doc_object;
+}
+#+END_SRC
+
+*** Tail
+
+#+NAME: skel_tail
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+string skel_tail(M)(
+ M doc_matters,
+) {
+ return "tail";
+}
+#+END_SRC
+
+* Munge
+
+#+NAME: munge
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+template munge() {
+ import std.stdio;
+ import std.conv;
+ void puts(string _obj_is) {
+ writeln(__FILE__, ":", __LINE__, ": ", _obj_is);
+ }
+ string newline = "\n";
+ string newlines = "\n\n";
+ string toc(O)(O obj) {
+ // puts(obj.metainfo.is_a);
+ // return "toc\n";
+ return obj.text ~ newline;
+ }
+ string heading(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string para(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string group(O)(O obj) {
+ /+
+ The "group" is different from the "block" mark in that "group" does not
+ preserve whitespace, the "block" mark does. The text falling within the
+ block is a single object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string block(O)(O obj) {
+ /+
+ The "block" is different from the "group" mark in that the "block" mark
+ (like the "poem" mark) preserves whitespace, the "group" mark does not.
+ The text falling within the "block" is a single object, which is different
+ from the "poem" mark where each identified verse is an object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string poem(O)(O obj) {
+ /+
+ The "poem" mark like the "block" preserves whitespace. Text followed by
+ two newlines are identified as verse and each verse is an object i.e. a
+ poem may consist of multiple verse each of which is identified as an
+ object, unlike a text "block" which is identified as a single object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ // return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ return obj.text ~ newlines;
+ }
+ string verse(O)(O obj) {
+ /+
+ See description of poem, the poem is demarkated but the verse is the
+ object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string code(O)(O obj) {
+ /+
+ "Code" blocks are a single text object, in which the original text is
+ preserved.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string quote(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string table(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string endnote(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+ string bookindex(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+ string bibliography(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+ string glossary(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+ string blurb(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+ string comment(O)(O obj) {
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+}
+#+END_SRC
+
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
+* __END__
diff --git a/org/out_sqlite.org b/org/out_sqlite.org
index b9ab903..4564f9b 100644
--- a/org/out_sqlite.org
+++ b/org/out_sqlite.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -95,7 +95,7 @@ template SQLiteHubBuildTablesAndPopulate() {
D doc
) {
<<sqlite_db_statement_composite_collection>>
- if (doc.matters.opt.action.vox_gt0) {
+ if (doc.matters.opt.action.vox_gt_1) {
writeln(" ", pth_sqlite.sqlite_file);
}
}
@@ -177,7 +177,7 @@ template SQLiteHubDiscreteBuildTablesAndPopulate() {
import core.runtime;
core.runtime.Runtime.terminate();
}
- if (doc.matters.opt.action.vox_gt0) {
+ if (doc.matters.opt.action.vox_gt_1) {
writeln(" ", pth_sqlite.sqlite_file(doc.matters.src.filename));
}
}
@@ -215,7 +215,7 @@ template SQLiteDbRun() {
{ /+ debug +/
if (opt_action.debug_do_sqlite) {
writeln(note);
- if (opt_action.vox_gt2) {
+ if (opt_action.vox_gt_3) {
writeln(db_statement);
}
}
@@ -436,12 +436,12 @@ if (opt_action.sqlite_db_create) {
? config.conf.w_srv_db_sqlite_path
: "";
if (db_filename.length > 0 && db_path.length > 0) {
- if (opt_action.vox_gt2) {
+ if (opt_action.vox_gt_3) {
writeln("db name: ", db_filename);
writeln("db path: ", db_path);
writeln("db name & path: ", db_path, "/", db_filename);
}
- if (opt_action.vox_gt1) {
+ if (opt_action.vox_gt_2) {
writeln("attempting to create db: ", db_path, "/", db_filename);
}
auto pth_sqlite = spinePathsSQLite!()(db_filename, db_path);
@@ -560,13 +560,12 @@ db.close;
#+NAME: sqlite_imports
#+BEGIN_SRC d
-import
- sisudoc.io_out,
- sisudoc.io_out.rgx,
- sisudoc.io_out.rgx_xhtml;
-import
- std.file,
- std.uri;
+import sisudoc.io_out;
+import sisudoc.io_out.rgx;
+import sisudoc.io_out.rgx_xhtml;
+import std.file;
+import std.uri;
+// import std.digest.sha;
import std.conv : to;
import std.typecons : Nullable;
import d2sqlite3;
@@ -873,7 +872,7 @@ string inline_links(M,O)(
);
}
} else {
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(
"WARNING on internal document links, anchor to link <<"
~ m.captures["hash"]
@@ -2163,7 +2162,24 @@ VALUES (
);
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_src_pod.org b/org/out_src_pod.org
index e72d332..3bf8f87 100644
--- a/org/out_src_pod.org
+++ b/org/out_src_pod.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -31,7 +31,7 @@ template spinePod() {
<<output_imports>>
void spinePod(T)(T doc_matters) {
<<source_pod_init>>
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
try {
{
podArchive_directory_tree(doc_matters, pths_pod);
@@ -69,18 +69,15 @@ template spinePod() {
#+NAME: output_imports
#+BEGIN_SRC d
-import
- sisudoc.meta.rgx_files,
- sisudoc.io_out;
-import
- std.digest.sha,
- std.file,
- std.outbuffer,
- std.zip,
- std.conv : to;
-import
- sisudoc.io_out.create_zip_file,
- sisudoc.io_out.xmls;
+import std.digest.sha;
+import std.file;
+import std.outbuffer;
+import std.zip;
+import std.conv : to;
+import sisudoc.meta.rgx_files;
+import sisudoc.io_out;
+import sisudoc.io_out.create_zip_file;
+import sisudoc.io_out.xmls;
#+END_SRC
*** init
@@ -105,8 +102,8 @@ assert (doc_matters.src.filename.match(rgx_files.src_fn));
#+BEGIN_SRC d
auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
auto pth_dr_doc_src = doc_matters.src_path_info;
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt1) {
- writeln(__LINE__, ": ",
+ if (doc_matters.opt.action.vox_gt_3) { // correct
+ writeln(__LINE__, ":", __FILE__, ":\n",
doc_matters.src.filename, " -> ",
pths_pod.fn_doc(doc_matters.src.filename, doc_matters.src.language).filesystem_open_zpod
);
@@ -116,7 +113,7 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
string[string][string] _digests;
{ // bundle images - get digest
foreach (image; doc_matters.srcs.image_list) {
- debug(podimages) {
+ if (doc_matters.opt.action.vox_gt_3) {
writeln(
pth_dr_doc_src.image_root.to!string, "/", image, " -> ",
pths_pod.image_root(doc_matters.src.filename).zpod, "/", image
@@ -139,11 +136,11 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
if (doc_matters.opt.action.source_or_pod) {
fn_src_in.copy(fn_src_out_filesystem);
}
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
zip = podArchive("file_path_bin", fn_src_in, fn_src_out_pod_zip_base, zip);
}
} else {
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt1) {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
writeln("WARNING (io) src out NOT found (image): ", fn_src_in);
}
}
@@ -163,11 +160,11 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
if (doc_matters.opt.action.source_or_pod) {
fn_src_in.copy(fn_src_out_filesystem);
}
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
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_gt1) {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
writeln("WARNING (io) src out NOT found (document make): ", fn_src_in);
}
}
@@ -191,7 +188,7 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
= File(pths_pod.fn_pod_filelist(doc_matters.src.filename).filesystem_open_zpod, "w");
Node _pmy;
string _pm = "doc:\n filename: " ~ doc_matters.src.filename ~ "\n language: " ~ doc_matters.pod.manifest_list_of_languages.to!string ~ "\n";
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt1) {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
try {
_pmy = Loader.fromString(_pm).load();
} catch (ErrnoException ex) {
@@ -208,7 +205,7 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
if (doc_matters.opt.action.source_or_pod) {
pod_filelist_yaml_string.writeln(_pm);
}
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
zip = podArchive("string", _pm, fn_src_out_pod_zip_base, zip);
}
}
@@ -228,11 +225,14 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
string fn_src_out_filesystem_lng
= pths_pod.fn_doc(doc_matters.src.filename, _lang).filesystem_open_zpod.to!string;
string _sstm = (doc_matters.pod.manifest_path ~ "/media/text/" ~ _lang ~ "/" ~ doc_matters.src.filename);
- // writeln(_sstm);
- if (exists(_sstm)) { // what of language?
- debug(io) { writeln("(io debug) src in found: ", _sstm); }
+ string _pth_file_sstm;
+ if (exists(_sstm)) { _pth_file_sstm = _sstm;
+ } else if (exists(fn_src_in)) { _pth_file_sstm = fn_src_in;
+ }
+ if (exists(_pth_file_sstm)) { // what of language?
+ debug(io) { writeln("(io debug) src in found: ", _pth_file_sstm); }
{ // take DIGEST write to pod file digests.txt
- auto data = (cast(byte[]) (_sstm).read);
+ auto data = (cast(byte[]) (_pth_file_sstm).read);
_digests[_lang]["sstm"] ~= data.sha256Of.toHexString ~ "::" ~ data.length.to!string ~ " - " ~ doc_matters.src.filename ~ " - [" ~ _lang ~ "]";
// writeln(data.sha256Of.toHexString, "::", data.length, " - ", doc_matters.src.filename);
}
@@ -240,11 +240,11 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
filelist_src_zpod_arr ~= fn_src_out_inside_pod;
string _pod_to_markup_file = doc_matters.src.pod_name ~ "/" ~ "media/text/" ~ _lang ~ "/" ~ doc_matters.src.filename;
if (doc_matters.opt.action.source_or_pod) {
- _sstm.copy(fn_src_out_filesystem_lng);
+ _pth_file_sstm.copy(fn_src_out_filesystem_lng);
}
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
auto _rgx_sstm = regex(r"(?P<path_to_pod>\S+?)(?P<podname>[a-z_-]+)/(?P<from_root>media/text/)(?P<language>\S+?)/(?P<filename>\S+?\.ss[mt])");
- if (auto _x = _sstm.match(_rgx_sstm)){
+ if (auto _x = _pth_file_sstm.match(_rgx_sstm)){
if (doc_matters.src.lng == doc_matters.pod.manifest_list_of_languages[$-1]) { // again wait until all language versions of .ssm parsed
string _path_to_pod = _x.captures["path_to_pod"];
string _podname = _x.captures["podname"];
@@ -259,12 +259,12 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
}
}
} else {
- zip = podArchive("file_path_text", _sstm, fn_src_out_pod_zip_base, zip);
+ zip = podArchive("file_path_text", _pth_file_sstm, fn_src_out_pod_zip_base, zip);
}
}
} else {
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt1) {
- writeln("WARNING (io) src in NOT found (markup source): ", _sstm);
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
+ writeln("WARNING (io) src in NOT found (markup source): \n", _sstm, "or in", fn_src_in);
}
}
}
@@ -308,11 +308,11 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
).filesystem_open_zpod.to!string;
_pth_mkup_src_in.copy(fn_src_out_filesystem); // check why here, thought dealt with elsewhere
}
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
zip = podArchive("file_path_text", _pth_mkup_src_in, _pth_mkup_src_out, zip);
}
} else {
- if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt1) {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
writeln("WARNING (io) src out NOT found (insert file): ", _pth_mkup_src_in);
}
}
@@ -342,11 +342,11 @@ auto pod_zipMakeReady(M,P,S)(M doc_matters, P pths_pod, S _st) {
if (doc_matters.opt.action.source_or_pod) {
fn_src_in.copy(fn_src_out_filesystem);
}
- if (doc_matters.opt.action.pod) {
+ if (doc_matters.opt.action.source_or_pod) {
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_gt1) {
+ if (doc_matters.opt.action.debug_do_pod && doc_matters.opt.action.vox_gt_2) {
writeln("WARNING (io) src out NOT found (insert file): ", fn_src_in);
}
}
@@ -375,7 +375,7 @@ void podArchive_directory_tree(M,P)(M doc_matters, P pths_pod) { // create direc
pths_pod.pod_dir_().mkdirRecurse;
}
if (doc_matters.opt.action.source_or_pod) {
- // if (doc_matters.opt.action.vox_gt0) { writeln(" ", pths_pod.fn_pod_filelist(doc_matters.src.filename).filesystem_open_zpod); }
+ // if (doc_matters.opt.action.vox_gt_1) { writeln(" ", pths_pod.fn_pod_filelist(doc_matters.src.filename).filesystem_open_zpod); }
if (!exists(pths_pod.text_root(doc_matters.src.filename).filesystem_open_zpod)) {
pths_pod.text_root(doc_matters.src.filename).filesystem_open_zpod.mkdirRecurse;
}
@@ -477,19 +477,19 @@ void zipArchiveDigest(M,F,D)(M doc_matters, F fn_pod, D _digests) {
// Handle error
}
try {
- // if (doc_matters.opt.action.vox_gt1) { writeln(" ", pths_pod.pod_dir_(), "/", doc_matters.src.filename_base, ".digests.txt"); }
+ // if (doc_matters.opt.action.vox_gt_2) { writeln(" ", pths_pod.pod_dir_(), "/", doc_matters.src.filename_base, ".digests.txt"); }
string _digest_fn = pths_pod.pod_dir_() ~ "/" ~ doc_matters.src.filename_base ~ ".digests.txt";
- // if (doc_matters.opt.action.vox_gt1) { writeln(_digest_fn); }
+ // if (doc_matters.opt.action.vox_gt_2) { writeln(_digest_fn); }
auto f = File(_digest_fn, "w");
if (exists(fn_pod)) {
try {
auto data = (cast(byte[]) (fn_pod).read);
- // if (doc_matters.opt.action.vox_gt1) { writeln(" ", doc_matters.src.filename, " > ", doc_matters.src.filename_base, ".zip"); }
+ // if (doc_matters.opt.action.vox_gt_2) { writeln(" ", doc_matters.src.filename, " > ", doc_matters.src.filename_base, ".zip"); }
if (doc_matters.opt.action.pod) {
_zip_digest = (data.sha256Of.toHexString ~ "::" ~ data.length.to!string ~ " - " ~ doc_matters.src.filename_base ~ ".zip");
- if (doc_matters.opt.action.vox_gt0) { writeln(" ", _zip_digest); }
- if (doc_matters.opt.action.vox_gt0) { writeln(" ", pths_pod.pod_dir_(), "/", doc_matters.src.filename_base, "/"); }
- if (doc_matters.opt.action.vox_gt0) { writeln(" ", _digest_fn); }
+ if (doc_matters.opt.action.vox_gt_1) { writeln(" ", _zip_digest); }
+ if (doc_matters.opt.action.vox_gt_1) { writeln(" ", pths_pod.pod_dir_(), "/", doc_matters.src.filename_base, "/"); }
+ if (doc_matters.opt.action.vox_gt_1) { writeln(" ", _digest_fn); }
f.writeln(_zip_digest);
}
} catch (ErrnoException ex) {
@@ -499,18 +499,18 @@ void zipArchiveDigest(M,F,D)(M doc_matters, F fn_pod, D _digests) {
foreach (_lang; doc_matters.pod.manifest_list_of_languages) {
if (_lang in _digests) {
if (("sstm" in _digests[_lang]) && (_digests[_lang]["sstm"].length > 0)) {
- // if (doc_matters.opt.action.vox_gt1) { writeln(_digests[_lang]["sstm"]); }
+ // if (doc_matters.opt.action.vox_gt_2) { writeln(_digests[_lang]["sstm"]); }
f.writeln(_digests[_lang]["sstm"]);
}
if (("ssi" in _digests[_lang]) && (_digests[_lang]["ssi"].length > 0)) {
- // if (doc_matters.opt.action.vox_gt1) { writeln(_digests[_lang]["ssi"]); }
+ // if (doc_matters.opt.action.vox_gt_2) { writeln(_digests[_lang]["ssi"]); }
f.writeln(_digests[_lang]["ssi"]);
}
}
}
if ("shared" in _digests) {
if (("images" in _digests["shared"]) && (_digests["shared"]["images"].length > 0)) {
- // if (doc_matters.opt.action.vox_gt1) { writeln(_digests["shared"]["images"]); }
+ // if (doc_matters.opt.action.vox_gt_2) { writeln(_digests["shared"]["images"]); }
f.writeln(_digests["shared"]["images"]);
}
}
@@ -520,7 +520,24 @@ void zipArchiveDigest(M,F,D)(M doc_matters, F fn_pod, D _digests) {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_text.org b/org/out_text.org
new file mode 100644
index 0000000..02d6294
--- /dev/null
+++ b/org/out_text.org
@@ -0,0 +1,565 @@
+-*- mode: org -*-
+#+TITLE: sisudoc spine (doc_reform) output xmls
+#+DESCRIPTION: documents - structuring, publishing in multiple formats & search
+#+FILETAGS: :spine:output:text:
+#+AUTHOR: Ralph Amissah
+#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
+#+COPYRIGHT: Copyright (C) 2015 - 2025 Ralph Amissah
+#+LANGUAGE: en
+#+STARTUP: content hideblocks hidestars noindent entitiespretty
+#+PROPERTY: header-args :exports code
+#+PROPERTY: header-args+ :noweb yes
+#+PROPERTY: header-args+ :results output none
+#+PROPERTY: header-args+ :cache no
+#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :mkdirp yes
+#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+
+- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
+- [[./output_hub.org][output_hub]]
+
+* Text
+** outputText template
+
+#+HEADER: :tangle "../src/sisudoc/io_out/text.d"
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+<<doc_header_including_copyright_and_license>>
+module sisudoc.io_out.text;
+@safe:
+template outputText() {
+ <<munge>>
+ <<the_document>>
+ void outputText(D,M) (
+ const D doc_abstraction,
+ M doc_matters,
+ ) {
+ import std.stdio;
+ import sisudoc.io_out;
+ <<text_out>>
+ text_out(doc_abstraction, doc_matters);
+ }
+}
+#+END_SRC
+
+** Output
+
+#+NAME: text_out
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+void text_out(D,M)(
+ const D doc_abstraction,
+ M doc_matters,
+) {
+ struct Text {
+ string head;
+ string content;
+ string tail;
+ }
+ auto text = Text();
+ // text.head = theDocument!().text_head(doc_matters);
+ text.content = theDocument!().text_body(doc_abstraction, doc_matters);
+ text.tail = theDocument!().text_tail(doc_matters);
+ auto pth_text = spinePathsText(doc_matters);
+ try {
+ import std.file;
+ if (!exists(pth_text.base_pth)) {
+ (pth_text.base_pth).mkdirRecurse;
+ }
+ } catch (ErrnoException ex) {
+ }
+ if (doc_matters.opt.action.vox_gt_1) {
+ writeln(" ", pth_text.text_file);
+ }
+ // writeln(pth_text.base_pth);
+ auto f = File(pth_text.text_file, "w");
+ // f.writeln(text.head);
+ f.writeln(text.content);
+ f.writeln(text.tail);
+}
+#+END_SRC
+
+* The Document
+** theDocument template
+
+#+NAME: the_document
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+template theDocument() {
+ import std.stdio;
+ import sisudoc.io_out;
+ <<text_head>>
+ <<text_body_assign_munge>>
+ <<text_tail>>
+}
+#+END_SRC
+
+** the Document (assign munge)
+*** Head SKIP
+
+#+NAME: text_head
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+string text_head(M)(
+ M doc_matters,
+) {
+ return "head";
+}
+#+END_SRC
+
+*** Body munge assign
+
+#+NAME: text_body_assign_munge
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+string text_body(D,M)(
+ const D doc_abstraction,
+ M doc_matters,
+) {
+ string doc_object = "";
+ foreach (section; doc_matters.has.keys_seq.scroll) {
+ foreach (obj; doc_abstraction[section]) {
+ if (obj.metainfo.is_a == "toc") { doc_object ~= munge!().toc(obj, doc_matters); }
+ if (obj.metainfo.is_a == "heading") { doc_object ~= munge!().heading(obj, doc_matters); }
+ if (obj.metainfo.is_a == "para") { doc_object ~= munge!().para(obj, doc_matters); }
+ if (obj.metainfo.is_a == "group") { doc_object ~= munge!().group(obj, doc_matters); }
+ if (obj.metainfo.is_a == "block") { doc_object ~= munge!().block(obj, doc_matters); }
+ if (obj.metainfo.is_a == "poem") { doc_object ~= munge!().poem(obj, doc_matters); } // CHECK
+ if (obj.metainfo.is_a == "verse") { doc_object ~= munge!().verse(obj, doc_matters); } // CHECK
+ if (obj.metainfo.is_a == "code") { doc_object ~= munge!().code(obj, doc_matters); }
+ if (obj.metainfo.is_a == "quote") { doc_object ~= munge!().quote(obj, doc_matters); } // LATER
+ if (obj.metainfo.is_a == "table") { doc_object ~= munge!().table(obj, doc_matters); }
+ if (obj.metainfo.is_a == "endnote") { doc_object ~= munge!().endnote(obj, doc_matters); }
+ if (obj.metainfo.is_a == "bookindex") { doc_object ~= munge!().bookindex(obj, doc_matters); } // CHECK
+ if (obj.metainfo.is_a == "bibliography") { doc_object ~= munge!().bibliography(obj, doc_matters); } // CHECK
+ if (obj.metainfo.is_a == "glossary") { doc_object ~= munge!().glossary(obj, doc_matters); } // CHECK
+ if (obj.metainfo.is_a == "blurb") { doc_object ~= munge!().blurb(obj, doc_matters); } // CHECK
+ if (obj.metainfo.is_a == "comment") { doc_object ~= munge!().comment(obj, doc_matters); } // LATER
+ }
+ }
+ return doc_object;
+}
+#+END_SRC
+
+*** Tail
+
+#+NAME: text_tail
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+string text_tail(M)(
+ M doc_matters,
+) {
+ string metadata_;
+ if (doc_matters.opt.action.debug_do) {
+ writeln(doc_matters.src.filename_base);
+ writeln("Title: ", doc_matters.conf_make_meta.meta.title_full);
+ writeln(" Author: ", doc_matters.conf_make_meta.meta.creator_author);
+ writeln(" Published: ", doc_matters.conf_make_meta.meta.date_published);
+ writeln(" Copyright: ", doc_matters.conf_make_meta.meta.rights_copyright);
+ writeln(" License: ", doc_matters.conf_make_meta.meta.rights_license);
+ }
+ if (!(doc_matters.conf_make_meta.meta.title_full.empty)) {
+ metadata_ ~= "Title: " ~ doc_matters.conf_make_meta.meta.title_full ~ "\n\n";
+ } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
+ writeln("ERROR no Title information provided in document header ", doc_matters.src.filename_base);
+ }
+ if (!(doc_matters.conf_make_meta.meta.creator_author.empty)) {
+ if (doc_matters.opt.action.html_link_curate) {
+ metadata_ ~= "Author: " ~ doc_matters.conf_make_meta.meta.creator_author_surname.translate([' ' : "_"])
+ ~ doc_matters.conf_make_meta.meta.creator_author ~ "\n\n";
+ } else {
+ metadata_ ~= "Author: "
+ ~ doc_matters.conf_make_meta.meta.creator_author ~ "\n\n";
+ }
+ } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
+ writeln("ERROR no Author information provided in document header ", doc_matters.src.filename_base);
+ }
+ metadata_ ~= "Published: " ~ doc_matters.conf_make_meta.meta.date_published ~ "\n\n";
+ if (!(doc_matters.conf_make_meta.meta.rights_copyright.empty)) {
+ metadata_ ~= "Copyright: " ~ doc_matters.conf_make_meta.meta.rights_copyright ~ "\n\n";
+ } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
+ writeln("WARNING no Copyright information provided in document header ", doc_matters.src.filename_base);
+ }
+ if (!(doc_matters.conf_make_meta.meta.rights_license.empty)) {
+ metadata_ ~= "License: " ~ doc_matters.conf_make_meta.meta.rights_license ~ "\n\n";
+ } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt_3) {
+ writeln("WARNING no License information provided in document header ", doc_matters.src.filename_base);
+ }
+ metadata_ ~= doc_matters.generator_program.project_name.strip ~ "\n";
+ metadata_ ~= doc_matters.generator_program.url_home.strip;
+ return metadata_;
+}
+#+END_SRC
+
+* Munge
+
+#+NAME: munge
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+template munge() {
+ import sisudoc.io_out;
+ import sisudoc.io_out.rgx;
+ import std.stdio;
+ import std.conv;
+ import std.conv : to;
+ import std.typecons : Nullable;
+ mixin spineRgxOut;
+ static auto rgx = RgxO();
+ void puts(string _obj_is) {
+ writeln(__FILE__, ":", __LINE__, ": ", _obj_is);
+ }
+ string newline = "\n";
+ string newlines = "\n\n";
+ template special_characters_and_font_face() {
+ string code(string _txt){
+ _txt = _txt.replaceAll(rgx.nbsp_char, " ");
+ return _txt;
+ }
+ string general(string _txt) {
+ _txt = _txt
+ .replaceAll(rgx.nbsp_char, " ")
+ .replaceAll(rgx.br_line, "\n")
+ .replaceAll(rgx.br_line_inline, "\n")
+ .replaceAll(rgx.br_line_spaced, "\n\n")
+ .replaceAll(rgx.inline_strike, "-{$1}-")
+ .replaceAll(rgx.inline_insert, "+{$1}+")
+ .replaceAll(rgx.inline_cite, "\"{$1}\"")
+ .replaceAll(rgx.inline_emphasis, "!{$1}!")
+ .replaceAll(rgx.inline_bold, "*{$1}*")
+ .replaceAll(rgx.inline_italics, "/{$1}/")
+ .replaceAll(rgx.inline_underscore, "_{$1}_")
+ .replaceAll(rgx.inline_superscript, "^{$1}^")
+ .replaceAll(rgx.inline_subscript, ",{$1},")
+ .replaceAll(rgx.inline_mono, "#{$1}#");
+ return _txt;
+ }
+ string links_and_images(string _txt){
+ if (_txt.match(rgx.inline_link)) {
+ foreach (m; _txt.matchAll(rgx.inline_link)) {
+ _txt = (m.captures[3] == "0")
+ ? _txt.replaceFirst(rgx.inline_link, (m.captures[1]))
+ : _txt.replaceFirst(rgx.inline_link, (m.captures[1] ~ " ≫" ~ m.captures[3]));
+ }
+ }
+ if (_txt.matchFirst(rgx.inline_image)) {
+ foreach (m; _txt.matchAll(rgx.inline_image)) {
+ _txt = _txt.replaceFirst(rgx.inline_image, (m.captures[3]));
+ }
+ }
+ return _txt;
+ }
+ }
+ string generalMunge(O,M)(O obj, M doc_matters) {
+ string _txt = obj.text;
+ string _notes;
+ string _ocn;
+ string general_munge;
+ _ocn = (obj.metainfo.ocn == 0 || doc_matters.opt.action.ocn_off)
+ ? "" : "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newline;
+ if (_txt.matchFirst(rgx.inline_notes_al_gen)) {
+ foreach (m; _txt.matchAll(rgx.inline_notes_al_regular_number_note)) {
+ _notes ~= newlines ~ m["num"] ~ ". "
+ ~ special_characters_and_font_face!().general(m["note"].replaceAll(rgx.inline_link, ("$1")));
+ }
+ }
+ _txt = _txt.replaceAll(rgx.inline_notes_al_regular_number_note, "[$1]");
+ _txt = (obj.metainfo.is_a == "code")
+ ? special_characters_and_font_face!().code(_txt)
+ : special_characters_and_font_face!().general(_txt);
+ _txt = special_characters_and_font_face!().links_and_images(_txt);
+ general_munge = (obj.metainfo.is_a == "heading")
+ ? newline ~ _txt ~ _notes ~ newline ~ _ocn ~ newline
+ : _txt ~ _notes ~ newline ~ _ocn ~ newline;
+ return general_munge;
+ }
+ string toc(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return "toc\n";
+ // _txt = _special_characters_and_font_face(obj.text);
+ string _txt = special_characters_and_font_face!().general(obj.text);
+ string _spaces;
+ switch (obj.attrib.indent_hang) {
+ case 1: _spaces = "";
+ break;
+ case 2: _spaces = ":";
+ break;
+ case 3: _spaces = "∴";
+ break;
+ case 4: _spaces = " ";
+ break;
+ case 5: _spaces = " ";
+ break;
+ case 6: _spaces = " ";
+ break;
+ case 7: _spaces = " ";
+ break;
+ case 8: _spaces = " ";
+ break;
+ default:
+ break;
+ }
+ _txt = (doc_matters.opt.action.ocn_off)
+ ? _txt.replaceAll(rgx.inline_link, (_spaces ~ "$1"))
+ : _txt.replaceAll(rgx.inline_link, (_spaces ~ "$1 ≫ $3"));
+ return _txt ~ newline;
+ }
+ string heading(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string para(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string group(O,M)(O obj, M doc_matters) {
+ /+
+ The "group" is different from the "block" mark in that "group" does not
+ preserve whitespace, the "block" mark does. The text falling within the
+ block is a single object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string block(O,M)(O obj, M doc_matters) {
+ /+
+ The "block" is different from the "group" mark in that the "block" mark
+ (like the "poem" mark) preserves whitespace, the "group" mark does not.
+ The text falling within the "block" is a single object, which is different
+ from the "poem" mark where each identified verse is an object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string poem(O,M)(O obj, M doc_matters) { // LATER
+ /+
+ The "poem" mark like the "block" preserves whitespace. Text followed by
+ two newlines are identified as verse and each verse is an object i.e. a
+ poem may consist of multiple verse each of which is identified as an
+ object, unlike a text "block" which is identified as a single object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+ string verse(O,M)(O obj, M doc_matters) {
+ /+
+ See description of poem, the poem is demarkated but the verse is the
+ object.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string code(O,M)(O obj, M doc_matters) {
+ /+
+ "Code" blocks are a single text object, in which the original text is
+ preserved.
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string quote(O,M)(O obj, M doc_matters) { // LATER
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newline ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string table(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ auto tablarize(O)(
+ string _txt,
+ const O obj,
+ ) {
+ string[] _table_rows = (_txt).split(rgx.table_delimiter_row);
+ string[] _table_cols;
+ string _table = "";
+ string _tablenote = "";
+ int[] _col_width;
+ _col_width.length = obj.table.number_of_columns.to!ulong;
+ foreach(row_idx, row; _table_rows) {
+ _table_cols = row.split(rgx.table_delimiter_col);
+ _table ~= "";
+ foreach(col_idx, cell; _table_cols) {
+ if (!((_table_cols.length == 1)
+ && (_table_rows.length <= row_idx+2))) {
+ if (_col_width[col_idx] < (cell.length.to!int)) {
+ _col_width[col_idx] = cell.length.to!int;
+ }
+ }
+ }
+ }
+ foreach(row_idx, row; _table_rows) {
+ _table_cols = row.split(rgx.table_delimiter_col);
+ foreach(col_idx, cell; _table_cols) {
+ if ((_table_cols.length == 1)
+ && (_table_rows.length <= row_idx+2)) { // check row_idx+2 (rather than == ++row_idx)
+ _tablenote ~= cell ~ newline;
+ } else {
+ if (obj.table.column_aligns[col_idx] == "l") {
+ _table ~= format(q"┃%-*s%s┃",
+ _col_width[col_idx],
+ cell,
+ (_table_cols.length > (col_idx + 1)) ? " ┊ " : ""
+ );
+ } else {
+ _table ~= format(q"┃%*s%s┃",
+ _col_width[col_idx],
+ cell,
+ (_table_cols.length > (col_idx + 1)) ? " ┊ " : ""
+ );
+ }
+ _table = _table
+ .replaceAll(regex("\\s*$"), "");
+ }
+ }
+ _table ~= newline;
+ }
+ Tuple!(string, string) t = tuple(
+ _table,
+ _tablenote,
+ );
+ return t;
+ }
+ // string _txt = obj.text;
+ // writeln(obj.table.column_widths);
+ auto _t = tablarize(obj.text, obj);
+ string _txt = _t[0];
+ string _tablenote = _t[1];
+ return _txt ~ _tablenote ~ "「" ~ obj.metainfo.ocn.to!string ~ "」" ~ newlines;
+ }
+ string endnote(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _ocn;
+ _ocn = "「" ~ obj.metainfo.ocn.to!string ~ "」";
+ string _txt = obj.text;
+ string _parent_ocn;
+ _txt = _txt
+ .replaceAll(rgx.inline_link, ("$1")) // consider
+ .replaceFirst(rgx.inline_superscript, ("$1"));
+ _parent_ocn = (obj.metainfo.parent_ocn == 0 || doc_matters.opt.action.ocn_off)
+ ? "" : " ≫" ~ obj.metainfo.parent_ocn.to!string;
+ _txt = special_characters_and_font_face!().general(_txt) ~ _parent_ocn;
+ return _txt ~ newlines;
+ }
+ string bookindex(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _txt = obj.text;
+ _txt = (doc_matters.opt.action.ocn_off)
+ ? _txt.replaceAll(rgx.find_bookindex_ocn_link_and_comma, "")
+ .replaceAll(regex("\\s*\\\\"), "")
+ : _txt.replaceAll(rgx.inline_link, ("≫$1"))
+ .replaceAll(regex("\\s*\\\\"), "");
+ _txt = special_characters_and_font_face!().general(_txt);
+ return _txt ~ newlines;
+ }
+ string bibliography(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _txt = obj.text;
+ _txt = special_characters_and_font_face!().general(_txt);
+ return _txt ~ newlines;
+ // ALT:
+ // string _general_munge = generalMunge(obj,doc_matters);
+ // return _general_munge;
+ }
+ string glossary(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _txt = obj.text;
+ _txt = special_characters_and_font_face!().general(_txt);
+ return _txt;
+ }
+ string blurb(O,M)(O obj, M doc_matters) {
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ string _general_munge = generalMunge(obj,doc_matters);
+ return _general_munge;
+ }
+ string comment(O,M)(O obj, M doc_matters) { // LATER
+ /+
+ +/
+ // puts(obj.metainfo.is_a);
+ // return obj.metainfo.is_a;
+ return obj.text ~ newlines;
+ }
+}
+#+END_SRC
+
+* org includes
+** spine project VERSION
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
+* __END__
+* TODO WORKON
+
+#+BEGIN_SRC org
+TODO
+ PRIORITY
+ LATER
+- object types
+ - comment
+ - quote
+- images ? remove?? (currently with inline links)
+- anchor tags (for internal links)?
+
+WISH
+- underline headings?
+- break para text at set width?
+- text wrap at text-line-width specified option
+
+DONE
+- line breaks
+- font face: bold, italics etc.
+- object types
+ - toc
+ - inline_link /[┥┝┤├]
+ - indents
+ obj.metainfo.heading_lev_markup < 4
+ - group
+ - block
+ - code
+ - verse
+ - table
+ - endnote section
+ - point back to object number of origin, use parent_ocn (used e.g. in text output: endnote info on calling object ≫\d+)
+ - bookindex
+ - bibliography
+ - glossary
+ - blurb
+- inline_link /[┥┝┤├]
+#+END_SRC
+
diff --git a/org/out_xmls.org b/org/out_xmls.org
index 8d0b475..0d510b5 100644
--- a/org/out_xmls.org
+++ b/org/out_xmls.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -18,11 +18,6 @@
- [[./doc-reform.org][doc-reform.org]] [[./][org/]]
- [[./output_hub.org][output_hub]]
-#+NAME: year
-#+BEGIN_SRC text
-2025
-#+END_SRC
-
* xml offspring (xhtml html epub)
** format xhtml objects :format:
*** _module template_ :module:
@@ -91,38 +86,34 @@ template outputXHTMLs() {
#+NAME: output_imports_xml
#+BEGIN_SRC d
-import
- std.file,
- std.outbuffer,
- std.uri,
- std.conv : to;
-import
- sisudoc.io_out,
- sisudoc.io_out.rgx,
- sisudoc.meta.rgx_files,
- sisudoc.io_out.rgx_xhtml,
- sisudoc.io_out.create_zip_file,
- sisudoc.io_out.xmls,
- sisudoc.io_out.xmls_css;
+import std.file;
+import std.outbuffer;
+import std.uri;
+import std.conv : to;
+import sisudoc.io_out;
+import sisudoc.io_out.rgx;
+import sisudoc.meta.rgx_files;
+import sisudoc.io_out.rgx_xhtml;
+import sisudoc.io_out.create_zip_file;
+import sisudoc.io_out.xmls;
+import sisudoc.io_out.xmls_css;
#+END_SRC
**** epub3
#+NAME: output_imports_epub
#+BEGIN_SRC d
-import
- std.file,
- std.outbuffer,
- std.uri,
- std.zip,
- std.conv : to;
-import
- sisudoc.io_out,
- sisudoc.io_out.rgx,
- sisudoc.io_out.rgx_xhtml,
- sisudoc.io_out.create_zip_file,
- sisudoc.io_out.xmls,
- sisudoc.io_out.xmls_css;
+import std.file;
+import std.outbuffer;
+import std.uri;
+import std.zip;
+import std.conv : to;
+import sisudoc.io_out;
+import sisudoc.io_out.rgx;
+import sisudoc.io_out.rgx_xhtml;
+import sisudoc.io_out.create_zip_file;
+import sisudoc.io_out.xmls;
+import sisudoc.io_out.xmls_css;
#+END_SRC
*** misc
@@ -729,7 +720,7 @@ string inline_links(O,M)(
);
}
} else {
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(
"WARNING on internal document links, anchor to link <<"
~ m.captures["hash"]
@@ -2030,7 +2021,7 @@ scroll_write_output(doc_out, doc.matters);
} catch (ErrnoException ex) {
// Handle error
}
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(" ", pth_html.fn_scroll(doc_matters.src.filename));
}
}
@@ -2366,7 +2357,7 @@ seg_write_output(doc_html, doc_html_endnotes, doc.matters);
} catch (ErrnoException ex) {
// handle error
}
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(" ", pth_html.fn_seg(doc_matters.src.filename, "toc"));
}
}
@@ -2426,7 +2417,7 @@ void css(M)(M doc_matters) {
if (exists(fn_src_in)) {
fn_src_in.copy(fn_src_out);
} else {
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln("WARNING image not found: ", fn_src_in);
}
}
@@ -3275,7 +3266,7 @@ zip -0 file.epub mimetype && zip -r -9 file.epub META-INF OEBPS
foreach (image; doc_matters.srcs.image_list) {
{ /+ debug +/
if (doc_matters.opt.action.debug_do_epub) {
- if (doc_matters.opt.action.vox_gt2) {
+ if (doc_matters.opt.action.vox_gt_3) {
writeln(
doc_matters.src.image_dir_path, "/", image, " -> ",
pth_epub3.dbg_doc_oebps_image(doc_matters.src.filename), "/", image
@@ -3322,7 +3313,7 @@ zip -0 file.epub mimetype && zip -r -9 file.epub META-INF OEBPS
} catch (ErrnoException ex) {
// Handle error
}
- if (doc_matters.opt.action.vox_gt0) {
+ if (doc_matters.opt.action.vox_gt_1) {
writeln(" ", fn_epub);
}
#+END_SRC
@@ -3347,7 +3338,24 @@ zip -0 file.epub mimetype && zip -r -9 file.epub META-INF OEBPS
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_xmls_css.org b/org/out_xmls_css.org
index 1ba12d0..d827616 100644
--- a/org/out_xmls_css.org
+++ b/org/out_xmls_css.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -2502,7 +2502,16 @@ p[indent="h9i9"] {
┃");
#+END_SRC
-* document header including copyright & license
+* org includes
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/out_zip.org b/org/out_zip.org
index 5bd503b..7464c37 100644
--- a/org/out_zip.org
+++ b/org/out_zip.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -28,11 +28,10 @@
module sisudoc.io_out.create_zip_file;
@safe:
template createZipFile() {
- import
- std.file,
- std.outbuffer,
- std.string,
- std.zip;
+ import std.file;
+ import std.outbuffer;
+ import std.string;
+ import std.zip;
void createZipFile(
string zip_file_name,
void[] compressed_zip_data,
@@ -46,7 +45,24 @@ template createZipFile() {
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/output_hub.org b/org/output_hub.org
index c87c757..47123b2 100644
--- a/org/output_hub.org
+++ b/org/output_hub.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -35,7 +35,7 @@ template outputHub() {
@system void outputHub(D)(D doc) {
mixin Msg;
auto msg = Msg!()(doc.matters);
- enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff }
+ enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff, text, skel }
void Scheduled(D)(int sched, D doc) {
auto msg = Msg!()(doc.matters);
<<output_scheduled_task_source_or_pod>>
@@ -45,10 +45,12 @@ template outputHub() {
<<output_scheduled_task_html_seg>>
<<output_scheduled_task_html_out>>
<<output_scheduled_task_latex>>
+ <<output_scheduled_task_text>>
<<output_scheduled_task_odt>>
<<output_scheduled_task_sqlite>>
+ <<output_scheduled_task_skel>>
}
- if (doc.matters.opt.action.vox_gt0) { writeln(doc.matters.src.filename_base); }
+ if (doc.matters.opt.action.vox_gt_1) { writeln(doc.matters.src.filename_base); }
if (!(doc.matters.opt.action.parallelise_subprocesses)) {
foreach(schedule; doc.matters.opt.action.output_task_scheduler) {
Scheduled!()(schedule, doc);
@@ -230,6 +232,18 @@ if (sched == outTask.latex) {
}
#+END_SRC
+**** text :text:txt:
+
+#+NAME: output_scheduled_task_text
+#+BEGIN_SRC d
+if (sched == outTask.text) {
+ msg.v("text processing... ");
+ import sisudoc.io_out.text;
+ outputText!()(doc.abstraction, doc.matters);
+ msg.vv("text done");
+}
+#+END_SRC
+
**** odf / odt :odf:odt:
#+NAME: output_scheduled_task_odt
@@ -242,6 +256,18 @@ if (sched == outTask.odt) {
}
#+END_SRC
+**** skel :skel:text:
+
+#+NAME: output_scheduled_task_skel
+#+BEGIN_SRC d
+if (sched == outTask.skel) {
+ msg.v("skel processing... ");
+ import sisudoc.io_out.skel;
+ outputSkel!()(doc.abstraction, doc.matters);
+ msg.vv("skel done");
+}
+#+END_SRC
+
**** sqlite discrete :sqlite:
#+NAME: output_scheduled_task_sqlite
@@ -279,12 +305,12 @@ if (doc.matters.opt.action.sqlite_update) {
#+NAME: output_options_op_sqlite_db_drop
#+BEGIN_SRC d
if ((opt_action.sqlite_db_drop)) {
- if ((opt_action.vox_gt1)) {
+ if ((opt_action.vox_gt_2)) {
writeln("sqlite drop db...");
}
import sisudoc.io_out.sqlite;
SQLiteDbDrop!()(opt_action, config);
- if ((opt_action.vox_gt2)) {
+ if ((opt_action.vox_gt_3)) {
writeln("sqlite drop db done");
}
}
@@ -295,19 +321,36 @@ if ((opt_action.sqlite_db_drop)) {
#+NAME: output_options_op_sqlite_db_create
#+BEGIN_SRC d
if ((opt_action.sqlite_db_create)) {
- if ((opt_action.vox_gt1)) {
+ if ((opt_action.vox_gt_2)) {
auto pth_sqlite_db = spinePathsSQLite!()(opt_action.cgi_sqlite_search_filename, opt_action.output_dir_set);
writeln("sqlite create table...");
}
import sisudoc.io_out.sqlite;
SQLiteTablesCreate!()(env, opt_action, config);
- if ((opt_action.vox_gt2)) {
+ if ((opt_action.vox_gt_3)) {
writeln("sqlite create table done");
}
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/output_show.org b/org/output_show.org
index 6f54451..2a8070f 100644
--- a/org/output_show.org
+++ b/org/output_show.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -34,7 +34,7 @@ template spineMetaDocSummary() {
<<metadoc_show_imports_shared>>
mixin InternalMarkup;
<<metadoc_show_initialize>>
- if (doc_matters.opt.action.vox_gt1
+ if (doc_matters.opt.action.vox_gt_2
|| doc_matters.opt.action.show_summary) {
<<meta_metadoc_show_summary_document_check_counts>>
<<meta_metadoc_show_summary_document>>
@@ -532,27 +532,25 @@ writefln(
#+NAME: metadoc_show_imports_shared
#+BEGIN_SRC d
-import
- std.array,
- std.digest.crc,
- std.digest.sha,
- std.exception,
- std.regex,
- std.stdio,
- std.string,
- std.typecons,
- std.uni,
- std.utf,
- std.conv : to;
+import std.array;
+import std.digest.crc;
+import std.digest.sha;
+import std.exception;
+import std.regex;
+import std.stdio;
+import std.string;
+import std.typecons;
+import std.uni;
+import std.utf;
+import std.conv : to;
#+END_SRC
*** imports
#+NAME: metadoc_show_summary_imports
#+BEGIN_SRC d
-import
- sisudoc.meta.defaults,
- sisudoc.meta.rgx;
+import sisudoc.meta.defaults;
+import sisudoc.meta.rgx;
#+END_SRC
*** initialize :report:
@@ -568,7 +566,24 @@ char_repeat_number = (char_repeat_number > min_repeat_number)
: min_repeat_number;
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
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 b536386..fb03fea 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
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :noweb yes
#+PROPERTY: header-args+ :exports code
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -108,6 +108,13 @@
0
#+END_SRC
+* year
+
+#+NAME: year
+#+BEGIN_SRC org
+2025
+#+END_SRC
+
* sisudoc spine git source SET
** sisudoc-spine src
diff --git a/org/spine.org b/org/spine.org
index 51c649c..9971dc2 100644
--- a/org/spine.org
+++ b/org/spine.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -37,7 +37,6 @@
- by zip filename
#+HEADER: :tangle "../src/sisudoc/spine.d"
-#+HEADER: :shebang "#!/usr/bin/env rdmd"
#+HEADER: :noweb yes
#+BEGIN_SRC d
<<doc_header_including_copyright_and_license>>
@@ -85,7 +84,7 @@ string program_name = "spine";
}
} else { // note cannot parallelise sqlite shared db
foreach(manifest; _manifests[1..$]) {
- if (_opt_action.vox_gt2) { writeln("parallelisation off: actions include sqlite shared db"); }
+ if (_opt_action.vox_gt_3) { writeln("parallelisation off: actions include sqlite shared db"); }
if (!empty(manifest.src.filename)) {
<<spine_each_file_do_scope>>
<<spine_each_file_do_abstraction>>
@@ -105,7 +104,7 @@ string program_name = "spine";
if (_opt_action.curate_authors) {
spineMetaDocCuratesAuthors!()(hvst.curates, _make_and_meta_struct, _opt_action);
}
- if (_opt_action.vox_gt0) {
+ if (_opt_action.vox_gt_1) {
import sisudoc.io_out.paths_output;
auto out_pth = spinePathsHTML!()(_make_and_meta_struct.conf.output_path, "");
if (_opt_action.curate_authors) {
@@ -126,52 +125,48 @@ string program_name = "spine";
#+NAME: imports_spine
#+BEGIN_SRC d
-import
- std.algorithm,
- std.datetime,
- std.getopt,
- std.file,
- std.path,
- std.process;
-import
- sisudoc.conf.compile_time_info,
- sisudoc.meta,
- sisudoc.meta.metadoc,
- sisudoc.meta.metadoc_curate,
- sisudoc.meta.metadoc_curate_authors,
- sisudoc.meta.metadoc_curate_topics,
- sisudoc.meta.metadoc_from_src,
- sisudoc.meta.conf_make_meta_structs,
- sisudoc.meta.conf_make_meta_json,
- sisudoc.meta.defaults,
- sisudoc.meta.doc_debugs,
- sisudoc.meta.rgx,
- sisudoc.meta.rgx_yaml,
- sisudoc.meta.rgx_files,
- sisudoc.io_in.paths_source,
- sisudoc.io_in.read_config_files,
- sisudoc.io_in.read_source_files,
- sisudoc.io_out.hub;
+import std.algorithm;
+import std.datetime;
+import std.getopt;
+import std.file;
+import std.path;
+import std.process;
+import sisudoc.conf.compile_time_info;
+import sisudoc.meta;
+import sisudoc.meta.metadoc;
+import sisudoc.meta.metadoc_curate;
+import sisudoc.meta.metadoc_curate_authors;
+import sisudoc.meta.metadoc_curate_topics;
+import sisudoc.meta.metadoc_from_src;
+import sisudoc.meta.conf_make_meta_structs;
+import sisudoc.meta.conf_make_meta_json;
+import sisudoc.meta.defaults;
+import sisudoc.meta.doc_debugs;
+import sisudoc.meta.rgx;
+import sisudoc.meta.rgx_yaml;
+import sisudoc.meta.rgx_files;
+import sisudoc.io_in.paths_source;
+import sisudoc.io_in.read_config_files;
+import sisudoc.io_in.read_source_files;
+import sisudoc.io_out.hub;
#+END_SRC
***** spine metadoc :spine:
#+NAME: imports_spine_metadoc
#+BEGIN_SRC d
-import
- std.datetime,
- std.digest.crc,
- std.digest.sha;
-import
- sisudoc.meta,
- sisudoc.meta.metadoc_from_src,
- sisudoc.meta.conf_make_meta_structs,
- sisudoc.meta.conf_make_meta_json,
- sisudoc.meta.defaults,
- sisudoc.io_in.paths_source,
- sisudoc.io_in.read_config_files,
- sisudoc.io_in.read_source_files,
- sisudoc.io_out.hub;
+import std.datetime;
+import std.digest.crc;
+import std.digest.sha;
+import sisudoc.meta;
+import sisudoc.meta.metadoc_from_src;
+import sisudoc.meta.conf_make_meta_structs;
+import sisudoc.meta.conf_make_meta_json;
+import sisudoc.meta.defaults;
+import sisudoc.io_in.paths_source;
+import sisudoc.io_in.read_config_files;
+import sisudoc.io_in.read_source_files;
+import sisudoc.io_out.hub;
#+END_SRC
****** notes
@@ -316,6 +311,7 @@ bool[string] opts = [
"html-link-pdf-a4" : false,
"html-link-pdf-letter" : false,
"html-link-search" : false,
+ "html-link-text" : false,
"html-seg" : false,
"html-scroll" : false,
"latex" : false,
@@ -325,6 +321,7 @@ bool[string] opts = [
"light" : false,
"manifest" : false,
"hide-ocn" : false,
+ "no-ocn" : false,
"ocn-off" : false,
"odf" : false,
"odt" : false,
@@ -348,6 +345,7 @@ bool[string] opts = [
"show-pod" : false,
"show-sqlite" : false,
"show-summary" : false,
+ "skel" : false,
"source" : false,
"sqlite-discrete" : false,
"sqlite-db-create" : false,
@@ -357,9 +355,11 @@ bool[string] opts = [
"sqlite-insert" : false,
"sqlite-update" : false,
"text" : false,
- "vox_is0" : false,
- "vox_gt1" : false,
- "vox_gt2" : false,
+ "vox_is0" : false, // silent
+ "vox_is1" : false, // quiet
+ "vox_is2" : false, // default (unset)
+ "vox_is3" : false, // verbose
+ "vox_is4" : false, // very verbose
"xhtml" : false,
"section_toc" : true,
"section_body" : true,
@@ -434,6 +434,7 @@ auto helpInfo = getopt(args,
"html-link-pdf", "provide html link to pdf a4 & letter output", &opts["html-link-pdf"],
"html-link-pdf-a4", "provide html link to pdf a4 output", &opts["html-link-pdf-a4"],
"html-link-pdf-letter", "provide html link to pdf letter size output", &opts["html-link-pdf-letter"],
+ "html-link-text", "provide html link to text output", &opts["html-link-text"],
"html-link-search", "html embedded search submission", &opts["html-link-search"],
"html-seg", "process html output", &opts["html-seg"],
"html-scroll", "process html output", &opts["html-scroll"],
@@ -444,6 +445,7 @@ auto helpInfo = getopt(args,
"latex-header-sty", "latex document header sty files", &opts["latex-header-sty"],
"light", "default light theme", &opts["light"],
"manifest", "process manifest output", &opts["manifest"],
+ "no-ocn", "object cite numbers", &opts["no-ocn"],
"ocn-off", "object cite numbers", &opts["ocn-off"],
"odf", "open document format text (--odt)", &opts["odf"],
"odt", "open document format text", &opts["odt"],
@@ -454,7 +456,7 @@ auto helpInfo = getopt(args,
"pdf-color-links", "mono or color links for pdfs", &opts["pdf-color-links"],
"pdf-init", "initialise latex shared files (see latex-header-sty)", &opts["pdf-init"],
"pod", "spine (doc reform) pod source content bundled", &opts["pod"],
- "quiet|q", "output to terminal", &opts["vox_is0"],
+ "quiet|q", "output to terminal", &opts["vox_is1"],
"section-backmatter", "document backmatter (default)" , &opts["backmatter"],
"section-biblio", "document biblio (default)", &opts["section_biblio"],
"section-blurb", "document blurb (default)", &opts["section_blurb"],
@@ -479,9 +481,11 @@ auto helpInfo = getopt(args,
"show-sqlite", "show sqlite", &opts["show-sqlite"],
"show-summary", "show summary", &opts["show-summary"],
"source", "document markup source", &opts["source"],
+ "silent", "output to terminal", &opts["vox_is0"],
"set-digest", "default hash digest type (e.g. sha256)", &settings["set-digest"],
"set-papersize", "default papersize (latex pdf eg. a4 or a5 or b4 or letter)", &settings["set-papersize"],
"set-textwrap", "default textwrap (e.g. 80 (characters)", &settings["set-textwrap"],
+ "skel", "skel (dummy outline)", &opts["skel"],
"sqlite-discrete", "process discrete sqlite output", &opts["sqlite-discrete"],
"sqlite-db-create", "create db, create tables", &opts["sqlite-db-create"],
"sqlite-db-drop", "drop tables & db", &opts["sqlite-db-drop"],
@@ -491,16 +495,16 @@ auto helpInfo = getopt(args,
"sqlite-delete", "sqlite output", &opts["sqlite-delete"],
"sqlite-insert", "sqlite output", &opts["sqlite-insert"],
"sqlite-update", "sqlite output", &opts["sqlite-update"],
+ "text", "text output", &opts["text"],
+ "txt", "text output", &opts["text"],
"www-http", "http or https", &settings["www-http"],
"www-host", "web server host (domain) name", &settings["www-host"],
"www-host-doc-root", "web host host (domain) name with path to doc root", &settings["www-host-doc-root"],
"www-url-doc-root", "e.g. http://localhost", &settings["www-url-doc-root"],
- "text", "text output", &opts["text"],
"theme-dark", "alternative dark theme", &opts["theme-dark"],
"theme-light", "default light theme", &opts["theme-light"],
- "txt", "text output", &opts["text"],
- "verbose|v", "output to terminal", &opts["vox_gt1"],
- "very-verbose", "output to terminal", &opts["vox_gt2"],
+ "verbose|v", "output to terminal", &opts["vox_is3"],
+ "very-verbose", "output to terminal", &opts["vox_is4"],
"workon", "(reserved for some matters under development & testing)", &opts["workon"],
"xhtml", "xhtml output", &opts["xhtml"],
"config", "=/path/to/config/file/including/filename", &settings["config"],
@@ -529,7 +533,7 @@ if (helpInfo.helpWanted) {
#+NAME: spine_args_get_options_aa2str
#+BEGIN_SRC d
-enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff }
+enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff, text, skel }
struct OptActions {
@trusted bool allow_downloads() {
return opts["allow-downloads"];
@@ -633,6 +637,12 @@ struct OptActions {
@trusted bool html_link_pdf_letter() {
return (opts["html-link-pdf-letter"]) ? true : false;
}
+ @trusted bool html_link_text() {
+ return (opts["html-link-text"]) ? true : false;
+ }
+ @trusted bool text_link_curate() {
+ return (opts["text-link-curate"]) ? true : false;
+ }
@trusted bool html_link_search() {
return (opts["html-link-search"]) ? true : false;
}
@@ -667,7 +677,7 @@ struct OptActions {
return opts["hide-ocn"];
}
@trusted bool ocn_off() {
- return opts["ocn-off"];
+ return ((opts["ocn-off"]) || (opts["no-ocn"])) ? true : false;
}
@trusted bool pod() {
return opts["pod"];
@@ -679,10 +689,10 @@ struct OptActions {
return opts["show-curate"];
}
@trusted bool show_curate_authors() {
- return (opts["show-curate"] || opts["show-curate-authors"] || opts["vox_gt1"] || opts["vox_gt2"]) ? true : false;
+ return (opts["show-curate"] || opts["show-curate-authors"] || vox_gt_2) ? true : false;
}
@trusted bool show_curate_topics() {
- return (opts["show-curate"] || opts["show-curate-topics"] || opts["vox_gt2"]) ? true : false;
+ return (opts["show-curate"] || opts["show-curate-topics"] || vox_gt_3) ? true : false;
}
@trusted bool show_epub() {
return opts["show-epub"];
@@ -706,10 +716,10 @@ struct OptActions {
return opts["show-pod"];
}
@trusted bool show_sqlite() {
- return (opts["show-sqlite"] || opts["vox_gt2"]) ? true : false;
+ return (opts["show-sqlite"] || vox_gt_3) ? true : false;
}
@trusted bool show_summary() {
- return (opts["show-summary"] || opts["vox_gt1"] || opts["vox_gt2"]) ? true : false;
+ return (opts["show-summary"] || vox_gt_2) ? true : false;
}
@trusted bool source() {
return opts["source"];
@@ -741,21 +751,48 @@ struct OptActions {
|| opts["sqlite-update"]
) ? true : false;
}
- @trusted bool vox_is0() { // --quiet -q
+ @trusted bool skel() {
+ return opts["skel"];
+ }
+ @trusted bool text() {
+ return opts["text"];
+ }
+ @trusted bool vox_0() { // --silent
return opts["vox_is0"];
}
- @trusted bool vox_gt0() { // normal, minimal, without flag
- return (!(opts["vox_is0"]) || opts["vox_gt1"] || opts["vox_gt2"]) ? true : false;
+ @trusted bool vox_1() { // --quiet -q
+ return opts["vox_is1"];
}
- @trusted bool vox_gt1() { // -- verbose -v
- return (opts["vox_gt1"] || opts["vox_gt2"]) ? true : false;
+ @trusted bool vox_2() { // normal, minimal, without flag
+ bool _vox_default = true;
+ if (opts["vox_is0"] || opts["vox_is1"] || opts["vox_is3"] || opts["vox_is4"]) { _vox_default = false;
+ } else { _vox_default = true;
+ }
+ return _vox_default;
}
- @trusted bool vox_gt2() { // --very-verbose
- return opts["vox_gt2"];
+ @trusted bool vox_3() { // --verbose -v
+ return opts["vox_is3"];
}
- @trusted bool text() {
- return opts["text"];
+ @trusted bool vox_4() { // --very-verbose
+ return opts["vox_is4"];
+ }
+ @trusted bool vox_gt_0() { // --quiet -q and above
+ return ( vox_1 || vox_2 || vox_3 || vox_4) ? true : false;
+ }
+ @trusted bool vox_gt_1() { // normal, and above
+ return (vox_2 || vox_3 || vox_4) ? true : false;
}
+ @trusted bool vox_gt_2() { // --verbose -v and above
+ return ( vox_3 || vox_4) ? true : false;
+ }
+ @trusted bool vox_gt_3() { // --very-verbose
+ return (vox_4) ? true : false;
+ }
+ @trusted bool vox_silent() { return vox_0; } // --silent
+ @trusted bool vox_quiet() { return vox_gt_0; } // --quiet -q & above
+ @trusted bool vox_default() { return vox_gt_1; } // defalt, & above
+ @trusted bool vox_verbose() { return vox_gt_2; } // --verbose -v & above
+ @trusted bool vox_very_verbose() { return vox_gt_3; } // --very-verbose
@trusted bool xhtml() {
return opts["xhtml"];
}
@@ -869,6 +906,8 @@ struct OptActions {
|| latex
|| manifest
|| sqlite_discrete
+ || text
+ || skel
) {
_is = true;
} else { _is = false; }
@@ -879,30 +918,16 @@ struct OptActions {
}
auto output_task_scheduler() {
int[] schedule;
- if (source_or_pod) {
- schedule ~= outTask.source_or_pod;
- }
- if (sqlite_discrete) {
- schedule ~= outTask.sqlite;
- }
- if (epub) {
- schedule ~= outTask.epub;
- }
- if (html_scroll) {
- schedule ~= outTask.html_scroll;
- }
- if (html_seg) {
- schedule ~= outTask.html_seg;
- }
- if (html_stuff) {
- schedule ~= outTask.html_stuff;
- }
- if (odt) {
- schedule ~= outTask.odt;
- }
- if (latex) {
- schedule ~= outTask.latex;
- }
+ if (source_or_pod) { schedule ~= outTask.source_or_pod; }
+ if (sqlite_discrete) { schedule ~= outTask.sqlite; }
+ if (epub) { schedule ~= outTask.epub; }
+ if (html_scroll) { schedule ~= outTask.html_scroll; }
+ if (html_seg) { schedule ~= outTask.html_seg; }
+ if (html_stuff) { schedule ~= outTask.html_stuff; }
+ if (odt) { schedule ~= outTask.odt; }
+ if (latex) { schedule ~= outTask.latex; }
+ if (text) { schedule ~= outTask.text; }
+ if (skel) { schedule ~= outTask.skel; }
return schedule.sort().uniq;
}
@trusted bool abstraction() {
@@ -919,6 +944,8 @@ struct OptActions {
|| sqlite_discrete
|| sqlite_delete
|| sqlite_update
+ || text
+ || skel
) ? true : false;
}
@trusted bool require_processing_files() {
@@ -940,6 +967,7 @@ struct OptActions {
|| sqlite_update
|| text
|| xhtml
+ || skel
) ? true : false;
}
@trusted bool meta_processing_general() {
@@ -952,6 +980,8 @@ struct OptActions {
|| latex
|| sqlite_discrete
|| sqlite_update
+ || text
+ || skel
) ? true :false;
}
@trusted bool meta_processing_xml_dom() {
@@ -1100,94 +1130,53 @@ foreach(arg; args[1..$]) {
);
if (exists(sisudoc_txt_)) {
try {
- if (exists(sisudoc_txt_)) {
- import dyaml;
- try {
- Node pod_manifest_yaml;
- try {
- pod_manifest_yaml = Loader.fromFile(sisudoc_txt_).load();
- } catch (ErrnoException ex) {
- } catch (FileException ex) {
- writeln("ERROR failed to read config file");
- } catch (Throwable) {
- writeln("ERROR failed to read config file content, not parsed as yaml");
- }
- if ("doc" in pod_manifest_yaml) {
- if (pod_manifest_yaml["doc"].type.mapping
- && pod_manifest_yaml["doc"].tag.match(rgx_y.yaml_tag_is_map)
- ) {
- if ("path" in pod_manifest_yaml["doc"]) {
- if (pod_manifest_yaml["doc"]["path"].tag.match(rgx_y.yaml_tag_is_seq)) {
- foreach (string _path; pod_manifest_yaml["doc"]["path"]) {
- markup_contents_location_ ~= _path ~ "\n";
- pod_manifest_root_content_paths_to_markup_location_raw_ ~=
- _path ~ "\n";
- }
- } else if (
- pod_manifest_yaml["doc"]["path"].type.string
- && pod_manifest_yaml["doc"]["path"].tag.match(rgx_y.yaml_tag_is_str)
- ) {
- markup_contents_location_ = pod_manifest_yaml["doc"]["path"].get!string;
- pod_manifest_root_content_paths_to_markup_location_raw_ =
- pod_manifest_yaml["doc"]["path"].get!string;
- }
+ import dyaml;
+ Node pod_manifest_yaml;
+ try {
+ pod_manifest_yaml = Loader.fromFile(sisudoc_txt_).load();
+ } catch (ErrnoException ex) {
+ } catch (FileException ex) {
+ writeln("ERROR failed to read config file");
+ } catch (Throwable) {
+ writeln("ERROR failed to read config file content, not parsed as yaml");
+ }
+ if ("doc" in pod_manifest_yaml) {
+ if (pod_manifest_yaml["doc"].type.mapping
+ && pod_manifest_yaml["doc"].tag.match(rgx_y.yaml_tag_is_map)
+ ) {
+ if ("path" in pod_manifest_yaml["doc"]) {
+ if (pod_manifest_yaml["doc"]["path"].tag.match(rgx_y.yaml_tag_is_seq)) {
+ foreach (string _path; pod_manifest_yaml["doc"]["path"]) {
+ markup_contents_location_ ~= _path ~ "\n";
+ pod_manifest_root_content_paths_to_markup_location_raw_ ~=
+ _path ~ "\n";
}
- if ("filename" in pod_manifest_yaml["doc"]) {
- if (pod_manifest_yaml["doc"]["filename"].tag.match(rgx_y.yaml_tag_is_seq)) {
- foreach (string _filename; pod_manifest_yaml["doc"]["filename"]) {
- if ("language" in pod_manifest_yaml["doc"]) {
- if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_seq)) {
- foreach (string _lang; pod_manifest_yaml["doc"]["language"]) {
- markup_contents_location_ ~=
- "media/text/"
- ~ _lang ~ "/"
- ~ _filename ~ "\n";
- }
- } else if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_str)
- ) {
- markup_contents_location_ =
- "media/text/"
- ~ pod_manifest_yaml["doc"]["language"].get!string
- ~ "/" ~ _filename ~ "\n";
- } else {
- string _lang_default = "en";
- markup_contents_location_ ~=
- "media/text/"
- ~ _lang_default ~ "/"
- ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
- }
- } else {
- string _lang_default = "en";
- markup_contents_location_ ~=
- "media/text/"
- ~ _lang_default ~ "/"
- ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
- }
- }
- } else if (
- pod_manifest_yaml["doc"]["filename"].type.string
- && pod_manifest_yaml["doc"]["filename"].tag.match(rgx_y.yaml_tag_is_str)
- ) {
- if ("language" in pod_manifest_yaml["doc"]) {
- if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_seq)) {
- foreach (string _lang; pod_manifest_yaml["doc"]["language"]) {
- markup_contents_location_ ~=
- "media/text/"
- ~ _lang ~ "/"
- ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
- }
- } else if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_str)) {
- markup_contents_location_ =
- "media/text/"
- ~ pod_manifest_yaml["doc"]["language"].get!string
- ~ "/" ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
- } else {
- string _lang_default = "en";
+ } else if (
+ pod_manifest_yaml["doc"]["path"].type.string
+ && pod_manifest_yaml["doc"]["path"].tag.match(rgx_y.yaml_tag_is_str)
+ ) {
+ markup_contents_location_ = pod_manifest_yaml["doc"]["path"].get!string;
+ pod_manifest_root_content_paths_to_markup_location_raw_ =
+ pod_manifest_yaml["doc"]["path"].get!string;
+ }
+ }
+ if ("filename" in pod_manifest_yaml["doc"]) {
+ if (pod_manifest_yaml["doc"]["filename"].tag.match(rgx_y.yaml_tag_is_seq)) {
+ foreach (string _filename; pod_manifest_yaml["doc"]["filename"]) {
+ if ("language" in pod_manifest_yaml["doc"]) {
+ if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_seq)) {
+ foreach (string _lang; pod_manifest_yaml["doc"]["language"]) {
markup_contents_location_ ~=
"media/text/"
- ~ _lang_default ~ "/"
- ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
+ ~ _lang ~ "/"
+ ~ _filename ~ "\n";
}
+ } else if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_str)
+ ) {
+ markup_contents_location_ =
+ "media/text/"
+ ~ pod_manifest_yaml["doc"]["language"].get!string
+ ~ "/" ~ _filename ~ "\n";
} else {
string _lang_default = "en";
markup_contents_location_ ~=
@@ -1195,11 +1184,47 @@ foreach(arg; args[1..$]) {
~ _lang_default ~ "/"
~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
}
+ } else {
+ string _lang_default = "en";
+ markup_contents_location_ ~=
+ "media/text/"
+ ~ _lang_default ~ "/"
+ ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
}
}
+ } else if (
+ pod_manifest_yaml["doc"]["filename"].type.string
+ && pod_manifest_yaml["doc"]["filename"].tag.match(rgx_y.yaml_tag_is_str)
+ ) {
+ if ("language" in pod_manifest_yaml["doc"]) {
+ if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_seq)) {
+ foreach (string _lang; pod_manifest_yaml["doc"]["language"]) {
+ markup_contents_location_ ~=
+ "media/text/"
+ ~ _lang ~ "/"
+ ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
+ }
+ } else if (pod_manifest_yaml["doc"]["language"].tag.match(rgx_y.yaml_tag_is_str)) {
+ markup_contents_location_ =
+ "media/text/"
+ ~ pod_manifest_yaml["doc"]["language"].get!string
+ ~ "/" ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
+ } else {
+ string _lang_default = "en";
+ markup_contents_location_ ~=
+ "media/text/"
+ ~ _lang_default ~ "/"
+ ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
+ }
+ } else {
+ string _lang_default = "en";
+ markup_contents_location_ ~=
+ "media/text/"
+ ~ _lang_default ~ "/"
+ ~ pod_manifest_yaml["doc"]["filename"].get!string ~ "\n";
+ }
}
}
- } catch (ErrnoException ex) {
}
}
} catch (ErrnoException ex) {
@@ -1260,7 +1285,7 @@ foreach(arg; args[1..$]) {
#+NAME: spine_each_file_do_scope
#+BEGIN_SRC d
scope(success) {
- if (_opt_action.vox_gt0) { writeln("-- ~ document complete, ok ~ ------------------------------------"); }
+ if (_opt_action.vox_gt_1) { writeln("-- ~ document complete, ok ~ ------------------------------------"); }
}
scope(failure) {
debug(checkdoc) {
@@ -1377,7 +1402,7 @@ if (doc.matters.opt.action.curate) {
} else {
if ((doc.matters.opt.action.debug_do)
|| (_opt_action.debug_do_curate)
- || (doc.matters.opt.action.vox_gt2)
+ || (doc.matters.opt.action.vox_gt_3)
) {
writeln("WARNING curate: document header yaml does not contain information related to: title or author: ", _hvst.path_html_segtoc);
}
@@ -1426,7 +1451,7 @@ if (!(doc.matters.opt.action.skip_output)) {
#+NAME: spine_each_file_do_scope_exit
#+BEGIN_SRC d
scope(exit) {
- if (_opt_action.vox_gt0) {
+ if (_opt_action.vox_gt_1) {
writefln(
"processed file: %s [%s]",
manifest.src.filename,
@@ -1825,7 +1850,24 @@ if ((_opt_action.debug_do)
}
#+END_SRC
-* document header including copyright & license
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
#+NAME: doc_header_including_copyright_and_license
#+HEADER: :noweb yes
diff --git a/org/spine_info.org b/org/spine_info.org
index a2078fe..7459672 100644
--- a/org/spine_info.org
+++ b/org/spine_info.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -77,7 +77,7 @@
<<sisudoc_spine_README_command_examples_populate_db_text>>
-,*** generate a cgi search form in d
+,*** generate a cgi search form
<<sisudoc_spine_README_command_examples_search_db_cgi_text>>
@@ -85,7 +85,7 @@
<<sisudoc_spine_README_command_examples_compile_search_db_cgi_text>>
-,*** create db & search form
+,*** create db
<<sisudoc_spine_README_command_examples_create_db_and_search_form_text>>
@@ -129,7 +129,7 @@
,#+PROPERTY: header-args :exports code
,#+PROPERTY: header-args+ :noweb yes
,#+PROPERTY: header-args+ :eval no
-,#+PROPERTY: header-args+ :results no
+,#+PROPERTY: header-args+ :results output none
,#+PROPERTY: header-args+ :cache no
,#+PROPERTY: header-args+ :padline no
#+END_SRC
@@ -196,7 +196,7 @@
<<sisudoc_spine_README_command_examples_compile_search_db_cgi_text>>
-### create db & search form
+### create db
<<sisudoc_spine_README_command_examples_create_db_and_search_form_text>>
@@ -299,7 +299,7 @@ Make a directory and clone the sisudoc-spine project
git clone --depth 1 git://git.sisudoc.org/software/sisudoc-spine-search-cgi && \
git clone --depth 1 git://git.sisudoc.org/markup/sisudoc-spine-samples
-such a relative directory layout will be assumed in the examples that provided
+such a relative directory layout will be assumed in the examples provided
all work in this installation of and use of sisudoc-spine will take place in the
directory: sisudoc-spine
@@ -624,23 +624,16 @@ for a document collection you can point to the document collection:
#+NAME: sisudoc_spine_README_command_examples_search_db_cgi_text
#+BEGIN_SRC text
-spine -v --cgi-search-form-codegen \
- --output=/var/www/html \
- ~spineMarkupSamples/pod
-
-spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod
-
-spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod/.dr/config_local_site
-
-spine --cgi-search-form-codegen --output=`echo ~webDocRoot` ~spineMarkupSamples/pod
+The CGI search form is built separately in the sisudoc-spine-search-cgi/ directory.
-spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot`
+Steps:
+1. Clone the sisudoc-spine-search-cgi repository
+2. Configure views/configuration.txt with your web server settings
+3. Build the CGI binary using Nix or dub
+4. Deploy the CGI binary to your web server's cgi-bin directory
-spine -v --cgi-search-form-codegen \
- --sqlite-db-filename="spine.search.db" \
- --cgi-sqlite-search-filename="spine-search" \
- --output=/var/www/html \
- ~spineMarkupSamples/pod
+For detailed instructions, see:
+ sisudoc-spine-search-cgi/README.md
#+END_SRC
#+NAME: sisudoc_spine_README_command_examples_compile_search_db_cgi_text
@@ -676,9 +669,10 @@ cgi-bin directory
#+BEGIN_SRC text
spine -v \
--sqlite-db-create --sqlite-db-filename="spine.search.db" \
- --cgi-search-form-codegen --cgi-sqlite-search-filename="spine-search" \
--output=/var/www/html \
~spineMarkupSamples/pod/*
+
+Note: The CGI search form is built separately in the sisudoc-spine-search-cgi/ directory.
#+END_SRC
#+NAME: sisudoc_spine_README_command_examples_html_with_links_to_search_form_text
@@ -1166,3 +1160,30 @@ git log --pretty=format:'-_-%+s %+as %ae%+h%d%+b' --no-merges \
git log --pretty=format:"-_-_%+s %+as %ae%+h%d%+b" --no-merges \
> ${CHL} && sed -i '/^$/d; s/^\([ ]\)*\*/\1-/; s/ \+$//; s/^-_-_//' ${CHL}
#+END_SRC
+
+* org includes
+** project version
+
+#+NAME: spine_version
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_project_version()>>
+#+END_SRC
+
+** year
+
+#+NAME: year
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:year()>>
+#+END_SRC
+
+** document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+HEADER: :noweb yes
+#+BEGIN_SRC emacs-lisp
+<<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>>
+#+END_SRC
+
+* __END__
diff --git a/org/spine_markup_sample.org b/org/spine_markup_sample.org
index d0381ac..60c6272 100644
--- a/org/spine_markup_sample.org
+++ b/org/spine_markup_sample.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
@@ -1300,7 +1300,7 @@ code(number){
3~ Tables
={ SiSU markup:tables;tables }
-Tables may be prepared in two either of two forms
+Tables may be prepared in either of two forms
!_ resulting output:
diff --git a/org/util_spine_markup_conversion_from_sisu.org b/org/util_spine_markup_conversion_from_sisu.org
index 56f79dd..5122032 100644
--- a/org/util_spine_markup_conversion_from_sisu.org
+++ b/org/util_spine_markup_conversion_from_sisu.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
diff --git a/org/util_spine_syntax_highlighting_emacs.org b/org/util_spine_syntax_highlighting_emacs.org
index 7272faf..cde92fb 100644
--- a/org/util_spine_syntax_highlighting_emacs.org
+++ b/org/util_spine_syntax_highlighting_emacs.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes
diff --git a/org/util_spine_syntax_highlighting_vim.org b/org/util_spine_syntax_highlighting_vim.org
index b66b67d..c62fc1e 100644
--- a/org/util_spine_syntax_highlighting_vim.org
+++ b/org/util_spine_syntax_highlighting_vim.org
@@ -9,7 +9,7 @@
#+STARTUP: content hideblocks hidestars noindent entitiespretty
#+PROPERTY: header-args :exports code
#+PROPERTY: header-args+ :noweb yes
-#+PROPERTY: header-args+ :results no
+#+PROPERTY: header-args+ :results output none
#+PROPERTY: header-args+ :cache no
#+PROPERTY: header-args+ :padline no
#+PROPERTY: header-args+ :mkdirp yes