From 0c693b23c4ff8f98a151884a24f150a5ff746dd4 Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Fri, 16 Oct 2020 19:16:18 -0400 Subject: org mode, unique code-block names & adjust headers - avoid org-mode undefined behavior, provide unique code-block names --- .gitignore | 3 +- COPYRIGHT | 104 + README | 325 -- README.md | 326 ++ makefile | 6 +- org/compile_time_info.org | 8 +- org/default_misc.org | 1 + org/default_paths.org | 41 +- org/default_regex.org | 116 +- org/default_shared.org | 1 + org/imports.org | 1 + org/in_source_files.org | 11 +- org/meta_conf_make_meta.org | 33 +- org/meta_debugs.org | 1 + org/metaverse.org | 497 ++- org/out_cgi_search_sqlite.org | 53 +- org/out_harvest_metadata.org | 11 +- org/out_latex.org | 238 +- org/out_metadata.org | 8 +- org/out_odt.org | 177 +- org/out_sqlite.org | 141 +- org/out_src_pod.org | 8 +- org/out_xmls.org | 217 +- org/out_xmls_css.org | 141 +- org/out_zip.org | 1 + org/output_hub.org | 39 +- org/output_show.org | 1 + org/spine.org | 83 +- org/spine_build_scaffold.org | 242 +- org/spine_doc.org | 4548 ------------------------ org/spine_info.org | 5 +- org/util_cgi_d_sqlite_search.org | 60 +- org/util_cgi_rb_fcgi_sqlite_search.org | 1 + org/util_spine_markup_conversion_from_sisu.org | 11 +- org/util_spine_syntax_highlighting_emacs.org | 1 + org/util_spine_syntax_highlighting_vim.org | 1 + src/doc_reform/io_out/epub3.d | 4 +- src/doc_reform/io_out/html.d | 2 +- src/doc_reform/io_out/odt.d | 4 +- src/doc_reform/io_out/source_pod.d | 2 +- src/doc_reform/meta/conf_make_meta_yaml.d | 2 +- src/doc_reform/meta/metadoc_from_src.d | 2 +- 42 files changed, 1855 insertions(+), 5622 deletions(-) delete mode 100644 README create mode 100644 README.md delete mode 100644 org/spine_doc.org diff --git a/.gitignore b/.gitignore index f9f3687..2dec148 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,9 @@ #./.dub/** * !.gitignore +!README.md !COPYRIGHT -!README +!CHANGELOG !makefile !version.txt !dub.json diff --git a/COPYRIGHT b/COPYRIGHT index 05e171f..b3ef5a8 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -43,6 +43,110 @@ - Hompages: [http://www.sisudoc.org] +- Dependencies [check dub.json or dub.sdl] + + - Name: d2sqlite3 + - Description: + This is a small wrapper around SQLite for the D programming language. + + - Author: + [Nicolas Sicard] + [https://github.com/dlang-community/d2sqlite3/graphs/contributors] + + - Copyright: (C) 2011-2018, Nicolas Sicard + + - code: + - License: BSL-1.0 + Boost Software License 1.0 + [http://www.boost.org/LICENSE_1_0.txt] + + - Hompages: + [https://github.com/dlang-community/d2sqlite3] + [https://code.dlang.org/packages/d2sqlite3] + + - Name: dyaml + - Description: + D:YAML is an open source YAML parser and emitter library for the D programming language. + + - Author: + [Ferdinand Majerech] + + - Copyright: (C) 2011-2018, Ferdinand Majerech + + - code: + - License: BSL-1.0 + Boost Software License 1.0 + [http://www.boost.org/LICENSE_1_0.txt] + + - Hompages: + [https://github.com/dlang-community/D-YAML] + [https://code.dlang.org/packages/dyaml] + + - Name: imageformats + - Description: + + - Author: + [Tero Hänninen] + + - Copyright: (C) Tero Hänninen + + - code: + - License: BSL-1.0 + Boost Software License 1.0 + [http://www.boost.org/LICENSE_1_0.txt] + + - Hompages: + [https://github.com/lgvz/imageformats] + [https://code.dlang.org/packages/imageformats] + + - Name: tinyendian (dyaml dependency) + - Description: + TinyEndian is a minimal endianness library for the D programming language. + + - Author: + [Ferdinand Majerech] + + - Copyright: (C) 2014, Ferdinand Majerech + + - code: + - License: BSL-1.0 + Boost Software License 1.0 + [http://www.boost.org/LICENSE_1_0.txt] + + - Hompages: + [https://github.com/dlang-community/tinyendian] + [http://code.dlang.org/packages/tinyendian] + +- Name: cgi.d + - Description: + + - Author: + [Adam D. Ruppe] + + - Copyright: (C) Adam D. Ruppe 2008 - 2020 + + - code: cgi.d (copy in ./misc/ext_lib/src/arsd/) + aria2c https://raw.githubusercontent.com/adamdruppe/arsd/master/cgi.d + + - License: BSL-1.0 + Boost Software License 1.0 + [http://www.boost.org/LICENSE_1_0.txt] + (Check the bottom of the file for details) + + - Hompages: + [https://github.com/adamdruppe/arsd] + + +- Name: dub2nix + - Description: + + - Author: + [] + + - Copyright: (C) + + - code: mkDub.nix (modified as needed) + - License: - Spine, Doc Reform (SiSU) markup samples Individual document content Copyright (Author) [as stated in document header] diff --git a/README b/README deleted file mode 100644 index 203ee70..0000000 --- a/README +++ /dev/null @@ -1,325 +0,0 @@ -project_name: Spine, Doc Reform - description: [ - "documents, structuring, processing, publishing", - search, - object numbering, - static content generator, - sisu markup - ] - - author: - name: Ralph Amissah - email: ralph.amissah@gmail.com - - copyright: "(C) 2015 - 2020 Ralph Amissah, All Rights Reserved." - - license: "AGPL 3 or later" - - hompage: [ - "http://www.doc_reform.org", - "http://www.sisudoc.org" - ] - -# Installation, Compilation - -SiSU spine is written in the programming language D for which there are 3 compilers: - -- dmd -- ldc -- gdc - -D projects tend to use dub as project manager -https://code.dlang.org/packages/dub -https://code.dlang.org/packages/dub -https://github.com/dlang/dub/blob/master/source/dub/commandline.d - - dub --compiler=ldc2 -color --config=ldc -b release - - dub --compiler=dmd -color --config=dmd - - dub --compiler=gdc-10 -color --config=gdc -b release - - make ldc - - make dmd - -there has been some coalescence around the Meson build system -https://mesonbuild.com/ - - meson - - ninja -C build - - meson setup --wipe build && ninja -v -C build - - make meson - -dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. - -# Configuration - -Configuration files are yaml files - -The following paths are searched: - - ~/.dr/config_local_site - ~/path_to_pod_root/.dr/config_local_site - -e.g. processing - - ~spineMarkupSamples/pod/* - -will search: - - ~spineMarkupSamples/pod/.dr/config_local_site - - ~/.dr/config_local_site - -to specify an alternative configuration file to use on the command line (in this -example named "my_config"): - - spine -v --html --config=~spineMarkupSamples/pod/.dr/my_config - -here is a sample configuration file: - -flag: - act0: "--html" - act1: "--html --epub" -output: - path: "/var/www/html" -default: - language: "en" - papersize: "a4" - text_wrap: "80" - digest: "sha256" -webserv: - http: "http" - domain: "localhost" - data_http: "http" - data_domain: "localhost" - data_root_url: "http://localhost" - data_root_path: "/var/www/html" - data_root_part: "" - images_root_part: "image" - cgi_title: "≅ SiSU Spine search" - cgi_http: "http" - cgi_domain: "localhost" - cgi_bin_url: "http://localhost/cgi-bin" - cgi_bin_part: "cgi-bin" - cgi_bin_path: "/usr/lib/cgi-bin" - cgi_search_script: "spine-search" - cgi_search_script_raw_fn_d: "spine_search.d" - cgi_port: "" - cgi_user: "" - cgi_action: "http://localhost/cgi-bin/spine-search" - db_sqlite: "spine.search.db" - db_pg_table: "" - db_pg_user: "" - -# Commands - -for a list of commands from the program type: - - spine -h - -at the time of writing this provides the following output: - - --abstraction document abstraction - --assert set optional assertions on - --cgi-search-form-codegen generates (pre-compiled) d code for search of specified db - --cgi-sqlite-search-filename =[filename] - --concordance file for document - --config =/path/to/config/file/including/filename - --dark alternative dark theme - --debug debug - --digest hash digest for each object - --epub process epub output - --harvest extract info on authors & topics from document header metadata - --harvest-authors extract info on authors from document header metadata - --harvest-topics extract info on topics from document header metadata - --hide-ocn object cite numbers - --html process html output - --html-link-harvest place links back to harvest in segmented html - --html-link-search html embedded search submission - --html-seg process html output - --html-scroll process html output - --lang =[lang code e.g. =en or =en,es] - --latex output for pdfs - --latex-color-links mono or color links for pdfs - --light default light theme - --manifest process manifest output - --ocn-off object cite numbers - --odf open document format text (--odt) - --odt open document format text - --output =/path/to/output/dir specify where to place output - --parallel parallelisation - --parallel-subprocesses nested parallelisation - --pdf latex output for pdfs - --pdf-color-links mono or color links for pdfs - --pod spine (doc reform) pod source content bundled --q --quiet output to terminal - --section-backmatter document backmatter (default) - --section-biblio document biblio (default) - --section-blurb document blurb (default) - --section-body document body (default) - --section-bookindex document bookindex (default) - --section-endnotes document endnotes (default) - --section-glossary document glossary (default) - --section-toc table of contents (default) - --serial serial processing - --skip-output skip output - --show-config show config - --show-make show make - --show-metadata show metadata - --show-summary show summary - --source document markup source - --sqlite-discrete process discrete sqlite output - --sqlite-db-create create db, create tables - --sqlite-db-drop drop tables & db - --sqlite-db-recreate create db, create tables - --sqlite-delete sqlite output - --sqlite-db-filename =[filename].sql.db - --sqlite-insert sqlite output - --sqlite-update sqlite output - --text text output - --theme-dark alternative dark theme - --theme-light default light theme - --txt text output --v --verbose output to terminal - --very-verbose output to terminal - --workon (reserved for some matters under development & testing) - --xhtml xhtml output --h --help This help information. - -# Examples - -if configuartion has been set specify just -- the desired output and -- the markup document/pod(s) to process - - spine -v --html ~spineMarkupSamples/markup/pod/sisu-manual - -if configuartion has not been set or to overide the set configration specify -- the output path as well as -- the desired output and -- the markup document/pod(s) to process - -note: ~webDocRoot should be the path to web doc root, provide a suitable output path. - - spine -v --html --html-link-search --html-link-harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --html-link-harvest --epub --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --epub --latex --odt --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - -## harvest - -if you have a document collection with documents that have metadata headers a -summary of the collection can be made using the harvest command - - spine -v --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --harvest ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --html-link-harvest --harvest ~spineMarkupSamples/pod/* - -## sqlite - -### create db - -if there is no sqlite db you first need to create one, to do so -- the name of the db and -- the root path for document output -must be specified: - - spine -v \ - --sqlite-db-create --sqlite-db-filename="spine.search.db" \ - --output=/var/www/html \ - ~spineMarkupSamples/pod/* - - spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` - -if you have a configration file providing this information that is to be used -for a document collection you can point to the document collection: - - spine -v --sqlite-db-create ~spineMarkupSamples/pod - -### populate db - -must specify: -- the name of the db and -- the root path for document output - - spine -v --sqlite-update \ - --sqlite-db-filename="spine.search.db" \ - --output=/var/www/html \ - ~spineMarkupSamples/pod/* - - spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - -if you have a configration file providing this information that is to be used -for a document collection you can point to the document collection: - - spine -v --sqlite-update ~spineMarkupSamples/pod/* - -### generate a cgi search form in d - - 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 - - spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot` - - spine -v --cgi-search-form-codegen \ - --sqlite-db-filename="spine.search.db" \ - --cgi-sqlite-search-filename="spine-search" \ - --output=/var/www/html \ - ~spineMarkupSamples/pod - -#### compile the cgi search form - - cd /var/www/html/cgi # /var/www/html (default document root) - - cd ~webDocRoot/cgi - -the directory ~webDocRoot/cgi/src should contain two files -- spine_search.d (or whatever you named it) -- cgi.d (by Adam Rupee) - - dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. - -should compile spine-search in ~webDocRoot/cgi/cgi-bin and copy it to the -cgi-bin directory - - spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` - - spine -v --sqlite-db-create ~spineMarkupSamples/pod - - spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - -### create db & search form - - 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/* - -### html with links to search form - - spine -v --html \ - --html-link-search \ - --output=`echo ~webDocRoot` \ - ~spineMarkupSamples/pod/* diff --git a/README.md b/README.md new file mode 100644 index 0000000..ac35e9f --- /dev/null +++ b/README.md @@ -0,0 +1,326 @@ +project_name: Spine, Doc Reform + + description: [ + "documents, structuring, processing, publishing", + search, + object numbering, + static content generator, + sisu markup + ] + + author: + name: Ralph Amissah + email: ralph.amissah@gmail.com + + copyright: "(C) 2015 - 2020 Ralph Amissah, All Rights Reserved." + + license: "AGPL 3 or later" + + hompage: [ + "http://www.doc_reform.org", + "http://www.sisudoc.org" + ] + +# Installation, Compilation + +SiSU spine is written in the programming language D for which there are 3 compilers: + +- dmd +- ldc +- gdc + +D projects tend to use dub as project manager +https://code.dlang.org/packages/dub +https://code.dlang.org/packages/dub +https://github.com/dlang/dub/blob/master/source/dub/commandline.d + + dub --compiler=ldc2 -color --config=ldc -b release + + dub --compiler=dmd -color --config=dmd + + dub --compiler=gdc-10 -color --config=gdc -b release + + make ldc + + make dmd + +there has been some coalescence around the Meson build system +https://mesonbuild.com/ + + meson + + ninja -C build + + meson setup --wipe build && ninja -v -C build + + make meson + +dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. + +# Configuration + +Configuration files are yaml files + +The following paths are searched: + + ~/.dr/config_local_site + ~/path_to_pod_root/.dr/config_local_site + +e.g. processing + + ~spineMarkupSamples/pod/* + +will search: + + ~spineMarkupSamples/pod/.dr/config_local_site + + ~/.dr/config_local_site + +to specify an alternative configuration file to use on the command line (in this +example named "my_config"): + + spine -v --html --config=~spineMarkupSamples/pod/.dr/my_config + +here is a sample configuration file: + +flag: + act0: "--html" + act1: "--html --epub" +output: + path: "/var/www/html" +default: + language: "en" + papersize: "a4" + text_wrap: "80" + digest: "sha256" +webserv: + http: "http" + domain: "localhost" + data_http: "http" + data_domain: "localhost" + data_root_url: "http://localhost" + data_root_path: "/var/www/html" + data_root_part: "" + images_root_part: "image" + cgi_title: "≅ SiSU Spine search" + cgi_http: "http" + cgi_domain: "localhost" + cgi_bin_url: "http://localhost/cgi-bin" + cgi_bin_part: "cgi-bin" + cgi_bin_path: "/usr/lib/cgi-bin" + cgi_search_script: "spine-search" + cgi_search_script_raw_fn_d: "spine_search.d" + cgi_port: "" + cgi_user: "" + cgi_action: "http://localhost/cgi-bin/spine-search" + db_sqlite: "spine.search.db" + db_pg_table: "" + db_pg_user: "" + +# Commands + +for a list of commands from the program type: + + spine -h + +at the time of writing this provides the following output: + + --abstraction document abstraction + --assert set optional assertions on + --cgi-search-form-codegen generates (pre-compiled) d code for search of specified db + --cgi-sqlite-search-filename =[filename] + --concordance file for document + --config =/path/to/config/file/including/filename + --dark alternative dark theme + --debug debug + --digest hash digest for each object + --epub process epub output + --harvest extract info on authors & topics from document header metadata + --harvest-authors extract info on authors from document header metadata + --harvest-topics extract info on topics from document header metadata + --hide-ocn object cite numbers + --html process html output + --html-link-harvest place links back to harvest in segmented html + --html-link-search html embedded search submission + --html-seg process html output + --html-scroll process html output + --lang =[lang code e.g. =en or =en,es] + --latex output for pdfs + --latex-color-links mono or color links for pdfs + --light default light theme + --manifest process manifest output + --ocn-off object cite numbers + --odf open document format text (--odt) + --odt open document format text + --output =/path/to/output/dir specify where to place output + --parallel parallelisation + --parallel-subprocesses nested parallelisation + --pdf latex output for pdfs + --pdf-color-links mono or color links for pdfs + --pod spine (doc reform) pod source content bundled +-q --quiet output to terminal + --section-backmatter document backmatter (default) + --section-biblio document biblio (default) + --section-blurb document blurb (default) + --section-body document body (default) + --section-bookindex document bookindex (default) + --section-endnotes document endnotes (default) + --section-glossary document glossary (default) + --section-toc table of contents (default) + --serial serial processing + --skip-output skip output + --show-config show config + --show-make show make + --show-metadata show metadata + --show-summary show summary + --source document markup source + --sqlite-discrete process discrete sqlite output + --sqlite-db-create create db, create tables + --sqlite-db-drop drop tables & db + --sqlite-db-recreate create db, create tables + --sqlite-delete sqlite output + --sqlite-db-filename =[filename].sql.db + --sqlite-insert sqlite output + --sqlite-update sqlite output + --text text output + --theme-dark alternative dark theme + --theme-light default light theme + --txt text output +-v --verbose output to terminal + --very-verbose output to terminal + --workon (reserved for some matters under development & testing) + --xhtml xhtml output +-h --help This help information. + +# Examples + +if configuartion has been set specify just +- the desired output and +- the markup document/pod(s) to process + + spine -v --html ~spineMarkupSamples/markup/pod/sisu-manual + +if configuartion has not been set or to overide the set configration specify +- the output path as well as +- the desired output and +- the markup document/pod(s) to process + +note: ~webDocRoot should be the path to web doc root, provide a suitable output path. + + spine -v --html --html-link-search --html-link-harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + + spine -v --html --html-link-search --html-link-harvest --epub --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + + spine -v --html --epub --latex --odt --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + +## harvest + +if you have a document collection with documents that have metadata headers a +summary of the collection can be made using the harvest command + + spine -v --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + + spine -v --harvest ~spineMarkupSamples/pod/* + + spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + + spine -v --html --html-link-search --html-link-harvest --harvest ~spineMarkupSamples/pod/* + +## sqlite + +### create db + +if there is no sqlite db you first need to create one, to do so +- the name of the db and +- the root path for document output +must be specified: + + spine -v \ + --sqlite-db-create --sqlite-db-filename="spine.search.db" \ + --output=/var/www/html \ + ~spineMarkupSamples/pod/* + + spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` + +if you have a configration file providing this information that is to be used +for a document collection you can point to the document collection: + + spine -v --sqlite-db-create ~spineMarkupSamples/pod + +### populate db + +must specify: +- the name of the db and +- the root path for document output + + spine -v --sqlite-update \ + --sqlite-db-filename="spine.search.db" \ + --output=/var/www/html \ + ~spineMarkupSamples/pod/* + + spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + +if you have a configration file providing this information that is to be used +for a document collection you can point to the document collection: + + spine -v --sqlite-update ~spineMarkupSamples/pod/* + +### generate a cgi search form in d + + 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 + + spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot` + + spine -v --cgi-search-form-codegen \ + --sqlite-db-filename="spine.search.db" \ + --cgi-sqlite-search-filename="spine-search" \ + --output=/var/www/html \ + ~spineMarkupSamples/pod + +#### compile the cgi search form + + cd /var/www/html/cgi # /var/www/html (default document root) + + cd ~webDocRoot/cgi + +the directory ~webDocRoot/cgi/src should contain two files +- spine_search.d (or whatever you named it) +- cgi.d (by Adam Rupee) + + dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. + +should compile spine-search in ~webDocRoot/cgi/cgi-bin and copy it to the +cgi-bin directory + + spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` + + spine -v --sqlite-db-create ~spineMarkupSamples/pod + + spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + + spine -v --html --html-link-search --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + + spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* + +### create db & search form + + 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/* + +### html with links to search form + + spine -v --html \ + --html-link-search \ + --output=`echo ~webDocRoot` \ + ~spineMarkupSamples/pod/* diff --git a/makefile b/makefile index 90cc29b..60cb557 100644 --- a/makefile +++ b/makefile @@ -78,9 +78,6 @@ data/sisudir/media/text/through_the_looking_glass.lewis_carroll.sst \ data/sisudir/media/text/two_bits.christopher_kelty.sst \ data/sisudir/media/text/un_contracts_international_sale_of_goods_convention_1980.sst \ data/sisudir/media/text/viral_spiral.david_bollier.sst -dub_upgrade: - $(DUB) upgrade -default: ldc markup_samples: find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \ find data/sisudir/media/text -name *.ss[tm] | sort @@ -88,6 +85,9 @@ markup_pod_samples: find data/pod -name pod.manifest | cut -f 1-3 -d / | sort markup_dir_samples: find data/sisudir/media/text -name *.ss[tm] | sort +dub_upgrade: + $(DUB) upgrade +default: ldc all: dmd ldc gdc all_ver: dmd_ver ldc_ver gdc_ver all_debug: dmd_debug gdc_debug ldc_debug diff --git a/org/compile_time_info.org b/org/compile_time_info.org index e09409e..59ea6a4 100644 --- a/org/compile_time_info.org +++ b/org/compile_time_info.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -30,7 +31,8 @@ version(Windows) {} else { ... } +/ module doc_reform.conf.compile_time_info; template CompileTimeInfo() { - <> + <> + <> } #+END_SRC @@ -39,7 +41,7 @@ OS type shows during compilation *** set os flags -#+NAME: spine_compile_time_info +#+NAME: spine_compile_time_info_0 #+BEGIN_SRC d version(Windows) { pragma(msg, "[ Windows compilation ]"); @@ -97,7 +99,7 @@ static if(sysWindows) { ** 64 bit compilation? -#+NAME: spine_compile_time_info +#+NAME: spine_compile_time_info_1 #+BEGIN_SRC d version(D_LP64) { enum bits = "64 bit"; diff --git a/org/default_misc.org b/org/default_misc.org index 615f480..eb58fb2 100644 --- a/org/default_misc.org +++ b/org/default_misc.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no diff --git a/org/default_paths.org b/org/default_paths.org index f0881da..5c4e15e 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -35,7 +36,10 @@ import import doc_reform.meta.defaults, doc_reform.meta.rgx; -<> +<> +<> +<> +<> <> <> <> @@ -43,7 +47,7 @@ import ** _manifest_ :manifest: -#+NAME: template_paths_src +#+NAME: template_paths_src_0 #+BEGIN_SRC d template PodManifest() { mixin spineRgxIn; @@ -118,7 +122,7 @@ pod │   └── video └── pod.manifest -#+NAME: template_paths_src +#+NAME: template_paths_src_1 #+BEGIN_SRC d template PathMatters() { mixin spineRgxIn; @@ -466,7 +470,7 @@ template PathMatters() { ** _config_ (dr_document_make & config_local_site) :config: -#+NAME: template_paths_src +#+NAME: template_paths_src_2 #+BEGIN_SRC d template configFilePaths() { mixin spineRgxIn; @@ -639,7 +643,7 @@ filelist for processing [things to ponder] *** manual source -#+NAME: template_paths_src +#+NAME: template_paths_src_3 #+BEGIN_SRC d template spinePathsSRC() { mixin spineRgxIn; @@ -971,13 +975,18 @@ import std.regex, std.stdio; import doc_reform.meta.rgx; -<> +<> +<> <> -<> +<> +<> +<> <> <> <> -<> +<> +<> +<> #+END_SRC ** shared out path, base directory :out: @@ -990,7 +999,7 @@ import doc_reform.meta.rgx; - if pod and file have same name, keep name (makes no sense to repeat pod name) NO dr_markup.sisu_markup should be sisu_markup -#+NAME: template_paths_out +#+NAME: template_paths_out_0 #+BEGIN_SRC d template spineOutPaths() { auto spineOutPaths()( @@ -1048,7 +1057,7 @@ template spineOutPathSQLiteCGI() { ** set -#+NAME: template_paths_out +#+NAME: template_paths_out_1 #+BEGIN_SRC d template spineOutPathsFnPd() { /+ TODO stuff to work out here +/ @@ -1092,7 +1101,7 @@ template spineOutPathsFnPd() { ** _html_ :html: *** relative -#+NAME: template_paths_html +#+NAME: template_paths_html_0 #+BEGIN_SRC d template spineDocRootTreeHTML() { mixin spineRgxIn; @@ -1158,7 +1167,7 @@ template spineDocRootTreeHTML() { *** absolute disk path -#+NAME: template_paths_html +#+NAME: template_paths_html_1 #+BEGIN_SRC d template spinePathsHTML() { mixin spineRgxIn; @@ -1224,7 +1233,7 @@ template spinePathsHTML() { *** urls -#+NAME: template_paths_html +#+NAME: template_paths_html_2 #+BEGIN_SRC d template spineUrlsHTML() { import std.format; @@ -1553,7 +1562,7 @@ template spinePathsLaTeX() { ** _sqlite_ :sqlite: *** discrete -#+NAME: template_paths_sqlite +#+NAME: template_paths_sqlite_0 #+BEGIN_SRC d template spinePathsSQLiteDiscrete() { mixin spineRgxIn; @@ -1585,7 +1594,7 @@ template spinePathsSQLiteDiscrete() { *** TODO collection -#+NAME: template_paths_sqlite +#+NAME: template_paths_sqlite_1 #+BEGIN_SRC d template spinePathsSQLite() { mixin spineRgxIn; @@ -1614,7 +1623,7 @@ template spinePathsSQLite() { *** TODO cgi search form -#+NAME: template_paths_sqlite +#+NAME: template_paths_sqlite_2 #+BEGIN_SRC d template spinePathsSQLiteCGI() { mixin spineRgxIn; diff --git a/org/default_regex.org b/org/default_regex.org index d9020d4..d78409e 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -37,15 +38,45 @@ http://dlang.org/phobos/std_regex.html module doc_reform.meta.rgx; static template spineRgxIn() { static struct RgxI { - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> } } #+END_SRC ** misc :misc: -#+NAME: meta_rgx +#+NAME: meta_rgx_0 #+BEGIN_SRC d /+ misc +/ // static true_dollar = ctRegex!(`\$`, "gm"); @@ -84,7 +115,7 @@ static numeric_col = ctRegex!(`^[ 0-9,.%$£ ** comments :comment: -#+NAME: meta_rgx +#+NAME: meta_rgx_1 #+BEGIN_SRC d /+ comments +/ static comment = ctRegex!(`^%+ `); @@ -92,7 +123,7 @@ static comment = ctRegex!(`^%+ `); ** config -#+NAME: meta_rgx +#+NAME: meta_rgx_2 #+BEGIN_SRC d /+ header +/ #+END_SRC @@ -100,7 +131,7 @@ static comment = ctRegex!(`^%+ `); ** native headers *** native header :native:header: -#+NAME: meta_rgx +#+NAME: meta_rgx_3 #+BEGIN_SRC d /+ header +/ static variable_doc_title = ctRegex!(`@title`); @@ -112,7 +143,7 @@ static yaml_config = ctRegex!(`^[a-z]+\s*:\s* ** heading & paragraph operators :paragraph:operator: -#+NAME: meta_rgx +#+NAME: meta_rgx_4 #+BEGIN_SRC d /+ heading & paragraph operators +/ static heading_a = ctRegex!(`^:?[A][~] `, "m"); @@ -141,7 +172,7 @@ static para_inline_link_anchor = ctRegex!(`\*[~](?P(?:[ ,]+[0-9]+)+)[)][}]"); @@ -150,7 +181,7 @@ static block_poem_open = ctRegex!("^((poem(?:[(][ *** blocked markup tic :block:tic: -#+NAME: meta_rgx +#+NAME: meta_rgx_6 #+BEGIN_SRC d /+ blocked markup tics +/ static block_tic_code_open = ctRegex!("^`{3} code(?:[.](?P[a-z][0-9a-z#+_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); @@ -164,7 +195,7 @@ static block_tic_close = ctRegex!("^(`{3})$","m") *** blocked markup curly :block:curly: -#+NAME: meta_rgx +#+NAME: meta_rgx_7 #+BEGIN_SRC d /+ blocked markup curly +/ static block_curly_code_open = ctRegex!(`^(?:code(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); @@ -185,14 +216,14 @@ static block_curly_table_special_markup = ctRegex!(`^[{]table[(](? *** block sub-matches :block: **** code -#+NAME: meta_rgx +#+NAME: meta_rgx_8 #+BEGIN_SRC d static code_numbering = ctRegex!(`(?P\blinenumber\b|\bnumber\b|\blnr\b)`); #+END_SRC **** table -#+NAME: meta_rgx +#+NAME: meta_rgx_9 #+BEGIN_SRC d static table_head_instructions = ctRegex!(`(?:(?Ph);)?(?:[ ]+c(?P[0-9]):)?(?P(?:[, ]+[0-9]+[lr]?)+)`); static table_col_widths_and_alignment = ctRegex!(`(?P[0-9]+)(?P[lr]?)`); @@ -206,7 +237,7 @@ static table_col_separator_nl = ctRegex!(`[┊]$`, "mg") ** inline markup :inline:footnote: *** footnotes & endnotes -#+NAME: meta_rgx +#+NAME: meta_rgx_10 #+BEGIN_SRC d /+ inline markup footnotes endnotes +/ static inline_notes_curly_gen = ctRegex!(`~\{.+?\}~`, "m"); @@ -224,7 +255,7 @@ static note_ref = ctRegex!(`^\S+?noteref_( *** links/ urls :inline:footnote: -#+NAME: meta_rgx +#+NAME: meta_rgx_11 #+BEGIN_SRC d static webserv_url_doc_root = ctRegex!(`(?P(?Phttps?:\/\/[^ /]+)\/(?P\S*))`, "mg"); static smid_inline_url_generic = ctRegex!(`(?:^|[}(\[ ])(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_#]`, "mg"); @@ -237,7 +268,7 @@ static smid_inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(?P(?:^|[ ]|[^\S]?)[{┥](?:~\^\s+|\s*))(?P[a-zA-Z0-9._-]+?\.(?:png|gif|jpg))(?P(?:.*?)\s*[}┝](?:image|┤.*?├|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?=[;:!,?.]?([ )\]]|$)))`, "mg"); @@ -250,7 +281,7 @@ static smid_image_delimit = ctRegex!(`(?P
^|[ ]
 
 *** inline markup book index                               :inline:bookindex:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_13
 #+BEGIN_SRC d
 /+ inline markup book index +/
 static book_index_item                                = ctRegex!(`^=\{\s*(?P.+?)\}$`, "m");
@@ -261,7 +292,7 @@ static book_index_item_close                          = ctRegex!(`^(.*?)\}$`, "m
 ** switch
 *** switch off auto-heading number
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_14
 #+BEGIN_SRC d
 static auto_heading_numbering_lv1                    = ctRegex!(`^1~`, "m");
 static auto_heading_numbering_lv2                    = ctRegex!(`^2~`, "m");
@@ -276,7 +307,7 @@ static auto_heading_numbering_off_lv4                = ctRegex!(`^4~\S*?-\s`, "m
 
 ** no object_number object                                    :ocn:off:object:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_15
 #+BEGIN_SRC d
 /+ no object_number object +/
 static object_number_off                            = ctRegex!(`~#[ ]*$`, "m");
@@ -287,7 +318,7 @@ static repeated_character_line_separator            = ctRegex!(`^(?:[ ]*(?:(?:[.
 
 ** no object_number block                                      :ocn:off:block:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_16
 #+BEGIN_SRC d
 /+ no object_number block +/
 static object_number_off_block                      = ctRegex!(`^--~#$`);
@@ -298,7 +329,7 @@ static object_number_block_marks                    = ctRegex!(`^--[+~-]#$`);
 
 ** ignore outside code blocks                                    :block:code:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_17
 #+BEGIN_SRC d
 /+ ignore outside code blocks +/
 static skip_from_regular_parse    = ctRegex!(`^(--[+~-]#|-[\\]{2}-|=[.\\]{2}=)$`);
@@ -306,7 +337,7 @@ static skip_from_regular_parse    = ctRegex!(`^(--[+~-]#|-[\\]{2}-|=[.\\]{2}=)$`
 
 ** line & page breaks                                                 :break:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_18
 #+BEGIN_SRC d
 /+ line & page breaks +/
 static break_string                                   = ctRegex!(`』`);
@@ -314,7 +345,7 @@ static break_string                                   = ctRegex!(`』`);
 
 ** biblio tags                                                  :biblio:tags:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_19
 #+BEGIN_SRC d
 /+ biblio tags +/
 static biblio_tags                                    = ctRegex!(`^(is|au|author_raw|author|author_arr|editor_raw|ed|editor_arr|ti|title|subtitle|fulltitle|lng|language|trans|src|jo|journal|in|vol|volume|edn|edition|yr|year|pl|place|pb|pub|publisher|url|pg|pages|note|short_name|id):\s+(.+)`);
@@ -323,7 +354,7 @@ static biblio_abbreviations                           = ctRegex!(`^(au|ed|ti|lng
 
 ** bookindex split                                          :bookindex:split:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_20
 #+BEGIN_SRC d
 /+ bookindex split +/
 static bi_main_terms_split                            = ctRegex!(`\s*;\s*`);
@@ -334,7 +365,7 @@ static bi_term_and_object_numbers_match               = ctRegex!(`^(.+?)\+(\d+)`
 
 ** topic register split (document classify)
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_21
 #+BEGIN_SRC d
 static topic_register_main_terms_split                = ctRegex!(`\s*;\s*`);
 static topic_register_main_term_plus_rest_split       = ctRegex!(`\s*:\s*`);
@@ -344,7 +375,7 @@ static topic_register_multiple_sub_terms_split        = ctRegex!(`␣([^|␣]+(?
 
 ** language codes                                            :language:codes:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_22
 #+BEGIN_SRC d
 /+ language codes +/
 auto language_code_and_filename                                    =
@@ -367,8 +398,17 @@ http://dlang.org/phobos/std_regex.html
 module doc_reform.io_out.rgx;
 static template spineRgxOut() {
   static struct RgxO {
-    <>
-    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
   }
 }
 #+END_SRC
@@ -376,7 +416,7 @@ static template spineRgxOut() {
 ** special characters
 *** xhtml special characters
 
-#+NAME: sp_ch_xhtml_rgx
+#+NAME: sp_ch_xhtml_rgx_0
 #+BEGIN_SRC d
 static xhtml_ampersand                            = ctRegex!(`[&]`, "m");      // &
 static xhtml_quotation                            = ctRegex!(`["]`, "m");      // "
@@ -387,7 +427,7 @@ static xhtml_line_break                           = ctRegex!(` [\\]{2}`, "m"); /
 
 *** latex special characters
 
-#+NAME: sp_ch_xhtml_rgx
+#+NAME: sp_ch_xhtml_rgx_1
 #+BEGIN_SRC d
 static latex_special_char                         = ctRegex!(`([%${}_#&\\])`);
 static latex_special_char_for_escape              = ctRegex!(`([%${}_#\\])`);
@@ -404,7 +444,7 @@ static latex_clean_bookindex_linebreak            = ctRegex!(`\s*\\\\\\\\\s*`, "
 * 2. ctRegex defaults shared by meta & output (generic)
 ** misc generic
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_0
 #+BEGIN_SRC d
 static newline                                        = ctRegex!("\n", "mg");
 static space                                          = ctRegex!(`[ ]`, "mg");
@@ -415,7 +455,7 @@ static nbsp_char                                      = ctRegex!(`░`, "mg");
 
 ** filename (& path) (including insert file)      :insert:file:path:filename:
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_1
 #+BEGIN_SRC d
 static src_pth_sst_or_ssm                             = ctRegex!(`^(?P[/]?(?:[a-zA-Z0-9._-]+/)*)(?P[a-zA-Z0-9._-]+[.](?Pss[tm]))$`);
 static src_pth_pod_sst_or_ssm                         = ctRegex!(`^(?P[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P[a-zA-Z0-9][a-zA-Z0-9._-]*?[.]ss[tm])$`);
@@ -436,7 +476,7 @@ static src_formalised_file_path_parts                 = ctRegex!(`(?P(?:[/a
 
 *** inline breaks
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_2
 #+BEGIN_SRC d
 /+ line breaks +/
 static br_empty_line                                  = ctRegex!(`\n[ ]*\n`, "mg");
@@ -447,7 +487,7 @@ static br_nl                                          = ctRegex!(`┙`, "mg");
 
 *** inline (internal program) markup footnotes endnotes     :inline:footnote:
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_3
 #+BEGIN_SRC d
 /+ inline markup footnotes endnotes +/
 static inline_notes_al                                = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg");
@@ -467,7 +507,7 @@ static inline_text_and_note_al_                       = ctRegex!(`(.+?(?:【[*+]
 
 *** inline links
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_4
 #+BEGIN_SRC d
 /+ inline markup links +/
 static inline_image                                   = ctRegex!(`(?P
┥)☼(?P(?P[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+))\s*(?P.*?┝┤.*?├)`, "mg");
@@ -495,7 +535,7 @@ static quotation_mark_sql_insert_delimiter            = ctRegex!("[']", "mg");
 
 *** inline markup font face mod                            :inline:font:face:
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_5
 #+BEGIN_SRC d
 /+ inline markup font face mod +/
 static inline_mark_emphasis                         = ctRegex!(`(?P[*])\{(?P.+?)\}[*]`, "mg");
@@ -510,7 +550,7 @@ static inline_mark_mono                             = ctRegex!(`(?P[#])\{(
 static inline_mark_cite                             = ctRegex!(`(?P["])\{(?P.+?)\}["]`, "mg");
 #+END_SRC
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_6
 #+BEGIN_SRC d
 static inline_faces_line                              = ctRegex!(`^[*!/_]_ (?P.+?)((?: [\\]{2}|[~]#){0,2}$)`);
 static inline_emphasis_line                           = ctRegex!(`^\*_ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
@@ -519,7 +559,7 @@ static inline_italics_line                            = ctRegex!(`^/_ (?P.
 static inline_underscore_line                         = ctRegex!(`^__ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
 #+END_SRC
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_7
 #+BEGIN_SRC d
 /+ inline markup font face mod +/
 static inline_emphasis                                = ctRegex!(`[*]┨(?P.+?)┣[*]`, "mg");
@@ -538,7 +578,7 @@ static inline_fontface_clean                          = ctRegex!(`[*!_/^,+■‖
 
 *** table related
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_8
 #+BEGIN_SRC d
 /+ table delimiters +/
 static table_delimiter_col                           = ctRegex!("[ ]*[┊][ ]*", "mg");
diff --git a/org/default_shared.org b/org/default_shared.org
index c776725..5b81f84 100644
--- a/org/default_shared.org
+++ b/org/default_shared.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/imports.org b/org/imports.org
index 0d8e20f..06ea0ff 100644
--- a/org/imports.org
+++ b/org/imports.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/in_source_files.org b/org/in_source_files.org
index db433b0..86b0607 100644
--- a/org/in_source_files.org
+++ b/org/in_source_files.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -47,13 +48,15 @@ import
   <>,
   doc_reform.meta.rgx;
 <>
-<>
+<>
+<>
+<>
 #+END_SRC
 
 *** 0. read config files (config local site & dr document make) (yaml)
 **** 1. site configuration
 
-#+NAME: meta_config_file_hub
+#+NAME: meta_config_file_hub_0
 #+BEGIN_SRC d
 template readConfigSite() {
   @system final auto readConfigSite(C,O)(C _conf_file_details, O _opt_action) {
@@ -167,7 +170,7 @@ webserv:
 
 **** 2. document make/config
 
-#+NAME: meta_config_file_hub
+#+NAME: meta_config_file_hub_1
 #+BEGIN_SRC d
 static template readConfigDoc() {
   import
@@ -223,7 +226,7 @@ static template readConfigDoc() {
 
 *** YAML config (config local site & dr document make)      :file:config:hub:
 
-#+NAME: meta_config_file_hub
+#+NAME: meta_config_file_hub_2
 #+BEGIN_SRC d
 static template configReadSiteYAML() {
   import
diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org
index dbe3cc9..d1e21bc 100644
--- a/org/meta_conf_make_meta.org
+++ b/org/meta_conf_make_meta.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -84,12 +85,18 @@ import doc_reform.meta.conf_make_meta_structs;
 
 #+BEGIN_SRC d :tangle "../src/doc_reform/meta/conf_make_meta_structs.d"
 module doc_reform.meta.conf_make_meta_structs;
-<>
+<>
+<>
+<>
+<>
+<>
+<>
+<>
 #+END_SRC
 
 ** initialize, imports etc.
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_0
 #+BEGIN_SRC d
 import
   std.exception,
@@ -112,7 +119,7 @@ static auto mkup = InlineMarkup();
 
 ** struct Generic ConfComposite
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_1
 #+BEGIN_SRC d
 @safe string url_markup(string line) {
   string line_ = line
@@ -224,7 +231,7 @@ struct confCompositeMakeBuild {
 ** initialize make & meta
 *** composite make
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_2
 #+BEGIN_SRC d
 struct ConfCompositeMakeInit {
   string[]   bold;
@@ -249,7 +256,7 @@ struct ConfCompositeMakeInit {
 
 *** struct: conf site local
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_3
 #+BEGIN_SRC d
 struct ConfCompositeSiteLocal {
   string   w_srv_http;
@@ -308,7 +315,7 @@ struct ConfCompositeSiteLocal {
 
 *** struct: composite meta
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_4
 #+BEGIN_SRC d
 struct MetaComposite {
   string   classify_dewey;
@@ -368,7 +375,7 @@ struct MetaComposite {
 
 *** composite structs
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_5
 #+BEGIN_SRC d
 struct ConfComposite {
   MetaComposite               meta;
@@ -380,7 +387,7 @@ struct ConfComposite {
 
 *** JSONValue
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_6
 #+BEGIN_SRC d
 JSONValue config_jsonstr = `{
 }`;
@@ -1451,7 +1458,9 @@ static template contentJSONtoSpineStruct() {
       writeln("<< --------------------------- <<");
     }
     confCompositeMakeBuild _mk;
-    <>
+    <>
+    <>
+    <>
     return _struct_composite;
   }
 }
@@ -1459,7 +1468,7 @@ static template contentJSONtoSpineStruct() {
 
 **  make
 
-#+NAME: json_objects
+#+NAME: json_objects_0
 #+BEGIN_SRC d
 /+ make ------------------------------------------------------------------- +/
 if ("make" in _json.object) {
@@ -1624,7 +1633,7 @@ if ("make" in _json.object) {
 
 **  conf
 
-#+NAME: json_objects
+#+NAME: json_objects_1
 #+BEGIN_SRC d
 /+ conf ------------------------------------------------------------------- +/
 if ("webserv" in _json.object) {
@@ -1795,7 +1804,7 @@ if ("search" in _json.object) {
 
 **  meta
 
-#+NAME: json_objects
+#+NAME: json_objects_2
 #+BEGIN_SRC d
 /+ meta ------------------------------------------------------------------- +/
 if (_struct_composite.meta.creator_author.empty) {
diff --git a/org/meta_debugs.org b/org/meta_debugs.org
index 6dc2ecf..7a2247f 100644
--- a/org/meta_debugs.org
+++ b/org/meta_debugs.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/metaverse.org b/org/metaverse.org
index 697dd5e..668ac15 100644
--- a/org/metaverse.org
+++ b/org/metaverse.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -34,7 +35,12 @@ template docAbstraction() {
                                                                                 /+ ↓ abstraction mixins +/
   <>
                                                                                 /+ ↓ abstraction struct init +/
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
   <>
                                                                                 /+ ↓ abstract marked up document +/
   @system auto docAbstraction(CMM,Opt,Mf) (
@@ -46,14 +52,16 @@ template docAbstraction() {
   ) {
     static auto rgx = RgxI();
                                                                                 /+ ↓ abstraction init +/
-    <>
+    <>
+    <>
                                                                                 /+ abstraction init ↑ +/
     <>
                                                                                 /+ ↓ ↻ loop markup document/text line by line +/
     srcDocLoop:
     foreach (line; markup_sourcefile_content) {                                 /+ ↓ markup document/text line by line +/
                                                                                 // "line" variable can be empty but should never be null
-      <>
+      <>
+      <>
       if ( pith["block_is"] == eN.blk_is.code
         && pith["block_state"] == eN.blk_state.on
       ) {
@@ -61,25 +69,76 @@ template docAbstraction() {
       } else if (!matchFirst(line, rgx.skip_from_regular_parse)) {              /+ object other than "code block" object +/
                                                                                 /+ (includes regular text paragraph, headings & blocks other than code) +/
                                                                                 /+ heading, glossary, blurb, poem, group, block, quote, table +/
-        <>
+        <>
+        <>
+        <>
+        <>
+        <>
+        <>
+        <>
+        <>
+        <>
+        <>
         } else {                                                                /+ not within a block group +/
           <>
           if (line.matchFirst(rgx.block_open)) {
             <>
           } else if (!line.empty) {                                             /+ line not empty +/
                                                                                 /+ non blocks (headings, paragraphs) & closed blocks +/
-            <>
+            <>
+            <>
+            <>
+            <>
+            <>
+            <>
+            <>
           } else if (pith["block_state"] == eN.blk_state.closing) {             /+ line empty, with blocks flag +/
             <>
           } else {                                                              /+ line.empty, post contents, empty variables: +/
-            <>
+            <>
+            <>
+            <>
           }                                                                     // close else for line empty
         }                                                                       // close else for not the above
       }                                                                         // close after non code, other blocks or regular text
       <>
     }                                                                           /+ ← srcDocLoop closed: loop markup document/text line by line +/
                                                                                 /+ ↓ post loop markup document/text +/
-    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
+    <>
     <>
     <>
     <>
@@ -89,48 +148,117 @@ template docAbstraction() {
   <>
   <>
   <>
-  <>
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
   <>
   <>
   <>
   <>
   <>
   <>
-  <>
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
   <>
-  <>
-  <>
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
                                                                                 /+ abstraction functions ↑ +/
                                                                                 /+ ↓ abstraction function emitters +/
   <>
                                                                                 /+ +/
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
   <>
   <>
   <>
   <>
-  <>
+  <>
+  <>
   <>
                                                                                 /+ +/
   <>
   <>
   <>
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
   <>
   <>
                                                                                 /+ +/
   <>
   <>
-  <>
+  <>
+  <>
+  <>
+  <>
                                                                                 /+ +/
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
                                                                                 /+ +/
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
                                                                                 /+ +/
-  <>
+  <>
+  <>
+  <>
+  <>
                                                                                 /+ abstraction functions emitters ↑ +/
                                                                                 /+ ↓ abstraction functions assertions +/
   <>
@@ -170,7 +298,7 @@ mixin spineRgxIn;
 *** initialize                                                   :initialize:
 **** declare enum
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_0
 #+BEGIN_SRC d
 @safe static auto eN() {
   struct _e {
@@ -228,7 +356,7 @@ mixin spineRgxIn;
 
 **** initialize general
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_1
 #+BEGIN_SRC d
 /+ initialize +/
 ObjGenericComposite[] the_table_of_contents_section;
@@ -320,7 +448,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method heading ancestors
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_2
 #+BEGIN_SRC d
 @safe pure ObjGenericComposite obj_heading_ancestors()(
   ObjGenericComposite  obj,
@@ -379,7 +507,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method dom markup tags
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_3
 #+BEGIN_SRC d
 @safe pure ObjGenericComposite obj_dom_structure_set_markup_tags()(
   ObjGenericComposite  obj,
@@ -429,7 +557,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method dom collapsed tags
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_4
 #+BEGIN_SRC d
 @safe pure ObjGenericComposite obj_dom_set_collapsed_tags()(
   ObjGenericComposite  obj,
@@ -479,7 +607,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method ocn emit
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_5
 #+BEGIN_SRC d
 @safe static auto ocn_emit(int ocn_status_flag) {
   return object_citation_number.ocn_emitter(ocn_status_flag);
@@ -568,7 +696,7 @@ enum sObj { content, anchor_tag, notes_reg, notes_star, links, image_no_dimensio
 
 *** scope
 
-#+NAME: abs_init_rest
+#+NAME: abs_init_rest_0
 #+BEGIN_SRC d
 scope(success) {
 }
@@ -589,7 +717,7 @@ scope(exit) {
 
 *** init rest
 
-#+NAME: abs_init_rest
+#+NAME: abs_init_rest_1
 #+BEGIN_SRC d
 mixin spineNode;
 auto node_para_int_    = node_metadata_para_int;
@@ -747,7 +875,7 @@ debug (substitutions) {
 ** 2. ↻ *LOOP* _loop: process document body_ [+6]                          :loop:
 *** Loop scope                                                        :scope:
 
-#+NAME: abs_in_loop_body_00
+#+NAME: abs_in_loop_body_00_0
 #+BEGIN_SRC d
 /+ scope +/
 scope(exit) {
@@ -775,7 +903,7 @@ debug(srclines) {
 
 *** check whether object number is on or turned off                     :ocn:
 
-#+NAME: abs_in_loop_body_00
+#+NAME: abs_in_loop_body_00_1
 #+BEGIN_SRC d
 if (!line.empty) {
   pith = line._check_ocn_status_(pith);
@@ -795,7 +923,7 @@ continue;
 **** _non code objects_ (non-code blocks & regular text: by line) [+4] :non_code:
 ***** inline fontface markup
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_0
 #+BEGIN_SRC d
 line = line.inline_markup_faces; // by text line (rather than by text object), linebreaks in para problematic
 #+END_SRC
@@ -803,7 +931,7 @@ line = line.inline_markup_faces; // by text line (rather than by text object), l
 ***** in section (biblio, glossary, blurb) +(block group)+ [+1]  :block:active:
 ****** in section: biblio                                            :biblio:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_1
 #+BEGIN_SRC d
 if (line.matchFirst(rgx.heading_biblio)
 || (pith["section"] == eN.sect.bibliography
@@ -832,7 +960,7 @@ if there is a glossary section you need to:
   - need indentation and regular paragraph inline markup
 - reconstitute the document with the glossary section following the endnotes
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_2
 #+BEGIN_SRC d
 } else if (line.matchFirst(rgx.heading_glossary)
 || (pith["section"] == eN.sect.glossary
@@ -940,7 +1068,7 @@ if there is a blurb section you need to:
   - need regular paragraph inline markup
 - reconstitute the document with the blurb section at the very end of the doucment
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_3
 #+BEGIN_SRC d
 } else if (line.matchFirst(rgx.heading_blurb)
 || (pith["section"] == eN.sect.blurb
@@ -1093,14 +1221,14 @@ if there is a blurb section you need to:
 
 ***** in blocks [+1]                                           :block:active:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_4
 #+BEGIN_SRC d
 } else if (pith["block_state"] == eN.blk_state.on) {
 #+END_SRC
 
 ****** in block: quote                                                :quote:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_5
 #+BEGIN_SRC d
   if (pith["block_is"]    == eN.blk_is.quote) {
     line = line
@@ -1112,7 +1240,7 @@ if there is a blurb section you need to:
 
 ****** in block: group                                                :group:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_6
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.group) {
     line = line
@@ -1125,7 +1253,7 @@ if there is a blurb section you need to:
 
 ****** in block: block                                                :block:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_7
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.block) {
     line = line
@@ -1141,7 +1269,7 @@ if there is a blurb section you need to:
 
 ****** in block: poem                                                  :poem:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_8
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.poem) {
     an_object = line.flow_txt_block_poem(an_object, pith, cntr, object_number_poem, conf_make_meta, tag_in_seg);
@@ -1150,7 +1278,7 @@ if there is a blurb section you need to:
 
 ****** in block: table                                                :table:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_9
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.table) {
     an_object = line.flow_txt_block_table(an_object, pith, conf_make_meta);
@@ -1186,7 +1314,7 @@ continue;
 ****** line not empty [+2]
 ******* asserts                                                      :assert:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_0
 #+BEGIN_SRC d
 assert(
   !line.empty,
@@ -1214,7 +1342,7 @@ if (pith["block_state"] == eN.blk_state.closing) {
 
 ******* book index                                                :bookindex:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_1
 #+BEGIN_SRC d
 if (line.matchFirst(rgx.book_index_item)
 || line.matchFirst(rgx.book_index_item_open)
@@ -1224,14 +1352,14 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******* not book index [+1]
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_2
 #+BEGIN_SRC d
 } else {                                                                       /+ not book_index +/
 #+END_SRC
 
 ******** matched: comment                                     :comment:match:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_3
 #+BEGIN_SRC d
   an_object_key = "body_nugget";
   if (auto m = line.matchFirst(rgx.comment)) {                                 /+ matched comment +/
@@ -1253,7 +1381,7 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******** flag !set & line !exist: heading or para         :heading:paragraph:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_4
 #+BEGIN_SRC d
   } else if ((line_occur["para"] == eN.bi.off
     && line_occur["heading"] == eN.bi.off)
@@ -1298,7 +1426,7 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******** line exist: heading                                        :heading:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_5
 #+BEGIN_SRC d
   } else if (line_occur["heading"] > eN.bi.off) {                              /+ heading +/
     debug(heading) {
@@ -1310,7 +1438,7 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******** line exist: para                                              :para:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_6
 #+BEGIN_SRC d
   } else if (line_occur["para"] > eN.bi.off) {                                 /+ paragraph +/
     debug(para) {
@@ -1347,7 +1475,7 @@ an_object = line.flow_block_flag_line_empty_(
 ****** line empty [+1]
 ******* assert line empty                                            :assert:
 
-#+NAME: abs_in_loop_body_not_block_obj_line_empty
+#+NAME: abs_in_loop_body_not_block_obj_line_empty_0
 #+BEGIN_SRC d
 assert(
   line.empty,
@@ -1362,7 +1490,7 @@ assert(
 
 ******* heading object                                       :heading:object:
 
-#+NAME: abs_in_loop_body_not_block_obj_line_empty
+#+NAME: abs_in_loop_body_not_block_obj_line_empty_1
 #+BEGIN_SRC d
 if (_new_doc) {
   tag_assoc = tag_assoc.init;
@@ -1496,7 +1624,7 @@ if (pith["txt_is"] == eN.txt_is.heading
 
 ******* paragraph object                                   :paragraph:object:
 
-#+NAME: abs_in_loop_body_not_block_obj_line_empty
+#+NAME: abs_in_loop_body_not_block_obj_line_empty_2
 #+BEGIN_SRC d
 } else if (pith["txt_is"] == eN.txt_is.para
   && line_occur["para"] > eN.bi.off
@@ -1627,7 +1755,7 @@ if (the_document_body_section.length > 0) {
 *** tie up preparation of document sections
 **** endnotes section (scroll & seg)                               :endnotes:
 
-#+NAME: abs_post
+#+NAME: abs_post_0
 #+BEGIN_SRC d
 auto en_tuple
   = note_section.endnote_objects(obj_cite_digits, opt_action);
@@ -1647,7 +1775,7 @@ debug(endnotes) {
 
 **** no glossary section?                                          :glossary:
 
-#+NAME: abs_post
+#+NAME: abs_post_1
 #+BEGIN_SRC d
 if (an_object["glossary_nugget"].length == 0) {
   comp_obj_heading_                                   = comp_obj_heading_.init;
@@ -1676,7 +1804,7 @@ debug(glossary) {
 
 **** bibliography section (objects)                            :bibliography:
 
-#+NAME: abs_post
+#+NAME: abs_post_2
 #+BEGIN_SRC d
 auto biblio_unsorted_incomplete = biblio_arr_json.dup;
 auto biblio = Bibliography();
@@ -1684,7 +1812,7 @@ auto biblio_ordered
   = biblio.flow_bibliography_(biblio_unsorted_incomplete, bib_arr_json);
 #+END_SRC
 
-#+NAME: abs_post
+#+NAME: abs_post_3
 #+BEGIN_SRC d
 if (biblio_ordered.length > 0) {
   {
@@ -1792,7 +1920,7 @@ if (biblio_ordered.length > 0) {
 }
 #+END_SRC
 
-#+NAME: abs_post
+#+NAME: abs_post_4
 #+BEGIN_SRC d
 debug(bibliosection) {
   foreach (o; the_bibliography_section) {
@@ -1837,7 +1965,7 @@ JSONValue biblio_entry_tags_jsonstr =  `{
 
 **** bookindex section (scroll & seg)                            :book:index:
 
-#+NAME: abs_post
+#+NAME: abs_post_5
 #+BEGIN_SRC d
 auto bi = BookIndexReportSection();
 auto bi_tuple
@@ -1858,7 +1986,7 @@ debug(bookindex) {
 
 **** no blurb section?                                                :blurb:
 
-#+NAME: abs_post
+#+NAME: abs_post_6
 #+BEGIN_SRC d
 if (an_object["blurb_nugget"].length == 0) {
   comp_obj_heading_                                   = comp_obj_heading_.init;
@@ -1889,7 +2017,7 @@ debug(blurb) {
 
 **** toc backmatter, table of contents backmatter (scroll & seg)   :contents:
 
-#+NAME: abs_post
+#+NAME: abs_post_7
 #+BEGIN_SRC d
 indent = [
   "hang_position" : 1,
@@ -1990,7 +2118,7 @@ debug(toc) {
 
 **** doc head (separate document head from body, make space for toc)
 
-#+NAME: abs_post
+#+NAME: abs_post_8
 #+BEGIN_SRC d
 the_document_head_section ~= the_document_body_section[0];
 the_document_body_section = the_document_body_section[1..$];
@@ -2014,7 +2142,7 @@ NOTE there are issues attempting to do this on first pass as:
 ***** Methods
 ****** get ancestors markup
 
-#+NAME: abs_post
+#+NAME: abs_post_9
 #+BEGIN_SRC d
 @safe int[] _get_ancestors_markup(O)(O obj, ref int[] _ancestors_markup) {
   if (obj.metainfo.is_a == "heading") {
@@ -2107,7 +2235,7 @@ NOTE there are issues attempting to do this on first pass as:
 
 ****** get ancestors collapsed
 
-#+NAME: abs_post
+#+NAME: abs_post_10
 #+BEGIN_SRC d
 @safe int[] _get_ancestors_collapsed(O)(O obj, ref int[] _ancestors_collapsed) {
   if (obj.metainfo.is_a == "heading") {
@@ -2200,7 +2328,7 @@ NOTE there are issues attempting to do this on first pass as:
 - substantive object numbers already exist
 - number un-numbered non-substantive text
 
-#+NAME: abs_post
+#+NAME: abs_post_11
 #+BEGIN_SRC d
 /+ multiple 1~ levels, loop through document body +/
 if (the_document_body_section.length > 1) {
@@ -2228,7 +2356,7 @@ if (the_document_body_section.length > 1) {
 
 ***** ↻ Loop section: endnotes [en]
 
-#+NAME: abs_post
+#+NAME: abs_post_12
 #+BEGIN_SRC d
 if (the_endnotes_section.length > 1) {
   segnames["html"] ~= "endnotes";
@@ -2249,7 +2377,7 @@ if (the_endnotes_section.length > 1) {
 
 ***** ↻ Loop section: glossary [gl]
 
-#+NAME: abs_post
+#+NAME: abs_post_13
 #+BEGIN_SRC d
 if (the_glossary_section.length > 1) {
   segnames["html"] ~= "glossary";
@@ -2270,7 +2398,7 @@ if (the_glossary_section.length > 1) {
 
 ***** ↻ Loop section: bibliography [bb]
 
-#+NAME: abs_post
+#+NAME: abs_post_14
 #+BEGIN_SRC d
 if (the_bibliography_section.length > 1) {
   segnames["html"] ~= "bibliography";
@@ -2291,7 +2419,7 @@ if (the_bibliography_section.length > 1) {
 
 ***** ↻ Loop section: book index [bi]
 
-#+NAME: abs_post
+#+NAME: abs_post_15
 #+BEGIN_SRC d
 if (the_bookindex_section.length > 1) {
   segnames["html"] ~= "bookindex";
@@ -2312,7 +2440,7 @@ if (the_bookindex_section.length > 1) {
 
 ***** ↻ Loop section: blurb [bl]
 
-#+NAME: abs_post
+#+NAME: abs_post_16
 #+BEGIN_SRC d
 if (the_blurb_section.length > 1) {
   segnames["html"] ~= "blurb";
@@ -2372,7 +2500,7 @@ Build here:
 ***** Methods
 ****** decendants
 
-#+NAME: abs_post
+#+NAME: abs_post_17
 #+BEGIN_SRC d
 @safe auto get_decendants()(ObjGenericComposite[] document_sections) {
   int[string] _heading_ocn_decendants;
@@ -2425,7 +2553,7 @@ Build here:
 
 ****** images: extract
 
-#+NAME: abs_post
+#+NAME: abs_post_18
 #+BEGIN_SRC d
 string[] _images;
 @safe string[] extract_images()(string content_block) {
@@ -2440,7 +2568,7 @@ string[] segnames_0_to_4;
 
 ****** images: dimensions
 
-#+NAME: abs_post
+#+NAME: abs_post_19
 #+BEGIN_SRC d
 @system auto _image_dimensions(O,M)(O obj, M manifested) {
   if (obj.has.image_without_dimensions) {
@@ -2493,7 +2621,7 @@ string[] segnames_0_to_4;
       - book index
     - footnotes and footnote numbers
 
-#+NAME: abs_post
+#+NAME: abs_post_20
 #+BEGIN_SRC d
 @safe auto _links(O)(O obj) {
   if (auto m = obj.text.match(rgx.inline_link_stow_uri)) {
@@ -2518,7 +2646,7 @@ string[] segnames_0_to_4;
 
 ***** ↻ Loop section: head
 
-#+NAME: abs_post
+#+NAME: abs_post_21
 #+BEGIN_SRC d
 foreach (ref obj; the_document_head_section) {
   if (obj.metainfo.is_a == "heading") {
@@ -2550,7 +2678,7 @@ foreach (ref obj; the_document_head_section) {
 
 ***** ↻ Loop section: toc [to]
 
-#+NAME: abs_post
+#+NAME: abs_post_22
 #+BEGIN_SRC d
 if (the_table_of_contents_section.length > 1) {
   /+ scroll +/
@@ -2580,7 +2708,7 @@ if (the_table_of_contents_section.length > 1) {
 
 ***** ↻ Loop section: document body [bd]
 
-#+NAME: abs_post
+#+NAME: abs_post_23
 #+BEGIN_SRC d
 /+ multiple 1~ levels, loop through document body +/
 if (the_document_body_section.length > 1) {
@@ -2631,7 +2759,7 @@ auto image_list = (_images.sort()).uniq;
 
 - endnotes have their own number, (also use in node) and they belong to calling object
 
-#+NAME: abs_post
+#+NAME: abs_post_24
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_endnotes_section.length > 1) {
@@ -2676,7 +2804,7 @@ if (the_endnotes_section.length > 1) {
 
 - add glossary numbering, (also use in node) no need to show in text
 
-#+NAME: abs_post
+#+NAME: abs_post_25
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_glossary_section.length > 1) {
@@ -2721,7 +2849,7 @@ if (the_glossary_section.length > 1) {
 
 - add bibliography numbering, (also use in node) no need to show in text
 
-#+NAME: abs_post
+#+NAME: abs_post_26
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_bibliography_section.length > 1) {
@@ -2766,7 +2894,7 @@ if (the_bibliography_section.length > 1) {
 
 - add book index numbering?, (also use in node) no need to show in text
 
-#+NAME: abs_post
+#+NAME: abs_post_27
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 int ocn_       = obj_cite_digits.object_number;
@@ -2821,7 +2949,7 @@ if (the_bookindex_section.length > 1) {                                        /
 
 ***** ↻ Loop section: blurb [bl]
 
-#+NAME: abs_post
+#+NAME: abs_post_28
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_blurb_section.length > 1) {
@@ -2864,7 +2992,7 @@ if (the_blurb_section.length > 1) {
 
 ***** ↻ Loop sections: get decendants
 
-#+NAME: abs_post
+#+NAME: abs_post_29
 #+BEGIN_SRC d
 if (the_document_body_section.length > 1) {
   auto pairs = get_decendants(
@@ -2962,7 +3090,7 @@ if (the_document_body_section.length > 1) {
 
 **** TODO update BUG?
 
-#+NAME: abs_post
+#+NAME: abs_post_30
 #+BEGIN_SRC d
   /+ TODO
     - note create/insert heading object sole purpose eof close all open tags
@@ -3000,7 +3128,7 @@ comp_obj_heading_ = comp_obj_heading_.obj_heading_ancestors(lv_ancestors_txt);
 ** 4. _return document tuple_                                            :post:
 *** _the document_                                                   :document:
 
-#+NAME: abs_post
+#+NAME: abs_post_31
 #+BEGIN_SRC d
 ObjGenericComposite[][string] document_the = [
   "head":             the_document_head_section,
@@ -3020,7 +3148,7 @@ ObjGenericComposite[][string] document_the = [
 
 *** document _section keys_ sequence
 
-#+NAME: abs_post
+#+NAME: abs_post_32
 #+BEGIN_SRC d
 string[][string] document_section_keys_sequenced = [
   "scroll": ["head", "toc", "body",],
@@ -3068,7 +3196,7 @@ if ((opt_action.html)
 
 *** dup
 
-#+NAME: abs_post
+#+NAME: abs_post_33
 #+BEGIN_SRC d
 string[] segnames_4                 = segnames["html"].dup;
 string[] segnames_lv1_to_4          = segnames["epub"].dup;
@@ -3080,7 +3208,7 @@ debug(segnames) {
 
 *** clean out structure
 
-#+NAME: abs_post
+#+NAME: abs_post_34
 #+BEGIN_SRC d
 destroy(the_document_head_section);
 destroy(the_table_of_contents_section);
@@ -3270,7 +3398,7 @@ functions used in document abstraction
 *** make substitutions
 **** project
 
-#+NAME: abs_functions_substitutions
+#+NAME: abs_functions_substitutions_0
 #+BEGIN_SRC d
 @safe char[] _doc_header_and_make_substitutions_(CMM)(
   char[]  line,
@@ -3291,7 +3419,7 @@ functions used in document abstraction
 
 **** fontface
 
-#+NAME: abs_functions_substitutions
+#+NAME: abs_functions_substitutions_1
 #+BEGIN_SRC d
 @safe char[] _doc_header_and_make_substitutions_fontface_(CMM)(
   char[]  line,
@@ -3324,7 +3452,7 @@ functions used in document abstraction
 **** block start (open) block                                         :start:
 ***** { block starts function
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_0
 #+BEGIN_SRC d
 @safe void flow_txt_block_start()(
              char[]         line,
@@ -3336,14 +3464,14 @@ functions used in document abstraction
 
 ****** block (various) curly open                                     :curly:
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_1
 #+BEGIN_SRC d
   static auto rgx = RgxI();
 #+END_SRC
 
 ******* code
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_2
 #+BEGIN_SRC d
   if (auto m = line.matchFirst(rgx.block_curly_code_open)) {
     dochas["codeblock"]++;
@@ -3363,7 +3491,7 @@ functions used in document abstraction
 
 ******* poem
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_3
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_poem_open)) {
     dochas["poem"]++;
@@ -3385,7 +3513,7 @@ functions used in document abstraction
 
 ******* group
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_4
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_group_open)) {
     dochas["group"]++;
@@ -3405,7 +3533,7 @@ functions used in document abstraction
 
 ******* block
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_5
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_block_open)) {
     dochas["block"]++;
@@ -3425,7 +3553,7 @@ functions used in document abstraction
 
 ******* quote
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_6
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_quote_open)) {
     dochas["quote"]++;
@@ -3445,7 +3573,7 @@ functions used in document abstraction
 
 ******* table
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_7
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_table_open)) {           /+ curly table open +/
     debug(table) {                             // table (curly) open
@@ -3464,7 +3592,7 @@ functions used in document abstraction
 
 ******* table special
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_8
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_table_special_markup)) { /+ table: special table block markup syntax! +/
     dochas["table"]++;
@@ -3478,7 +3606,7 @@ functions used in document abstraction
 ****** block (various) tic open                                         :tic:
 ******* code
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_9
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_code_open)) {
     dochas["codeblock"]++;
@@ -3498,7 +3626,7 @@ functions used in document abstraction
 
 ******* poem
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_10
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_poem_open)) {
     dochas["poem"]++;
@@ -3520,7 +3648,7 @@ functions used in document abstraction
 
 ******* group
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_11
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_group_open)) {
     dochas["group"]++;
@@ -3540,7 +3668,7 @@ functions used in document abstraction
 
 ******* block
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_12
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_block_open)) {
     dochas["block"]++;
@@ -3560,7 +3688,7 @@ functions used in document abstraction
 
 ******* quote
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_13
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_quote_open)) {
     dochas["quote"]++;
@@ -3580,7 +3708,7 @@ functions used in document abstraction
 
 ******* table
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_14
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_table_open)) {             /+ tic table open +/
     debug(table) {                             // table (tic) open
@@ -3600,7 +3728,7 @@ functions used in document abstraction
 
 ***** }
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_15
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -3659,7 +3787,7 @@ functions used in document abstraction
 ***** biblio block                                                   :biblio:
 ****** biblio tag map
 
-#+NAME: abs_functions_block_biblio
+#+NAME: abs_functions_block_biblio_0
 #+BEGIN_SRC d
 @safe final string biblio_tag_map()(string abr) {
   auto btm = [
@@ -3711,7 +3839,7 @@ final string biblio_tag_map_()(string abr) {
 
 ****** biblio block
 
-#+NAME: abs_functions_block_biblio
+#+NAME: abs_functions_block_biblio_1
 #+BEGIN_SRC d
 @system void flow_txt_block_biblio(
   char[]                  line,
@@ -4325,7 +4453,7 @@ process and use an_object["table_head"] (then empty it)
   - table_column_widths, int[] column widths (as given or calculate average)
   - show table walls, bool
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_0
 #+BEGIN_SRC d
 @system void flow_table_closed_make_special_notation_table_(N,CMM)(
              char[]                line,
@@ -4374,7 +4502,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** { line empty, _make block_
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_1
 #+BEGIN_SRC d
 @system string[string] flow_block_flag_line_empty_(B,N,CMM,Ts)(
              char[]                   line,
@@ -4404,7 +4532,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: quote block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_2
 #+BEGIN_SRC d
   if (pith["block_state"] == eN.blk_state.closing) {
     if (pith["block_is"] == eN.blk_is.quote) {
@@ -4463,7 +4591,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: group block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_3
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.group) {
       obj_cite_digits = ocn_emit(pith["ocn"]);
@@ -4521,7 +4649,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_4
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.block) {
       obj_cite_digits = ocn_emit(pith["ocn"]);
@@ -4578,7 +4706,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: poem
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_5
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.poem) {
       an_object["bookindex_nugget"]
@@ -4622,7 +4750,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: code block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_6
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.code) {
       obj_cite_digits = ocn_emit(pith["ocn"]);
@@ -4680,7 +4808,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: table
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_7
 #+BEGIN_SRC d
     } else if (pith["block_is"]    == eN.blk_is.table) {
       comp_obj_block = comp_obj_block.init;
@@ -4730,7 +4858,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** }
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_8
 #+BEGIN_SRC d
   }
   return an_object;
@@ -4796,7 +4924,7 @@ process and use an_object["table_head"] (then empty it)
 *** heading or paragraph                                  :heading:paragraph:
 **** heading found                                                  :heading:
 
-#+NAME: abs_functions_heading
+#+NAME: abs_functions_heading_0
 #+BEGIN_SRC d
 @safe string[string] flow_heading_found_()(
              char[]                line,
@@ -4883,7 +5011,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** heading make set                                               :heading:
 
-#+NAME: abs_functions_heading
+#+NAME: abs_functions_heading_1
 #+BEGIN_SRC d
 @safe char[] flow_heading_make_set_()(
              char[]                line,
@@ -4945,7 +5073,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** heading match                                                  :heading:
 
-#+NAME: abs_functions_heading
+#+NAME: abs_functions_heading_2
 #+BEGIN_SRC d
 @safe string[string] flow_heading_matched_(CMM)(
              char[]          line,
@@ -5101,7 +5229,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** para match                                                        :para:
 
-#+NAME: abs_functions_para
+#+NAME: abs_functions_para_0
 #+BEGIN_SRC d
 @safe string[string] flow_para_match_()(
              char[]         line,
@@ -5160,7 +5288,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** text font face
 
-#+NAME: abs_functions_para
+#+NAME: abs_functions_para_1
 #+BEGIN_SRC d
 @safe char[] font_faces_line()(
   char[]  textline,
@@ -5197,7 +5325,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table instructions
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_0
 #+BEGIN_SRC d
 @safe ObjGenericComposite flow_table_instructions(H)(
   return ref ObjGenericComposite  table_object,
@@ -5228,7 +5356,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table array munge
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_1
 #+BEGIN_SRC d
 @safe ObjGenericComposite flow_table_array_munge(T)(
   return ref ObjGenericComposite  table_object,
@@ -5358,7 +5486,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table substantive munge
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_2
 #+BEGIN_SRC d
 @system ObjGenericComposite flow_table_substantive_munge(T)(
   return ref ObjGenericComposite  table_object,
@@ -5380,7 +5508,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table substantive munge special
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_3
 #+BEGIN_SRC d
 @system ObjGenericComposite flow_table_substantive_munge_special(T)(
   return ref ObjGenericComposite  table_object,
@@ -5460,7 +5588,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** { struct, inline markup munge
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_0
 #+BEGIN_SRC d
 @safe static struct ObjInlineMarkupMunge {
   string[string] obj_txt;
@@ -5478,7 +5606,7 @@ process and use an_object["table_head"] (then empty it)
   }
 #+END_SRC
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_1
 #+BEGIN_SRC d
   @safe static auto images()(string obj_txt_in) {
     static auto mng = InlineMarkup();
@@ -5514,7 +5642,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* footnotes endnotes markup
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_2
 #+BEGIN_SRC d
   @safe TxtPlusHasFootnotes footnotes_endnotes_markup_and_number_or_stars()(string obj_txt_in, bool reset_note_numbers) {
     /+ endnotes (regular) +/
@@ -5591,7 +5719,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* object notes and links
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_3
 #+BEGIN_SRC d
   @safe private TxtPlusHasFootnotesUrlsImages object_notes_and_links_()(
     string obj_txt_in,
@@ -5662,7 +5790,7 @@ process and use an_object["table_head"] (then empty it)
 - identified text by heading level marker followed by text until two new lines
 - general markup
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_4
 #+BEGIN_SRC d
   @safe auto munge_heading()(
     string obj_txt_in,
@@ -5693,7 +5821,7 @@ process and use an_object["table_head"] (then empty it)
   - footnotes/endnotes
   - links
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_5
 #+BEGIN_SRC d
   @safe auto munge_para()(string obj_txt_in) {
     obj_txt["munge"] = (obj_txt_in)
@@ -5712,7 +5840,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* quote
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_6
 #+BEGIN_SRC d
   @safe string munge_quote()(string obj_txt_in) {
     obj_txt["munge"] = obj_txt_in;
@@ -5732,7 +5860,7 @@ process and use an_object["table_head"] (then empty it)
 - drop spaces
 - keep newlines?
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_7
 #+BEGIN_SRC d
   @safe auto munge_group(string obj_txt_in) {
     TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt_in.split("\n\n").join(" \\\\\n \\\\\n"));
@@ -5753,7 +5881,7 @@ process and use an_object["table_head"] (then empty it)
 - keep newlines
 - newlines detected and kept?
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_8
 #+BEGIN_SRC d
   @safe auto munge_block()(string obj_txt_in) {
     TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt_in);
@@ -5772,7 +5900,7 @@ process and use an_object["table_head"] (then empty it)
   - footnotes/endnotes
   - links?
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_9
 #+BEGIN_SRC d
   @safe auto munge_verse()(string obj_txt_in) {
     TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt_in);
@@ -5790,7 +5918,7 @@ process and use an_object["table_head"] (then empty it)
 - no general markup
 - one special character represented by mkup.nbsp ░
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_10
 #+BEGIN_SRC d
   @safe string munge_code()(string obj_txt_in) {
     obj_txt_in = obj_txt_in.replaceAll(rgx.space, mkup.nbsp);
@@ -5805,7 +5933,7 @@ process and use an_object["table_head"] (then empty it)
 - table block identified by open an close tags
 - table markup
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_11
 #+BEGIN_SRC d
   @safe string munge_table()(string obj_txt_in) {
     obj_txt["munge"] = obj_txt_in;
@@ -5817,7 +5945,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* comment
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_12
 #+BEGIN_SRC d
   @safe string munge_comment()(string obj_txt_in) {
     obj_txt["munge"] = obj_txt_in;
@@ -5829,7 +5957,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** }
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_13
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -6054,7 +6182,7 @@ private:
 
 ******** make heading number & segment anchor tags if instructed :markup:inline:segment:anchor:tags:
 
-#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
+#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags_0
 #+BEGIN_SRC d
   static int[] heading_num = [ 0, 0, 0, 0 ];
   static string heading_number_auto_composite = "";
@@ -6207,7 +6335,7 @@ private:
 
 ******** make segment anchor tags if not provided :markup:inline:segment:anchor:tags:
 
-#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
+#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags_1
 #+BEGIN_SRC d
   static int heading_num_lev1 = 0;
   @safe static string _make_segment_anchor_tags_if_none_provided()(
@@ -6338,7 +6466,7 @@ struct ObjAttributes {
 
 ******** para & blocks
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_0
 #+BEGIN_SRC d
   @safe string txt_para_and_blocks()(string obj_txt_in) {
     if (obj_txt_in.matchFirst(rgx.para_bullet)) {
@@ -6368,7 +6496,7 @@ struct ObjAttributes {
 
 ******** heading
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_1
 #+BEGIN_SRC d
   @safe string txt_heading()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6382,7 +6510,7 @@ struct ObjAttributes {
 
 ******** para
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_2
 #+BEGIN_SRC d
   @safe string txt_para()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6396,7 +6524,7 @@ struct ObjAttributes {
 
 ******** quote
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_3
 #+BEGIN_SRC d
   @safe string txt_quote()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6410,7 +6538,7 @@ struct ObjAttributes {
 
 ******** group
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_4
 #+BEGIN_SRC d
   @safe string txt_group()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6424,7 +6552,7 @@ struct ObjAttributes {
 
 ******** block
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_5
 #+BEGIN_SRC d
   @safe string txt_block()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6438,7 +6566,7 @@ struct ObjAttributes {
 
 ******** verse
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_6
 #+BEGIN_SRC d
   @safe string txt_verse()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6452,7 +6580,7 @@ struct ObjAttributes {
 
 ******** code
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_7
 #+BEGIN_SRC d
   @safe string txt_code()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6466,7 +6594,7 @@ struct ObjAttributes {
 
 ******** table
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_8
 #+BEGIN_SRC d
   @safe string txt_table()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6480,7 +6608,7 @@ struct ObjAttributes {
 
 ******** comment
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_9
 #+BEGIN_SRC d
   @safe string txt_comment()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"comment\","
@@ -6642,7 +6770,7 @@ struct BookIndexReportIndent {
 ***** book index (sort &) report section                     :report:section:
 ****** { book index struct open
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_0
 #+BEGIN_SRC d
 struct BookIndexReportSection {
   int  mkn, skn;
@@ -6652,7 +6780,7 @@ struct BookIndexReportSection {
 
 ******* bookindex write section
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_1
 #+BEGIN_SRC d
   @safe void bookindex_write_section()(
     string[][string][string] bookindex_unordered_hashes
@@ -6687,7 +6815,7 @@ struct BookIndexReportSection {
 
 ******* book index (sort &) build section                    :report:section:
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_2
 #+BEGIN_SRC d
   @system auto bookindex_build_abstraction_section(N,B)(
     string[][string][string] bookindex_unordered_hashes,
@@ -6850,14 +6978,14 @@ struct BookIndexReportSection {
 
 ****** }
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_3
 #+BEGIN_SRC d
 }
 #+END_SRC
 
 **** (end)notes section                                    :endnotes:section:
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_0
 #+BEGIN_SRC d
 struct NotesSection {
   string[string] object_notes;
@@ -6868,7 +6996,7 @@ struct NotesSection {
 
 ***** { gather notes for endnote section struct open
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_1
 #+BEGIN_SRC d
   @safe private auto gather_notes_for_endnote_section(
     ObjGenericComposite[] contents_am,
@@ -6954,7 +7082,7 @@ struct NotesSection {
 
 ****** gathered notes
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_2
 #+BEGIN_SRC d
   @safe private auto gathered_notes() {
     string[][string] endnotes_;
@@ -6971,7 +7099,7 @@ struct NotesSection {
 
 ****** endnote objects
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_3
 #+BEGIN_SRC d
   @safe private auto endnote_objects(N,O)(
     N              obj_cite_digits,
@@ -7087,7 +7215,7 @@ struct NotesSection {
 
 ***** }
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_4
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -7095,14 +7223,14 @@ struct NotesSection {
 **** bibliography                                              :bibliography:
 ***** { biblio struct
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_0
 #+BEGIN_SRC d
 struct Bibliography {
 #+END_SRC
 
 ****** biblio
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_1
 #+BEGIN_SRC d
 @system public JSONValue[] flow_bibliography_()(
     return ref string[]    biblio_unsorted_incomplete,
@@ -7133,7 +7261,7 @@ struct Bibliography {
 
 ****** biblio unsorted complete
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_2
 #+BEGIN_SRC d
   @system final private JSONValue[] biblio_make_unsorted_array_of_json_objects()(
     string[]      biblio_unordered,
@@ -7167,7 +7295,7 @@ struct Bibliography {
 
 ****** biblio sort
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_3
 #+BEGIN_SRC d
   @system final private JSONValue[] biblio_sort()(JSONValue[] biblio_unordered) {
     JSONValue[] biblio_sorted_;
@@ -7188,7 +7316,7 @@ struct Bibliography {
 
 ****** biblio debug
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_4
 #+BEGIN_SRC d
   @system void biblio_debug()(JSONValue[] biblio_sorted) {
     debug(biblio0) {
@@ -7203,7 +7331,7 @@ struct Bibliography {
 
 ***** }
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_5
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -7211,7 +7339,7 @@ struct Bibliography {
 **** node structure metadata                        :structure:metadata:node:
 ***** { metadata node struct
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_0
 #+BEGIN_SRC d
 struct NodeStructureMetadata {
   int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7;
@@ -7222,7 +7350,7 @@ struct NodeStructureMetadata {
 
 ****** node metadata emitter
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_1
 #+BEGIN_SRC d
   @safe ObjGenericComposite node_location_emitter(La,Ta,N)(
     string         lev_markup_number,
@@ -7282,7 +7410,7 @@ struct NodeStructureMetadata {
 
 ****** node metadata emitter heading, (including most segnames & their pointers)
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_2
 #+BEGIN_SRC d
   @safe ObjGenericComposite node_emitter_heading(Hd,TaL,TA,N,fNr,fNs,fL)(
     string         _text,
@@ -7484,7 +7612,7 @@ struct NodeStructureMetadata {
 
 ***** }
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_3
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -7711,7 +7839,16 @@ set abstracted objects for downstream processing
 module doc_reform.meta.metadoc_object_setter;
 template ObjectSetter() {
   /+ structs +/
-  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
+  <>
 }
 #+END_SRC
 
@@ -7732,7 +7869,7 @@ struct HeadingAttrib {
 
 *** _composite object_ [#A]
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_0
 #+BEGIN_SRC d
 struct DocObj_MetaInfo_ {
   string                 is_of_part                           = ""; // frontmatter, body, backmatter
@@ -7811,7 +7948,7 @@ struct DocObj_MetaInfo_ {
 
 **** object text attributes
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_1
 #+BEGIN_SRC d
 struct DocObj_TxtAttrib_ {
   int                    indent_base                         = 0;
@@ -7823,7 +7960,7 @@ struct DocObj_TxtAttrib_ {
 
 **** object has within it
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_2
 #+BEGIN_SRC d
 struct DocObj_Has_ {
   bool                   inline_links                        = false;
@@ -7836,7 +7973,7 @@ struct DocObj_Has_ {
 
 **** table attributes
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_3
 #+BEGIN_SRC d
 struct DocObj_Table_ {
   int                    number_of_columns                   = 0;
@@ -7849,7 +7986,7 @@ struct DocObj_Table_ {
 
 **** code attributes
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_4
 #+BEGIN_SRC d
 struct DocObj_CodeBlock_ {
   string                 syntax                              = "";
@@ -7859,7 +7996,7 @@ struct DocObj_CodeBlock_ {
 
 **** stow (things to be protected from regular text transformations, so far links)
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_5
 #+BEGIN_SRC d
 struct DocObj_Stow_ {
   string[]               link                               = [];
@@ -7868,7 +8005,7 @@ struct DocObj_Stow_ {
 
 **** pointers
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_6
 #+BEGIN_SRC d
 struct DocObj_Pointer_ {
   int                    doc_object                          = 0;
@@ -7879,7 +8016,7 @@ struct DocObj_Pointer_ {
 
 **** tags
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_7
 #+BEGIN_SRC d
 struct DocObj_Tags_ {
   string[]               heading_ancestors_text              = [ "", "", "", "", "", "", "", "", ];
@@ -7898,7 +8035,7 @@ struct DocObj_Tags_ {
 
 **** composite object the parts
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_8
 #+BEGIN_SRC d
 struct ObjGenericComposite {
   string                 text                                = "";
@@ -7915,7 +8052,7 @@ struct ObjGenericComposite {
 
 *** The Objects: generic composite object array
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_9
 #+BEGIN_SRC d
 struct TheObjects {
   ObjGenericComposite[] oca;
diff --git a/org/out_cgi_search_sqlite.org b/org/out_cgi_search_sqlite.org
index f9b90d0..df98ed9 100644
--- a/org/out_cgi_search_sqlite.org
+++ b/org/out_cgi_search_sqlite.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -99,21 +100,33 @@ void cgi_function_intro(Cgi cgi) {
   <>
   <>
   <>
-  <>
+  <>
+  <>
   <>
   <>
   <>
   <>
   <>
   <>
-<>
+<>
+<>
+<>
 <>
-<>
+<>
+<>
+<>
+<>
       "%s",
-<>
+<>
+<>
   <>
   <>
 <>
+<>
+<>
+<>
+<>
+<>
   <>
 <>
 }
@@ -409,7 +422,7 @@ auto text_fields() {
 ***** env
 ****** POST
 
-#+NAME: cgi_sqlite_initialize_env
+#+NAME: cgi_sqlite_initialize_env_0
 #+BEGIN_SRC d
   if (environment.get("REQUEST_METHOD", "POST") == "POST") {
     if ("sf" in cgi.post) {
@@ -559,7 +572,7 @@ auto text_fields() {
 
 ****** GET
 
-#+NAME: cgi_sqlite_initialize_env
+#+NAME: cgi_sqlite_initialize_env_1
 #+BEGIN_SRC d
   } else if (environment.get("REQUEST_METHOD", "POST") == "GET") {
     got.canned_query = environment.get("QUERY_STRING", "");
@@ -814,7 +827,7 @@ string show_matched_objects (string fn) {
 
 **** format
 
-#+NAME: cgi_sqlite_header
+#+NAME: cgi_sqlite_header_0
 #+BEGIN_SRC d
   {
     header = format(q"┃
@@ -822,7 +835,7 @@ string show_matched_objects (string fn) {
 
 **** html
 
-#+NAME: cgi_sqlite_header
+#+NAME: cgi_sqlite_header_1
 #+BEGIN_SRC html
 
 
@@ -839,7 +852,7 @@ string show_matched_objects (string fn) {
 
 **** css
 
-#+NAME: cgi_sqlite_header
+#+NAME: cgi_sqlite_header_2
 #+BEGIN_SRC css
    *{
     padding                  : 0px;
@@ -1667,7 +1680,7 @@ string show_matched_objects (string fn) {
 
 *** cgi html form
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_0
 #+BEGIN_SRC d
   {
     string post_value(string field_name, string type="box", string set="on") {
@@ -1710,7 +1723,7 @@ string show_matched_objects (string fn) {
 
 **** canned search
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_1
 #+BEGIN_SRC d
     string the_can(string fv) {
       string show_the_can = post_value("url");
@@ -1748,7 +1761,7 @@ string show_matched_objects (string fn) {
 
 **** provide tip
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_2
 #+BEGIN_SRC d
     string provide_tip() {
       string searched_tip = post_value("se");
@@ -1785,7 +1798,7 @@ string show_matched_objects (string fn) {
 **** the form
 ***** form html
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_3
 #+BEGIN_SRC html
     form = format(q"┃
 
@@ -1823,7 +1836,7 @@ string show_matched_objects (string fn) { ***** form values -#+NAME: cgi_sqlite_form_post +#+NAME: cgi_sqlite_form_post_0 #+BEGIN_SRC d (post_value("ec") == "checked") ? post_value("sf", "field") : "", provide_tip, @@ -1843,7 +1856,7 @@ string show_matched_objects (string fn) { **** set value (debug) -#+NAME: cgi_sqlite_form_post +#+NAME: cgi_sqlite_form_post_1 #+BEGIN_SRC d { string set_value(string field_name, string default_val) { @@ -2008,7 +2021,7 @@ auto db = Database(conf.db_path ~ cv.db_selected); **** db SELECT statement, the body -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_1 #+BEGIN_SRC sql sql_select.the_body ~= format(q"┃ SELECT @@ -2051,7 +2064,7 @@ LIMIT %%s OFFSET %%s **** html write selected ***** head -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_2 #+BEGIN_SRC d (cv.checked_sql) ? cgi.write(previous_next @@ -2100,7 +2113,7 @@ LIMIT %%s OFFSET %%s ***** text found -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_3 #+BEGIN_SRC d if (cv.results_type == "txt") { if (row["ocn"].as!string != "0") { @@ -2143,7 +2156,7 @@ LIMIT %%s OFFSET %%s ***** ocn index -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_4 #+BEGIN_SRC d } else { if (row["ocn"].as!string != "0") { @@ -2176,7 +2189,7 @@ LIMIT %%s OFFSET %%s ***** tail -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_5 #+BEGIN_SRC d } cgi.write( previous_next); diff --git a/org/out_harvest_metadata.org b/org/out_harvest_metadata.org index 424803f..4c32e37 100644 --- a/org/out_harvest_metadata.org +++ b/org/out_harvest_metadata.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -138,7 +139,8 @@ template spineMetaDocHarvestsTopics() { ) { <> <> -<> +<> +<> <> <> <> @@ -477,7 +479,8 @@ template spineMetaDocHarvestsAuthors() { O _opt_action, ) { <> -<> +<> +<> <> <> <> @@ -621,7 +624,7 @@ if (_opt_action.verbose *** themes **** head -#+NAME: harvested_html_themes +#+NAME: harvested_html_themes_0 #+BEGIN_SRC d string theme_dark_0 = format(q"┃ body { @@ -717,7 +720,7 @@ string theme_light_0 = format(q"┃ **** levels -#+NAME: harvested_html_themes +#+NAME: harvested_html_themes_1 #+BEGIN_SRC d string theme_dark_1 = format(q"┃ h1 { diff --git a/org/out_latex.org b/org/out_latex.org index c9610c3..ff56f47 100644 --- a/org/out_latex.org +++ b/org/out_latex.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -29,26 +30,89 @@ template outputLaTeX() { static auto rgx = RgxO(); mixin spineLanguageCodes; auto lang = Lang(); - <> -<> - <> -<> - <> - <> -<> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> +<> +<> +<> +<> +<> +<> +<> + <> + <> + <> + <> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> + <> + <> + <> + <> + <> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> + <> <> - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> <> - <> - <> + <> + <> + <> + <> } #+END_SRC ** write latex output :latex:out: -#+NAME: output_latex +#+NAME: output_latex_0 #+BEGIN_SRC d void writeOutputLaTeX(T,M)( const T latex_content, @@ -90,7 +154,7 @@ void writeOutputLaTeX(T,M)( ** latex output hub [#A] :latex:pdf:out: -#+NAME: output_latex +#+NAME: output_latex_1 #+BEGIN_SRC d void outputLaTeX(D,M)( const D doc_abstraction, @@ -128,7 +192,7 @@ import doc_reform.io_out; ** shared *** paper dimensions (struct) -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_0 #+BEGIN_SRC d auto paper() { struct PaperType { @@ -295,7 +359,7 @@ import doc_reform.io_out; *** latex \escape special characters **** general -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_1 #+BEGIN_SRC d @safe string sp_char_esc(O)( string _txt, @@ -324,7 +388,7 @@ import doc_reform.io_out; } #+END_SRC -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_2 #+BEGIN_SRC d @safe string sp_char_esc_txt()( string _txt, @@ -366,7 +430,7 @@ import doc_reform.io_out; - bold, italics, underscore, strikethrough -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_3 #+BEGIN_SRC d @safe string fontface()( string _txt, @@ -389,7 +453,7 @@ _txt = _txt **** spaces ***** leading hardspace -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_4 #+BEGIN_SRC d @safe string leading_hardspaces()( string _txt, @@ -406,7 +470,7 @@ _txt = _txt ***** nbsp character -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_5 #+BEGIN_SRC d @safe string nbsp_char()(string _txt) { if (_txt.match(rgx.nbsp_char)) { @@ -418,7 +482,7 @@ _txt = _txt ***** remove nbsp character -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_6 #+BEGIN_SRC d @safe string nbsp_char_to_space()(string _txt) { if (_txt.match(rgx.nbsp_char)) { @@ -431,7 +495,7 @@ _txt = _txt **** links and images ***** links / urls -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_7 #+BEGIN_SRC d @safe string links_and_images(O,M)( string _txt, @@ -483,7 +547,7 @@ _txt = _txt *** footnotes **** footnotes -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_8 #+BEGIN_SRC d @safe string footnotes()( string _txt, @@ -504,7 +568,7 @@ _txt = _txt **** footnote remove -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_9 #+BEGIN_SRC d @safe string remove_footnotes()( string _txt, @@ -519,7 +583,7 @@ _txt = _txt *** para **** para -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_10 #+BEGIN_SRC d @safe string para(O)( string _txt, @@ -540,7 +604,7 @@ _txt = _txt **** bookindex para -#+NAME: output_latex_shared +#+NAME: output_latex_shared_a_11 #+BEGIN_SRC d @safe string bookindex(O)( string _txt, @@ -561,7 +625,7 @@ _txt = _txt *** bullets & indentation -#+NAME: output_latex_head +#+NAME: output_latex_head_0 #+BEGIN_SRC d @safe string bullets_and_indentation(O)( string _txt, @@ -606,7 +670,7 @@ _txt = _txt *** heading -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_0 #+BEGIN_SRC d @safe string heading(O,M)( string _txt, @@ -780,7 +844,7 @@ _txt = _txt - (hardspace not honored) clear hardspace marker -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_1 #+BEGIN_SRC d string group(O,M)( string _txt, @@ -808,7 +872,7 @@ string group(O,M)( - (hardspace honored) \hardspace -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_2 #+BEGIN_SRC d string block(O,M)( string _txt, @@ -840,7 +904,7 @@ string block(O,M)( - (hardspace honored) \hardspace -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_3 #+BEGIN_SRC d string verse(O,M)( string _txt, @@ -872,7 +936,7 @@ string verse(O,M)( - (hardspace honored) \begin{lstlisting} clear hardspace marker -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_4 #+BEGIN_SRC d string codeblock(O,M)( string _txt, @@ -904,7 +968,7 @@ string codeblock(O,M)( ***** tablarize -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_5 #+BEGIN_SRC d auto tablarize(O)( string _txt, @@ -943,7 +1007,7 @@ auto tablarize(O)( ***** table -#+NAME: output_latex_shared_0 +#+NAME: output_latex_shared_b_6 #+BEGIN_SRC d string table(O,M)( string _txt, @@ -1003,7 +1067,7 @@ string table(O,M)( *** latex head :head: **** latex head function -#+NAME: output_latex_head +#+NAME: output_latex_head_1 #+BEGIN_SRC d string latex_head(M)( M doc_matters, @@ -1015,7 +1079,7 @@ string latex_head(M)( ***** paper type dimensions ****** struct -#+NAME: output_latex_head +#+NAME: output_latex_head_2 #+BEGIN_SRC d struct paperTypeLatex { string a4_portrait; @@ -1034,7 +1098,7 @@ string latex_head(M)( ****** footer -#+NAME: output_latex_head +#+NAME: output_latex_head_3 #+BEGIN_SRC d string _footer(M)(M doc_matters) { string _ft = "\\lfoot[\\textrm{\\thepage}]"; @@ -1069,7 +1133,7 @@ string latex_head(M)( ***** paper margins ****** struct -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_0 #+BEGIN_SRC d struct paperMargins { string portrait; @@ -1080,19 +1144,19 @@ string latex_head(M)( ****** portrait -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_1 #+BEGIN_SRC d margins.portrait = format(q"┃ #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_2 #+BEGIN_SRC latex \setlength{\oddsidemargin}{0mm} \setlength{\evensidemargin}{0mm} \setlength{\topmargin}{-12pt} \setlength{\headheight}{12pt} \setlength{\headsep}{35pt} #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_3 #+BEGIN_SRC d ┃", ); @@ -1100,19 +1164,19 @@ string latex_head(M)( ****** landscape -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_4 #+BEGIN_SRC d margins.landscape = format(q"┃ #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_5 #+BEGIN_SRC latex \setlength{\oddsidemargin}{6mm} \setlength{\evensidemargin}{6mm} \setlength{\topmargin}{-12mm} \setlength{\headheight}{12pt} \setlength{\headsep}{20pt} #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_6 #+BEGIN_SRC d ┃", ); @@ -1121,7 +1185,7 @@ string latex_head(M)( ***** multicol ****** struct -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_7 #+BEGIN_SRC d struct columnsMulti { string portrait; @@ -1132,17 +1196,17 @@ string latex_head(M)( ****** portrait -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_8 #+BEGIN_SRC d multicol.portrait = format(q"┃ #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_9 #+BEGIN_SRC latex \usepackage{multicol} #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_10 #+BEGIN_SRC d ┃", ); @@ -1150,7 +1214,7 @@ string latex_head(M)( ****** landscape -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_11 #+BEGIN_SRC d multicol.landscape = ""; #+END_SRC @@ -1158,7 +1222,7 @@ string latex_head(M)( ***** color links ****** struct -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_12 #+BEGIN_SRC d struct colorLinks { string mono; @@ -1169,12 +1233,12 @@ string latex_head(M)( ****** mono -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_13 #+BEGIN_SRC d links.mono = format(q"┃ #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_14 #+BEGIN_SRC latex \usepackage[xetex, colorlinks=true, @@ -1183,7 +1247,7 @@ string latex_head(M)( linkcolor=myblack, #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_15 #+BEGIN_SRC d ┃", ); @@ -1191,12 +1255,12 @@ string latex_head(M)( ****** color -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_16 #+BEGIN_SRC d links.color = format(q"┃ #+END_SRC -#+NAME: output_latex_head_1_tex +#+NAME: output_latex_head_b_tex_17 #+BEGIN_SRC latex \usepackage[xetex, colorlinks=true, @@ -1205,7 +1269,7 @@ string latex_head(M)( linkcolor=myred, %% \href{...} and \pageref{...} #+END_SRC -#+NAME: output_latex_head_1_format_string_variables +#+NAME: output_latex_head_b_format_string_variables #+BEGIN_SRC d ┃", ); @@ -1215,7 +1279,7 @@ string latex_head(M)( ***** dimensions & orientation ****** set -#+NAME: output_latex_head_0_format_string +#+NAME: output_latex_head_format_string_0 #+BEGIN_SRC d string set_paper(P)(P paper_set,) { string paper_type_description; @@ -1246,7 +1310,7 @@ string latex_head(M)( ***** (a4, a5, b4, letter, legal) * (portrait & landscape) -#+NAME: output_latex_head_0_format_string +#+NAME: output_latex_head_format_string_1 #+BEGIN_SRC d string paper_size_orientation_latex; switch (paper_size_orientation) { @@ -1266,7 +1330,7 @@ string latex_head(M)( ***** set color links -#+NAME: output_latex_head_0_format_string +#+NAME: output_latex_head_format_string_2 #+BEGIN_SRC d string links_mono_or_color_set = links.mono.strip; if ( @@ -1284,14 +1348,14 @@ string latex_head(M)( ***** format latex head, open -#+NAME: output_latex_head_0_format_string +#+NAME: output_latex_head_format_string_3 #+BEGIN_SRC d string _latex_head = format(q"┃%%%% spine LaTeX output #+END_SRC ***** description comment -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_0 #+BEGIN_SRC latex %%%% Generated by: %s %%%% D version: %s @@ -1308,7 +1372,7 @@ string latex_head(M)( - paper_type_latex.us_letter_portrait - paper_type_latex.us_letter_landscape -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_1 #+BEGIN_SRC latex %s #+END_SRC @@ -1318,14 +1382,14 @@ string latex_head(M)( - margins.portrait - margins.landscape -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_2 #+BEGIN_SRC latex %s #+END_SRC ***** margin shared -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_3 #+BEGIN_SRC latex \setlength{\marginparsep}{4mm} \setlength{\marginparwidth}{8mm} @@ -1333,14 +1397,14 @@ string latex_head(M)( ***** multicol (portrait | landscape) -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_4 #+BEGIN_SRC latex %s #+END_SRC ***** language & font -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_5 #+BEGIN_SRC latex \usepackage{polyglossia, ucs, fontspec, xltxtra, xunicode} \setmainlanguage{%s} @@ -1354,7 +1418,7 @@ string latex_head(M)( ***** latex head -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_6 #+BEGIN_SRC latex \usepackage{alltt} \usepackage{thumbpdf} @@ -1362,14 +1426,14 @@ string latex_head(M)( ***** color links: no = mono | yes = color -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_7 #+BEGIN_SRC latex %s #+END_SRC ***** metadata -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_8 #+BEGIN_SRC latex pdftitle={%s}, pdfauthor={%s}, @@ -1403,7 +1467,7 @@ string latex_head(M)( ***** define colors -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_9 #+BEGIN_SRC latex \usepackage[usenames]{color} \definecolor{myblack}{rgb}{0,0,0} @@ -1415,7 +1479,7 @@ string latex_head(M)( ***** latex head -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_10 #+BEGIN_SRC latex \usepackage{url} \urlstyle{sf} @@ -1425,7 +1489,7 @@ string latex_head(M)( ***** latex head -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_11 #+BEGIN_SRC latex \usepackage{textcomp} \usepackage[parfill]{parskip} @@ -1447,7 +1511,7 @@ string latex_head(M)( ***** indent, bullet, list -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_12 #+BEGIN_SRC latex \usepackage[multiple,ragged]{footmisc} \setlength\footnotemargin{12pt} @@ -1491,7 +1555,7 @@ string latex_head(M)( ***** part, section, subsection, paragraph, subparagraph -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_13 #+BEGIN_SRC latex \usepackage{fancyhdr} \lhead{} @@ -1525,7 +1589,7 @@ string latex_head(M)( ***** latex head misc. including defined commands -#+NAME: output_latex_head_0_tex +#+NAME: output_latex_head_tex_14 #+BEGIN_SRC latex \selectlanguage{%s} \lhead[ ]{ } @@ -1586,7 +1650,7 @@ string latex_head(M)( **** latex head format inclusions -#+NAME: output_latex_head_0_format_string_variables +#+NAME: output_latex_head_a_format_string_variables #+BEGIN_SRC d ┃", doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.name_and_version.strip, @@ -1619,7 +1683,7 @@ string latex_head(M)( *** ↻ latex body :content:body: **** latex body function -#+NAME: output_latex_body +#+NAME: output_latex_body_0 #+BEGIN_SRC d string latex_body(D,M)( const D doc_abstraction, @@ -1633,7 +1697,7 @@ string latex_body(D,M)( **** ↻ loop open -#+NAME: output_latex_body +#+NAME: output_latex_body_1 #+BEGIN_SRC d foreach (part; doc_matters.has.keys_seq.latex) { foreach (obj; doc_abstraction[part]) { @@ -1643,7 +1707,7 @@ string latex_body(D,M)( **** ↻ within loop ***** frontmatter -#+NAME: output_latex_body +#+NAME: output_latex_body_2 #+BEGIN_SRC d case "frontmatter": assert(part == "head" || "toc"); _txt = obj.text @@ -1670,7 +1734,7 @@ string latex_body(D,M)( ***** body -#+NAME: output_latex_body +#+NAME: output_latex_body_3 #+BEGIN_SRC d case "body": assert(part == "body" || "head"); // surprise _txt = obj.text @@ -1732,7 +1796,7 @@ string latex_body(D,M)( ***** backmatter -#+NAME: output_latex_body +#+NAME: output_latex_body_4 #+BEGIN_SRC d case "backmatter": assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -1792,7 +1856,7 @@ string latex_body(D,M)( ***** after -#+NAME: output_latex_body +#+NAME: output_latex_body_5 #+BEGIN_SRC d case "comment": break; @@ -1817,7 +1881,7 @@ string latex_body(D,M)( **** latex body return -#+NAME: output_latex_body +#+NAME: output_latex_body_6 #+BEGIN_SRC d return _latex_body; } @@ -1826,7 +1890,7 @@ string latex_body(D,M)( *** latex tail :tail: **** latex tail function -#+NAME: output_latex_tail +#+NAME: output_latex_tail_0 #+BEGIN_SRC d string latex_tail(M)( M doc_matters, @@ -1836,7 +1900,7 @@ string latex_tail(M)( **** latex tail starts -#+NAME: output_latex_tail +#+NAME: output_latex_tail_1 #+BEGIN_SRC d string _latex_tail = format(q"┃ #+END_SRC @@ -1854,7 +1918,7 @@ string latex_tail(M)( **** latex tail format inclusions -#+NAME: output_latex_tail_close +#+NAME: output_latex_tail_close_0 #+BEGIN_SRC d ┃", // doc_matters.conf_make_meta.meta.title_full, @@ -1864,7 +1928,7 @@ string latex_tail(M)( **** latex tail return -#+NAME: output_latex_tail_close +#+NAME: output_latex_tail_close_1 #+BEGIN_SRC d return _latex_tail; } diff --git a/org/out_metadata.org b/org/out_metadata.org index 3b5bbc5..594eb72 100644 --- a/org/out_metadata.org +++ b/org/out_metadata.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -24,7 +25,8 @@ template outputMetadata() { @safe void outputMetadata(T)( T doc_matters) { <> <> -<> +<> +<> <> <> <> @@ -258,7 +260,7 @@ metadata_write_output(doc_matters, metadata_); *** themes **** head -#+NAME: harvested_html_themes +#+NAME: harvested_html_themes_0 #+BEGIN_SRC css string theme_dark_0 = format(q"┃ body { @@ -324,7 +326,7 @@ string theme_light_0 = format(q"┃ **** levels -#+NAME: harvested_html_themes +#+NAME: harvested_html_themes_1 #+BEGIN_SRC css string theme_dark_1 = format(q"┃ h1 { diff --git a/org/out_odt.org b/org/out_odt.org index 027816d..fe83c68 100644 --- a/org/out_odt.org +++ b/org/out_odt.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -52,7 +53,31 @@ template formatODT() { mixin spineRgxOut; struct formatODT { static auto rgx = RgxO(); - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> } } template outputODT() { @@ -61,16 +86,40 @@ template outputODT() { mixin spineRgxOut; static auto rgx = RgxO(); // mixin outputXmlODT; - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> <> - <> + <> + <> + <> <> <> - <> - <> - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> } #+END_SRC @@ -87,7 +136,7 @@ template outputODT() { **** object attrib ***** tags -#+NAME: odt_format_objects +#+NAME: odt_format_objects_0 #+BEGIN_SRC d @safe string _tags(O)(const O obj) { string _tags = ""; @@ -111,7 +160,7 @@ template outputODT() { ****** anchor tags -#+NAME: odt_format_objects +#+NAME: odt_format_objects_1 #+BEGIN_SRC d @safe string _xhtml_anchor_tags(O)(O obj) { const(string[]) anchor_tags = obj.tags.anchor_tags; @@ -129,7 +178,7 @@ template outputODT() { ***** ocn object number display -#+NAME: odt_format_objects +#+NAME: odt_format_objects_2 #+BEGIN_SRC d @safe string obj_num(O)(const O obj) { // TODO string _on; @@ -145,7 +194,7 @@ template outputODT() { ***** footnotes -#+NAME: odt_format_objects +#+NAME: odt_format_objects_3 #+BEGIN_SRC d @safe string _footnotes()(string _txt) { static auto rgx = RgxO(); @@ -170,7 +219,7 @@ template outputODT() { ***** bullet -#+NAME: odt_format_objects +#+NAME: odt_format_objects_4 #+BEGIN_SRC d @safe string _bullet(O)(const O obj) { string _b = ""; @@ -183,7 +232,7 @@ template outputODT() { ***** para (with bullet, indent levels, footnotes extracted) -#+NAME: odt_format_objects +#+NAME: odt_format_objects_5 #+BEGIN_SRC d @safe string _indent(O)(string _txt, const O obj) { // TODO // if (obj.attrib.indent_base > 0 || @@ -297,7 +346,7 @@ template outputODT() { ***** block type -#+NAME: odt_format_objects +#+NAME: odt_format_objects_6 #+BEGIN_SRC d @safe string _block_type_delimiters(O)(string[] _block_lines, const O obj) { // TODO string _block = ""; @@ -338,7 +387,7 @@ template outputODT() { ***** special characters -#+NAME: odt_format_objects +#+NAME: odt_format_objects_7 #+BEGIN_SRC d @safe string _special_characters(O)(string _txt, const O obj) { _txt = _txt @@ -353,7 +402,7 @@ template outputODT() { ***** preserve white space -#+NAME: odt_format_objects +#+NAME: odt_format_objects_8 #+BEGIN_SRC d @safe string _preserve_white_spaces(O)(string _txt, const O obj) { if (obj.metainfo.is_a == "code" || obj.metainfo.is_a == "verse" || obj.metainfo.is_a == "block") { @@ -366,7 +415,7 @@ template outputODT() { ***** font_face -#+NAME: odt_format_objects +#+NAME: odt_format_objects_9 #+BEGIN_SRC d string _font_face(string _txt){ _txt = _txt @@ -386,7 +435,7 @@ string _font_face(string _txt){ ***** object number -#+NAME: odt_format_objects +#+NAME: odt_format_objects_10 #+BEGIN_SRC d @safe auto _obj_num(O)(O obj) { // NOT USED YET struct objNum { @@ -415,7 +464,7 @@ string _font_face(string _txt){ ***** break page -#+NAME: odt_format_objects +#+NAME: odt_format_objects_11 #+BEGIN_SRC d @safe string _break_page()() { return format(q"┃ @@ -436,7 +485,7 @@ string _font_face(string _txt){ ***** empty lines break -#+NAME: odt_format_objects +#+NAME: odt_format_objects_12 #+BEGIN_SRC d @safe string _empty_line_break(O)(string _txt, const O obj) { if (obj.metainfo.is_a == "code" || obj.metainfo.is_a == "verse" || obj.metainfo.is_a == "block") { @@ -449,7 +498,7 @@ string _font_face(string _txt){ ***** links: url, mail -#+NAME: odt_format_objects +#+NAME: odt_format_objects_13 #+BEGIN_SRC d @safe string _links(O)(string _txt, const O obj) { if (obj.metainfo.is_a != "code") { @@ -495,7 +544,7 @@ string _font_face(string _txt){ ***** image -#+NAME: odt_format_objects +#+NAME: odt_format_objects_14 #+BEGIN_SRC d @safe string _images(O)(string _txt, const O obj) { if (_txt.match(rgx.inline_image)) { @@ -512,7 +561,7 @@ string _font_face(string _txt){ **** markup hub (including font face) -#+NAME: odt_format_objects +#+NAME: odt_format_objects_15 #+BEGIN_SRC d @safe string markup(O)(const O obj) { /+ markup TODO +/ @@ -534,7 +583,7 @@ string _font_face(string _txt){ **** para type ***** heading -#+NAME: odt_format_objects +#+NAME: odt_format_objects_16 #+BEGIN_SRC d @safe string heading(O,M)( const O obj, @@ -584,7 +633,7 @@ string _font_face(string _txt){ ***** para -#+NAME: odt_format_objects +#+NAME: odt_format_objects_17 #+BEGIN_SRC d @safe string para(O,M)( const O obj, @@ -610,7 +659,7 @@ string _font_face(string _txt){ **** block type ***** quote -#+NAME: odt_format_objects +#+NAME: odt_format_objects_18 #+BEGIN_SRC d @safe string quote(O,M)( const O obj, @@ -631,7 +680,7 @@ string _font_face(string _txt){ - preserves double newlines (paragraph delimiter) - the "group" delimiter is different from the "block" delimiter in that groups do not preserve whitespace, the "block" mark does -#+NAME: odt_format_objects +#+NAME: odt_format_objects_19 #+BEGIN_SRC d @safe string group(O,M)( const O obj, @@ -666,7 +715,7 @@ string _font_face(string _txt){ - "^[ ]"   - count number only at beginning of line and replace each -#+NAME: odt_format_objects +#+NAME: odt_format_objects_20 #+BEGIN_SRC d @safe string block(O,M)( const O obj, @@ -689,7 +738,7 @@ string _font_face(string _txt){ - preserves spaces - preserves newlines -#+NAME: odt_format_objects +#+NAME: odt_format_objects_21 #+BEGIN_SRC d @safe string verse(O,M)( const O obj, @@ -708,7 +757,7 @@ string _font_face(string _txt){ ***** code -#+NAME: odt_format_objects +#+NAME: odt_format_objects_22 #+BEGIN_SRC d @safe string code(O,M)( const O obj, @@ -762,7 +811,7 @@ string _font_face(string _txt){ ***** table ****** tablarize -#+NAME: odt_format_objects +#+NAME: odt_format_objects_23 #+BEGIN_SRC d @safe Tuple!(string, string) tablarize(O)( const O obj, @@ -802,7 +851,7 @@ string _font_face(string _txt){ ****** table -#+NAME: odt_format_objects +#+NAME: odt_format_objects_24 #+BEGIN_SRC d int _table_number = 0; @safe string table(O,M)( @@ -842,7 +891,7 @@ int _table_number = 0; ** write odt output :odf:odt:out: -#+NAME: output_odt +#+NAME: output_odt_0 #+BEGIN_SRC d void writeOutputODT(W,I)( const W odt_content, @@ -931,7 +980,7 @@ void writeOutputODT(W,I)( ** odt output hub [#A] :odf:odt:out: -#+NAME: output_odt +#+NAME: output_odt_1 #+BEGIN_SRC d void outputODT(D,I)( const D doc_abstraction, @@ -1019,13 +1068,13 @@ void dirtree(I)( *** manifest.rdf :manifest_rdf: -#+NAME: output_odt_fixed_manifest_rdf +#+NAME: output_odt_fixed_manifest_rdf_0 #+BEGIN_SRC d @safe string manifest_rdf() { string _manifest_rdf = format(q"┃ #+END_SRC -#+NAME: output_odt_fixed_manifest_rdf +#+NAME: output_odt_fixed_manifest_rdf_1 #+BEGIN_SRC xml @@ -1046,7 +1095,7 @@ void dirtree(I)( #+END_SRC -#+NAME: output_odt_fixed_manifest_rdf +#+NAME: output_odt_fixed_manifest_rdf_2 #+BEGIN_SRC d ┃"); return _manifest_rdf; @@ -1055,13 +1104,13 @@ void dirtree(I)( *** settings.xml :settings: -#+NAME: output_odt_fixed_settings_xml +#+NAME: output_odt_fixed_settings_xml_0 #+BEGIN_SRC d @safe string settings_xml() { string _settings_xml = format(q"┃ #+END_SRC -#+NAME: output_odt_fixed_settings_xml +#+NAME: output_odt_fixed_settings_xml_1 #+BEGIN_SRC xml @@ -1160,7 +1209,7 @@ void dirtree(I)( #+END_SRC -#+NAME: output_odt_fixed_settings_xml +#+NAME: output_odt_fixed_settings_xml_2 #+BEGIN_SRC d ┃"); return _settings_xml; @@ -1169,13 +1218,13 @@ void dirtree(I)( *** styles.xml :styles_xml: -#+NAME: output_odt_fixed_styles_xml +#+NAME: output_odt_fixed_styles_xml_0 #+BEGIN_SRC d @safe string styles_xml() { string _styles_xml = format(q"┃ #+END_SRC -#+NAME: output_odt_fixed_styles_xml +#+NAME: output_odt_fixed_styles_xml_1 #+BEGIN_SRC xml @@ -2070,7 +2119,7 @@ void dirtree(I)( #+END_SRC -#+NAME: output_odt_fixed_styles_xml +#+NAME: output_odt_fixed_styles_xml_2 #+BEGIN_SRC d ┃"); return _styles_xml; @@ -2082,7 +2131,7 @@ void dirtree(I)( **** content head ***** head open -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_0 #+BEGIN_SRC d @safe string odt_head(I)(I doc_matters) { string _has_tables = format(q"┃ @@ -2090,7 +2139,7 @@ void dirtree(I)( ***** if table include within head -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_1 #+BEGIN_SRC xml @@ -2168,7 +2217,7 @@ void dirtree(I)( ***** head -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_2 #+BEGIN_SRC d ┃",); string _odt_head = format(q"┃ @@ -2176,7 +2225,7 @@ void dirtree(I)( ***** head xml -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_3 #+BEGIN_SRC xml @@ -2209,7 +2258,7 @@ void dirtree(I)( ***** head close -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_4 #+BEGIN_SRC d ┃", (doc_matters.has.tables > 0) ? _has_tables : "", @@ -2221,7 +2270,7 @@ void dirtree(I)( **** ↻ content body ***** body open -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_5 #+BEGIN_SRC d @safe string odt_body(D,I)( const D doc_abstraction, @@ -2236,7 +2285,7 @@ void dirtree(I)( ***** ↻ the loop & outer switch (sections & objects) format output -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_6 #+BEGIN_SRC d foreach (part; doc_matters.has.keys_seq.scroll) { foreach (obj; doc_abstraction[part]) { @@ -2245,7 +2294,7 @@ void dirtree(I)( ****** frontmatter -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_7 #+BEGIN_SRC d case "frontmatter": assert(part == "head" || "toc"); switch (obj.metainfo.is_of_type) { @@ -2270,7 +2319,7 @@ void dirtree(I)( ****** body -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_8 #+BEGIN_SRC d case "body": assert(part == "body" || "head"); // surprise switch (obj.metainfo.is_of_type) { @@ -2321,7 +2370,7 @@ void dirtree(I)( ****** backmatter -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_9 #+BEGIN_SRC d case "backmatter": assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -2371,7 +2420,7 @@ void dirtree(I)( ***** closings & post loop -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_10 #+BEGIN_SRC d } } @@ -2382,13 +2431,13 @@ void dirtree(I)( **** content book index? -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_11 #+BEGIN_SRC d #+END_SRC **** content tail -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_12 #+BEGIN_SRC d @safe string odt_tail() { string _odt_tail = format(q"┃spine: <www.doc_reform.org> and <www.sisudoc.org> @@ -2399,7 +2448,7 @@ void dirtree(I)( **** hub -#+NAME: output_odt_variable_content_xml +#+NAME: output_odt_variable_content_xml_13 #+BEGIN_SRC d @safe string content_xml(D,I)( const D doc_abstraction, @@ -2420,7 +2469,7 @@ void dirtree(I)( - META-INF/manifest.xml - image list changes -#+NAME: output_odt_variable_manifest_xml +#+NAME: output_odt_variable_manifest_xml_0 #+BEGIN_SRC d @safe string manifest_xml(M)( auto ref M doc_matters, @@ -2433,7 +2482,7 @@ void dirtree(I)( string _manifest_xml = format(q"┃ #+END_SRC -#+NAME: output_odt_variable_manifest_xml +#+NAME: output_odt_variable_manifest_xml_1 #+BEGIN_SRC xml @@ -2447,7 +2496,7 @@ void dirtree(I)( #+END_SRC -#+NAME: output_odt_variable_manifest_xml +#+NAME: output_odt_variable_manifest_xml_2 #+BEGIN_SRC d ┃", _images.join("\n"), @@ -2458,7 +2507,7 @@ _images.join("\n"), *** meta.xml (time stamp) :meta_xml: -#+NAME: output_odt_variable_meta_xml +#+NAME: output_odt_variable_meta_xml_0 #+BEGIN_SRC d @safe string meta_xml(M)( auto ref M doc_matters, @@ -2467,7 +2516,7 @@ _images.join("\n"), string _meta_xml = format(q"┃ #+END_SRC -#+NAME: output_odt_variable_meta_xml +#+NAME: output_odt_variable_meta_xml_1 #+BEGIN_SRC xml @@ -2479,7 +2528,7 @@ _images.join("\n"), #+END_SRC -#+NAME: output_odt_variable_meta_xml +#+NAME: output_odt_variable_meta_xml_2 #+BEGIN_SRC d ┃", doc_matters.generator_program.name_and_version, diff --git a/org/out_sqlite.org b/org/out_sqlite.org index a35bcf1..a71a4ec 100644 --- a/org/out_sqlite.org +++ b/org/out_sqlite.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -183,10 +184,33 @@ template SQLiteFormatAndLoadObject() { mixin spineRgxOut; struct sqlite_format_and_load_objects { <> - <> - <> - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> } return sqlite_format_and_load_objects(); } @@ -222,7 +246,9 @@ template SQLiteDeleteDocument() { string SQLiteDeleteDocument(M)( M doc_matters, ) { - <> + <> + <> + <> return _delete_uid; } } @@ -236,8 +262,16 @@ template SQLiteInsertMetadata() { string SQLiteInsertMetadata(M)( M doc_matters, ) { - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> return _insert_metadata; } } @@ -255,7 +289,10 @@ template SQLiteInsertDocObjectsLoop() { string _uid = SQLinsertDelimiter!()(doc_matters.src.doc_uid); auto url_html = spineUrlsHTML!()(doc_matters.conf_make_meta.conf.w_srv_data_root_url_html, doc_matters.src.language); string insertDocObjectsRow(O)(O obj) { - <> + <> + <> + <> + <> return _insert_doc_objects_row; } <> @@ -477,7 +514,7 @@ light html objects ***** munge ****** general munge (special characters, inline markup, move notes) -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_0 #+BEGIN_SRC d string munge_html(M,O)( M doc_matters, @@ -522,7 +559,7 @@ string munge_html(M,O)( ****** special characters -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_1 #+BEGIN_SRC d string html_special_characters(string _txt){ _txt = _txt @@ -538,7 +575,7 @@ string html_special_characters(string _txt){ ****** special characters for code -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_2 #+BEGIN_SRC d string html_special_characters_code(string _txt){ _txt = _txt @@ -553,7 +590,7 @@ string html_special_characters_code(string _txt){ ****** font_face -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_3 #+BEGIN_SRC d string html_font_face(string _txt){ _txt = _txt @@ -574,7 +611,7 @@ string html_font_face(string _txt){ ****** inline markup ******* images -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_4 #+BEGIN_SRC d string inline_images(M,O)( M doc_matters, @@ -605,7 +642,7 @@ string inline_images(M,O)( ******* links ******** scroll, seg, epub -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_5 #+BEGIN_SRC d string inline_links(M,O)( M doc_matters, @@ -715,7 +752,7 @@ string inline_links(M,O)( ******* notes ******** scroll -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_6 #+BEGIN_SRC d string inline_notes_scroll(M,O)( M doc_matters, @@ -751,7 +788,7 @@ string inline_notes_scroll(M,O)( ******* inline markup -#+NAME: sanitize_and_munge_inline_html +#+NAME: sanitize_and_munge_inline_html_7 #+BEGIN_SRC d string xml_type="seg"; /+ set html document type to be linked to here (seg|scroll) +/ string inline_markup(M,O)( @@ -769,7 +806,7 @@ string inline_markup(M,O)( ***** objects ****** heading -#+NAME: html_objects +#+NAME: html_objects_0 #+BEGIN_SRC d string html_heading(M,O)( M doc_matters, @@ -815,7 +852,7 @@ string html_heading(M,O)( ****** para -#+NAME: html_objects +#+NAME: html_objects_1 #+BEGIN_SRC d string html_para(M,O)( M doc_matters, @@ -842,7 +879,7 @@ string html_para(M,O)( ****** quote -#+NAME: html_objects +#+NAME: html_objects_2 #+BEGIN_SRC d string html_quote(M,O)( M doc_matters, @@ -865,7 +902,7 @@ string html_quote(M,O)( ****** group -#+NAME: html_objects +#+NAME: html_objects_3 #+BEGIN_SRC d string html_group(M,O)( M doc_matters, @@ -888,7 +925,7 @@ string html_group(M,O)( ****** block -#+NAME: html_objects +#+NAME: html_objects_4 #+BEGIN_SRC d string html_block(M,O)( M doc_matters, @@ -910,7 +947,7 @@ string html_block(M,O)( ****** verse -#+NAME: html_objects +#+NAME: html_objects_5 #+BEGIN_SRC d string html_verse(M,O)( M doc_matters, @@ -931,7 +968,7 @@ string html_verse(M,O)( ****** code -#+NAME: html_objects +#+NAME: html_objects_6 #+BEGIN_SRC d string html_code(O)( const O obj, @@ -951,7 +988,7 @@ string html_code(O)( ****** table -#+NAME: html_objects +#+NAME: html_objects_7 #+BEGIN_SRC d string html_table(M,O)( M doc_matters, @@ -1023,7 +1060,7 @@ string html_table(M,O)( *** 2. hub (sqlite_format_and_load_objects) **** sql related -#+NAME: sqlite_load_object +#+NAME: sqlite_load_object_0 #+BEGIN_SRC d string sqlite_load_string(M,O)( M doc_matters, @@ -1034,7 +1071,7 @@ string sqlite_load_string(M,O)( } #+END_SRC -#+NAME: sqlite_load_object +#+NAME: sqlite_load_object_1 #+BEGIN_SRC d string postgresql_load_string(M,O)( M doc_matters, @@ -1045,7 +1082,7 @@ string postgresql_load_string(M,O)( } #+END_SRC -#+NAME: sqlite_load_object +#+NAME: sqlite_load_object_2 #+BEGIN_SRC d string sqlite_statement(O)( const O obj, @@ -1065,7 +1102,7 @@ string sqlite_statement(O)( **** heading -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_0 #+BEGIN_SRC d string[string] heading(M,O)( M doc_matters, @@ -1094,7 +1131,7 @@ string[string] heading(M,O)( **** para -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_1 #+BEGIN_SRC d string[string] para(M,O)( M doc_matters, @@ -1123,7 +1160,7 @@ string[string] para(M,O)( **** quote -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_2 #+BEGIN_SRC d string[string] quote(M,O)( M doc_matters, @@ -1151,7 +1188,7 @@ string[string] quote(M,O)( #+END_SRC **** group -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_3 #+BEGIN_SRC d string[string] group(M,O)( M doc_matters, @@ -1180,7 +1217,7 @@ string[string] group(M,O)( **** block -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_4 #+BEGIN_SRC d string[string] block(M,O)( M doc_matters, @@ -1209,7 +1246,7 @@ string[string] block(M,O)( **** verse -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_5 #+BEGIN_SRC d string[string] verse(M,O)( M doc_matters, @@ -1238,7 +1275,7 @@ string[string] verse(M,O)( **** code -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_6 #+BEGIN_SRC d string[string] code(M,O)( M doc_matters, @@ -1267,7 +1304,7 @@ string[string] code(M,O)( **** table -#+NAME: hub_format_and_sqlite_load_objects +#+NAME: hub_format_and_sqlite_load_objects_7 #+BEGIN_SRC d string[string] table(M,O)( M doc_matters, @@ -1682,7 +1719,7 @@ CREATE INDEX idx_topics ON metadata_and_text(classify_topic_register); **** DELETE uid rows doc matters & metadata ***** sql statement: dlang format -#+NAME: sqlite_formatted_delete +#+NAME: sqlite_formatted_delete_0 #+BEGIN_SRC d string _uid = doc_matters.src.doc_uid; string _delete_uid = format(q"┃ @@ -1690,7 +1727,7 @@ string _delete_uid = format(q"┃ ***** DELETE FROM ... WHERE -#+NAME: sqlite_formatted_delete +#+NAME: sqlite_formatted_delete_1 #+BEGIN_SRC sql DELETE FROM metadata_and_text WHERE uid = '%s'; @@ -1700,7 +1737,7 @@ WHERE uid_metadata_and_text = '%s'; ***** VALUES -#+NAME: sqlite_formatted_delete +#+NAME: sqlite_formatted_delete_2 #+BEGIN_SRC d ┃", _uid, @@ -1712,7 +1749,7 @@ WHERE uid_metadata_and_text = '%s'; **** INSERT doc matters & metadata ***** sql statement: dlang format -#+NAME: sqlite_formatted_insertions_doc_matters_metadata +#+NAME: sqlite_formatted_insertions_doc_matters_metadata_0 #+BEGIN_SRC d string _uid = SQLinsertDelimiter!()(doc_matters.src.doc_uid); string _insert_metadata = format(q"┃ @@ -1720,7 +1757,7 @@ string _insert_metadata = format(q"┃ ***** INSERT INTO -#+NAME: sqlite_formatted_insertions_doc_matters_metadata +#+NAME: sqlite_formatted_insertions_doc_matters_metadata_1 #+BEGIN_SRC sql INSERT INTO metadata_and_text ( uid, @@ -1778,7 +1815,7 @@ string _insert_metadata = format(q"┃ ***** VALUES -#+NAME: sqlite_formatted_insertions_doc_matters_metadata +#+NAME: sqlite_formatted_insertions_doc_matters_metadata_2 #+BEGIN_SRC sql VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' @@ -1787,7 +1824,7 @@ string _insert_metadata = format(q"┃ ***** dlang values for formatting -#+NAME: sqlite_formatted_insertions_doc_matters_metadata +#+NAME: sqlite_formatted_insertions_doc_matters_metadata_3 #+BEGIN_SRC d ┃", _uid, @@ -1849,7 +1886,7 @@ writeln(doc_matters.conf_make_meta.meta.classify_topic_register_arr); ***** { if topic register then loop topic register array -#+NAME: sqlite_formatted_insertions_topic_register +#+NAME: sqlite_formatted_insertions_topic_register_0 #+BEGIN_SRC d if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { string _insert_topics; @@ -1859,14 +1896,14 @@ if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { ***** sql statement: dlang format -#+NAME: sqlite_formatted_insertions_topic_register +#+NAME: sqlite_formatted_insertions_topic_register_1 #+BEGIN_SRC d _insert_topics ~= format(q"┃ #+END_SRC ***** INSERT INTO -#+NAME: sqlite_formatted_insertions_topic_register +#+NAME: sqlite_formatted_insertions_topic_register_2 #+BEGIN_SRC sql INSERT INTO topic_register ( uid_metadata_and_text, @@ -1880,7 +1917,7 @@ _insert_topics ~= format(q"┃ ***** VALUES -#+NAME: sqlite_formatted_insertions_topic_register +#+NAME: sqlite_formatted_insertions_topic_register_3 #+BEGIN_SRC sql VALUES ( '%s', '%s', '%s', '%s', '%s', '%s' @@ -1889,7 +1926,7 @@ _insert_topics ~= format(q"┃ ***** dlang values for formatting -#+NAME: sqlite_formatted_insertions_topic_register +#+NAME: sqlite_formatted_insertions_topic_register_4 #+BEGIN_SRC d ┃", _uid, @@ -1903,7 +1940,7 @@ _insert_topics ~= format(q"┃ ***** } close topic register & loop topic register array -#+NAME: sqlite_formatted_insertions_topic_register +#+NAME: sqlite_formatted_insertions_topic_register_5 #+BEGIN_SRC d } } @@ -1920,14 +1957,14 @@ either: ***** sql statement: dlang format -#+NAME: sqlite_formatted_insertions_doc_objects +#+NAME: sqlite_formatted_insertions_doc_objects_0 #+BEGIN_SRC d string _insert_doc_objects_row = format(q"┃ #+END_SRC ***** INSERT INTO -#+NAME: sqlite_formatted_insertions_doc_objects +#+NAME: sqlite_formatted_insertions_doc_objects_1 #+BEGIN_SRC sql INSERT INTO doc_objects ( uid_metadata_and_text, @@ -1944,7 +1981,7 @@ string _insert_doc_objects_row = format(q"┃ ***** VALUES -#+NAME: sqlite_formatted_insertions_doc_objects +#+NAME: sqlite_formatted_insertions_doc_objects_2 #+BEGIN_SRC sql VALUES ( '%s', %s, '%s', '%s', '%s', %s, '%s', '%s', '%s' @@ -1953,7 +1990,7 @@ string _insert_doc_objects_row = format(q"┃ ***** dlang values for formatting -#+NAME: sqlite_formatted_insertions_doc_objects +#+NAME: sqlite_formatted_insertions_doc_objects_3 #+BEGIN_SRC d ┃", _uid, diff --git a/org/out_src_pod.org b/org/out_src_pod.org index 3fc6d82..e7d761b 100644 --- a/org/out_src_pod.org +++ b/org/out_src_pod.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -29,7 +30,8 @@ template spinePod() { <> try { <> - <> + <> + <> <> } catch (ErrnoException ex) { // Handle error @@ -140,7 +142,7 @@ if (doc_matters.opt.action.source) { ** copy :copy: -#+NAME: source_pod_copy +#+NAME: source_pod_copy_0 #+BEGIN_SRC d debug(pod) { writeln(__LINE__, ": ", @@ -393,7 +395,7 @@ auto fn_pod = pths_pod.pod_filename(doc_matters.src.filename).zpod; ** sha256 of pod.zip, zip debug, read zip archive -#+NAME: source_pod_copy +#+NAME: source_pod_copy_1 #+BEGIN_SRC d if (exists(fn_pod)) { try { diff --git a/org/out_xmls.org b/org/out_xmls.org index c76e44b..eb83196 100644 --- a/org/out_xmls.org +++ b/org/out_xmls.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -28,7 +29,45 @@ template outputXHTMLs() { mixin spineRgxOut; struct outputXHTMLs { static auto rgx = RgxO(); - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> <> } } @@ -71,7 +110,7 @@ import *** misc **** div delimiter -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_0 #+BEGIN_SRC d @safe string div_delimit( string part, @@ -107,7 +146,7 @@ import **** special characters text -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_1 #+BEGIN_SRC d @safe string special_characters_text(string _txt) { _txt = _txt @@ -122,7 +161,7 @@ import **** special characters -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_2 #+BEGIN_SRC d @safe string special_characters(O)( const O obj, @@ -138,7 +177,7 @@ import **** font_face -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_3 #+BEGIN_SRC d @safe string font_face(string _txt) { _txt = _txt @@ -158,7 +197,7 @@ import **** anchor tags -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_4 #+BEGIN_SRC d @safe string _xhtml_anchor_tags(O)(O obj) { const(string[]) anchor_tags = obj.tags.anchor_tags; @@ -177,7 +216,7 @@ import **** doc head & tails ***** metadata -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_5 #+BEGIN_SRC d @safe string header_metadata(M)( M doc_matters, @@ -220,7 +259,7 @@ import ***** site info button -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_6 #+BEGIN_SRC d @safe string site_info_button(M)( M doc_matters, @@ -250,7 +289,7 @@ import ***** search form -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_7 #+BEGIN_SRC d @safe string inline_search_form(M)( M doc_matters, @@ -289,7 +328,7 @@ import ***** html head & head banner -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_8 #+BEGIN_SRC d @safe string html_head(M)( M doc_matters, @@ -346,7 +385,7 @@ import ***** epub seg head -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_9 #+BEGIN_SRC d @safe string epub3_seg_head(M)( M doc_matters, @@ -420,7 +459,7 @@ import ***** xhtml tail -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_10 #+BEGIN_SRC d @safe string tail() { string o; @@ -436,7 +475,7 @@ import *** inline markup **** images -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_11 #+BEGIN_SRC d @safe string inline_images(O,M)( string _txt, @@ -469,7 +508,7 @@ import **** links ***** scroll, seg, epub -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_12 #+BEGIN_SRC d @safe string inline_links(O,M)( string _txt, @@ -567,7 +606,7 @@ import **** notes ***** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_13 #+BEGIN_SRC d @safe string inline_notes_scroll(O,M)( string _txt, @@ -604,7 +643,7 @@ import ***** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_14 #+BEGIN_SRC d @safe Tuple!(string, string[]) inline_notes_seg(O,M)( string _txt, @@ -675,7 +714,7 @@ import **** inline markup ***** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_15 #+BEGIN_SRC d @safe string inline_markup_scroll(O,M)( string _txt, @@ -697,7 +736,7 @@ import ***** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_16 #+BEGIN_SRC d @safe auto inline_markup_seg(O,M)( string _txt, @@ -724,7 +763,7 @@ import *** toc **** subtoc -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_17 #+BEGIN_SRC d @safe string lev4_heading_subtoc(O,M)( const O obj, @@ -757,7 +796,7 @@ import **** navigation pre next svg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_18 #+BEGIN_SRC d @safe auto nav_pre_next_svg(O,M)( const O obj, @@ -838,7 +877,7 @@ import *** heading **** heading -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_19 #+BEGIN_SRC d @safe string heading(O,M)( string _txt, @@ -909,7 +948,7 @@ import **** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_20 #+BEGIN_SRC d @safe string heading_scroll(O,M)( string _txt, @@ -925,7 +964,7 @@ import **** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_21 #+BEGIN_SRC d @safe Tuple!(string, string[]) heading_seg(O,M)( string _txt, @@ -949,7 +988,7 @@ import *** para **** para -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_22 #+BEGIN_SRC d @safe string para(O,M)( string _txt, @@ -1005,7 +1044,7 @@ import **** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_23 #+BEGIN_SRC d @safe string para_scroll(O,M)( string _txt, @@ -1024,7 +1063,7 @@ import **** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_24 #+BEGIN_SRC d @safe Tuple!(string, string[]) para_seg(O,M)( string _txt, @@ -1048,7 +1087,7 @@ import *** quote **** quote -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_25 #+BEGIN_SRC d @safe string quote(O,M)( string _txt, @@ -1090,7 +1129,7 @@ import **** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_26 #+BEGIN_SRC d @safe string quote_scroll(O,M)( string _txt, @@ -1106,7 +1145,7 @@ import **** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_27 #+BEGIN_SRC d @safe Tuple!(string, string[]) quote_seg(O,M)( string _txt, @@ -1130,7 +1169,7 @@ import *** group **** group -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_28 #+BEGIN_SRC d @safe string group(O,M)( string _txt, @@ -1174,7 +1213,7 @@ import **** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_29 #+BEGIN_SRC d @safe string group_scroll(O,M)( string _txt, @@ -1191,7 +1230,7 @@ import **** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_30 #+BEGIN_SRC d @safe Tuple!(string, string[]) group_seg(O,M)( string _txt, @@ -1215,7 +1254,7 @@ import *** block **** block -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_31 #+BEGIN_SRC d @safe string block(O,M)( string _txt, @@ -1255,7 +1294,7 @@ import **** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_32 #+BEGIN_SRC d @safe string block_scroll(O,M)( string _txt, @@ -1272,7 +1311,7 @@ import **** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_33 #+BEGIN_SRC d @safe Tuple!(string, string[]) block_seg(O,M)( string _txt, @@ -1296,7 +1335,7 @@ import *** poem verse **** verse -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_34 #+BEGIN_SRC d @safe string verse(O,M)( string _txt, @@ -1334,7 +1373,7 @@ import **** scroll -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_35 #+BEGIN_SRC d @safe string verse_scroll(O,M)( string _txt, @@ -1351,7 +1390,7 @@ import **** seg -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_36 #+BEGIN_SRC d @safe Tuple!(string, string[]) verse_seg(O,M)( string _txt, @@ -1446,7 +1485,7 @@ align="left|right|center" "style=\"text-align:" ~ "right\"" -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_37 #+BEGIN_SRC d @safe Tuple!(string, string) tablarize(O)( string _txt, @@ -1485,7 +1524,7 @@ align="left|right|center" **** table -#+NAME: xhtml_format_objects +#+NAME: xhtml_format_objects_38 #+BEGIN_SRC d @safe string table(O,M)( string _txt, @@ -1531,8 +1570,22 @@ module doc_reform.io_out.html; template outputHTML() { <> mixin outputXHTMLs; - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> <> <> } @@ -1541,7 +1594,7 @@ template outputHTML() { ** scroll :scroll: *** ↻ loop & switch (sections & objects) format html output -#+NAME: output_html_scroll +#+NAME: output_html_scroll_0 #+BEGIN_SRC d @safe void scroll(D,M)( const D doc_abstraction, @@ -1559,7 +1612,7 @@ template outputHTML() { **** ↻ the loops & outer switch (sections & objects) format output -#+NAME: output_html_scroll +#+NAME: output_html_scroll_1 #+BEGIN_SRC d foreach (part; doc_matters.has.keys_seq.scroll) { foreach (obj; doc_abstraction[part]) { @@ -1570,7 +1623,7 @@ template outputHTML() { ***** frontmatter -#+NAME: output_html_scroll +#+NAME: output_html_scroll_2 #+BEGIN_SRC d case "frontmatter": assert(part == "head" || "toc"); switch (obj.metainfo.is_of_type) { @@ -1606,7 +1659,7 @@ template outputHTML() { ***** body -#+NAME: output_html_scroll +#+NAME: output_html_scroll_3 #+BEGIN_SRC d case "body": assert(part == "body" || "head"); switch (obj.metainfo.is_of_type) { @@ -1674,7 +1727,7 @@ template outputHTML() { ***** backmatter -#+NAME: output_html_scroll +#+NAME: output_html_scroll_4 #+BEGIN_SRC d case "backmatter": assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -1735,7 +1788,7 @@ template outputHTML() { ***** closings & post loop -#+NAME: output_html_scroll +#+NAME: output_html_scroll_5 #+BEGIN_SRC d } } @@ -1747,7 +1800,7 @@ template outputHTML() { *** write output file -#+NAME: output_html_scroll +#+NAME: output_html_scroll_6 #+BEGIN_SRC d @trusted void scroll_write_output(D,M)( D doc, @@ -1777,7 +1830,7 @@ template outputHTML() { ** seg :seg: *** ↻ loop & switch (sections & objects) format html output -#+NAME: output_html_seg +#+NAME: output_html_seg_0 #+BEGIN_SRC d @safe void seg(D,M)( const D doc_abstraction, @@ -1799,7 +1852,7 @@ template outputHTML() { **** ↻ the loop (sections & objects) format output -#+NAME: output_html_seg +#+NAME: output_html_seg_1 #+BEGIN_SRC d foreach (part; doc_matters.has.keys_seq.seg) { foreach (obj; doc_abstraction[part]) { @@ -1809,7 +1862,7 @@ template outputHTML() { ***** all headings -#+NAME: output_html_seg +#+NAME: output_html_seg_2 #+BEGIN_SRC d if (obj.metainfo.is_a == "heading") { assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -1882,7 +1935,7 @@ template outputHTML() { ***** non-heading -#+NAME: output_html_seg +#+NAME: output_html_seg_3 #+BEGIN_SRC d } else { assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -1891,7 +1944,7 @@ template outputHTML() { ****** frontmatter -#+NAME: output_html_seg +#+NAME: output_html_seg_4 #+BEGIN_SRC d case "frontmatter": assert(part == "head" || "toc"); switch (obj.metainfo.is_of_type) { @@ -1925,7 +1978,7 @@ template outputHTML() { ****** body -#+NAME: output_html_seg +#+NAME: output_html_seg_5 #+BEGIN_SRC d case "body": assert(part == "body"); switch (obj.metainfo.is_of_type) { @@ -2001,7 +2054,7 @@ template outputHTML() { ****** backmatter -#+NAME: output_html_seg +#+NAME: output_html_seg_6 #+BEGIN_SRC d case "backmatter": assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -2067,7 +2120,7 @@ template outputHTML() { ***** closings & post loop -#+NAME: output_html_seg +#+NAME: output_html_seg_7 #+BEGIN_SRC d } } @@ -2078,7 +2131,7 @@ template outputHTML() { *** write output files -#+NAME: output_html_seg +#+NAME: output_html_seg_8 #+BEGIN_SRC d @trusted void seg_write_output(D,E,M)( // @system? D doc_html, @@ -2194,10 +2247,22 @@ template outputEPub3() { <> mixin InternalMarkup; mixin outputXHTMLs; - <> - <> + <> + <> + <> + <> + <> <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> <> } #+END_SRC @@ -2208,7 +2273,7 @@ template outputEPub3() { - mimetype file indicating that zip file contains an EPUB -#+NAME: output_epub3_fixed +#+NAME: output_epub3_fixed_0 #+BEGIN_SRC d @safe string epub3_mimetypes() { string o; @@ -2221,7 +2286,7 @@ template outputEPub3() { - identifies the root package document (so systems can find it), [unchanged from epub2] -#+NAME: output_epub3_fixed +#+NAME: output_epub3_fixed_1 #+BEGIN_SRC d @safe string epub3_container_xml() { string o; @@ -2243,7 +2308,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> - provides the default reading order - identifies the navigation document -#+NAME: output_epub3_constructs +#+NAME: output_epub3_constructs_0 #+BEGIN_SRC d @safe string epub3_oebps_content(D,M,P)(D doc_abstraction, M doc_matters, P parts) { auto xhtml_format = outputXHTMLs(); @@ -2349,7 +2414,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> - toc_nav.xhtml declared as nav file in content.opf (epub3 navigation document) -#+NAME: output_epub3_constructs +#+NAME: output_epub3_constructs_1 #+BEGIN_SRC d @safe string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) { enum DomTags { none, open, close, close_and_open, open_still, } @@ -2437,7 +2502,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> - toc.ncx (epub2 navigation document) - (replaced in epub3 by a declared xhtml nav file, in our case toc_nav.xhtml) -#+NAME: output_epub3_constructs +#+NAME: output_epub3_constructs_2 #+BEGIN_SRC d @safe string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { int counter = 0; @@ -2533,7 +2598,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ** the document contents :seg: *** ↻ loop & switch (sections & objects) format epub3 xhtml output -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_0 #+BEGIN_SRC d @system void outputEPub3(D,I)( const D doc_abstraction, @@ -2564,7 +2629,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> **** ↻ the loop (sections & objects) format output -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_1 #+BEGIN_SRC d foreach (part; doc_matters.has.keys_seq.seg) { foreach (obj; doc_abstraction[part]) { @@ -2573,7 +2638,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ***** all headings -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_2 #+BEGIN_SRC d if (obj.metainfo.is_a == "heading") { assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -2642,7 +2707,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ***** non-heading -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_3 #+BEGIN_SRC d } else { assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -2651,7 +2716,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ****** frontmatter -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_4 #+BEGIN_SRC d case "frontmatter": assert(part == "head" || "toc"); switch (obj.metainfo.is_of_type) { @@ -2686,7 +2751,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ****** body -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_5 #+BEGIN_SRC d case "body": assert(part == "body"); switch (obj.metainfo.is_of_type) { @@ -2762,7 +2827,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ****** backmatter -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_6 #+BEGIN_SRC d case "backmatter": assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); @@ -2873,7 +2938,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ***** closings & post loop -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_7 #+BEGIN_SRC d } } @@ -2890,7 +2955,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ** write output files :write:zip: -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_8 #+BEGIN_SRC d @system void epub3_write_output_files(W,M)( W epub_write, @@ -3086,7 +3151,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> ** zip debug, read zip archive :zip: -#+NAME: output_epub3_xhtml_seg +#+NAME: output_epub3_xhtml_seg_9 #+BEGIN_SRC d debug(epub_archive) { if (exists(fn_epub)) { diff --git a/org/out_xmls_css.org b/org/out_xmls_css.org index be358a6..38bb73d 100644 --- a/org/out_xmls_css.org +++ b/org/out_xmls_css.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -31,39 +32,90 @@ template spineCss() { <> <> string _css_light_html_seg = format(q"┃ -<> -<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> ┃", _color_ocn_light, _css_indent, _color_ocn_light, ); string _css_dark_html_seg = format(q"┃ -<> -<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> ┃", _color_ocn_dark, _css_indent, _color_ocn_dark, ); string _css_light_html_scroll = format(q"┃ -<> -<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> ┃", _color_ocn_light, _css_indent, _color_ocn_light, ); string _css_dark_html_scroll = format(q"┃ -<> -<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> ┃", _color_ocn_dark, _css_indent, _color_ocn_dark, ); string _css_light_epub = format(q"┃ -<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> <> ┃", _color_ocn_light, @@ -71,7 +123,16 @@ template spineCss() { _color_ocn_light, ); string _css_dark_epub = format(q"┃ -<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> <> ┃", _color_ocn_dark, @@ -105,7 +166,7 @@ template spineCss() { *** html shared **** general -#+NAME: css_light_shared +#+NAME: css_light_shared_0 #+BEGIN_SRC css *{ padding : 0px; @@ -124,7 +185,7 @@ template spineCss() { **** link -#+NAME: css_light_shared +#+NAME: css_light_shared_1 #+BEGIN_SRC css a:link { color : #003399; @@ -165,7 +226,7 @@ template spineCss() { **** div -#+NAME: css_light_shared +#+NAME: css_light_shared_2 #+BEGIN_SRC css div { margin-left : 0; @@ -283,7 +344,7 @@ template spineCss() { **** paragraphs headings blocks ***** misc -#+NAME: css_light_shared +#+NAME: css_light_shared_3 #+BEGIN_SRC css .norm, .bold, .verse, .group, .block, .alt { line-height : 133%%; @@ -309,7 +370,7 @@ template spineCss() { } #+END_SRC -#+NAME: css_light_shared +#+NAME: css_light_shared_4 #+BEGIN_SRC css img { max-width : 100%%; @@ -319,7 +380,7 @@ template spineCss() { ***** code block -#+NAME: css_light_shared +#+NAME: css_light_shared_5 #+BEGIN_SRC css pre { width : auto; @@ -386,7 +447,7 @@ template spineCss() { ***** paragraph general -#+NAME: css_light_shared +#+NAME: css_light_shared_6 #+BEGIN_SRC css p.spaced { white-space : pre; } p.block { @@ -502,14 +563,14 @@ template spineCss() { ***** paragraph indent -#+NAME: css_light_shared +#+NAME: css_light_shared_7 #+BEGIN_SRC css %s #+END_SRC ***** misc including tables & lists -#+NAME: css_light_shared +#+NAME: css_light_shared_8 #+BEGIN_SRC css note { white-space : pre; } label.ocn { @@ -578,7 +639,7 @@ template spineCss() { ***** headings -#+NAME: css_light_shared +#+NAME: css_light_shared_9 #+BEGIN_SRC css h0, h1, h2, h3, h4, h5, h6, h7 { font-weight : bold; @@ -683,7 +744,7 @@ template spineCss() { *** html seg **** previous next -#+NAME: css_light_html_seg +#+NAME: css_light_html_seg_0 #+BEGIN_SRC css .icon-bar { width : 100%%; @@ -763,7 +824,7 @@ template spineCss() { **** flex -#+NAME: css_light_html_seg +#+NAME: css_light_html_seg_1 #+BEGIN_SRC css /* flex */ .flex-menu-bar { @@ -800,7 +861,7 @@ template spineCss() { Consider what if anything should be used here -#+NAME: css_light_html_seg +#+NAME: css_light_html_seg_2 #+BEGIN_SRC css /* grid */ .wrapper { @@ -889,7 +950,7 @@ Consider what if anything should be used here *** html scroll **** flex -#+NAME: css_light_html_scroll +#+NAME: css_light_html_scroll_0 #+BEGIN_SRC css /* flex */ .flex-menu-bar { @@ -924,7 +985,7 @@ Consider what if anything should be used here **** grid -#+NAME: css_light_html_scroll +#+NAME: css_light_html_scroll_1 #+BEGIN_SRC css /* grid */ .wrapper { @@ -1020,7 +1081,7 @@ Consider what if anything should be used here *** html shared **** general -#+NAME: css_dark_shared +#+NAME: css_dark_shared_0 #+BEGIN_SRC css *{ padding : 0px; @@ -1039,7 +1100,7 @@ Consider what if anything should be used here **** link -#+NAME: css_dark_shared +#+NAME: css_dark_shared_1 #+BEGIN_SRC css a:link { color : #FFFFFF; @@ -1080,7 +1141,7 @@ Consider what if anything should be used here **** div -#+NAME: css_dark_shared +#+NAME: css_dark_shared_2 #+BEGIN_SRC css div { margin-left : 0; @@ -1198,7 +1259,7 @@ Consider what if anything should be used here **** paragraphs headings blocks ***** misc -#+NAME: css_dark_shared +#+NAME: css_dark_shared_3 #+BEGIN_SRC css .norm, .bold, .verse, .group, .block, .alt { line-height : 133%%; @@ -1224,7 +1285,7 @@ Consider what if anything should be used here } #+END_SRC -#+NAME: css_dark_shared +#+NAME: css_dark_shared_4 #+BEGIN_SRC css img { max-width : 100%%; @@ -1234,7 +1295,7 @@ Consider what if anything should be used here ***** code block -#+NAME: css_dark_shared +#+NAME: css_dark_shared_5 #+BEGIN_SRC css pre { width : auto; @@ -1300,7 +1361,7 @@ Consider what if anything should be used here ***** paragraph general -#+NAME: css_dark_shared +#+NAME: css_dark_shared_6 #+BEGIN_SRC css p.spaced { white-space : pre; } p.block { @@ -1416,14 +1477,14 @@ Consider what if anything should be used here ***** paragraph indent -#+NAME: css_dark_shared +#+NAME: css_dark_shared_7 #+BEGIN_SRC css %s #+END_SRC ***** misc including tables & lists -#+NAME: css_dark_shared +#+NAME: css_dark_shared_8 #+BEGIN_SRC css note { white-space : pre; } label.ocn { @@ -1492,7 +1553,7 @@ Consider what if anything should be used here ***** headings -#+NAME: css_dark_shared +#+NAME: css_dark_shared_9 #+BEGIN_SRC css h0, h1, h2, h3, h4, h5, h6, h7 { font-weight : bold; @@ -1597,7 +1658,7 @@ Consider what if anything should be used here *** html seg **** previous next -#+NAME: css_dark_html_seg +#+NAME: css_dark_html_seg_0 #+BEGIN_SRC css .icon-bar { width : 100%%; @@ -1677,7 +1738,7 @@ Consider what if anything should be used here **** flex -#+NAME: css_dark_html_seg +#+NAME: css_dark_html_seg_1 #+BEGIN_SRC css /* flex */ .flex-menu-bar { @@ -1714,7 +1775,7 @@ Consider what if anything should be used here Consider what if anything should be used here -#+NAME: css_dark_html_seg +#+NAME: css_dark_html_seg_2 #+BEGIN_SRC css /* grid */ .wrapper { @@ -1803,7 +1864,7 @@ Consider what if anything should be used here *** html scroll **** flex -#+NAME: css_dark_html_scroll +#+NAME: css_dark_html_scroll_0 #+BEGIN_SRC css /* flex */ .flex-menu-bar { @@ -1838,7 +1899,7 @@ Consider what if anything should be used here **** grid -#+NAME: css_dark_html_scroll +#+NAME: css_dark_html_scroll_1 #+BEGIN_SRC css /* grid */ .wrapper { diff --git a/org/out_zip.org b/org/out_zip.org index 8a98638..8af05f8 100644 --- a/org/out_zip.org +++ b/org/out_zip.org @@ -6,6 +6,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no diff --git a/org/output_hub.org b/org/output_hub.org index 5116c7c..7b8b96c 100644 --- a/org/output_hub.org +++ b/org/output_hub.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -38,7 +39,15 @@ template outputHub() { enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff } void Scheduled(D,I)(int sched, D doc_abstraction, I doc_matters) { auto msg = Msg!()(doc_matters); - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> } if (!(doc_matters.opt.action.quiet)) { writeln(" ", doc_matters.src.filename_base); @@ -61,7 +70,9 @@ template outputHubOp() { @system void outputHubOp(E,O,C)(E env, O opt_action, C config) { mixin spineRgxOut; static auto rgx = RgxO(); - <> + <> + <> + <> } } #+END_SRC @@ -82,7 +93,7 @@ import doc_reform.io_out, **** source: _dr_src_ &/or _pod_ :source:pod: - [[./output_pod.org][output_pod]] -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_source_or_pod #+BEGIN_SRC d if (sched == outTask.source_or_pod) { if (doc_matters.opt.action.source) { @@ -104,7 +115,7 @@ if (sched == outTask.source_or_pod) { **** epub :epub: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_epub #+BEGIN_SRC d if (sched == outTask.epub) { msg.v("epub3 processing... "); @@ -117,7 +128,7 @@ if (sched == outTask.epub) { **** html :html: ***** metadata :metadata: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_html_meta #+BEGIN_SRC d if (sched == outTask.html_stuff) { outputMetadata!()(doc_matters); @@ -127,7 +138,7 @@ if (sched == outTask.html_stuff) { ***** scroll :scroll: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_html_scroll #+BEGIN_SRC d if (sched == outTask.html_scroll) { msg.v("html scroll processing... "); @@ -139,7 +150,7 @@ if (sched == outTask.html_scroll) { ***** seg :seg: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_html_seg #+BEGIN_SRC d if (sched == outTask.html_seg) { msg.v("html seg processing... "); @@ -151,7 +162,7 @@ if (sched == outTask.html_seg) { ***** css, images etc :css:images: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_html_out #+BEGIN_SRC d if (sched == outTask.html_stuff) { import doc_reform.io_out.html; @@ -163,7 +174,7 @@ if (sched == outTask.html_stuff) { **** latex / pdf :latex:pdf: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_latex #+BEGIN_SRC d if (sched == outTask.latex) { msg.v("latex processing... (available for downstream processing & pdf output"); @@ -175,7 +186,7 @@ if (sched == outTask.latex) { **** odf / odt :odf:odt: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_odt #+BEGIN_SRC d if (sched == outTask.odt) { msg.v("odf:odt processing... "); @@ -187,7 +198,7 @@ if (sched == outTask.odt) { **** sqlite discrete :sqlite: -#+NAME: output_scheduled_task +#+NAME: output_scheduled_task_sqlite #+BEGIN_SRC d if (sched == outTask.sqlite) { msg.v("sqlite processing... "); @@ -219,7 +230,7 @@ if (doc_matters.opt.action.sqlite_update) { ***** no markup source files to process ****** drop :drop: -#+NAME: output_options_op +#+NAME: output_options_op_sqlite_db_drop #+BEGIN_SRC d if ((opt_action.sqlite_db_drop)) { if ((opt_action.verbose)) { @@ -235,7 +246,7 @@ if ((opt_action.sqlite_db_drop)) { ****** create :create: -#+NAME: output_options_op +#+NAME: output_options_op_sqlite_db_create #+BEGIN_SRC d if ((opt_action.sqlite_db_create)) { if ((opt_action.verbose)) { @@ -252,7 +263,7 @@ if ((opt_action.sqlite_db_create)) { **** cgi sqlite search form -#+NAME: output_options_op +#+NAME: output_options_op_cgi_search_form_codegen #+BEGIN_SRC d if ((opt_action.cgi_search_form_codegen)) { if ((opt_action.verbose)) { diff --git a/org/output_show.org b/org/output_show.org index ff33803..8550f53 100644 --- a/org/output_show.org +++ b/org/output_show.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no diff --git a/org/spine.org b/org/spine.org index 82cdeb7..5f39984 100644 --- a/org/spine.org +++ b/org/spine.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -96,8 +97,16 @@ string project_name = "spine"; string program_name = "spine"; @system void main(string[] args) { <> - <> - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> if (_manifests.length > 1 // _manifests[0] initialized dummy element && _opt_action.abstraction) { if (_opt_action.parallelise) { // see else @@ -106,7 +115,12 @@ string program_name = "spine"; if (!empty(manifest.src.filename)) { <> <> - <> + <> + <> + <> + <> + <> + <> <> <> } else { @@ -121,7 +135,12 @@ string program_name = "spine"; if (!empty(manifest.src.filename)) { <> <> - <> + <> + <> + <> + <> + <> + <> <> <> } else { @@ -307,14 +326,14 @@ mixin outputHub; **** init :init: -#+NAME: spine_init +#+NAME: spine_init_0 #+BEGIN_SRC d auto hvst = spineHarvest!(); #+END_SRC **** args :args: -#+NAME: spine_init +#+NAME: spine_init_1 #+BEGIN_SRC d string flag_action; string arg_unrecognized; @@ -324,7 +343,7 @@ static auto rgx = RgxI(); *** scope (run complete) :scope: -#+NAME: spine_init +#+NAME: spine_init_2 #+BEGIN_SRC d scope(success) { writefln( @@ -349,7 +368,7 @@ scope(failure) { - set getopt options ***** initialize -#+NAME: spine_args +#+NAME: spine_args_0 #+BEGIN_SRC d bool[string] opts = [ "abstraction" : false, @@ -427,7 +446,7 @@ string[string] settings = [ ***** set & describe -#+NAME: spine_args +#+NAME: spine_args_1 #+BEGIN_SRC d auto helpInfo = getopt(args, std.getopt.config.passThrough, @@ -509,7 +528,7 @@ if (helpInfo.helpWanted) { **** getopt hash to struct - move getopt options to struct -#+NAME: spine_args +#+NAME: spine_args_2 #+BEGIN_SRC d enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff } struct OptActions { @@ -830,7 +849,7 @@ OptActions _opt_action = OptActions(); **** env - environmental info -#+NAME: spine_args +#+NAME: spine_args_3 #+BEGIN_SRC d @safe auto program_info() { struct ProgramInfo { @@ -862,7 +881,7 @@ auto _env = [ *** get/read site config -#+NAME: spine_args +#+NAME: spine_args_4 #+BEGIN_SRC d auto _manifested = PathMatters!()(_opt_action, _env, ""); auto _manifests = [ _manifested ]; @@ -897,7 +916,7 @@ if (_opt_action.show_config) { *** use config for operations that do not require file processing -#+NAME: spine_args +#+NAME: spine_args_5 #+BEGIN_SRC d if (!(_opt_action.skip_output)) { if ((_opt_action.debug_do) @@ -916,7 +935,7 @@ if (!(_opt_action.skip_output)) { *** opt action on processing files (loop args) -#+NAME: spine_args +#+NAME: spine_args_6 #+BEGIN_SRC d ConfComposite _make_and_meta_struct = _config; destroy(_config); @@ -1153,7 +1172,7 @@ if ((doc_matters.opt.action.debug_do) ***** show document summary - abstraction _print summary_ (to screen) :abstraction:summary: --show-summary (abstraction summary) -#+NAME: spine_each_file_do_debugs_checkdoc +#+NAME: spine_each_file_do_debugs_checkdoc_0 #+BEGIN_SRC d /+ ↓ debugs +/ if (doc_matters.opt.action.verbose @@ -1167,7 +1186,7 @@ if (doc_matters.opt.action.verbose ***** show metadata (doc headers metadata) --show-metadata -#+NAME: spine_each_file_do_debugs_checkdoc +#+NAME: spine_each_file_do_debugs_checkdoc_1 #+BEGIN_SRC d /+ ↓ debugs +/ if (doc_matters.opt.action.show_metadata) { @@ -1179,7 +1198,7 @@ if (doc_matters.opt.action.show_metadata) { ***** show make (make files & doc headers) --show-make -#+NAME: spine_each_file_do_debugs_checkdoc +#+NAME: spine_each_file_do_debugs_checkdoc_2 #+BEGIN_SRC d /+ ↓ debugs +/ if (doc_matters.opt.action.show_make) { @@ -1191,7 +1210,7 @@ if (doc_matters.opt.action.show_make) { ***** show config (config files & doc headers) --show-config -#+NAME: spine_each_file_do_debugs_checkdoc +#+NAME: spine_each_file_do_debugs_checkdoc_3 #+BEGIN_SRC d /+ ↓ debugs +/ if (doc_matters.opt.action.show_config) { @@ -1203,7 +1222,7 @@ if (doc_matters.opt.action.show_config) { ***** abstraction harvest :abstraction:harvest: - abstraction harvest -#+NAME: spine_each_file_do_debugs_checkdoc +#+NAME: spine_each_file_do_debugs_checkdoc_4 #+BEGIN_SRC d if (doc_matters.opt.action.harvest) { auto _hvst = spineMetaDocHarvest!()(doc_matters, hvst); @@ -1225,7 +1244,7 @@ if (doc_matters.opt.action.harvest) { **** 1. _debug_ (document parts, checkdoc) :debug:checkdoc: - [[./meta_output_debugs.org][meta_output_debugs]] -#+NAME: spine_each_file_do_debugs_checkdoc +#+NAME: spine_each_file_do_debugs_checkdoc_5 #+BEGIN_SRC d /+ ↓ debugs +/ if (doc_matters.opt.action.debug_do) { @@ -1304,6 +1323,14 @@ template spineAbstraction() { <> <> <> + <> + <> + <> + <> + <> + <> + <> + <> auto t = tuple(doc_abstraction, doc_matters); return t; } @@ -1454,14 +1481,14 @@ if ((_opt_action.debug_do) **** DocumentMatters struct { -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_0 #+BEGIN_SRC d struct DocumentMatters { #+END_SRC **** generator related -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_1 #+BEGIN_SRC d @safe auto generator_program() { struct Prog_ { @@ -1510,7 +1537,7 @@ struct DocumentMatters { **** config make & meta -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_2 #+BEGIN_SRC d @safe auto conf_make_meta() { return _make_and_meta_struct; @@ -1522,7 +1549,7 @@ struct DocumentMatters { **** env related -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_3 #+BEGIN_SRC d @safe auto env() { struct Env_ { @@ -1539,7 +1566,7 @@ struct DocumentMatters { **** opt -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_4 #+BEGIN_SRC d @safe auto opt() { struct Opt_ { @@ -1557,7 +1584,7 @@ struct DocumentMatters { **** output related -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_5 #+BEGIN_SRC d @safe auto src() { return _manifest.src; @@ -1618,7 +1645,7 @@ struct DocumentMatters { **** } close -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_6 #+BEGIN_SRC d } auto doc_matters = DocumentMatters(); @@ -1626,7 +1653,7 @@ auto doc_matters = DocumentMatters(); **** step complete message -#+NAME: spine_each_file_do_document_matters +#+NAME: spine_each_file_do_document_matters_7 #+BEGIN_SRC d if ((_opt_action.debug_do) || (_opt_action.very_verbose) diff --git a/org/spine_build_scaffold.org b/org/spine_build_scaffold.org index c18b599..542e8e3 100644 --- a/org/spine_build_scaffold.org +++ b/org/spine_build_scaffold.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -14,27 +15,86 @@ #+PROPERTY: header-args+ :cache no #+PROPERTY: header-args+ :padline no -[[./org/spine.org][spine.org]] [[./org/][org/]] +[[./spine.org][spine.org]] [[../org/][org/]] +[[./spine_info.org][spine_info.org]] * makefile :makefile: +** tangle + +#+BEGIN_SRC makefile :tangle ../makefile +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +<> +#+END_SRC + ** settings [+2] :settings: *** git version stamp :git:version: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_var_0 +#+BEGIN_SRC makefile PROG_VER_GIT :=$(shell echo `git describe --long --tags | sed -e "s/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g"`) PROG_VER_DECLARED :=$(shell echo `cat ./views/version.txt | grep --color=never "enum" | sed 's/.\+(\([0-9]\+\),[ \t]\+\([0-9]\+\),[ \t]\+\([0-9]\+\)[ \t]*).\+/\1.\2.\3/g'`) #+END_SRC *** dub (build tool) :dub: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_var_1 +#+BEGIN_SRC makefile DUB=dub DUB_FLAGS=-v --force --compiler= #+END_SRC *** Project Details :project:spine: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_var_2 +#+BEGIN_SRC makefile PRG_NAME=doc-reform PRG_NICKAME=spine PRG_NAME_DIR=$(shell echo `echo $(PRG_NAME) | sed -e "s/-/_/g"`) @@ -47,7 +107,8 @@ PRG_DOCDIR=./docs *** Emacs Org settings :settings:emacs:org:tangle: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_var_3 +#+BEGIN_SRC makefile EMACSLISP=/usr/share/emacs/site-lisp ORG_VER_AVAILABLE=$(shell echo `ls -d ~/.emacs.d/elpa/org-???????? | cut -d '-' -f2`) EMACSLISP_ORG=~/.emacs.d/elpa/org-$($(shell echo $(ORG_VER_AVAILABLE))) @@ -61,7 +122,8 @@ ORGDIR :=$(shell echo `pwd`) *** Markup Samples **** pods -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_var_4 +#+BEGIN_SRC makefile SiSU_MARKUP_SAMPLES_FIND_PODS= \ find data/pod -maxdepth 2 -name pod.manifest | cut -f 1-3 -d / | sort @@ -96,7 +158,8 @@ data/pod/viral_spiral.david_bollier **** dir -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_var_5 +#+BEGIN_SRC makefile SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND = \ find data/sisudir/media/text -name *.ss[tm] | sort | xargs @@ -129,6 +192,27 @@ data/sisudir/media/text/un_contracts_international_sale_of_goods_convention_1980 data/sisudir/media/text/viral_spiral.david_bollier.sst #+END_SRC +******* sample markup file list + +#+NAME: makefile_a_0 +#+BEGIN_SRC makefile +markup_samples: + find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \ +find data/sisudir/media/text -name *.ss[tm] | sort +#+END_SRC + +#+NAME: makefile_a_1 +#+BEGIN_SRC makefile +markup_pod_samples: + find data/pod -name pod.manifest | cut -f 1-3 -d / | sort +#+END_SRC + +#+NAME: makefile_a_2 +#+BEGIN_SRC makefile +markup_dir_samples: + find data/sisudir/media/text -name *.ss[tm] | sort +#+END_SRC + ** _make_ commands [+2] :make:commands: - build commands @@ -152,49 +236,36 @@ data/sisudir/media/text/viral_spiral.david_bollier.sst ****** all builds ******* default -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_b_0 +#+BEGIN_SRC makefile dub_upgrade: $(DUB) upgrade #+END_SRC -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_b_1 +#+BEGIN_SRC makefile default: ldc #+END_SRC -******* sample markup file list - -#+BEGIN_SRC makefile :tangle ../makefile -markup_samples: - find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \ -find data/sisudir/media/text -name *.ss[tm] | sort -#+END_SRC - -#+BEGIN_SRC makefile :tangle ../makefile -markup_pod_samples: - find data/pod -name pod.manifest | cut -f 1-3 -d / | sort -#+END_SRC - -#+BEGIN_SRC makefile :tangle ../makefile -markup_dir_samples: - find data/sisudir/media/text -name *.ss[tm] | sort -#+END_SRC - ******* quick :quick: ******** default :default: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_b_2 +#+BEGIN_SRC makefile all: dmd ldc gdc #+END_SRC ******** version :version: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_b_3 +#+BEGIN_SRC makefile all_ver: dmd_ver ldc_ver gdc_ver #+END_SRC ******** debug :debug: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_b_4 +#+BEGIN_SRC makefile all_debug: dmd_debug gdc_debug ldc_debug #+END_SRC @@ -204,7 +275,8 @@ meson using dub - works & looks pretty clean - but subprojects built externally & not suitable for debian packaging -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_meson +#+BEGIN_SRC makefile meson_clean_build_dir: rm -r build; mkdir build meson_build: meson_clean_build_dir @@ -219,19 +291,22 @@ meson: meson_clean_build_dir dub_upgrade meson_build ******* clean & tangle :clean:tangle: ******** default :default: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_c_0 +#+BEGIN_SRC makefile all_clean: clean tangle dmd ldc gdc #+END_SRC ******** version :version: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_c_1 +#+BEGIN_SRC makefile all_ver_clean: clean tangle dmd_ver ldc_ver gdc_ver #+END_SRC ******** debug :debug: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_c_2 +#+BEGIN_SRC makefile all_debug_ver: dmd_debug_ver gdc_debug_ver ldc_debug_ver all_debug_clean_ver: clean tangle dmd_debug_ver gdc_debug_ver ldc_debug_ver #+END_SRC @@ -241,7 +316,8 @@ all_debug_clean_ver: clean tangle dmd_debug_ver gdc_debug_ver ldc_debug_ver ******* quick :quick: ******** default :default: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_dmd_0 +#+BEGIN_SRC makefile dmd: dub_upgrade $(DUB) --compiler=dmd --config=dmd --build=release-nobounds notify-send -t 0 'D dmd compiled test release executable ready' 'spine-dmd' @@ -249,7 +325,8 @@ dmd: dub_upgrade ******** debug :debug: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_dmd_1 +#+BEGIN_SRC makefile dmd_debug: $(DUB) --compiler=dmd --config=dmd --build=debug #+END_SRC @@ -258,7 +335,8 @@ dmd_debug: - assumes git tags with program version -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_dmd_2 +#+BEGIN_SRC makefile dmd_ver: dub_upgrade $(DUB) --compiler=dmd --config=dmd-version mv bin/spine-dmd-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-dmd @@ -268,7 +346,8 @@ dmd_clean_ver: clean tangle dmd_ver ******* clean & tangle :clean:tangle: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_dmd_3 +#+BEGIN_SRC makefile dmd_rel: expunge skel tangle $(DUB) --compiler=dmd --config=spine-release dmd_rel_tangle: tangle @@ -282,7 +361,8 @@ dmd_debug_tangle: tangle ******* quick :quick: ******** default :default: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_gdc_0 +#+BEGIN_SRC makefile gdc: dub_upgrade $(DUB) --compiler=gdc --config=gdc notify-send -t 0 'D gdc compiled test release executable ready' 'spine-gdc' @@ -290,7 +370,8 @@ gdc: dub_upgrade ******** debug :debug: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_gdc_1 +#+BEGIN_SRC makefile gdc_debug: $(DUB) --compiler=gdc --config=gdc --build=debug #+END_SRC @@ -299,7 +380,8 @@ gdc_debug: - assumes git tags with program version -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_gdc_2 +#+BEGIN_SRC makefile gdc_ver: dub_upgrade $(DUB) --compiler=gdc --config=gdc-version mv bin/spine-gdc-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-gdc @@ -309,7 +391,8 @@ gdc_clean_ver: clean tangle gdc_ver ******* clean & tangle :clean:tangle: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_gdc_3 +#+BEGIN_SRC makefile gdc_rel: expunge skel tangle $(DUB) --compiler=gdc --config=spine-release gdc_rel_tangle: tangle @@ -323,7 +406,8 @@ gdc_debug_tangle: tangle ******* quick :quick: ******** default :default: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_ldc_0 +#+BEGIN_SRC makefile ldc: dub_upgrade $(DUB) --compiler=ldc2 --config=ldc --build=release notify-send -t 0 'D ldc compiled test release executable ready' 'spine-ldc' @@ -331,7 +415,8 @@ ldc: dub_upgrade ******** debug :debug: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_ldc_1 +#+BEGIN_SRC makefile ldc_debug: $(DUB) --compiler=ldc2 --config=ldc --build=debug #+END_SRC @@ -340,7 +425,8 @@ ldc_debug: - assumes git tags with program version -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_ldc_2 +#+BEGIN_SRC makefile ldc_ver: dub_upgrade $(DUB) --compiler=ldc2 --config=ldc-version mv bin/spine-ldc-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-ldc @@ -350,7 +436,8 @@ ldc_clean_ver: clean tangle ldc_ver ******* clean & tangle :clean:tangle: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_ldc_3 +#+BEGIN_SRC makefile ldc_rel: expunge skel tangle $(DUB) --compiler=ldc2 --config=spine-release ldc_rel_tangle: tangle @@ -363,7 +450,8 @@ ldc_debug_tangle: tangle ***** generic ****** init clean distclean etc. :clean: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_d_0 +#+BEGIN_SRC makefile reinit: clean skel tangle skel: mkdir -p $(PRG_BINDIR); \ @@ -420,14 +508,16 @@ distclean_and_init: expunge ****** version :version: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_d_1 +#+BEGIN_SRC makefile ver: echo spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT) #+END_SRC ****** tangle build rebuild :clean:tangle:build: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_d_2 +#+BEGIN_SRC makefile clean_tangle_build: clean tangle build tangle_build: tangle build build: $(PRG_SRCDIR)/$(PRG_SRC) @@ -444,7 +534,8 @@ restart: clean tangle **** pods ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_0 +#+BEGIN_SRC makefile find_pods: $(SiSU_MARKUP_SAMPLES_FIND_PODS) #+END_SRC @@ -452,7 +543,8 @@ find_pods: ***** dmd ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_1 +#+BEGIN_SRC makefile dmd_testrun_find: ./bin/spine-dmd -v --source --html --epub --sqlite-discrete \ --sqlite-create --sqlite-update \ @@ -483,7 +575,8 @@ dmd_testrun_find_pod_all: ****** path list -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_2 +#+BEGIN_SRC makefile dmd_testrun_paths_pod_source: ./bin/spine-dmd -v --source \ --output-dir=tmp/program_output_pod \ @@ -510,7 +603,8 @@ $(SiSU_MARKUP_SAMPLES_POD) ***** gdc ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_3 +#+BEGIN_SRC makefile gdc_testrun_find: ./bin/spine-gdc -v --source --html --epub --sqlite-discrete \ --sqlite-create --sqlite-update \ @@ -541,7 +635,8 @@ gdc_testrun_find_pod_all: ****** path list -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_4 +#+BEGIN_SRC makefile gdc_testrun_paths: ./bin/spine-gdc -v --source --html --epub --sqlite-discrete \ --sqlite-create --sqlite-update \ @@ -573,7 +668,8 @@ $(SiSU_MARKUP_SAMPLES_POD) ***** ldc ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_5 +#+BEGIN_SRC makefile ldc_testrun_find: ./bin/spine-ldc -v --source --html --epub --sqlite-discrete \ --sqlite-create --sqlite-update \ @@ -604,7 +700,8 @@ ldc_testrun_find_pod_all: ****** path list -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_6 +#+BEGIN_SRC makefile ldc_testrun_paths: ./bin/spine-ldc -v --source --html --epub --sqlite-discrete \ --sqlite-create --sqlite-update \ @@ -637,7 +734,8 @@ $(SiSU_MARKUP_SAMPLES_POD) ***** dmd ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_7 +#+BEGIN_SRC makefile dmd_testrun_find_dir_source: $(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \ ./bin/spine-dmd -v --source \ @@ -663,7 +761,8 @@ dmd_testrun_find_dir_all: ****** file list -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_8 +#+BEGIN_SRC makefile dmd_testrun_filelist_dir_source: ./bin/spine-dmd -v --source \ --output-dir=tmp/program_output_dir \ @@ -690,7 +789,8 @@ $(SiSU_MARKUP_SAMPLES_DIR) ***** gdc ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_9 +#+BEGIN_SRC makefile gdc_testrun_find_dir_source: ./bin/spine-gdc -v --source \ --output-dir=tmp/program_output_dir \ @@ -716,7 +816,8 @@ gdc_testrun_find_dir_all: ****** file list -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_10 +#+BEGIN_SRC makefile gdc_testrun_filelist_dir_source: ./bin/spine-gdc -v --source \ --output-dir=tmp/program_output_dir \ @@ -743,7 +844,8 @@ $(SiSU_MARKUP_SAMPLES_DIR) ***** ldc ****** find files -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_11 +#+BEGIN_SRC makefile ldc_testrun_find_dir_source: $(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \ ./bin/spine-ldc -v --source \ @@ -769,7 +871,8 @@ ldc_testrun_find_dir_all: ****** file list -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_testrun_12 +#+BEGIN_SRC makefile ldc_testrun_filelist_dir_source: ./bin/spine-ldc -v --source \ --output-dir=tmp/program_output_dir \ @@ -796,7 +899,8 @@ $(SiSU_MARKUP_SAMPLES_DIR) *** org babel tangle batch process command :tangle: **** tangle: org babel tangle *.org -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_tangle_0 +#+BEGIN_SRC makefile tangle: skel for f in $(ORGFILELIST); do \ ORGFILES="$$ORGFILES \"$$f\""; \ @@ -819,7 +923,8 @@ tangle: skel **** tangle maker: org babel tangle maker.org, makefile new -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_tangle_1 +#+BEGIN_SRC makefile tangle_maker: for f in $(ORGFILELIST); do \ ORGFILES="\"org/dr_build_scaffold.org\""; \ @@ -842,14 +947,16 @@ tangle_maker: *** git snapshot -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_git_snapshot +#+BEGIN_SRC makefile gitsnapshot: distclean tangle git commit -a #+END_SRC ** phony :phony: -#+BEGIN_SRC makefile :tangle ../makefile +#+NAME: makefile_phony +#+BEGIN_SRC makefile .PHONY : all build rebuild debug release \ distclean init \ tangle gitsnapshot @@ -1406,8 +1513,9 @@ tinyendian_dep = declare_dependency( #./.dub/** * !.gitignore +!README.md !COPYRIGHT -!README +!CHANGELOG !makefile !version.txt !dub.json diff --git a/org/spine_doc.org b/org/spine_doc.org deleted file mode 100644 index 49e7313..0000000 --- a/org/spine_doc.org +++ /dev/null @@ -1,4548 +0,0 @@ --*- mode: org -*- -#+TITLE: spine (doc_reform) hub -#+DESCRIPTION: documents - structuring, various output representations & search -#+FILETAGS: :spine:hub: -#+AUTHOR: Ralph Amissah -#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] -#+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah -#+LANGUAGE: en -#+STARTUP: content hideblocks hidestars noindent entitiespretty -#+PROPERTY: header-args :exports code -#+PROPERTY: header-args+ :noweb yes -#+PROPERTY: header-args+ :eval no -#+PROPERTY: header-args+ :results no -#+PROPERTY: header-args+ :cache no -#+PROPERTY: header-args+ :padline no - -* README -** tangle - -#+BEGIN_SRC text :tangle "../README" -<> -<> -<> -<> -<> -<> -#+END_SRC - -** project name - -#+NAME: sisu_spine_readme_info -#+BEGIN_SRC text -project_name: Spine, Doc Reform - description: [ - "documents, structuring, processing, publishing", - search, - object numbering, - static content generator, - sisu markup - ] - - author: - name: Ralph Amissah - email: ralph.amissah@gmail.com - - copyright: "(C) 2015 - 2020 Ralph Amissah, All Rights Reserved." - - license: "AGPL 3 or later" - - hompage: [ - "http://www.doc_reform.org", - "http://www.sisudoc.org" - ] -#+END_SRC - -** short description - -#+NAME: sisu_spine_readme_description -#+BEGIN_SRC text -#+END_SRC - -** installation - -#+NAME: sisu_spine_readme_install -#+BEGIN_SRC text -# Installation, Compilation - -SiSU spine is written in the programming language D for which there are 3 compilers: - -- dmd -- ldc -- gdc - -D projects tend to use dub as project manager -https://code.dlang.org/packages/dub -https://code.dlang.org/packages/dub -https://github.com/dlang/dub/blob/master/source/dub/commandline.d - - dub --compiler=ldc2 -color --config=ldc -b release - - dub --compiler=dmd -color --config=dmd - - dub --compiler=gdc-10 -color --config=gdc -b release - - make ldc - - make dmd - -there has been some coalescence around the Meson build system -https://mesonbuild.com/ - - meson - - ninja -C build - - meson setup --wipe build && ninja -v -C build - - make meson - -dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. - -#+END_SRC - -** configuration - -#+NAME: sisu_spine_readme_configuration -#+BEGIN_SRC text -# Configuration - -Configuration files are yaml files - -The following paths are searched: - - ~/.dr/config_local_site - ~/path_to_pod_root/.dr/config_local_site - -e.g. processing - - ~spineMarkupSamples/pod/* - -will search: - - ~spineMarkupSamples/pod/.dr/config_local_site - - ~/.dr/config_local_site - -to specify an alternative configuration file to use on the command line (in this -example named "my_config"): - - spine -v --html --config=~spineMarkupSamples/pod/.dr/my_config - -here is a sample configuration file: - -flag: - act0: "--html" - act1: "--html --epub" -output: - path: "/var/www/html" -default: - language: "en" - papersize: "a4" - text_wrap: "80" - digest: "sha256" -webserv: - http: "http" - domain: "localhost" - data_http: "http" - data_domain: "localhost" - data_root_url: "http://localhost" - data_root_path: "/var/www/html" - data_root_part: "" - images_root_part: "image" - cgi_title: "≅ SiSU Spine search" - cgi_http: "http" - cgi_domain: "localhost" - cgi_bin_url: "http://localhost/cgi-bin" - cgi_bin_part: "cgi-bin" - cgi_bin_path: "/usr/lib/cgi-bin" - cgi_search_script: "spine-search" - cgi_search_script_raw_fn_d: "spine_search.d" - cgi_port: "" - cgi_user: "" - cgi_action: "http://localhost/cgi-bin/spine-search" - db_sqlite: "spine.search.db" - db_pg_table: "" - db_pg_user: "" - -#+END_SRC - -** commands help - -#+NAME: sisu_spine_readme_commands -#+BEGIN_SRC text -# Commands - -for a list of commands from the program type: - - spine -h - -at the time of writing this provides the following output: - - --abstraction document abstraction - --assert set optional assertions on - --cgi-search-form-codegen generates (pre-compiled) d code for search of specified db - --cgi-sqlite-search-filename =[filename] - --concordance file for document - --config =/path/to/config/file/including/filename - --dark alternative dark theme - --debug debug - --digest hash digest for each object - --epub process epub output - --harvest extract info on authors & topics from document header metadata - --harvest-authors extract info on authors from document header metadata - --harvest-topics extract info on topics from document header metadata - --hide-ocn object cite numbers - --html process html output - --html-link-harvest place links back to harvest in segmented html - --html-link-search html embedded search submission - --html-seg process html output - --html-scroll process html output - --lang =[lang code e.g. =en or =en,es] - --latex output for pdfs - --latex-color-links mono or color links for pdfs - --light default light theme - --manifest process manifest output - --ocn-off object cite numbers - --odf open document format text (--odt) - --odt open document format text - --output =/path/to/output/dir specify where to place output - --parallel parallelisation - --parallel-subprocesses nested parallelisation - --pdf latex output for pdfs - --pdf-color-links mono or color links for pdfs - --pod spine (doc reform) pod source content bundled --q --quiet output to terminal - --section-backmatter document backmatter (default) - --section-biblio document biblio (default) - --section-blurb document blurb (default) - --section-body document body (default) - --section-bookindex document bookindex (default) - --section-endnotes document endnotes (default) - --section-glossary document glossary (default) - --section-toc table of contents (default) - --serial serial processing - --skip-output skip output - --show-config show config - --show-make show make - --show-metadata show metadata - --show-summary show summary - --source document markup source - --sqlite-discrete process discrete sqlite output - --sqlite-db-create create db, create tables - --sqlite-db-drop drop tables & db - --sqlite-db-recreate create db, create tables - --sqlite-delete sqlite output - --sqlite-db-filename =[filename].sql.db - --sqlite-insert sqlite output - --sqlite-update sqlite output - --text text output - --theme-dark alternative dark theme - --theme-light default light theme - --txt text output --v --verbose output to terminal - --very-verbose output to terminal - --workon (reserved for some matters under development & testing) - --xhtml xhtml output --h --help This help information. - -#+END_SRC - -** command examples - -#+NAME: sisu_spine_readme_examples -#+BEGIN_SRC text -# Examples - -if configuartion has been set specify just -- the desired output and -- the markup document/pod(s) to process - - spine -v --html ~spineMarkupSamples/markup/pod/sisu-manual - -if configuartion has not been set or to overide the set configration specify -- the output path as well as -- the desired output and -- the markup document/pod(s) to process - -note: ~webDocRoot should be the path to web doc root, provide a suitable output path. - - spine -v --html --html-link-search --html-link-harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --html-link-harvest --epub --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --epub --latex --odt --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - -## harvest - -if you have a document collection with documents that have metadata headers a -summary of the collection can be made using the harvest command - - spine -v --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --harvest ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --html-link-harvest --harvest ~spineMarkupSamples/pod/* - -## sqlite - -### create db - -if there is no sqlite db you first need to create one, to do so -- the name of the db and -- the root path for document output -must be specified: - - spine -v \ - --sqlite-db-create --sqlite-db-filename="spine.search.db" \ - --output=/var/www/html \ - ~spineMarkupSamples/pod/* - - spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` - -if you have a configration file providing this information that is to be used -for a document collection you can point to the document collection: - - spine -v --sqlite-db-create ~spineMarkupSamples/pod - -### populate db - -must specify: -- the name of the db and -- the root path for document output - - spine -v --sqlite-update \ - --sqlite-db-filename="spine.search.db" \ - --output=/var/www/html \ - ~spineMarkupSamples/pod/* - - spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - -if you have a configration file providing this information that is to be used -for a document collection you can point to the document collection: - - spine -v --sqlite-update ~spineMarkupSamples/pod/* - -### generate a cgi search form in d - - 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 - - spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot` - - spine -v --cgi-search-form-codegen \ - --sqlite-db-filename="spine.search.db" \ - --cgi-sqlite-search-filename="spine-search" \ - --output=/var/www/html \ - ~spineMarkupSamples/pod - -#### compile the cgi search form - - cd /var/www/html/cgi # /var/www/html (default document root) - - cd ~webDocRoot/cgi - -the directory ~webDocRoot/cgi/src should contain two files -- spine_search.d (or whatever you named it) -- cgi.d (by Adam Rupee) - - dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. - -should compile spine-search in ~webDocRoot/cgi/cgi-bin and copy it to the -cgi-bin directory - - spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` - - spine -v --sqlite-db-create ~spineMarkupSamples/pod - - spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - - spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* - -### create db & search form - - 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/* - -### html with links to search form - - spine -v --html \ - --html-link-search \ - --output=`echo ~webDocRoot` \ - ~spineMarkupSamples/pod/* - -#+END_SRC - -* manpage -** tangle - -#+BEGIN_SRC man :tangle "../doc/man/man1/spine.1" -<> -<> -<> -<> -<> -<> -<> -<> -<> -#+END_SRC - -** manpage -*** head - -#+NAME: sisu_spine_manpage_head -#+BEGIN_SRC man -.TH "spine" "1" "2020-04-05" "0.10.0" "Spine" -.br -.SH NAME -.br -sisu - documents: markup, structuring, publishing in multiple standard formats, and search -.br -.SH SYNOPSIS -.br -sisu [--options] [filename/wildcard] - -.br -sisu --txt --html --epub --odt --pdf --wordmap --sqlite --manpage --texinfo --sisupod --source --qrcode [filename/wildcard] - -.br -sisu --pg (--createdb|update [filename/wildcard]|--dropall) - -#+END_SRC - -*** description - -#+NAME: sisu_spine_manpage_description -#+BEGIN_SRC man -.SH SISU - MANUAL, -RALPH AMISSAH - -.SH WHAT IS SISU? - -.SH INTRODUCTION - WHAT IS SISU? - -.BR - -.B SiSU -is a lightweight markup based document creation and publishing framework that -is controlled from the command line. Prepare documents for -.B SiSU -using your text editor of choice, then use -.B SiSU -to generate various output document formats. - -.BR -From a single lightly prepared document (plain-text -.I UTF-8 -) sisu custom builds several standard output formats which share a common (text -object) numbering system for citation of content within a document (that also -has implications for search). The sisu engine works with an abstraction of the -document's structure and content from which it is possible to generate -different forms of representation of the document. -.B SiSU -produces: plain-text, -.I HTML, -.I XHTML, -.I XML, -.I EPUB, -.I ODF: -.I ODT -(Opendocument), -.I LaTeX, -.I PDF, -and populates an -.I SQL -database ( -.I PostgreSQL -or -.I SQLite -) with text objects, roughly, paragraph sized chunks so that document searches -are done at this level of granularity. - -.BR -Outputs share a common citation numbering system, associated with text objects -and any semantic meta-data provided about the document. - -.BR - -.B SiSU -also provides concordance files, document content certificates and manifests of -generated output. Book indexes may be made. - -.BR -Some document markup samples are provided in the package sisu -markup-samples. -Homepages: - -- - -- - -.SH COMMANDS SUMMARY - -.SH DESCRIPTION - -.BR - -.B SiSU -is a document publishing system, that from a simple single marked-up document, -produces multiple output formats including: -.I plaintext, -.I HTML, -.I XHTML, -.I XML, -.I EPUB, -.I ODT -( -.I OpenDocument -( -.I ODF -) text), -.I LaTeX, -.I PDF, -info, and -.I SQL -( -.I PostgreSQL -and -.I SQLite -) , which share text object numbers ("object citation numbering") and the same -document structure information. For more see: or - -#+END_SRC - -** flags -*** general - -#+NAME: sisu_spine_manpage_flags -#+BEGIN_SRC man -.SH DOCUMENT PROCESSING COMMAND FLAGS - -.TP -.B --abstraction [path + filename] -run document abstraction -.TP -.B --act[s0-9] [path + filename] ---act0 to --act9 configurable shortcuts for multiple flags, -0 to -9 synonyms, -configure in sisurc.yml; sisu default action on a specified file where no flag -is provided is --act0; --act or --acts for information on current actions -ascribed to --act0 to --act9 -.TP -.B --asciidoc [path + filename] -asciidoc, smart text (not available) -.TP -.B --cgi-search-form-codegen - generate d code search form to search db specfied needs --output=[path] and ---sqlite-db-filename=[cgi search form name] or path to configuration file ---config=[full path to config file] -.TP -.B --cgi-sqlite-search-filename=[filename] -name to give cgi-search form, (it generates a [filename].d file that requires -subsequent compilation) also required is the name of the sqlite db to be -searched by the form. -.TP -.B --concordance [path + filename] -(not implemented) -.TP -.B --config=[path to config file + filename] -.TP -.B --dark - alternative theme for html and epub output, a light (default) theme is - also provided -.TP -.B --digest (not implemented) -.TP -.B --delete [path + filename] -see --zap -.TP -.B --digests [path + filename] -not implemented -.TP -.B --epub [path + filename] -produces an epub document -.TP -.B --harvest [path to files] -extract and present info on authors & topics from document header metadata. -makes two lists of sisu output based on the sisu markup documents in a -directory: list of author and authors works (year and titles), and; list by -topic with titles and author. Makes use of header metadata fields (author, -title, date, topic_register). -.TP -.B --harvest-authors [path to files] -extract and present info on authors from metadata in document headers -.TP -.B --harvest-topics [path to files] -extract and present info on topics from metadata in document headers -.TP -.B --hide-ocn -turn visibility of object numbers off -.TP -.B --html [path + filename] -produces html output in two forms (i) segmented text with table of contents -(toc.html and index.html) and (ii) the document in a single file (scroll.html). -.TP -.B --html-link-harvest -within html output creates link to the document set metadata harvest output -part of --html output instruction and assumes that --harvest has been or will - be run -.TP -.B --html-link-search -within html output creates a search form for submission, requires information -on the name of the search form --search part of --html output instruction it -assumes there is a cgi search form and related document database -.TP -.B --html-scroll [path + filename] -produces html output, the document in a single file (scroll.html) only. Compare ---html-seg and --html -.TP -.B --html-seg [path + filename] -produces html output, segmented text with table of contents (toc.html and -index.html). Compare --html-scroll and --html -.TP -.B --lang=[language code, e.g. =en or =en,es] -provide language code of document -.TP -.B --latex [path + filename] -.I LaTeX -output for different document sizes (a4, a5, b4, letter) and orientations -(portrait, landscape) for downstream (processing and) conversion to pdf, (used -with xetex no direct link between programs provided as this is a much slower -process) -.TP -.B --latex-color-links -monochrome or color links within pdf, toggle (mono better for printing), -the default is mono for portrait and color for landscape documents -.TP -.B --light theme -for html and epub output, default, a dark alternative is provided -.TP -.B --manifest [path + filename] -produces an html summary of output generated (hyperlinked to content) and -document specific metadata (sisu_manifest.html). This step is assumed for most -processing flags. -.TP -.B --markdown [path + filename] -markdown smart text (not available) -.TP -.B --no-* -negate a toggle -.TP -.B --ocn-off -object numbers off (the c in ocn is for citation). See --hide-ocn -.TP -.B --odf [path + filename] -see --odt -.TP -.B --odt [path + filename] -produce open document output -.TP -.B --output=[path to output directories] -where to place document output -.TP -.B --parallel -parallelization on (the default except for sqlite) -.TP -.B --parallel-subprocesses -nested parallelization on (the default except for sqlite) -.TP -.B --papersize-(a4|a5|b5|letter|legal) -in conjunction with --pdf set pdf papersize, overriding any configuration -settings, to set more than one papersize repeat the option --pdf --papersize-a4 ---papersize-letter. See also --papersize=* (NOT implemented) -.BR -.B --papersize=a4,a5,b5,letter,legal -in conjunction with --pdf set pdf papersize, overriding any configuration -settings, to set more than one papersize list after the equal sign with a comma -separator --papersize=a4,letter. See also --papersize-* (NOT implemented) -.TP -.B --pdf [path + filename] -produces -.I LaTeX -see --latex -.TP -.B --pdf-color-links -monochrome or color links within latex for pdf. See --latex-color-links -.TP -.B --pod -markup source bundled in a zip file. -Produces a zipped file of the prepared document specified along with associated -images This provides a quick way of gathering the relevant -parts of a sisu document which can then for example be emailed. A sisupod -includes sisu markup source file, (along with associated documents if a master -file, or available in multilingual versions), together with related images. -(it should be possible in future to run spine commands directly against a pod). -.TP -.B --qrcode [path + filename] -generate QR code image of metadata (used in manifest). (not implemented) -.TP -.B --quiet -quiet less output to terminal. -.TP -.B --section-* -provides finer grain control over which parts of the document are processed -to produce output, toc, body, endnotes, glossary, biblio, bookindex and blurb -.TP -.B --section-biblio -produce document bibliography output, toggle -.TP -.B --section-blurb -produce document blurb output, toggle -.TP -.B --section-body -produce document body output, toggle -.TP -.B --section-bookindex -produce document bookindex output, toggle -.TP -.B --section-endnotes -produce document endnotes output, toggle -.TP -.B --section-endnotes -produce document glossary output, toggle -.TP -.B --serial -serial processing --no-parallel -.TP -.B --show-config -show site and document configuration instructions. Requires path to -configuration file or path to documents to be processed. -.TP -.B --show-make -show document make instructions -.TP -.B --show-metadata -show document metadata -.TP -.B --show-summary -show document summary -.TP -.B --source [path + filename] -document markup source -.TP -.B --sha256 -set hash digest where used to sha256 (not implemented) -.TP -.B --sha512 -set hash digest where used to sha512 (not implemented) -.TP -.B --sqlite-discrete [path + filename] -create a per document sqlite db -.TP -.B --sqlite-db-create --sqlite-db-filename="[db filename]" --output="[output path]" -create a shared db and its tables. Requires a db filename, which may be set in the configuration file or on the command line as shown -.TP -.B --sqlite-db-drop [path + db filename] -drop (remove) db and its tables -.TP -.B --sqlite-db-recreate [path + filename] -drop and re-create a shared db and its tables. Requires a db filename, which may be set in the configuration file or on the command line with --sqlite-db-filename="[db name]" -.TP -.B --sqlite-db-filename="[db name]" -provide name of sqlite db, to be created, dropped, populated or for which a search form is to be made. This information may also be set in the configuration file. -.TP -.B --sqlite-delete [path + filename] -process sqlite output, remove file -.TP -.B --sqlite-insert [path + filename] -process sqlite output, insert file. See --sqlite-update -.TP -.B --sqlite-update [path + filename] -process sqlite output, update file -.TP -.B --source [filename/wildcard] -copies sisu markup file to output directory. Alias -s -.TP -.B --text [filename/wildcard] -produces -.I plaintext -output -(not implemented) -.TP -.B --theme-dark -See --dark -.TP -.B --theme-light -See --light -.TP -.B --txt [filename/wildcard] -produces -.I plaintext -output -(not implemented) -.TP -.B --txt-asciidoc [filename/wildcard] -see --asciidoc -(not implemented) -.TP -.B --txt-markdown [filename/wildcard] -see --markdown -(not implemented) -.TP -.B --txt-rst [filename/wildcard] -see --rst -(not implemented) -.TP -.B --txt-textile [filename/wildcard] -see --textile -(not implemented) -.TP -.B -v -on its own, provides -.B SiSU -version information -.TP -.B -v [filename/wildcard] -see --verbose -.TP -.B --verbose [filename/wildcard] -provides verbose output of what is being generated, where output is placed (and -error messages if any). Alias -v -.TP -.B --very-verbose [filename/wildcard] -provides more verbose output of what is being generated. See --verbose. Alias --V -.TP -.B --version -spine version -(not implemented) -.TP -.B --xhtml -xhtml output -(not implemented) - -.SH COMMAND LINE MODIFIERS - -.TP -.B --no-ocn -[with --html --pdf or --epub] switches off -.I object citation numbering. -Produce output without identifying numbers in margins of html or -.I LaTeX -/pdf output. -#+END_SRC - -*** db flags - -#+NAME: sisu_spine_manpage_flags_db -#+BEGIN_SRC man -.SH DATABASE COMMANDS - -.BR - -.B dbi - database interface - -.BR - -.B --pg or --pgsql -set for -.I PostgreSQL -.B --sqlite -default set for -.I SQLite --d is modifiable with --db=[database type (PgSQL or -.I SQLite -) ] -.TP -.B --pg -v --createall -initial step, creates required relations (tables, indexes) in existing -.I PostgreSQL -database (a database should be created manually and given the same name as -working directory, as requested) (rb.dbi) [ -dv --createall -.I SQLite -equivalent] it may be necessary to run sisu -Dv --createdb initially NOTE: at -the present time for -.I PostgreSQL -it may be necessary to manually create the database. The command would be -'createdb [database name]' where database name would be SiSU_[present working -directory name (without path)]. Please use only alphanumerics and underscores. -.TP -.B --pg -v --import -[filename/wildcard] imports data specified to -.I PostgreSQL -db (rb.dbi) [ -dv --import -.I SQLite -equivalent] -.TP -.B --pg -v --update -[filename/wildcard] updates/imports specified data to -.I PostgreSQL -db (rb.dbi) [ -dv --update -.I SQLite -equivalent] -.TP -.B --pg --remove -[filename/wildcard] removes specified data to -.I PostgreSQL -db (rb.dbi) [ -d --remove -.I SQLite -equivalent] -.TP -.B --pg --dropall -kills data" and drops ( -.I PostgreSQL -or -.I SQLite -) db, tables & indexes [ -d --dropall -.I SQLite -equivalent] - -.BR -The -v is for verbose output. -#+END_SRC - -** configuration file - -#+NAME: sisu_spine_manpage_config -#+BEGIN_SRC man -.SH CONFIGURATION - -.BR - -default location: -.TP -~/.dr/config_local_site -.TP -.nf -flag: - act0: "--html" - act1: "--html --epub" -output: - path: "/var/www/html" -default: - language: "en" - papersize: "a4" - text_wrap: "80" - digest: "sha256" -webserv: - http: "http" - domain: "localhost" - data_http: "http" - data_domain: "localhost" - data_root_url: "http://localhost" - data_root_path: "/var/www/html" - data_root_part: "" - images_root_part: "image" - cgi_title: "≅ SiSU Spine search" - cgi_http: "http" - cgi_domain: "localhost" - cgi_bin_url: "http://localhost/cgi-bin" - cgi_bin_part: "cgi-bin" - cgi_bin_path: "/usr/lib/cgi-bin" - cgi_search_script: "spine-search" - cgi_search_script_raw_fn_d: "spine_search.d" - cgi_port: "" - cgi_user: "" - cgi_action: "http://localhost/cgi-bin/spine-search" - db_sqlite: "spine.search.db" - db_pg_table: "" - db_pg_user: "" -.fi - -.BR -#+END_SRC - -** sample pod directory - -#+NAME: sisu_spine_manpage_pod_dir_structure -#+BEGIN_SRC man -.SH SAMPLE POD DIRECTORY STRUCTURE -.BR -.TP -.nf - -pod (directory may contain multiple documents) - └── the_wealth_of_networks.yochai_benkler - ├── conf - │   └── sisu_document_make - ├── media - │   ├── image - │   │   ├── won_benkler_2_1.png - │   │   ├── won_benkler_6_1.png - │   │   ├── won_benkler_7_1.png - │   │   ├── won_benkler_7_2.png - │   │   ├── won_benkler_7_3a.png - │   │   ├── won_benkler_7_3b.png - │   │   ├── won_benkler_7_4.png - │   │   ├── won_benkler_7_5.png - │   │   ├── won_benkler_7_6.png - │   │   └── won_benkler_9_1.png - │   └── text - │   └── en - │   └── the_wealth_of_networks.yochai_benkler.sst - └── pod.manifest - -.fi -#+END_SRC - -** examples - -#+NAME: sisu_spine_manpage_cli_examples -#+BEGIN_SRC man -.SH COMMAND LINE EXAMPLES - -.TP -note: ~webDocRoot should be the path to web doc root, provide a suitable output path. -.TP -spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* -.TP -spine -v --html --html-link-search --html-link-harvest --epub --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* -.TP -spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod -.TP -spine -v --sqlite-db-create ~spineMarkupSamples/pod -.TP -spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/* -.TP -spine -v --sqlite-update ~spineMarkupSamples/pod/* -.TP -spine -v --show-config -.TP -spine -v --show-config --config= ~spineMarkupSamples/pod/.dr/config_local_site_test -.TP -spine -v --show-config --config=~spineMarkupSamples/pod/.dr -.TP -spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod/.dr/config_local -.TP -cd ~webDocRoot/cgi -.TP -dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/. -.TP -#+END_SRC - -** docs -*** sources - -#+NAME: sisu_spine_manpage_docs -#+BEGIN_SRC man - -.BR -Running sisu (alone without any flags, filenames or wildcards) brings up the -interactive help, as does any sisu command that is not recognised. Enter to -escape. -.SH HELP - -.SH SISU MANUAL - - -.BR -The most up to date information on sisu should be contained in the sisu_manual, -available at: - -.BR - - -.BR -The manual can be generated from source, found respectively, either within the -.B SiSU -tarball or installed locally at: - -.BR - ./data/doc/sisu/markup-samples/sisu_manual - -.BR - /usr/share/doc/sisu/markup-samples/sisu_manual - -.BR -move to the respective directory and type e.g.: - -.BR - sisu sisu_manual.ssm -.SH SISU MAN PAGES - - -.BR -If -.B SiSU -is installed on your system usual man commands should be available, try: - -.BR - man sisu - -.BR -Most -.B SiSU -man pages are generated directly from sisu documents that are used to prepare -the sisu manual, the sources files for which are located within the -.B SiSU -tarball at: - -.BR - ./data/doc/sisu/markup-samples/sisu_manual - -.BR -Once installed, directory equivalent to: - -.BR - /usr/share/doc/sisu/markup-samples/sisu_manual - -.BR -Available man pages are converted back to html using man2html: - -.BR - /usr/share/doc/sisu/html/ - -.BR - ./data/doc/sisu/html - -.BR -An online version of the sisu man page is available here: - -.BR - -- various sisu man pages [^1] - -.BR -- sisu.1 [^2] -.SH SISU BUILT-IN INTERACTIVE HELP, [DISCONTINUED] - - -.BR -This fell out of date and has been discontinued. -#+END_SRC - -*** markup - -#+NAME: sisu_spine_manpage_markup -#+BEGIN_SRC man -.SH INTRODUCTION TO SISU MARKUP[^3] - -.SH SUMMARY - -.BR - -.B SiSU -source documents are -.I plaintext -( -.I UTF-8 -)[^4] files - -.BR -All paragraphs are separated by an empty line. - -.BR -Markup is comprised of: - -.BR -- at the top of a document, the document header made up of semantic meta-data -about the document and if desired additional processing instructions (such an -instruction to automatically number headings from a particular level down) - -.BR -- followed by the prepared substantive text of which the most important single -characteristic is the markup of different heading levels, which define the -primary outline of the document structure. Markup of substantive text includes: - -.BR - * heading levels defines document structure - -.BR - * text basic attributes, italics, bold etc. - -.BR - * grouped text (objects), which are to be treated differently, such as code - blocks or poems. - -.BR - * footnotes/endnotes - -.BR - * linked text and images - -.BR - * paragraph actions, such as indent, bulleted, numbered-lists, etc. -.SH MARKUP RULES, DOCUMENT STRUCTURE AND METADATA REQUIREMENTS - - -.BR -minimal content/structure requirement: - -.BR -[metadata] -.nf -A~ (level A [title]) - -1~ (at least one level 1 [segment/(chapter)]) -.fi - - -.BR -structure rules (document heirarchy, heading levels): - -.BR -there are two sets of heading levels ABCD (title & parts if any) and 123 -(segment & subsegments if any) - -.BR -sisu has the fllowing levels: -.nf -A~ [title] . - required (== 1) followed by B~ or 1~ -B~ [part] * - followed by C~ or 1~ -C~ [subpart] * - followed by D~ or 1~ -D~ [subsubpart] * - followed by 1~ -1~ [segment (chapter)] + - required (>= 1) followed by text or 2~ -text * - followed by more text or 1~, 2~ - or relevant part *() -2~ [subsegment] * - followed by text or 3~ -text * - followed by more text or 1~, 2~ or 3~ - or relevant part, see *() -3~ [subsubsegment] * - followed by text -text * - followed by more text or 1~, 2~ or 3~ or relevant part, see *() - -*(B~ if none other used; - if C~ is last used: C~ or B~; - if D~ is used: D~, C~ or B~) -.fi - -.nf -- level A~ is the tile and is mandatory -- there can only be one level A~ - -- heading levels BCD, are optional and there may be several of each - (where all three are used corresponding to e.g. Book Part Section) - * sublevels that are used must follow each other sequentially - (alphabetically), -- heading levels A~ B~ C~ D~ are followed by other heading levels rather - than substantive text - which may be the subsequent sequential (alphabetic) heading part level - or a heading (segment) level 1~ -- there must be at least one heading (segment) level 1~ - (the level on which the text is segmented, in a book would correspond - to the Chapter level) -- additional heading levels 1~ 2~ 3~ are optional and there may be several - of each -- heading levels 1~ 2~ 3~ are followed by text (which may be followed by - the same heading level) - and/or the next lower numeric heading level (followed by text) - or indeed return to the relevant part level - (as a corollary to the rules above substantive text/ content - must be preceded by a level 1~ (2~ or 3~) heading) -.fi - -.SH MARKUP EXAMPLES - -.SH ONLINE - - -.BR -Online markup examples are available together with the respective outputs -produced from or from - - -.BR -There is of course this document, which provides a cursory overview of sisu -markup and the respective output produced: - - -.BR -an alternative presentation of markup syntax: -/usr/share/doc/sisu/on_markup.txt.gz -.SH INSTALLED - - -.BR -With -.B SiSU -installed sample skins may be found in: /usr/share/doc/sisu/markup-samples (or -equivalent directory) and if sisu -markup-samples is installed also under: -/usr/share/doc/sisu/markup-samples-non-free - -.SH MARKUP OF HEADERS - -.BR -Headers contain either: semantic meta-data about a document, which can be used -by any output module of the program, or; processing instructions. - -.BR -Note: the first line of a document may include information on the markup -version used in the form of a comment. Comments are a percentage mark at the -start of a paragraph (and as the first character in a line of text) followed by -a space and the comment: -.nf -% this would be a comment -.fi - -.SH SAMPLE HEADER - - -.BR -This current document is loaded by a master document that has a header similar -to this one: -.nf -% SiSU master 4.0 - -title: SiSU - subtitle: Manual - -creator: - author: Amissah, Ralph - -publisher: [publisher name] - -rights: Copyright (C) Ralph Amissah 2007, part of SiSU documentation, License GPL 3 - -classify: - topic_register: SiSU:manual;electronic documents:SiSU:manual - subject: ebook, epublishing, electronic book, electronic publishing, - electronic document, electronic citation, data structure, - citation systems, search - -% used_by: manual - -date: - published: 2008-05-22 - created: 2002-08-28 - issued: 2002-08-28 - available: 2002-08-28 - modified: 2010-03-03 - -make: - num_top: 1 - breaks: new=C; break=1 - bold: /Gnu|Debian|Ruby|SiSU/ - home_button_text: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org - footer: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org - manpage: name=sisu - documents: markup, structuring, publishing in multiple standard formats, and search; - synopsis=sisu [-abcDdeFhIiMmNnopqRrSsTtUuVvwXxYyZz0-9] [filename/wildcard ] - . sisu [-Ddcv] [instruction] - . sisu [-CcFLSVvW] - -@links: - { SiSU Homepage }http://www.sisudoc.org/ - { SiSU Manual }http://www.sisudoc.org/sisu/sisu_manual/ - { Book Samples & Markup Examples }http://www.jus.uio.no/sisu/SiSU/examples.html - { SiSU Download }http://www.jus.uio.no/sisu/SiSU/download.html - { SiSU Changelog }http://www.jus.uio.no/sisu/SiSU/changelog.html - { SiSU Git repo }http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary - { SiSU List Archives }http://lists.sisudoc.org/pipermail/sisu/ - { SiSU @ Debian }http://packages.qa.debian.org/s/sisu.html - { SiSU Project @ Debian }http://qa.debian.org/developer.php?login=sisu@lists.sisudoc.org - { SiSU @ Wikipedia }http://en.wikipedia.org/wiki/SiSU -.fi - -.SH AVAILABLE HEADERS - - -.BR -Header tags appear at the beginning of a document and provide meta information -on the document (such as the -.I Dublin Core -) , or information as to how the document as a whole is to be processed. All -header instructions take the form @headername: or on the next line and indented -by once space :subheadername: All -.I Dublin Core -meta tags are available - -.BR - -.B @identifier: -information or instructions - -.BR -where the "identifier" is a tag recognised by the program, and the -"information" or "instructions" belong to the tag/identifier specified - -.BR -Note: a header where used should only be used once; all headers apart from -@title: are optional; the @structure: header is used to describe document -structure, and can be useful to know. - -.BR -This is a sample header -.nf -% SiSU 2.0 [declared file-type identifier with markup version] -.fi - -.nf -@title: [title text] [this header is the only one that is mandatory] - subtitle: [subtitle if any] - language: English -.fi - -.nf -creator: - author: [Lastname, First names] - illustrator: [Lastname, First names] - translator: [Lastname, First names] - prepared_by: [Lastname, First names] -.fi - -.nf -date: - published: [year or yyyy-mm-dd] - created: [year or yyyy-mm-dd] - issued: [year or yyyy-mm-dd] - available: [year or yyyy-mm-dd] - modified: [year or yyyy-mm-dd] - valid: [year or yyyy-mm-dd] - added_to_site: [year or yyyy-mm-dd] - translated: [year or yyyy-mm-dd] -.fi - -.nf -rights: - copyright: Copyright (C) [Year and Holder] - license: [Use License granted] - text: [Year and Holder] - translation: [Name, Year] - illustrations: [Name, Year] -.fi - -.nf -classify: - topic_register: SiSU:markup sample:book;book:novel:fantasy - type: - subject: - description: - keywords: - abstract: - loc: [Library of Congress classification] - dewey: [Dewey classification -.fi - -.nf -identify: - :isbn: [ISBN] - :oclc: -.fi - -.nf -links: { SiSU }http://www.sisudoc.org - { FSF }http://www.fsf.org -.fi - -.nf -make: - num_top: 1 - headings: [text to match for each level - (e.g. PART; Chapter; Section; Article; or another: none; BOOK|FIRST|SECOND; none; CHAPTER;) - breaks: new=:C; break=1 - promo: sisu, ruby, sisu_search_libre, open_society - bold: [regular expression of words/phrases to be made bold] - italics: [regular expression of words/phrases to italicise] - home_button_text: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org - footer: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org -.fi - -.nf -original: - language: [language] -.fi - -.nf -notes: - comment: - prefix: [prefix is placed just after table of contents] -.fi - -.SH MARKUP OF SUBSTANTIVE TEXT - -.SH HEADING LEVELS - - -.BR -Heading levels are :A~ ,:B~ ,:C~ ,1~ ,2~ ,3~ ... :A - :C being part / section -headings, followed by other heading levels, and 1 -6 being headings followed by -substantive text or sub-headings. :A~ usually the title :A~? conditional level -1 heading (used where a stand-alone document may be imported into another) - -.BR - -.B :A~ [heading text] -Top level heading [this usually has similar content to the title @title: ] -NOTE: the heading levels described here are in 0.38 notation, see heading - -.BR - -.B :B~ [heading text] -Second level heading [this is a heading level divider] - -.BR - -.B :C~ [heading text] -Third level heading [this is a heading level divider] - -.BR - -.B 1~ [heading text] -Top level heading preceding substantive text of document or sub-heading 2, the -heading level that would normally be marked 1. or 2. or 3. etc. in a document, -and the level on which sisu by default would break html output into named -segments, names are provided automatically if none are given (a number), -otherwise takes the form 1~my_filename_for_this_segment - -.BR - -.B 2~ [heading text] -Second level heading preceding substantive text of document or sub-heading 3 , -the heading level that would normally be marked 1.1 or 1.2 or 1.3 or 2.1 etc. -in a document. - -.BR - -.B 3~ [heading text] -Third level heading preceding substantive text of document, that would normally -be marked 1.1.1 or 1.1.2 or 1.2.1 or 2.1.1 etc. in a document -.nf -1~filename level 1 heading, - -% the primary division such as Chapter that is followed by substantive text, and may be further subdivided (this is the level on which by default html segments are made) -.fi - -.SH FONT ATTRIBUTES - -.BR - -.B markup example: -.nf -normal text, *{emphasis}*, !{bold text}!, /{italics}/, _{underscore}_, "{citation}", -^{superscript}^, ,{subscript},, +{inserted text}+, -{strikethrough}-, #{monospace}# - -normal text - -*{emphasis}* [note: can be configured to be represented by bold, italics or underscore] - -!{bold text}! - -/{italics}/ - -_{underscore}_ - -"{citation}" - -^{superscript}^ - -,{subscript}, - -+{inserted text}+ - --{strikethrough}- - -#{monospace}# -.fi - - -.BR - -.B resulting output: - -.BR -normal text, -.B emphasis, -.B bold text -, -.I italics, -.I underscore, -"citation", ^superscript^, [subscript], ++inserted text++, --strikethrough--, -monospace - -.BR -normal text - -.BR - -.B emphasis -[note: can be configured to be represented by bold, italics or underscore] - -.BR - -.B bold text - -.BR - -.I italics - -.BR -.I underscore - -.BR -"citation" - -.BR -^superscript^ - -.BR -[subscript] - -.BR -++inserted text++ - -.BR ---strikethrough-- - -.BR -monospace -.SH INDENTATION AND BULLETS - - -.BR - -.B markup example: -.nf -ordinary paragraph - -_1 indent paragraph one step - -_2 indent paragraph two steps - -_9 indent paragraph nine steps -.fi - - -.BR - -.B resulting output: - -.BR -ordinary paragraph - -.BR - indent paragraph one step - -.BR - indent paragraph two steps - -.BR - indent paragraph nine steps - -.BR - -.B markup example: -.nf -_* bullet text - -_1* bullet text, first indent - -_2* bullet text, two step indent -.fi - - -.BR - -.B resulting output: - -.BR -- bullet text - -.BR - * bullet text, first indent - -.BR - * bullet text, two step indent - -.BR -Numbered List (not to be confused with headings/titles, (document structure)) - -.BR - -.B markup example: -.nf -# numbered list numbered list 1., 2., 3, etc. - -_# numbered list numbered list indented a., b., c., d., etc. -.fi - -.SH HANGING INDENTS - - -.BR - -.B markup example: -.nf -_0_1 first line no indent, -rest of paragraph indented one step - -_1_0 first line indented, -rest of paragraph no indent - -in each case level may be 0-9 -.fi - - -.BR - -.B resulting output: - -.BR -first line no indent, rest of paragraph indented one step; first line no - indent, rest of paragraph indented one step; first line no indent, rest of - paragraph indented one step; first line no indent, rest of paragraph indented - one step; first line no indent, rest of paragraph indented one step; first - line no indent, rest of paragraph indented one step; first line no indent, - rest of paragraph indented one step; first line no indent, rest of paragraph - indented one step; first line no indent, rest of paragraph indented one step; - -.BR -A regular paragraph. - -.BR -first line indented, rest of paragraph no indent first line indented, rest of -paragraph no indent first line indented, rest of paragraph no indent first line -indented, rest of paragraph no indent first line indented, rest of paragraph no -indent first line indented, rest of paragraph no indent first line indented, -rest of paragraph no indent first line indented, rest of paragraph no indent -first line indented, rest of paragraph no indent first line indented, rest of -paragraph no indent first line indented, rest of paragraph no indent - -.BR -in each case level may be 0-9 - -.BR - -.B live-build - A collection of scripts used to build customized -.B Debian - Livesystems. - .I live-build - was formerly known as live-helper, and even earlier known as live-package. - -.BR - -.B live-build - - A collection of scripts used to build customized -.B Debian - Livesystems. -.I live-build - was formerly known as live-helper, and even earlier known as live-package. -.SH FOOTNOTES / ENDNOTES - - -.BR -Footnotes and endnotes are marked up at the location where they would be -indicated within a text. They are automatically numbered. The output type -determines whether footnotes or endnotes will be produced - -.BR - -.B markup example: -.nf -~{ a footnote or endnote }~ -.fi - - -.BR - -.B resulting output: - -.BR -[^5] - -.BR - -.B markup example: -.nf -normal text~{ self contained endnote marker & endnote in one }~ continues -.fi - - -.BR - -.B resulting output: - -.BR -normal text[^6] continues - -.BR - -.B markup example: -.nf -normal text ~{* unnumbered asterisk footnote/endnote, insert multiple asterisks if required }~ continues - -normal text ~{** another unnumbered asterisk footnote/endnote }~ continues -.fi - - -.BR - -.B resulting output: - -.BR -normal text [^*] continues - -.BR -normal text [^**] continues - -.BR - -.B markup example: -.nf -normal text ~[* editors notes, numbered asterisk footnote/endnote series ]~ continues - -normal text ~[+ editors notes, numbered plus symbol footnote/endnote series ]~ continues -.fi - - -.BR - -.B resulting output: - -.BR -normal text [^*3] continues - -.BR -normal text [^+2] continues - -.BR - -.B Alternative endnote pair notation for footnotes/endnotes: -.nf -% note the endnote marker "~^" - -normal text~^ continues - -^~ endnote text following the paragraph in which the marker occurs -.fi - - -.BR -the standard and pair notation cannot be mixed in the same document -.SH LINKS - -.SH NAKED URLS WITHIN TEXT, DEALING WITH URLS - - -.BR -urls found within text are marked up automatically. A url within text is -automatically hyperlinked to itself and by default decorated with angled -braces, unless they are contained within a code block (in which case they are -passed as normal text), or escaped by a preceding underscore (in which case the -decoration is omitted). - -.BR - -.B markup example: -.nf -normal text http://www.sisudoc.org/ continues -.fi - - -.BR - -.B resulting output: - -.BR -normal text continues - -.BR -An escaped url without decoration - -.BR - -.B markup example: -.nf -normal text _http://www.sisudoc.org/ continues - -deb _http://www.jus.uio.no/sisu/archive unstable main non-free -.fi - - -.BR - -.B resulting output: - -.BR -normal text <_http://www.sisudoc.org/> continues - -.BR -deb <_http://www.jus.uio.no/sisu/archive> unstable main non-free - -.BR -where a code block is used there is neither decoration nor hyperlinking, code -blocks are discussed later in this document - -.BR - -.B resulting output: -.nf -deb http://www.jus.uio.no/sisu/archive unstable main non-free -deb-src http://www.jus.uio.no/sisu/archive unstable main non-free -.fi - -.SH LINKING TEXT - - -.BR -To link text or an image to a url the markup is as follows - -.BR - -.B markup example: -.nf -about { SiSU }http://url.org markup -.fi - - -.BR - -.B resulting output: - -.BR -aboutSiSU markup - -.BR -A shortcut notation is available so the url link may also be provided -automatically as a footnote - -.BR - -.B markup example: -.nf -about {~^ SiSU }http://url.org markup -.fi - - -.BR - -.B resulting output: - -.BR -aboutSiSU [^7] markup - -.BR -Internal document links to a tagged location, including an ocn - -.BR - -.B markup example: -.nf -about { text links }#link_text -.fi - - -.BR - -.B resulting output: - -.BR -about ⌠text links⌡⌈link_text⌋ - -.BR -Shared document collection link - -.BR - -.B markup example: -.nf -about { SiSU book markup examples }:SiSU/examples.html -.fi - - -.BR - -.B resulting output: - -.BR -about ⌠ -.B SiSU -book markup examples⌡⌈:SiSU/examples.html⌋ -.SH LINKING IMAGES - - -.BR - -.B markup example: -.nf -{ tux.png 64x80 }image - -% various url linked images - -{tux.png 64x80 "a better way" }http://www.sisudoc.org/ - -{GnuDebianLinuxRubyBetterWay.png 100x101 "Way Better - with Gnu/Linux, Debian and Ruby" }http://www.sisudoc.org/ - -{~^ ruby_logo.png "Ruby" }http://www.ruby-lang.org/en/ -.fi - - -.BR - -.B resulting output: - -.BR -[ tux.png ] - -.BR -tux.png 64x80 "Gnu/Linux - a better way" - -.BR -GnuDebianLinuxRubyBetterWay.png 100x101 "Way Better - with Gnu/Linux, Debian -and Ruby" - -.BR -ruby_logo.png 70x90 "Ruby" [^8] - -.BR - -.B linked url footnote shortcut -.nf -{~^ [text to link] }http://url.org - -% maps to: { [text to link] }http://url.org ~{ http://url.org }~ - -% which produces hyper-linked text within a document/paragraph, with an endnote providing the url for the text location used in the hyperlink -.fi - -.nf -text marker *~name -.fi - - -.BR -note at a heading level the same is automatically achieved by providing names -to headings 1, 2 and 3 i.e. 2~[name] and 3~[name] or in the case of -auto-heading numbering, without further intervention. -.SH LINK SHORTCUT FOR MULTIPLE VERSIONS OF A SISU DOCUMENT IN THE SAME DIRECTORY -TREE - - -.BR - -.B markup example: -.nf -!_ /{"Viral Spiral"}/, David Bollier - -{ "Viral Spiral", David Bollier [3sS]}viral_spiral.david_bollier.sst -.fi - - -.BR - -.B -.I "Viral Spiral", -David Bollier -"Viral Spiral", David Bollier - document manifest - ⌠html, segmented text⌡「http://corundum/sisu_manual/en/html/viral_spiral.david_bollier.html」 - ⌠html, scroll, document in one⌡「http://corundum/sisu_manual/en/html/viral_spiral.david_bollier.html」 - ⌠epub⌡「http://corundum/sisu_manual/en/epub/viral_spiral.david_bollier.epub」 - ⌠pdf, landscape⌡「http://corundum/sisu_manual/en/pdf/viral_spiral.david_bollier.pdf」 - ⌠pdf, portrait⌡「http://corundum/sisu_manual/en/pdf/viral_spiral.david_bollier.pdf」 - ⌠odf: odt, open document text⌡「http://corundum/sisu_manual/en/odt/viral_spiral.david_bollier.odt」 - ⌠xhtml scroll⌡「http://corundum/sisu_manual/en/xhtml/viral_spiral.david_bollier.xhtml」 - ⌠xml, sax⌡「http://corundum/sisu_manual/en/xml/viral_spiral.david_bollier.xml」 - ⌠xml, dom⌡「http://corundum/sisu_manual/en/xml/viral_spiral.david_bollier.xml」 - ⌠concordance⌡「http://corundum/sisu_manual/en/html/viral_spiral.david_bollier.html」 - ⌠dcc, document content certificate (digests)⌡「http://corundum/sisu_manual/en/digest/viral_spiral.david_bollier.txt」 - ⌠markup source text⌡「http://corundum/sisu_manual/en/src/viral_spiral.david_bollier.sst」 - ⌠markup source (zipped) pod⌡「http://corundum/sisu_manual/en/pod/viral_spiral.david_bollier.sst.zip」 - -.SH GROUPED TEXT / BLOCKED TEXT - - -.BR -There are two markup syntaxes for blocked text, using curly braces or using -tics -.SH BLOCKED TEXT CURLY BRACE SYNTAX - - -.BR -at the start of a line on its own use name of block type with an opening curly -brace, follow with the content of the block, and close with a closing curly -brace and the name of the block type, e.g. -.nf -code{ - -this is a code block - -}code -.fi - -.nf - -poem{ - -this here is a poem - -}poem -.fi - -.SH BLOCKED TEXT TIC SYNTAX - -.nf -``` code -this is a code block - -``` - -``` poem -this here is a poem - -``` -.fi - - -.BR -start a line with three backtics, a space followed by the name of the name of -block type, follow with the content of the block, and close with three back -ticks on a line of their own, e.g. -.SH TABLES - - -.BR -Tables may be prepared in two either of two forms - -.BR - -.B markup example: -.nf -table{ c3; 40; 30; 30; - -This is a table -this would become column two of row one -column three of row one is here - -And here begins another row -column two of row two -column three of row two, and so on - -}table -.fi - - -.BR - -.B resulting output: -This is a table|this would become column two of row one|column three of row one is here』And here begins another row|column two of row two|column three of row two, and so on』 - - -.BR -a second form may be easier to work with in cases where there is not much -information in each column - -.BR - -.B markup example: -[^9] -.nf -!_ Table 3.1: Contributors to Wikipedia, January 2001 - June 2005 - -{table~h 24; 12; 12; 12; 12; 12; 12;} - |Jan. 2001|Jan. 2002|Jan. 2003|Jan. 2004|July 2004|June 2006 -Contributors* | 10| 472| 2,188| 9,653| 25,011| 48,721 -Active contributors** | 9| 212| 846| 3,228| 8,442| 16,945 -Very active contributors*** | 0| 31| 190| 692| 1,639| 3,016 -No. of English language articles| 25| 16,000| 101,000| 190,000| 320,000| 630,000 -No. of articles, all languages | 25| 19,000| 138,000| 490,000| 862,000|1,600,000 - -- Contributed at least ten times; ** at least 5 times in last month; *** more than 100 times in last month. -.fi - - -.BR - -.B resulting output: - -.BR - -.B Table 3.1: Contributors to Wikipedia, January 2001 - June 2005 -|Jan. 2001|Jan. 2002|Jan. 2003|Jan. 2004|July 2004|June 2006』Contributors*|10|472|2,188|9,653|25,011|48,721』Active contributors**|9|212|846|3,228|8,442|16,945』Very active contributors***|0|31|190|692|1,639|3,016』No. of English language articles|25|16,000|101,000|190,000|320,000|630,000』No. of articles, all languages|25|19,000|138,000|490,000|862,000|1,600,000』 - - -.BR -- Contributed at least ten times; ** at least 5 times in last month; *** more -than 100 times in last month. -.SH POEM - - -.BR - -.B basic markup: -.nf -poem{ - - Your poem here - -}poem - -Each verse in a poem is given an object number. -.fi - - -.BR - -.B markup example: -.nf -poem{ - - `Fury said to a - mouse, That he - met in the - house, - "Let us - both go to - law: I will - prosecute - YOU. --Come, - I'll take no - denial; We - must have a - trial: For - really this - morning I've - nothing - to do." - Said the - mouse to the - cur, "Such - a trial, - dear Sir, - With - no jury - or judge, - would be - wasting - our - breath." - "I'll be - judge, I'll - be jury," - Said - cunning - old Fury: - "I'll - try the - whole - cause, - and - condemn - you - to - death."' - -}poem -.fi - - -.BR - -.B resulting output: - `Fury said to a - mouse, That he - met in the - house, - "Let us - both go to - law: I will - prosecute - YOU. --Come, - I'll take no - denial; We - must have a - trial: For - really this - morning I've - nothing - to do." - Said the - mouse to the - cur, "Such - a trial, - dear Sir, - With - no jury - or judge, - would be - wasting - our - breath." - "I'll be - judge, I'll - be jury," - Said - cunning - old Fury: - "I'll - try the - whole - cause, - and - condemn - you - to - death."' - - -.SH GROUP - - -.BR - -.B basic markup: -.nf -group{ - - Your grouped text here - -}group - -A group is treated as an object and given a single object number. -.fi - - -.BR - -.B markup example: -.nf -group{ - - `Fury said to a - mouse, That he - met in the - house, - "Let us - both go to - law: I will - prosecute - YOU. --Come, - I'll take no - denial; We - must have a - trial: For - really this - morning I've - nothing - to do." - Said the - mouse to the - cur, "Such - a trial, - dear Sir, - With - no jury - or judge, - would be - wasting - our - breath." - "I'll be - judge, I'll - be jury," - Said - cunning - old Fury: - "I'll - try the - whole - cause, - and - condemn - you - to - death."' - -}group -.fi - - -.BR - -.B resulting output: - `Fury said to a - mouse, That he - met in the - house, - "Let us - both go to - law: I will - prosecute - YOU. --Come, - I'll take no - denial; We - must have a - trial: For - really this - morning I've - nothing - to do." - Said the - mouse to the - cur, "Such - a trial, - dear Sir, - With - no jury - or judge, - would be - wasting - our - breath." - "I'll be - judge, I'll - be jury," - Said - cunning - old Fury: - "I'll - try the - whole - cause, - and - condemn - you - to - death."' - - -.SH CODE - - -.BR -Code tags code{ ... }code (used as with other group tags described above) are -used to escape regular sisu markup, and have been used extensively within this -document to provide examples of -.B SiSU -markup. You cannot however use code tags to escape code tags. They are however -used in the same way as group or poem tags. - -.BR -A code-block is treated as an object and given a single object number. [an -option to number each line of code may be considered at some later time] - -.BR - -.B use of code tags instead of poem compared, resulting output: -.nf - `Fury said to a - mouse, That he - met in the - house, - "Let us - both go to - law: I will - prosecute - YOU. --Come, - I'll take no - denial; We - must have a - trial: For - really this - morning I've - nothing - to do." - Said the - mouse to the - cur, "Such - a trial, - dear Sir, - With - no jury - or judge, - would be - wasting - our - breath." - "I'll be - judge, I'll - be jury," - Said - cunning - old Fury: - "I'll - try the - whole - cause, - and - condemn - you - to - death."' -.fi - - -.BR -From -.B SiSU -2.7.7 on you can number codeblocks by placing a hash after the opening code tag -code{# as demonstrated here: -.nf -1 | `Fury said to a -2 | mouse, That he -3 | met in the -4 | house, -5 | "Let us -6 | both go to -7 | law: I will -8 | prosecute -9 | YOU. --Come, -10 | I'll take no -11 | denial; We -12 | must have a -13 | trial: For -14 | really this -15 | morning I've -16 | nothing -17 | to do." -18 | Said the -19 | mouse to the -20 | cur, "Such -21 | a trial, -22 | dear Sir, -23 | With -24 | no jury -25 | or judge, -26 | would be -27 | wasting -28 | our -29 | breath." -30 | "I'll be -31 | judge, I'll -32 | be jury," -33 | Said -34 | cunning -35 | old Fury: -36 | "I'll -37 | try the -38 | whole -39 | cause, -40 | and -41 | condemn -42 | you -43 | to -44 | death."' -.fi - -.SH ADDITIONAL BREAKS - LINEBREAKS WITHIN OBJECTS, COLUMN AND PAGE-BREAKS - -.SH LINE-BREAKS - - -.BR -To break a line within a "paragraph object", two backslashes \e\e -with a space before and a space or newline after them -may be used. -.nf -To break a line within a "paragraph object", -two backslashes \e\e with a space before -and a space or newline after them \e\e -may be used. -.fi - - -.BR -The html break br enclosed in angle brackets (though undocumented) is available -in versions prior to 3.0.13 and 2.9.7 (it remains available for the time being, -but is depreciated). - -.BR -To draw a dividing line dividing paragraphs, see the section on page breaks. -.SH PAGE BREAKS - - -.BR -Page breaks are only relevant and honored in some output formats. A page break -or a new page may be inserted manually using the following markup on a line on -its own: - -.BR -page new =\e= breaks the page, starts a new page. - -.BR -page break -\- breaks a column, starts a new column, if using columns, else -breaks the page, starts a new page. - -.BR -page break line across page -..- draws a dividing line, dividing paragraphs - -.BR -page break: -.nf --\e\e- -.fi - - -.BR -page (break) new: -.nf -=\e\e= -.fi - - -.BR -page (break) line across page (dividing paragraphs): -.nf --..- -.fi - -.SH BIBLIOGRAPHY / REFERENCES - - -.BR -There are three ways to prepare a bibliography using sisu (which are mutually -exclusive): (i) manually preparing and marking up as regular text in sisu a -list of references, this is treated as a regular document segment (and placed -before endnotes if any); (ii) preparing a bibliography, marking a heading level -1~!biblio (note the exclamation mark) and preparing a bibliography using -various metadata tags including for author: title: year: a list of which is -provided below, or; (iii) as an assistance in preparing a bibliography, marking -a heading level 1~!biblio and tagging citations within footnotes for inclusion, -identifying citations and having a parser attempt to extract them and build a -bibliography of the citations provided. - -.BR -For the heading/section sequence: endnotes, bibliography then book index to -occur, the name biblio or bibliography must be given to the bibliography -section, like so: -.nf -1~!biblio~ [Note: heading marker::required title missing] -.fi - -.SH A MARKUP TAGGED METADATA BIBLIOGRAPHY SECTION - - -.BR -Here instead of writing your full citations directly in footnotes, each time -you have new material to cite, you add it to your bibliography section (if it -has not been added yet) providing the information you need against an available -list of tags (provided below). - -.BR -The required tags are au: ti: and year: [^10] an short quick example might be -as follows: -.nf -1~!biblio~ [Note: heading marker::required title missing] - -au: von Hippel, E. -ti: Perspective: User Toolkits for Innovation -lng: (language) -jo: Journal of Product Innovation Management -vo: 18 -ed: (editor) -yr: 2001 -note: -sn: Hippel, /{User Toolkits}/ (2001) -id: vHippel_2001 -% form: - -au: Benkler, Yochai -ti: The Wealth of Networks -st: How Social Production Transforms Markets and Freedom -lng: (language) -pb: Harvard University Press -edn: (edition) -yr: 2006 -pl: U.S. -url: http://cyber.law.harvard.edu/wealth_of_networks/Main_Page -note: -sn: Benkler, /{Wealth of Networks}/ (2006) -id: Benkler2006 - -au: Quixote, Don; Panza, Sancho -ti: Taming Windmills, Keeping True -jo: Imaginary Journal -yr: 1605 -url: https://en.wikipedia.org/wiki/Don_Quixote -note: made up to provide an example of author markup for an article with two authors -sn: Quixote & Panza, /{Taming Windmills}/ (1605) -id: quixote1605 -.fi - - -.BR -Note that the section name !biblio (or !bibliography) is required for the -bibliography to be treated specially as such, and placed after the -auto-generated endnote section. - -.BR -Using this method, work goes into preparing the bibliography, the tags author -or editor, year and title are required and will be used to sort the -bibliography that is placed under the Bibliography section - -.BR -The metadata tags may include shortname (sn:) and id, if provided, which are -used for substitution within text. Every time the given id is found within the -text it will be replaced by the given short title of the work (it is for this -reason the short title has sisu markup to italicize the title), it should work -with any page numbers to be added, the short title should be one that can -easily be used to look up the full description in the bibliography. -.nf -The following footnote~{ quixote1605, pp 1000 - 1001, also Benkler2006 p 1. }~ -.fi - - -.BR -would be presented as: - -.BR -Quixote and Panza, -.I Taming Windmills -(1605), pp 1000 - 1001 also, Benkler, -.I Wealth of Networks, -(2006) p 1 or rather[^11] -.nf -au: author Surname, FirstNames (if multiple semi-colon separator) - (required unless editor to be used instead) -ti: title (required) -st: subtitle -jo: journal -vo: volume -ed: editor (required if author not provided) -tr: translator -src: source (generic field where others are not appropriate) -in: in (like src) -pl: place/location (state, country) -pb: publisher -edn: edition -yr: year (yyyy or yyyy-mm or yyyy-mm-dd) (required) -pg: pages -url: http://url -note: note -id: create_short_identifier e.g. authorSurnameYear - (used in substitutions: when found within text will be - replaced by the short name provided) -sn: short name e.g. Author, /{short title}/, Year - (used in substitutions: when an id is found within text - the short name will be used to replace it) -.fi - -.SH TAGGING CITATIONS FOR INCLUSION IN THE BIBLIOGRAPHY - - -.BR -Here whenever you make a citation that you wish be included in the -bibliography, you tag the citation as such using special delimiters (which are -subsequently removed from the final text produced by sisu) - -.BR -Here you would write something like the following, either in regular text or a -footnote -.nf -See .: Quixote, Don; Panza, Sancho /{Taming Windmills, Keeping True}/ (1605) :. -.fi - - -.BR - -.B SiSU -will parse for a number of patterns within the delimiters to try make out the -authors, title, date etc. and from that create a Bibliography. This is more -limited than the previously described method of preparing a tagged -bibliography, and using an id within text to identify the work, which also -lends itself to greater consistency. -.SH GLOSSARY - - -.BR -Using the section name 1~!glossary results in the Glossary being treated -specially as such, and placed after the auto-generated endnote section (before -the bibliography/list of references if there is one). - -.BR -The Glossary is ordinary text marked up in a manner deemed suitable for that -purpose. e.g. with the term in bold, possibly with a hanging indent. -.nf -1~!glossary~ [Note: heading marker::required title missing] - -_0_1 *{GPL}* An abbreviation that stands for "General Purpose License." ... - -_0_1 [provide your list of terms and definitions] -.fi - - -.BR -In the given example the first line is not indented subsequent lines are by one -level, and the term to be defined is in bold text. -.SH BOOK INDEX - - -.BR -To make an index append to paragraph the book index term relates to it, using -an equal sign and curly braces. - -.BR -Currently two levels are provided, a main term and if needed a sub-term. -Sub-terms are separated from the main term by a colon. -.nf - Paragraph containing main term and sub-term. - ={Main term:sub-term} -.fi - - -.BR -The index syntax starts on a new line, but there should not be an empty line -between paragraph and index markup. - -.BR -The structure of the resulting index would be: -.nf - Main term, 1 - sub-term, 1 -.fi - - -.BR -Several terms may relate to a paragraph, they are separated by a semicolon. If -the term refers to more than one paragraph, indicate the number of paragraphs. -.nf - Paragraph containing main term, second term and sub-term. - ={first term; second term: sub-term} -.fi - - -.BR -The structure of the resulting index would be: -.nf - First term, 1, - Second term, 1, - sub-term, 1 -.fi - - -.BR -If multiple sub-terms appear under one paragraph, they are separated under the -main term heading from each other by a pipe symbol. -.nf - Paragraph containing main term, second term and sub-term. - ={Main term: - sub-term+2|second sub-term; - Another term - } - - A paragraph that continues discussion of the first sub-term -.fi - - -.BR -The plus one in the example provided indicates the first sub-term spans one -additional paragraph. The logical structure of the resulting index would be: -.nf - Main term, 1, - sub-term, 1-3, - second sub-term, 1, - Another term, 1 -.fi - -.SH COMPOSITE DOCUMENTS MARKUP - - -.BR -It is possible to build a document by creating a master document that requires -other documents. The documents required may be complete documents that could be -generated independently, or they could be markup snippets, prepared so as to be -easily available to be placed within another text. If the calling document is a -master document (built from other documents), it should be named with the -suffix -.B .ssm -Within this document you would provide information on the other documents that -should be included within the text. These may be other documents that would be -processed in a regular way, or markup bits prepared only for inclusion within a -master document -.B .sst -regular markup file, or -.B .ssi -(insert/information) A secondary file of the composite document is built prior -to processing with the same prefix and the suffix -.B ._sst - -.BR -basic markup for importing a document into a master document -.nf -<< filename1.sst - -<< filename2.ssi -.fi - - -.BR -The form described above should be relied on. Within the -.I Vim -editor it results in the text thus linked becoming hyperlinked to the document -it is calling in which is convenient for editing. -.SH SUBSTITUTIONS - - -.BR - -.B markup example: -.nf -The current Debian is ${debian_stable} the next debian will be ${debian_testing} - -Configure substitution in _sisu/sisu_document_make - -make: - substitute: /${debian_stable}/,'*{Wheezy}*' /${debian_testing}/,'*{Jessie}*' -.fi - - -.BR - -.B resulting output: - -.BR -The current -.B Debian -is -.B Jessie -the next debian will be -.B Stretch - -.BR -Configure substitution in _sisu/sisu_document_make -.SH SISU FILETYPES - - -.BR - -.B SiSU -has -.I plaintext -and binary filetypes, and can process either type of document. -.SH .SST .SSM .SSI MARKED UP PLAIN TEXT - -.TP -.B SiSU -documents are prepared as plain-text (utf-8) files with -.B SiSU -markup. They may make reference to and contain images (for example), which are -stored in the directory beneath them _sisu/image. 〔b¤SiSU -.I plaintext -markup files are of three types that may be distinguished by the file extension -used: regular text .sst; master documents, composite documents that incorporate -other text, which can be any regular text or text insert; and inserts the -contents of which are like regular text except these are marked .ssi and are -not processed. - -.BR - -.B SiSU -processing can be done directly against a sisu documents; which may be located -locally or on a remote server for which a url is provided. - -.BR - -.B SiSU -source markup can be shared with the command: - -.BR - sisu -s [filename] -.SH SISU TEXT - REGULAR FILES (.SST) - - -.BR -The most common form of document in -.B SiSU, -see the section on -.B SiSU -markup. -.SH SISU MASTER FILES (.SSM) - - -.BR -Composite documents which incorporate other -.B SiSU -documents which may be either regular -.B SiSU -text .sst which may be generated independently, or inserts prepared solely for -the purpose of being incorporated into one or more master documents. - -.BR -The mechanism by which master files incorporate other documents is described as -one of the headings under under -.B SiSU -markup in the -.B SiSU -manual. - -.BR -Note: Master documents may be prepared in a similar way to regular documents, -and processing will occur normally if a .sst file is renamed .ssm without -requiring any other documents; the .ssm marker flags that the document may -contain other documents. - -.BR -Note: a secondary file of the composite document is built prior to processing -with the same prefix and the suffix ._sst -.SH SISU INSERT FILES (.SSI) - - -.BR -Inserts are documents prepared solely for the purpose of being incorporated -into one or more master documents. They resemble regular -.B SiSU -text files (.sst). Since sisu -5.5.0 (6.1.0) .ssi files can like .ssm files -include other .sst or .ssm files. .ssi files cannot be called by the sisu -processor directly and can only be incorporated in other documents. Making a -file a .ssi file is a quick and convenient way of breaking up a document that -is to be included in a master document, and flagging that the file to be -incorporated .ssi is not intended that the file should be processed on its own. -.SH SISUPOD, ZIPPED BINARY CONTAINER (SISUPOD.ZIP, .SSP) - - -.BR -A sisupod is a zipped -.B SiSU -text file or set of -.B SiSU -text files and any associated images that they contain (this will be extended -to include sound and multimedia-files) -.TP -.B SiSU -.I plaintext -files rely on a recognised directory structure to find contents such as images -associated with documents, but all images for example for all documents -contained in a directory are located in the sub-directory _sisu/image. Without -the ability to create a sisupod it can be inconvenient to manually identify all -other files associated with a document. A sisupod automatically bundles all -associated files with the document that is turned into a pod. - -.BR -The structure of the sisupod is such that it may for example contain a single -document and its associated images; a master document and its associated -documents and anything else; or the zipped contents of a whole directory of -prepared -.B SiSU -documents. - -.BR -The command to create a sisupod is: - -.BR - sisu -S [filename] - -.BR -Alternatively, make a pod of the contents of a whole directory: - -.BR - sisu -S - -.BR - -.B SiSU -processing can be done directly against a sisupod; which may be located locally -or on a remote server for which a url is provided. - -.BR - - -.BR - -.SH CONFIGURATION - -.SH CONFIGURATION FILES - -.SH CONFIG.YML - - -.BR - -.B SiSU -configration parameters are adjusted in the configuration file, which can be -used to override the defaults set. This includes such things as which directory -interim processing should be done in and where the generated output should be -placed. - -.BR -The -.B SiSU -configuration file is a yaml file, which means indentation is significant. - -.BR - -.B SiSU -resource configuration is determined by looking at the following files if they -exist: - -.BR - ./_sisu/v7/sisurc.yml - -.BR - ./_sisu/sisurc.yml - -.BR - ~/.sisu/v7/sisurc.yml - -.BR - ~/.sisu/sisurc.yml - -.BR - /etc/sisu/v7/sisurc.yml - -.BR - /etc/sisu/sisurc.yml - -.BR -The search is in the order listed, and the first one found is used. - -.BR -In the absence of instructions in any of these it falls back to the internal -program defaults. - -.BR -Configuration determines the output and processing directories and the database -access details. - -.BR -If -.B SiSU -is installed a sample sisurc.yml may be found in /etc/sisu/sisurc.yml -.SH SISU_DOCUMENT_MAKE - - -.BR -Most sisu document headers relate to metadata, the exception is the @make: -header which provides processing related information. The default contents of -the @make header may be set by placing them in a file sisu_document_make. - -.BR -The search order is as for resource configuration: - -.BR - ./_sisu/v7/sisu_document_make - -.BR - ./_sisu/sisu_document_make - -.BR - ~/.sisu/v7/sisu_document_make - -.BR - ~/.sisu/sisu_document_make - -.BR - /etc/sisu/v7/sisu_document_make - -.BR - /etc/sisu/sisu_document_make - -.BR -A sample sisu_document_make can be found in the _sisu/ directory under along -with the provided sisu markup samples. -.SH CSS - CASCADING STYLE SHEETS (FOR HTML, XHTML AND XML) - - -.BR -CSS files to modify the appearance of -.B SiSU -html, -.I XHTML -or -.I XML -may be placed in the configuration directory: ./_sisu/css ; ~/.sisu/css or; -/etc/sisu/css and these will be copied to the output directories with the -command sisu -CC. - -.BR -The basic CSS file for html output is html. css, placing a file of that name in -directory _sisu/css or equivalent will result in the default file of that name -being overwritten. - -.BR - -.I HTML: -html. css - -.BR - -.I XML -DOM: dom.css - -.BR - -.I XML -SAX: sax.css - -.BR - -.I XHTML: -xhtml. css - -.BR -The default homepage may use homepage.css or html. css - -.BR -Under consideration is to permit the placement of a CSS file with a different -name in directory _sisu/css directory or equivalent.[^12] -.SH ORGANISING CONTENT - DIRECTORY STRUCTURE AND MAPPING - - -.BR - -.B SiSU -v3 has new options for the source directory tree, and output directory -structures of which there are 3 alternatives. -.SH DOCUMENT SOURCE DIRECTORY - - -.BR -The document source directory is the directory in which sisu processing -commands are given. It contains the sisu source files (.sst .ssm .ssi), or (for -sisu v3 may contain) subdirectories with language codes which contain the sisu -source files, so all English files would go in subdirectory en/, French in fr/, -Spanish in es/ and so on. ISO 639-1 codes are used (as varied by po4a). A list -of available languages (and possible sub-directory names) can be obtained with -the command "sisu --help lang" The list of languages is limited to langagues -supported by XeTeX polyglosia. -.SH GENERAL DIRECTORIES - -.nf - ./subject_name/ - -% files stored at this level e.g. sisu_manual.sst or -% for sisu v3 may be under language sub-directories -% e.g. - - ./subject_name/en - - ./subject_name/fr - - ./subject_name/es - - ./subject_name/_sisu - - ./subject_name/_sisu/css - - ./subject_name/_sisu/image -.fi - -.SH DOCUMENT OUTPUT DIRECTORY STRUCTURES - -.SH OUTPUT DIRECTORY ROOT - - -.BR -The output directory root can be set in the sisurc.yml file. Under the root, -subdirectories are made for each directory in which a document set resides. If -you have a directory named poems or conventions, that directory will be created -under the output directory root and the output for all documents contained in -the directory of a particular name will be generated to subdirectories beneath -that directory (poem or conventions). A document will be placed in a -subdirectory of the same name as the document with the filetype identifier -stripped (.sst .ssm) - -.BR -The last part of a directory path, representing the sub-directory in which a -document set resides, is the directory name that will be used for the output -directory. This has implications for the organisation of document collections -as it could make sense to place documents of a particular subject, or type -within a directory identifying them. This grouping as suggested could be by -subject (sales_law, english_literature); or just as conveniently by some other -classification (X University). The mapping means it is also possible to place -in the same output directory documents that are for organisational purposes -kept separately, for example documents on a given subject of two different -institutions may be kept in two different directories of the same name, under a -directory named after each institution, and these would be output to the same -output directory. Skins could be associated with each institution on a -directory basis and resulting documents will take on the appropriate different -appearance. -.SH ALTERNATIVE OUTPUT STRUCTURES - - -.BR -There are 3 possibile output structures described as being, by language, by -filetype or by filename, the selection is made in sisurc.yml -.nf -#% output_dir_structure_by: language; filetype; or filename -output_dir_structure_by: language #(language & filetype, preferred?) -#output_dir_structure_by: filetype -#output_dir_structure_by: filename #(default, closest to original v1 & v2) -.fi - -.SH BY LANGUAGE - - -.BR -The by language directory structure places output files - -.BR -The by language directory structure separates output files by language code -(all files of a given language), and within the language directory by filetype. - -.BR -Its selection is configured in sisurc.yml - -.BR -output_dir_structure_by: language -.nf - |-- en - |-- epub - |-- hashes - |-- html - | |-- viral_spiral.david_bollier - | |-- manifest - | |-- qrcode - | |-- odt - | |-- pdf - | |-- sitemaps - | |-- txt - | |-- xhtml - | `-- xml - |-- po4a - | `-- live-manual - | |-- po - | |-- fr - | `-- pot - `-- _sisu - |-- css - |-- image - |-- image_sys -> ../../_sisu/image_sys - `-- xml - |-- rnc - |-- rng - `-- xsd -.fi - - -.BR -#by: language subject_dir/en/manifest/filename.html -.SH BY FILETYPE - - -.BR -The by filetype directory structure separates output files by filetype, all -html files in one directory pdfs in another and so on. Filenames are given a -language extension. - -.BR -Its selection is configured in sisurc.yml - -.BR -output_dir_structure_by: filetype -.nf - |-- epub - |-- hashes - |-- html - |-- viral_spiral.david_bollier - |-- manifest - |-- qrcode - |-- odt - |-- pdf - |-- po4a - |-- live-manual - | |-- po - | |-- fr - | `-- pot - |-- _sisu - | |-- css - | |-- image - | |-- image_sys -> ../../_sisu/image_sys - | `-- xml - | |-- rnc - | |-- rng - | `-- xsd - |-- sitemaps - |-- txt - |-- xhtml - `-- xml -.fi - - -.BR -#by: filetype subject_dir/html/filename/manifest.en.html -.SH BY FILENAME - - -.BR -The by filename directory structure places most output of a particular file -(the different filetypes) in a common directory. - -.BR -Its selection is configured in sisurc.yml - -.BR -output_dir_structure_by: filename -.nf - |-- epub - |-- po4a - |-- live-manual - | |-- po - | |-- fr - | `-- pot - |-- _sisu - | |-- css - | |-- image - | |-- image_sys -> ../../_sisu/image_sys - | `-- xml - | |-- rnc - | |-- rng - | `-- xsd - |-- sitemaps - |-- src - |-- pod - `-- viral_spiral.david_bollier -.fi - - -.BR -#by: filename subject_dir/filename/manifest.en.html -.SH REMOTE DIRECTORIES - -.nf - ./subject_name/ - -% containing sub_directories named after the generated files from which they are made - - ./subject_name/src - -% contains shared source files text and binary e.g. sisu_manual.sst and sisu_manual.sst.zip - - ./subject_name/_sisu - -% configuration file e.g. sisurc.yml - - ./subject_name/_sisu/skin - -% skins in various skin directories doc, dir, site, yml - - ./subject_name/_sisu/css - - ./subject_name/_sisu/image - -% images for documents contained in this directory - - ./subject_name/_sisu/mm -.fi - -.SH SISUPOD - -.nf - ./sisupod/ - -% files stored at this level e.g. sisu_manual.sst - - ./sisupod/_sisu - -% configuration file e.g. sisurc.yml - - ./sisupod/_sisu/skin - -% skins in various skin directories doc, dir, site, yml - - ./sisupod/_sisu/css - - ./sisupod/_sisu/image - -% images for documents contained in this directory - - ./sisupod/_sisu/mm -.fi - -.SH HOMEPAGES - - -.BR - -.B SiSU -is about the ability to auto-generate documents. Home pages are regarded as -custom built items, and are not created by -.B SiSU. -More accurately, -.B SiSU -has a default home page, which will not be appropriate for use with other -sites, and the means to provide your own home page instead in one of two ways -as part of a site's configuration, these being: - -.BR -1. through placing your home page and other custom built documents in the -subdirectory _sisu/home/ (this probably being the easier and more convenient -option) - -.BR -2. through providing what you want as the home page in a skin, - -.BR -Document sets are contained in directories, usually organised by site or -subject. Each directory can/should have its own homepage. See the section on -directory structure and organisation of content. -.SH HOME PAGE AND OTHER CUSTOM BUILT PAGES IN A SUB-DIRECTORY - - -.BR -Custom built pages, including the home page index.html may be placed within the -configuration directory _sisu/home/ in any of the locations that is searched -for the configuration directory, namely ./_sisu ; ~/_sisu ; /etc/sisu From -there they are copied to the root of the output directory with the command: - -.BR - sisu -CC -.SH MARKUP AND OUTPUT EXAMPLES - -.SH MARKUP EXAMPLES - - -.BR -Current markup examples and document output samples are provided off - or and in the sisu --markup-sample package available off - -.BR -For some documents hardly any markup at all is required at all, other than a -header, and an indication that the levels to be taken into account by the -program in generating its output are. -.SH SISU MARKUP SAMPLES - - -.BR -A few additional sample books prepared as sisu markup samples, output formats -to be generated using -.B SiSU -are contained in a separate package sisu -markup-samples. sisu -markup-samples -contains books (prepared using sisu markup), that were released by their -authors various licenses mostly different Creative Commons licences that do not -permit inclusion in the -.B Debian -Project as they have requirements that do not meet the -.B Debian -Free Software Guidelines for various reasons, most commonly that they require -that the original substantive text remain unchanged, and sometimes that the -works be used only non-commercially. - -.BR - -.I Accelerando, -Charles Stross (2005) -accelerando.charles_stross.sst - -.BR - -.I Alice's Adventures in Wonderland, -Lewis Carroll (1865) -alices_adventures_in_wonderland.lewis_carroll.sst - -.BR - -.I CONTENT, -Cory Doctorow (2008) -content.cory_doctorow.sst - -.BR - -.I Democratizing Innovation, -Eric von Hippel (2005) -democratizing_innovation.eric_von_hippel.sst - -.BR - -.I Down and Out in the Magic Kingdom, -Cory Doctorow (2003) -down_and_out_in_the_magic_kingdom.cory_doctorow.sst - -.BR - -.I For the Win, -Cory Doctorow (2010) -for_the_win.cory_doctorow.sst - -.BR - -.I Free as in Freedom - Richard Stallman's Crusade for Free Software, -Sam Williams (2002) -free_as_in_freedom.richard_stallman_crusade_for_free_software.sam_williams.sst - -.BR - -.I Free as in Freedom 2.0 - Richard Stallman and the Free Software Revolution, -Sam Williams (2002), Richard M. Stallman (2010) -free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst - -.BR - -.I Free Culture - How Big Media Uses Technology and the Law to Lock Down -Culture and Control Creativity, -Lawrence Lessig (2004) -free_culture.lawrence_lessig.sst - -.BR - -.I Free For All - How Linux and the Free Software Movement Undercut the High -Tech Titans, -Peter Wayner (2002) -free_for_all.peter_wayner.sst - -.BR - -.I GNU GENERAL PUBLIC LICENSE v2, -Free Software Foundation (1991) -gpl2.fsf.sst - -.BR - -.I GNU GENERAL PUBLIC LICENSE v3, -Free Software Foundation (2007) -gpl3.fsf.sst - -.BR - -.I Gulliver's Travels, -Jonathan Swift (1726 / 1735) -gullivers_travels.jonathan_swift.sst - -.BR - -.I Little Brother, -Cory Doctorow (2008) -little_brother.cory_doctorow.sst - -.BR - -.I The Cathederal and the Bazaar, -Eric Raymond (2000) -the_cathedral_and_the_bazaar.eric_s_raymond.sst - -.BR - -.I The Public Domain - Enclosing the Commons of the Mind, -James Boyle (2008) -the_public_domain.james_boyle.sst - -.BR - -.I The Wealth of Networks - How Social Production Transforms Markets and -Freedom, -Yochai Benkler (2006) -the_wealth_of_networks.yochai_benkler.sst - -.BR - -.I Through the Looking Glass, -Lewis Carroll (1871) -through_the_looking_glass.lewis_carroll.sst - -.BR - -.I Two Bits - The Cultural Significance of Free Software, -Christopher Kelty (2008) -two_bits.christopher_kelty.sst - -.BR - -.I UN Contracts for International Sale of Goods, -UN (1980) -un_contracts_international_sale_of_goods_convention_1980.sst - -.BR - -.I Viral Spiral, -David Bollier (2008) -viral_spiral.david_bollier.sst -.SH SISU SEARCH - INTRODUCTION - - -.BR -Because the document structure of sites created is clearly defined, and the -text -.I object citation system -is available hypothetically at least, for all forms of output, it is possible -to search the sql database, and either read results from that database, or map -the results to the html or other output, which has richer text markup. - -.BR - -.B SiSU -can populate a relational sql type database with documents at an object level, -including objects numbers that are shared across different output types. Making -a document corpus searchable with that degree of granularity. Basically, your -match criteria is met by these documents and at these locations within each -document, which can be viewed within the database directly or in various output -formats. - -.BR - -.B SiSU -can populate an sql database (sqlite3 or postgresql) with documents made up of -their objects. It also can generate a cgi search form that can be used to query -the database. - -.BR -In order to use the built in search functionality you would take the following -steps. - -.BR -- use sisu to populate an sql database with with a sisu markup content - -.BR - * sqlite3 should work out of the box - -.BR - * postgresql may require some initial database configuration - -.BR -- provide a way to query the database, which sisu can assist with by - -.BR - * generating a sample ruby cgi search form, required (sisu configuration - recommended) - -.BR - * adding a query field for this search form to be added to all html files - (sisu configuration required) -.SH SQL - -.SH POPULATE THE DATABASE - - -.BR -TO populate the sql database, run sisu against a sisu markup file with one of -the following sets of flags -.nf -sisu --sqlite filename.sst -.fi - - -.BR -creates an sqlite3 database containing searchable content of just the sisu -markup document selected -.nf -sisu --sqlite --update filename.sst -.fi - - -.BR -creates an sqlite3 database containing searchable content of marked up -document(s) selected by the user from a common directory -.nf -sisu --pg --update filename.sst -.fi - - -.BR -fills a postgresql database with searchable content of marked up document(s) -selected by the user from a common directory - -.BR -For postgresql the first time the command is run in a given directory the user -will be prompted to create the requisite database, at the time of writing the -prompt sisu provides is as follows: -.nf -no connection with pg database established, you may need to run: - createdb "SiSU.7a.current" - after that don't forget to run: - sisu --pg --createall - before attempting to populate the database -.fi - - -.BR -The named database that sisu expects to find must exist and if necessary be -created using postgresql tools. If the database exist but the database tables -do not, sisu will attempt to create the tables it needs, the equivalent of the -requested sisu --pg --createall command. - -.BR -Once this is done, the sql database is populated and ready to be queried. -.SH SQL TYPE DATABASES - - -.BR - -.B SiSU -feeds sisu markup documents into sql type databases -.I PostgreSQL -[^13] and/or -.I SQLite -[^14] database together with information related to document structure. - -.BR -This is one of the more interesting output forms, as all the structural data of -the documents are retained (though can be ignored by the user of the database -should they so choose). All site texts/documents are (currently) streamed to -four tables: - -.BR - * one containing semantic (and other) headers, including, title, author, - subject, (the - .I Dublin Core. - ..); - -.BR - * another the substantive texts by individual "paragraph" (or object) - along - with structural information, each paragraph being identifiable by its - paragraph number (if it has one which almost all of them do), and the - substantive text of each paragraph quite naturally being searchable (both in - formatted and clean text versions for searching); and - -.BR - * a third containing endnotes cross-referenced back to the paragraph from - which they are referenced (both in formatted and clean text versions for - searching). - -.BR - * a fourth table with a one to one relation with the headers table contains - full text versions of output, eg. pdf, html, xml, and - .I ascii. - -.BR -There is of course the possibility to add further structures. - -.BR -At this level -.B SiSU -loads a relational database with documents chunked into objects, their smallest -logical structurally constituent parts, as text objects, with their object -citation number and all other structural information needed to construct the -document. Text is stored (at this text object level) with and without -elementary markup tagging, the stripped version being so as to facilitate ease -of searching. - -.BR -Being able to search a relational database at an object level with the -.B SiSU -citation system is an effective way of locating content generated by -.B SiSU. -As individual text objects of a document stored (and indexed) together with -object numbers, and all versions of the document have the same numbering, -complex searches can be tailored to return just the locations of the search -results relevant for all available output formats, with live links to the -precise locations in the database or in html/xml documents; or, the structural -information provided makes it possible to search the full contents of the -database and have headings in which search content appears, or to search only -headings etc. (as the -.I Dublin Core -is incorporated it is easy to make use of that as well). -.SH POSTGRESQL - -.SH NAME - - -.BR - -.B SiSU -- Structured information, Serialized Units - a document publishing system, -postgresql dependency package -.SH DESCRIPTION - - -.BR -Information related to using postgresql with sisu (and related to the -sisu_postgresql dependency package, which is a dummy package to install -dependencies needed for -.B SiSU -to populate a postgresql database, this being part of -.B SiSU -- man sisu) . -.SH SYNOPSIS - - -.BR - sisu -D [instruction] [filename/wildcard if required] - -.BR - sisu -D --pg --[instruction] [filename/wildcard if required] -.SH COMMANDS - - -.BR -Mappings to two databases are provided by default, postgresql and sqlite, the -same commands are used within sisu to construct and populate databases however --d (lowercase) denotes sqlite and -D (uppercase) denotes postgresql, -alternatively --sqlite or --pgsql may be used - -.BR - -.B -D or --pgsql -may be used interchangeably. -.SH CREATE AND DESTROY DATABASE - -.TP -.B --pgsql --createall -initial step, creates required relations (tables, indexes) in existing -(postgresql) database (a database should be created manually and given the same -name as working directory, as requested) (rb.dbi) -.TP -.B sisu -D --createdb -creates database where no database existed before -.TP -.B sisu -D --create -creates database tables where no database tables existed before -.TP -.B sisu -D --Dropall -destroys database (including all its content)! kills data and drops tables, -indexes and database associated with a given directory (and directories of the -same name). -.TP -.B sisu -D --recreate -destroys existing database and builds a new empty database structure -.SH IMPORT AND REMOVE DOCUMENTS - -.TP -.B sisu -D --import -v [filename/wildcard] -populates database with the contents of the file. Imports documents(s) -specified to a postgresql database (at an object level). -.TP -.B sisu -D --update -v [filename/wildcard] -updates file contents in database -.TP -.B sisu -D --remove -v [filename/wildcard] -removes specified document from postgresql database. -.SH SQLITE - -.SH NAME - - -.BR - -.B SiSU -- Structured information, Serialized Units - a document publishing system. -.SH DESCRIPTION - - -.BR -Information related to using sqlite with sisu (and related to the sisu_sqlite -dependency package, which is a dummy package to install dependencies needed for -.B SiSU -to populate an sqlite database, this being part of -.B SiSU -- man sisu) . -.SH SYNOPSIS - - -.BR - sisu -d [instruction] [filename/wildcard if required] - -.BR - sisu -d --(sqlite|pg) --[instruction] [filename/wildcard if required] -.SH COMMANDS - - -.BR -Mappings to two databases are provided by default, postgresql and sqlite, the -same commands are used within sisu to construct and populate databases however --d (lowercase) denotes sqlite and -D (uppercase) denotes postgresql, -alternatively --sqlite or --pgsql may be used - -.SH CREATE AND DESTROY DATABASE - -.TP -.B --sqlite --createall -initial step, creates required relations (tables, indexes) in existing (sqlite) -database (a database should be created manually and given the same name as -working directory, as requested) (rb.dbi) -.TP -.B sisu -d --createdb -creates database where no database existed before -.TP -.B sisu -d --create -creates database tables where no database tables existed before -.TP -.B sisu -d --dropall -destroys database (including all its content)! kills data and drops tables, -indexes and database associated with a given directory (and directories of the -same name). -.TP -.B sisu -d --recreate -destroys existing database and builds a new empty database structure -.SH IMPORT AND REMOVE DOCUMENTS - -.TP -.B sisu -d --import -v [filename/wildcard] -populates database with the contents of the file. Imports documents(s) -specified to an sqlite database (at an object level). -.TP -.B sisu -d --update -v [filename/wildcard] -updates file contents in database -.TP -.B sisu -d --remove -v [filename/wildcard] -removes specified document from sqlite database. -.SH CGI SEARCH FORM - - -.BR -For the search form, which is a single search page - -.BR -- configure the search form - -.BR -- generate the sample search form with the sisu command, (this will be based on -the configuration settings and existing found sisu databases) - -.BR -For postgresql web content you may need to edit the search cgi script. Two -things to look out for are that the user is set as needed, and that the any -different databases that you wish to be able to query are listed. - -.BR -correctly, you may want www-data rather than your username. -.nf -@user='www-data' -.fi - - -.BR -- check the search form, copy it to the appropriate cgi directory and set the -correct permissions - -.BR -For a search form to appear on each html page, you need to: - -.BR -- rely on the above mentioned configuration of the search form - -.BR -- configure the html search form to be on - -.BR -- run the html command -.SH SETUP SEARCH FORM - - -.BR -You will need a web server, httpd with cgi enabled, and a postgresql database -to which you are able to create databases. - -.BR -Setup postgresql, make sure you are able to create and write to the database, -e.g.: -.nf -sudo su postgres - createuser -d -a ralph -.fi - - -.BR -You then need to create the database that sisu will use, for sisu manual in the -directory manual/en for example, (when you try to populate a database that does -not exist sisu prompts as to whether it exists): -.nf -createdb SiSU.7a.manual -.fi - - -.BR - -.B SiSU -is then able to create the required tables that allow you to populate the -database with documents in the directory for which it has been created: -.nf -sisu --pg --createall -v -.fi - - -.BR -You can then start to populate the database, in this example with a single -document: -.nf -sisu --pg --update -v en/sisu_manual.ssm -.fi - - -.BR -To create a sample search form, from within the same directory run: -.nf -sisu --sample-search-form --db-pg -.fi - - -.BR -and copy the resulting cgi form to your cgi-bin directory - -.BR -A sample setup for nginx is provided that assumes data will be stored under -/srv/www and cgi scripts under /srv/cgi -.SH SEARCH - DATABASE FRONTEND SAMPLE, UTILISING DATABASE AND SISU FEATURES, -INCLUDING OBJECT CITATION NUMBERING (BACKEND CURRENTLY POSTGRESQL) - - -.BR -Sample search frontend [^15] A small database and -sample query front-end (search from) that makes use of the citation system, .I -object citation numbering -to demonstrates functionality.[^16] - -.BR - -.B SiSU -can provide information on which documents are matched and at what locations -within each document the matches are found. These results are relevant across -all outputs using -.I object citation numbering, -which includes html, -.I XML, -.I EPUB, -.I LaTeX, -.I PDF -and indeed the -.I SQL -database. You can then refer to one of the other outputs or in the -.I SQL -database expand the text within the matched objects (paragraphs) in the -documents matched. - -.BR -Note you may set results either for documents matched and object number -locations within each matched document meeting the search criteria; or display -the names of the documents matched along with the objects (paragraphs) that -meet the search criteria.[^17] -.TP -.B sisu -F --webserv-webrick -builds a cgi web search frontend for the database created - -.BR -The following is feedback on the setup on a machine provided by the help -command: - -.BR - sisu --help sql -.nf -Postgresql - user: ralph - current db set: SiSU_sisu - port: 5432 - dbi connect: DBI:Pg:database=SiSU_sisu;port=5432 - -sqlite - current db set: /home/ralph/sisu_www/sisu/sisu_sqlite.db - dbi connect DBI:SQLite:/home/ralph/sisu_www/sisu/sisu_sqlite.db -.fi - -.BR -Note on databases built - -.BR -By default, [unless otherwise specified] databases are built on a directory -basis, from collections of documents within that directory. The name of the -directory you choose to work from is used as the database name, i.e. if you are -working in a directory called /home/ralph/ebook the database SiSU_ebook is -used. [otherwise a manual mapping for the collection is necessary] - -.SH SEARCH FORM - -.TP -.B sisu -F -generates a sample search form, which must be copied to the web-server cgi -directory -.TP -.B sisu -F --webserv-webrick -generates a sample search form for use with the webrick server, which must be -copied to the web-server cgi directory -.TP -.B sisu -W -starts the webrick server which should be available wherever sisu is properly -installed - -.BR -The generated search form must be copied manually to the webserver directory as -instructed -.SH SISU_WEBRICK - -.SH NAME - - -.BR - -.B SiSU -- Structured information, Serialized Units - a document publishing system -.SH SYNOPSIS - - -.BR -sisu_webrick [port] - -.BR -or - -.BR -sisu -W [port] -.SH DESCRIPTION - - -.BR -sisu_webrick is part of -.B SiSU -(man sisu) sisu_webrick starts -.B Ruby -' s Webrick web-server and points it to the directories to which -.B SiSU -output is written, providing a list of these directories (assuming -.B SiSU -is in use and they exist). - -.BR -The default port for sisu_webrick is set to 8081, this may be modified in the -yaml file: ~/.sisu/sisurc.yml a sample of which is provided as -/etc/sisu/sisurc.yml (or in the equivalent directory on your system). -.SH SUMMARY OF MAN PAGE - - -.BR -sisu_webrick, may be started on it's own with the command: sisu_webrick [port] -or using the sisu command with the -W flag: sisu -W [port] - -.BR -where no port is given and settings are unchanged the default port is 8081 -.SH DOCUMENT PROCESSING COMMAND FLAGS - - -.BR -sisu -W [port] starts -.B Ruby -Webrick web-server, serving -.B SiSU -output directories, on the port provided, or if no port is provided and the -defaults have not been changed in ~/.sisu/sisurc.yaml then on port 8081 -.SH SUMMARY OF FEATURES - - -.BR -- sparse/minimal markup (clean utf-8 source texts). Documents are prepared in a -single -.I UTF-8 -file using a minimalistic mnemonic syntax. Typical literature, documents like -"War and Peace" require almost no markup, and most of the headers are optional. - -.BR -- markup is easily readable/parsable by the human eye, (basic markup is simpler -and more sparse than the most basic -.I HTML -) , [this may also be converted to -.I XML -representations of the same input/source document]. - -.BR -- markup defines document structure (this may be done once in a header -pattern-match description, or for heading levels individually); basic text -attributes (bold, italics, underscore, strike-through etc.) as required; and -semantic information related to the document (header information, extended -beyond the Dublin core and easily further extended as required); the headers -may also contain processing instructions. -.B SiSU -markup is primarily an abstraction of document structure and document metadata -to permit taking advantage of the basic strengths of existing alternative -practical standard ways of representing documents [be that browser viewing, -paper publication, sql search etc.] (html, epub, xml, odf, latex, pdf, sql) - -.BR -- for output produces reasonably elegant output of established industry and -institutionally accepted open standard formats.[3] takes advantage of the -different strengths of various standard formats for representing documents, -amongst the output formats currently supported are: - -.BR -* -.I HTML -- both as a single scrollable text and a segmented document - -.BR -* -.I XHTML - -.BR -* -.I EPUB - -.BR -* -.I XML -- both in sax and dom style xml structures for further development as required - -.BR -* -.I ODT -- Open Document Format text, the iso standard for document storage - -.BR -* -.I LaTeX -- used to generate pdf - -.BR -* -.I PDF -(via -.I LaTeX -) - -.BR -* -.I SQL -- population of an sql database ( -.I PostgreSQL -or -.I SQLite -) , (at the same object level that is used to cite text within a document) - -.BR -Also produces: concordance files; document content certificates (md5 or sha256 -digests of headings, paragraphs, images etc.) and html manifests (and sitemaps -of content). (b) takes advantage of the strengths implicit in these very -different output types, (e.g. PDFs produced using typesetting of -.I LaTeX, -databases populated with documents at an individual object/paragraph level, -making possible -.I granular search -(and related possibilities)) - -.BR -- ensuring content can be cited in a meaningful way regardless of selected -output format. Online publishing (and publishing in multiple document formats) -lacks a useful way of citing text internally within documents (important to -academics generally and to lawyers) as page numbers are meaningless across -browsers and formats. sisu seeks to provide a common way of pinpoint the text -within a document, (which can be utilized for citation and by search engines). -The outputs share a common numbering system that is meaningful (to man and -machine) across all digital outputs whether paper, screen, or database -oriented, (pdf, -.I HTML, -.I EPUB, -xml, sqlite, postgresql) , this numbering system can be used to reference -content. - -.BR -- Granular search within documents. -.I SQL -databases are populated at an object level (roughly headings, paragraphs, -verse, tables) and become searchable with that degree of granularity, the -output information provides the object/paragraph numbers which are relevant -across all generated outputs; it is also possible to look at just the matching -paragraphs of the documents in the database; [output indexing also work well -with search indexing tools like hyperestraier]. - -.BR -- long term maintainability of document collections in a world of changing -formats, having a very sparsely marked-up source document base. there is a -considerable degree of future-proofing, output representations are -"upgradeable", and new document formats may be added. e.g. addition of odf -(open document text) module in 2006, epub in 2009 and in future html5 output -sometime in future, without modification of existing prepared texts - -.BR -* -.I SQL -search aside, documents are generated as required and static once generated. - -.BR -- documents produced are static files, and may be batch processed, this needs -to be done only once but may be repeated for various reasons as desired -(updated content, addition of new output formats, updated technology document -presentations/representations) - -.BR -- document source ( -.I plaintext -utf-8) if shared on the net may be used as input and processed locally to -produce the different document outputs - -.BR -- document source may be bundled together (automatically) with associated -documents (multiple language versions or master document with inclusions) and -images and sent as a zip file called a sisupod, if shared on the net these too -may be processed locally to produce the desired document outputs - -.BR -- generated document outputs may automatically be posted to remote sites. - -.BR -- for basic document generation, the only software dependency is -.B Ruby, -and a few standard Unix tools (this covers -.I plaintext, -.I HTML, -.I EPUB, -.I XML, -.I ODF, -.I LaTeX -) . To use a database you of course need that, and to convert the -.I LaTeX -generated to pdf, a latex processor like tetex or texlive. - -.BR -- as a developers tool it is flexible and extensible - -.BR -Syntax highlighting for -.B SiSU -markup is available for a number of text editors. - -.BR - -.B SiSU -is less about document layout than about finding a way with little markup to be -able to construct an abstract representation of a document that makes it -possible to produce multiple representations of it which may be rather -different from each other and used for different purposes, whether layout and -publishing, or search of content - -.BR -i.e. to be able to take advantage from this minimal preparation starting point -of some of the strengths of rather different established ways of representing -documents for different purposes, whether for search (relational database, or -indexed flat files generated for that purpose whether of complete documents, or -say of files made up of objects), online viewing (e.g. html, xml, pdf) , or -paper publication (e.g. pdf) ... - -.BR -the solution arrived at is by extracting structural information about the -document (about headings within the document) and by tracking objects (which -are serialized and also given hash values) in the manner described. It makes -possible representations that are quite different from those offered at -present. For example objects could be saved individually and identified by -their hashes, with an index of how the objects relate to each other to form a -document. -.TP -.BI *1. -square brackets - -.BR -.TP -.BI *2. -square brackets - -.BR -.TP -.BI +1. -square brackets - -.BR -.TP -.BI 1. - - -.BR -.TP -.BI 2. - - -.BR -.TP -.BI 3. -From sometime after SiSU 0.58 it should be possible to describe SiSU markup -using SiSU, which though not an original design goal is useful. - -.BR -.TP -.BI 4. -files should be prepared using UTF-8 character encoding - -.BR -.TP -.BI 5. -a footnote or endnote - -.BR -.TP -.BI 6. -self contained endnote marker & endnote in one - -.BR -.TP -.BI *. -unnumbered asterisk footnote/endnote, insert multiple asterisks if required - -.BR -.TP -.BI **. -another unnumbered asterisk footnote/endnote - -.BR -.TP -.BI *3. -editors notes, numbered asterisk footnote/endnote series - -.BR -.TP -.BI +2. -editors notes, numbered plus symbol footnote/endnote series - -.BR -.TP -.BI 7. - - -.BR -.TP -.BI 8. - - -.BR -.TP -.BI 9. -Table from the Wealth of Networks by Yochai Benkler - - -.BR -.TP -.BI 10. -for which you may alternatively use the full form author: title: and year: - -.BR -.TP -.BI 11. -Quixote and Panza, Taming Windmills (1605), pp 1000 - 1001 also, Benkler, Wealth of Networks (2006), p 1 - -.BR -.TP -.BI 12. -SiSU has worked this way in the past, though this was dropped as it was -thought the complexity outweighed the flexibility, however, the balance was -rather fine and this behaviour could be reinstated. - -.BR -.TP -.BI 13. - - - -.BR -.TP -.BI 14. - - -.BR -.TP -.BI 15. - - -.BR -.TP -.BI 16. -(which could be extended further with current back-end). As regards scaling -of the database, it is as scalable as the database (here Postgresql) and -hardware allow. - -.BR -.TP -.BI 17. -of this feature when demonstrated to an IBM software innovations evaluator -in 2004 he said to paraphrase: this could be of interest to us. We have large -document management systems, you can search hundreds of thousands of documents -and we can tell you which documents meet your search criteria, but there is no -way we can tell you without opening each document where within each your -matches are found. - -.BR - -.TP -.SH SEE ALSO - sisu(1), - sisu-epub(1), - sisu-harvest(1), - sisu-html(1), - sisu-odf(1), - sisu-pdf(1), - sisu-pg(1), - sisu-sqlite(1), - sisu-txt(1). - sisu_vim(7) -.TP -.SH HOMEPAGE - More information about SiSU can be found at or -.TP -.SH SOURCE - -.TP -.SH AUTHOR - SiSU is written by Ralph Amissah -#+END_SRC diff --git a/org/spine_info.org b/org/spine_info.org index 3dc942c..798836e 100644 --- a/org/spine_info.org +++ b/org/spine_info.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -14,6 +15,9 @@ #+PROPERTY: header-args+ :cache no #+PROPERTY: header-args+ :padline no +[[./spine.org][spine.org]] [[../org/][org/]] +[[./spine_build_scaffold.org][spine_build_scaffold.org]] + * README #+BEGIN_SRC txt :NO-tangle "../README" @@ -142,7 +146,6 @@ project_name: Spine, Doc Reform - Hompages: [http://www.sisudoc.org] - #+END_SRC #+BEGIN_SRC txt diff --git a/org/util_cgi_d_sqlite_search.org b/org/util_cgi_d_sqlite_search.org index 86242f4..e2f3cfd 100644 --- a/org/util_cgi_d_sqlite_search.org +++ b/org/util_cgi_d_sqlite_search.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -27,13 +28,30 @@ dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/ <> <> void cgi_function_intro(Cgi cgi) { - <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> + <> <> <> -<> +<> +<> +<> +<> +<> +<> <> <> <> +<> +<> <> <> } @@ -65,7 +83,7 @@ import std.process : environment; ** void main *** initialize -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_0 #+BEGIN_SRC d string header; string table; @@ -74,7 +92,7 @@ string form; **** config -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_1 #+BEGIN_SRC d struct Config { string http_request_type; @@ -106,7 +124,7 @@ conf.request_method = environment.get("REQUEST_METHOD", "POST"); **** cgi val -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_2 #+BEGIN_SRC d struct CGI_val { string db_selected = ""; @@ -128,7 +146,7 @@ cv.db_selected = "spine.search.db"; // config, set db name **** text fields ***** open -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_3 #+BEGIN_SRC d auto text_fields() { string canned_query_str = environment.get("QUERY_STRING", ""); @@ -151,7 +169,7 @@ auto text_fields() { ***** rgx -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_4 #+BEGIN_SRC d static struct Rgx { // static canned_query = ctRegex!(`\A(?P.+)\Z`, "m"); @@ -187,7 +205,7 @@ auto text_fields() { ***** searchfields -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_5 #+BEGIN_SRC d struct searchFields { string canned_query = ""; // GET canned_query == cq @@ -231,7 +249,7 @@ auto text_fields() { ***** env ****** POST -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_6 #+BEGIN_SRC d if (environment.get("REQUEST_METHOD", "POST") == "POST") { if ("sf" in cgi.post) { @@ -383,7 +401,7 @@ auto text_fields() { ****** GET -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_7 #+BEGIN_SRC d } else if (environment.get("REQUEST_METHOD", "POST") == "GET") { got.canned_query = environment.get("QUERY_STRING", ""); @@ -495,7 +513,7 @@ auto text_fields() { ***** tail -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_8 #+BEGIN_SRC d } auto tf = text_fields; // @@ -503,7 +521,7 @@ auto tf = text_fields; // **** SQL select -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_9 #+BEGIN_SRC d struct SQL_select { string the_body = ""; @@ -514,7 +532,7 @@ auto sql_select = SQL_select(); **** misc -#+NAME: cgi_sqlite_initialize +#+NAME: cgi_sqlite_initialize_10 #+BEGIN_SRC d string base ; // = ""; string tip ; // = ""; @@ -683,7 +701,7 @@ string previous_next () { *** cgi html form -#+NAME: cgi_sqlite_form +#+NAME: cgi_sqlite_form_0 #+BEGIN_SRC d { string post_value(string field_name, string type="box", string set="on") { @@ -726,7 +744,7 @@ string previous_next () { **** canned search -#+NAME: cgi_sqlite_form +#+NAME: cgi_sqlite_form_1 #+BEGIN_SRC d string the_can(string fv) { string show_the_can = post_value("url"); @@ -764,7 +782,7 @@ string previous_next () { **** provide tip -#+NAME: cgi_sqlite_form +#+NAME: cgi_sqlite_form_2 #+BEGIN_SRC d string provide_tip() { string searched_tip = post_value("se"); @@ -801,7 +819,7 @@ string previous_next () { **** the form ***** form html -#+NAME: cgi_sqlite_form +#+NAME: cgi_sqlite_form_3 #+BEGIN_SRC d form = format(q"┃ @@ -846,7 +864,7 @@ string previous_next () { ***** form values -#+NAME: cgi_sqlite_form +#+NAME: cgi_sqlite_form_4 #+BEGIN_SRC d "spine-search", (post_value("ec") == "checked") ? post_value("sf", "field") : "", @@ -870,7 +888,7 @@ string previous_next () { **** set value (debug) -#+NAME: cgi_sqlite_form +#+NAME: cgi_sqlite_form_5 #+BEGIN_SRC d { string set_value(string field_name, string default_val) { @@ -999,7 +1017,7 @@ auto db = Database(conf.db_path ~ cv.db_selected); **** db select statement ***** the body -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_1 #+BEGIN_SRC d sql_select.the_body ~= format(q"┃ SELECT @@ -1042,7 +1060,7 @@ LIMIT %s OFFSET %s ***** html write selected ****** ocn index -#+NAME: cgi_sqlite_select_statement_0 +#+NAME: cgi_sqlite_select_statement_2 #+BEGIN_SRC d (cv.checked_sql) ? cgi.write(previous_next ~ "
" ~ sql_select.the_body.split("\n ").join(" ").split("\n").join("
") ~ "
\n") diff --git a/org/util_cgi_rb_fcgi_sqlite_search.org b/org/util_cgi_rb_fcgi_sqlite_search.org index 124ac25..d10c163 100644 --- a/org/util_cgi_rb_fcgi_sqlite_search.org +++ b/org/util_cgi_rb_fcgi_sqlite_search.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no diff --git a/org/util_spine_markup_conversion_from_sisu.org b/org/util_spine_markup_conversion_from_sisu.org index 21a5ffb..4204560 100644 --- a/org/util_spine_markup_conversion_from_sisu.org +++ b/org/util_spine_markup_conversion_from_sisu.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no @@ -207,7 +208,9 @@ if (endnotes.length == endnote_ref_count) { void main(string[] args) { <> <> - <> + <> + <> + <> foreach(arg; args[1..$]) { if ( !(arg.match(regex(r"--\w+"))) @@ -310,7 +313,7 @@ string format_body_string(string s) { *** header format **** format header string -#+NAME: from_sisu_rb_header_format +#+NAME: from_sisu_rb_header_format_0 #+BEGIN_SRC d string format_header_string(string s) { string o; @@ -324,7 +327,7 @@ string format_header_string(string s) { **** format main header -#+NAME: from_sisu_rb_header_format +#+NAME: from_sisu_rb_header_format_1 #+BEGIN_SRC d string format_main_header(string hm, string hs = "", string c = "") { string o; @@ -341,7 +344,7 @@ string format_main_header(string hm, string hs = "", string c = "") { **** format sub header -#+NAME: from_sisu_rb_header_format +#+NAME: from_sisu_rb_header_format_2 #+BEGIN_SRC d string format_sub_header(string hs, string c) { string o; diff --git a/org/util_spine_syntax_highlighting_emacs.org b/org/util_spine_syntax_highlighting_emacs.org index 0007e48..e161b8f 100644 --- a/org/util_spine_syntax_highlighting_emacs.org +++ b/org/util_spine_syntax_highlighting_emacs.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no diff --git a/org/util_spine_syntax_highlighting_vim.org b/org/util_spine_syntax_highlighting_vim.org index 137d734..2c4f131 100644 --- a/org/util_spine_syntax_highlighting_vim.org +++ b/org/util_spine_syntax_highlighting_vim.org @@ -7,6 +7,7 @@ #+COPYRIGHT: Copyright (C) 2015 - 2020 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no diff --git a/src/doc_reform/io_out/epub3.d b/src/doc_reform/io_out/epub3.d index 14c328b..f435418 100644 --- a/src/doc_reform/io_out/epub3.d +++ b/src/doc_reform/io_out/epub3.d @@ -295,7 +295,7 @@ template outputEPub3() { ┃"); return toc; } - + @system void outputEPub3(D,I)( const D doc_abstraction, I doc_matters, @@ -809,5 +809,5 @@ template outputEPub3() { } } } - + } diff --git a/src/doc_reform/io_out/html.d b/src/doc_reform/io_out/html.d index 6a15614..e898bb8 100644 --- a/src/doc_reform/io_out/html.d +++ b/src/doc_reform/io_out/html.d @@ -510,7 +510,7 @@ template outputHTML() { M doc_matters, ) { { /+ (copy html images) +/ - + auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language); if (!exists(pth_html.image)) { pth_html.image.mkdirRecurse; diff --git a/src/doc_reform/io_out/odt.d b/src/doc_reform/io_out/odt.d index d3377dc..e12f93f 100644 --- a/src/doc_reform/io_out/odt.d +++ b/src/doc_reform/io_out/odt.d @@ -839,7 +839,7 @@ template outputODT() { } return doc_odt; } - + @safe string odt_tail() { string _odt_tail = format(q"┃spine: <www.doc_reform.org> and <www.sisudoc.org>
┃",); @@ -2038,7 +2038,7 @@ template outputODT() { pth_odt.manifest_rdf("fs"); /+ (manifest.rdf) +/ pth_odt.settings_xml("fs"); /+ (settings.xml) +/ pth_odt.styles_xml("fs"); /+ (styles_xml) +/ - + pth_odt.content_xml("fs"); pth_odt.manifest_xml("fs"); pth_odt.meta_xml("fs"); diff --git a/src/doc_reform/io_out/source_pod.d b/src/doc_reform/io_out/source_pod.d index 5a0fd47..36a86e2 100644 --- a/src/doc_reform/io_out/source_pod.d +++ b/src/doc_reform/io_out/source_pod.d @@ -371,7 +371,7 @@ template spinePod() { // Handle errors } } - + } catch (ErrnoException ex) { // Handle error } diff --git a/src/doc_reform/meta/conf_make_meta_yaml.d b/src/doc_reform/meta/conf_make_meta_yaml.d index 1f22dc8..4d1fdb1 100644 --- a/src/doc_reform/meta/conf_make_meta_yaml.d +++ b/src/doc_reform/meta/conf_make_meta_yaml.d @@ -180,7 +180,7 @@ template contentYAMLtoSpineStruct() { _struct_composite.make.substitute = _mk.substitute(_struct_composite.make_str.substitute); _struct_composite.make.texpdf_font = _mk.texpdf_font(_struct_composite.make_str.texpdf_font); } - + /+ conf ------------------------------------------------------------------- +/ if ("webserv" in _yaml && _yaml["webserv"].type.sequence diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d index bde1a5c..859acc5 100644 --- a/src/doc_reform/meta/metadoc_from_src.d +++ b/src/doc_reform/meta/metadoc_from_src.d @@ -2422,7 +2422,7 @@ template docAbstraction() { dom_structure_markedup_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; - + @safe auto doc_has() { struct DocHas_ { uint inline_links() { -- cgit v1.2.3