From c7c6c121884feb55ae3964e6055ac8ca983458cd Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Sat, 20 Aug 2016 08:57:12 -0400
Subject: step 0.6.3 includes fixes

---
 dub.sdl                            |  64 +++++---
 makefile                           |   5 +-
 maker.org                          | 152 ++++++++++++++----
 org/ao_abstract_doc_source.org     |  50 ++----
 org/ao_conf_make_meta.org          | 321 +++++++++++++++++++++++++++++++++++++
 org/ao_defaults.org                |  14 +-
 org/ao_output_debugs.org           |  39 ++++-
 org/output.org                     |  69 +++++++-
 org/sdp.org                        | 144 +++++++----------
 src/sdp.d                          |  55 +------
 src/sdp/ao_abstract_doc_source.d   |  28 +---
 src/sdp/ao_conf_make_meta_sdlang.d | 321 +++++++++++++++++++++++++++++++++++++
 src/sdp/ao_output_debugs.d         |  31 +++-
 src/sdp/ao_rgx.d                   |  10 +-
 src/sdp/output_hub.d               |  48 +++++-
 views/version.txt                  |   2 +-
 16 files changed, 1079 insertions(+), 274 deletions(-)

diff --git a/dub.sdl b/dub.sdl
index 7aa4621..88d23aa 100644
--- a/dub.sdl
+++ b/dub.sdl
@@ -1,13 +1,13 @@
 name              "sdp"
-description       "sisu document parser."
+description       "sisu document parser"
 homepage          "http://sisudoc.org"
 authors           "Ralph Amissah"
-copyright         "©2016 Ralph Amissah"
+copyright         "Copyright © 2016 Ralph Amissah"
 license           "AGPL-3+"
 targetPath        "./bin"
 sourcePath        "./src"
 stringImportPaths "./views"
-buildRequirements "disallowDeprecations" "allowWarnings"
+buildRequirements "allowWarnings"
 configuration     "sdp-release" {
   name            "release"
   targetType      "executable"
@@ -16,24 +16,6 @@ configuration     "sdp-release" {
   buildOptions    "releaseMode" "optimize" "inline"
   postGenerateCommands "/usr/bin/notify-send -t 0 'D release executable ready' 'sdp'"
 }
-configuration     "sdp-dmd" {
-  name            "dmd"
-  targetType      "executable"
-  platforms       "posix"
-  #compiler        "dmd"
-  targetName      "sdp-dmd"
-  buildOptions    "releaseMode" "optimize" "inline"
-  postGenerateCommands "/usr/bin/notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd'"
-}
-configuration     "sdp-ldc" {
-  name            "ldc"
-  targetType      "executable"
-  platforms       "posix"
-  #compiler        "ldc2"
-  targetName      "sdp-ldc"
-  buildOptions    "releaseMode" "optimize" "inline"
-  postGenerateCommands "/usr/bin/notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc'"
-}
 configuration     "sdp-debug" {
   name            "debuging"
   targetType      "executable"
@@ -65,3 +47,43 @@ configuration     "sdp-debug-clean" {
   buildOptions    "debugMode" "debugInfo" "optimize"
   postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug-clean'"
 }
+configuration     "sdp-dmd" {
+  name            "dmd"
+  targetType      "executable"
+  platforms       "posix"
+  #compiler        "dmd"
+  targetName      "sdp-dmd"
+  buildOptions    "releaseMode" "optimize" "inline"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd'"
+}
+configuration     "sdp-debug-dmd" {
+  name            "debuging"
+  targetType      "executable"
+  platforms       "posix"
+  targetName      "sdp-debug-dmd"
+  debugVersions   "checkdoc"
+  debugVersions   "summary"
+  debugVersions   "dumpdoc"
+  buildOptions    "debugMode" "debugInfo" "optimize"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug-dmd'"
+}
+configuration     "sdp-ldc" {
+  name            "ldc"
+  targetType      "executable"
+  platforms       "posix"
+  #compiler        "ldc2"
+  targetName      "sdp-ldc"
+  buildOptions    "releaseMode" "optimize" "inline"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc'"
+}
+configuration     "sdp-debug-ldc" {
+  name            "debuging"
+  targetType      "executable"
+  platforms       "posix"
+  targetName      "sdp-debug-ldc"
+  debugVersions   "checkdoc"
+  debugVersions   "summary"
+  debugVersions   "dumpdoc"
+  buildOptions    "debugMode" "debugInfo" "optimize"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug-ldc'"
+}
diff --git a/makefile b/makefile
index 1e804cf..d4fbe92 100644
--- a/makefile
+++ b/makefile
@@ -7,7 +7,6 @@ LDC_FLAGS=-w -J=views -I=src/sdp -linker=ld.gold
 LDC_FLAGS_RELEASE=-O4 -release
 LDC_FLAG_BINOF=-of=
 GDC=gdc
-#GDC=gdc-5
 GDC_FLAGS=
 GDC_FLAGS_RELEASE=-march=native -O3 -pipe -frelease
 GDC_FLAG_BINOF=-o
@@ -71,7 +70,7 @@ dub_dmd_stamp: tangle
 dub_dmd_release_test: tangle
 	$(DUB) $(DUB_FLAGS)dmd --config=sdp-dmd
 dub_dmd_debug: tangle
-	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug
+	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug-dmd
 dub_dmd_debug_clean: tangle
 	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug-clean
 dub_dmd_tmp: tangle
@@ -86,7 +85,7 @@ dub_ldc_stamp: tangle
 dub_ldc_release_test: tangle
 	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-ldc
 dub_ldc_debug: tangle
-	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug
+	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug-ldc
 dub_ldc_debug_clean: tangle
 	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug-clean
 dub_ldc_tmp: tangle
diff --git a/maker.org b/maker.org
index a37fbb6..5c585d3 100644
--- a/maker.org
+++ b/maker.org
@@ -47,7 +47,6 @@ LDC_FLAG_BINOF=-of=
 
 #+BEGIN_SRC makefile :tangle makefile
 GDC=gdc
-#GDC=gdc-5
 GDC_FLAGS=
 GDC_FLAGS_RELEASE=-march=native -O3 -pipe -frelease
 GDC_FLAG_BINOF=-o
@@ -82,7 +81,7 @@ Set D_COMPILER one of DMD, LDC or GDC e.g.: SET_D_COMPILER=DMD
 SET_D_COMPILER=LDC
 #+END_SRC
 
-**** TODO SET debug flags: "SET_DC_FLAGS_DEBUG_EXTRA=-debug=": :compiler:flags:debug:
+**** TODO SET _debug_ flags: "SET_DC_FLAGS_DEBUG_EXTRA=-debug=": :compiler:flags:debug:
 Set debug flags using DMD standard flag -debug= e.g.:
   SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=bookindex
   SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=footnotes -debug=endnotes
@@ -234,7 +233,7 @@ makefile_new:
 	make -k tangle_maker
 #+END_SRC
 
-***** TODO dub build rebuild [#A]                                       :dub:
+***** TODO _dub_ build rebuild [#A]                                       :dub:
 
 #+BEGIN_SRC makefile :tangle makefile
 dub: $(PRG_SRCDIR)/$(PRG_SRC)
@@ -249,7 +248,7 @@ dub_dmd_stamp: tangle
 dub_dmd_release_test: tangle
 	$(DUB) $(DUB_FLAGS)dmd --config=sdp-dmd
 dub_dmd_debug: tangle
-	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug
+	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug-dmd
 dub_dmd_debug_clean: tangle
 	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug-clean
 dub_dmd_tmp: tangle
@@ -264,7 +263,7 @@ dub_ldc_stamp: tangle
 dub_ldc_release_test: tangle
 	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-ldc
 dub_ldc_debug: tangle
-	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug
+	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug-ldc
 dub_ldc_debug_clean: tangle
 	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug-clean
 dub_ldc_tmp: tangle
@@ -443,19 +442,25 @@ gitsnapshot: distclean tangle
 ** dub                                                      :dub:description:
 Every DUB package should contain a [[http://code.dlang.org/package-format?lang=json][dub.json]] (or [[http://code.dlang.org/package-format?lang=sdl][dub.sdl]])
 
-*** dub.sdl [#A]                                                        :sdl:
+*** TODO dub.sdl [#A]                                                   :sdl:
+
+**** header                                                          :header:
 
 #+BEGIN_SRC sh  :tangle dub.sdl
 name              "sdp"
-description       "sisu document parser."
+description       "sisu document parser"
 homepage          "http://sisudoc.org"
 authors           "Ralph Amissah"
-copyright         "©2016 Ralph Amissah"
+copyright         "Copyright © 2016 Ralph Amissah"
 license           "AGPL-3+"
 targetPath        "./bin"
 sourcePath        "./src"
 stringImportPaths "./views"
-buildRequirements "disallowDeprecations" "allowWarnings"
+buildRequirements "allowWarnings"
+#+END_SRC
+
+**** configuration generic                                          :generic:
+#+BEGIN_SRC sh  :tangle dub.sdl
 configuration     "sdp-release" {
   name            "release"
   targetType      "executable"
@@ -464,24 +469,6 @@ configuration     "sdp-release" {
   buildOptions    "releaseMode" "optimize" "inline"
   postGenerateCommands "/usr/bin/notify-send -t 0 'D release executable ready' 'sdp'"
 }
-configuration     "sdp-dmd" {
-  name            "dmd"
-  targetType      "executable"
-  platforms       "posix"
-  #compiler        "dmd"
-  targetName      "sdp-dmd"
-  buildOptions    "releaseMode" "optimize" "inline"
-  postGenerateCommands "/usr/bin/notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd'"
-}
-configuration     "sdp-ldc" {
-  name            "ldc"
-  targetType      "executable"
-  platforms       "posix"
-  #compiler        "ldc2"
-  targetName      "sdp-ldc"
-  buildOptions    "releaseMode" "optimize" "inline"
-  postGenerateCommands "/usr/bin/notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc'"
-}
 configuration     "sdp-debug" {
   name            "debuging"
   targetType      "executable"
@@ -515,6 +502,117 @@ configuration     "sdp-debug-clean" {
 }
 #+END_SRC
 
+**** configuration dmd                                                  :dmd:
+***** sdp-dmd
+#+BEGIN_SRC sh  :tangle dub.sdl
+configuration     "sdp-dmd" {
+  name            "dmd"
+  targetType      "executable"
+  platforms       "posix"
+  #compiler        "dmd"
+  targetName      "sdp-dmd"
+  buildOptions    "releaseMode" "optimize" "inline"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd'"
+}
+#+END_SRC
+
+***** sdp-debug-dmd                                                   :debug:
+#+BEGIN_SRC sh  :tangle dub.sdl
+configuration     "sdp-debug-dmd" {
+  name            "debuging"
+  targetType      "executable"
+  platforms       "posix"
+  targetName      "sdp-debug-dmd"
+  debugVersions   "checkdoc"
+  debugVersions   "summary"
+  debugVersions   "dumpdoc"
+  buildOptions    "debugMode" "debugInfo" "optimize"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug-dmd'"
+}
+#+END_SRC
+
+**** configuration ldc                                                  :ldc:
+***** sdp-ldc
+#+BEGIN_SRC sh  :tangle dub.sdl
+configuration     "sdp-ldc" {
+  name            "ldc"
+  targetType      "executable"
+  platforms       "posix"
+  #compiler        "ldc2"
+  targetName      "sdp-ldc"
+  buildOptions    "releaseMode" "optimize" "inline"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc'"
+}
+#+END_SRC
+
+***** sdp-debug-ldc                                                   :debug:
+#+BEGIN_SRC sh  :tangle dub.sdl
+configuration     "sdp-debug-ldc" {
+  name            "debuging"
+  targetType      "executable"
+  platforms       "posix"
+  targetName      "sdp-debug-ldc"
+  debugVersions   "checkdoc"
+  debugVersions   "summary"
+  debugVersions   "dumpdoc"
+  buildOptions    "debugMode" "debugInfo" "optimize"
+  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug-ldc'"
+}
+#+END_SRC
+
+**** configuration debug list                                         :debug:
+
+#+BEGIN_SRC sh  :tangle no
+  debugVersions "biblio"
+  debugVersions "biblio_sorted"
+  debugVersions "bibliosorted"
+  debugVersions "block"
+  debugVersions "bookindex"
+  debugVersions "bookindexmatch"
+  debugVersions "bookindexraw"
+  debugVersions "check"
+  debugVersions "checkdoc"
+  debugVersions "code"
+  debugVersions "comment"
+  debugVersions "dumpdoc"
+  debugVersions "endnotes"
+  debugVersions "endnotes_build"
+  debugVersions "footnotes"
+  debugVersions "footnotesdone"
+  debugVersions "group"
+  debugVersions "header"
+  debugVersions "header_and_content"
+  debugVersions "header1"
+  debugVersions "headerjson"
+  debugVersions "headermakejson"
+  debugVersions "headermetadatajson"
+  debugVersions "heading"
+  debugVersions "headings"
+  debugVersions "headingsfound"
+  debugVersions "insert"
+  debugVersions "munge"
+  debugVersions "node"
+  debugVersions "objectrelated1"
+  debugVersions "objectrelated2"
+  debugVersions "objects"
+  debugVersions "ocnoff"
+  debugVersions "para"
+  debugVersions "parabullet"
+  debugVersions "parabulletindent"
+  debugVersions "paraindent"
+  debugVersions "paraindenthang"
+  debugVersions "parent"
+  debugVersions "poem"
+  debugVersions "quote"
+  debugVersions "raw"
+  debugVersions "sdlang"
+  debugVersions "source"
+  debugVersions "srclines"
+  debugVersions "structattrib"
+  debugVersions "summary"
+  debugVersions "table"
+#+END_SRC
+
 dflags        platform="dmd" "-v --force -de -w -J./views -I./src/sdp -of./bin/sdp"
 dflags        platform="dmd" "-O -release"
 #buildOptions      "-O -release"
diff --git a/org/ao_abstract_doc_source.org b/org/ao_abstract_doc_source.org
index 75c581d..2fe674b 100644
--- a/org/ao_abstract_doc_source.org
+++ b/org/ao_abstract_doc_source.org
@@ -752,7 +752,7 @@ auto bookindex_section = bi_tuple[0];
 obj_cite_number = bi_tuple[1];
 debug(bookindex) {                         // bookindex
   foreach (bi_entry; bookindex_section) {
-    writeln(bi_entry["obj"]);
+    writeln(bi_entry);
   }
 }
 #+END_SRC
@@ -2971,39 +2971,7 @@ struct BookIndexNuggetHash {
 }
 #+END_SRC
 
-**** book index report                                               :report:
-
-#+name: ao_emitters
-#+BEGIN_SRC d
-struct BookIndexReport {
-// class BookIndexReport : AssertBookIndexReport {
-  int mkn, skn;
-  auto bookindex_report_sorted(
-    string[][string][string] bookindex_unordered_hashes
-  ) {
-    auto mainkeys=bookindex_unordered_hashes.byKey.array.
-      sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
-    foreach (mainkey; mainkeys) {
-      auto subkeys=bookindex_unordered_hashes[mainkey].byKey.array.
-        sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
-      foreach (subkey; subkeys) {
-        debug(bookindex) {
-          writeln(
-            mainkey, ": ",
-            subkey, ": ",
-            to!string(bookindex_unordered_hashes[mainkey][subkey])
-          );
-        }
-        ++skn;
-      }
-      ++mkn;
-    }
-    // return bookindex_the;
-  }
-}
-#+END_SRC
-
-**** book index report indented                             :report:indented:
+**** book index (sort &) report indented                    :report:indented:
 
 #+name: ao_emitters
 #+BEGIN_SRC d
@@ -3036,7 +3004,7 @@ struct BookIndexReportIndent {
 }
 #+END_SRC
 
-**** book index report section                               :report:section:
+**** book index (sort &) report section                      :report:section:
 
 #+name: ao_emitters
 #+BEGIN_SRC d
@@ -3069,6 +3037,12 @@ struct BookIndexReportSection {
       ++mkn;
     }
   }
+#+END_SRC
+
+**** book index (sort &) build section                 :report:section:
+
+#+name: ao_emitters
+#+BEGIN_SRC d
   auto bookindex_build_section(
     string[][string][string] bookindex_unordered_hashes,
     int obj_cite_number
@@ -3161,6 +3135,12 @@ struct BookIndexReportSection {
     auto t = tuple(bookindex_section, obj_cite_number);
     return t;
   }
+#+END_SRC
+
+**** book index (sort &) build section                 :report:section:
+
+#+name: ao_emitters
+#+BEGIN_SRC d
   auto bookindex_build_section_(
     string[][string][string] bookindex_unordered_hashes
   ) {
diff --git a/org/ao_conf_make_meta.org b/org/ao_conf_make_meta.org
index f660147..38510c6 100644
--- a/org/ao_conf_make_meta.org
+++ b/org/ao_conf_make_meta.org
@@ -51,6 +51,107 @@ private auto configSettingsSDLangToAAmake(Tag conf_sdlang) {
 private auto documentMakeSDLangToAAmake(Tag document_make_sdlang) {
   auto dochead_make = sdlangToAAmake(make_aa, document_make_sdlang);
   /+
+  /+ dochead +/
+  string hm;
+  string hs;
+  /+ make +/
+  auto dochead_make = make_aa;
+  if (!(document_make_sdlang.maybe.tags["make"].empty)) {
+    hm = "make";
+    hs = "bold";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "breaks";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "cover_image";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "css";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "emphasis";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "footer";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "headings";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "home_button_image";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "home_button_text";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "italics";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "num_top";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "substitute";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "texpdf_font";
+    if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_make[hm][hs] =
+        to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+  }
+  +/
+  /+
   hm = "links";
   if (!(document_make_sdlang.maybe.tags[hm].empty)) {
     /+ TODO
@@ -520,6 +621,20 @@ private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] doch
       dochead_meta[hm][hs] =
         to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
     }
+    hs = "edition";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "note";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
   }
   hm = "creator";
   if (!(header_sdlang.maybe.tags[hm].empty)) {
@@ -536,6 +651,141 @@ private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] doch
       dochead_meta[hm][hs] =
         to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
     }
+    hs = "author_email";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "illustrator";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "translator";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+  }
+  hm = "classify";
+  if (!(header_sdlang.maybe.tags[hm].empty)) {
+    hs = "dewey";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "keywords";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "loc";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "subject";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "topic_register";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+  }
+  hm = "date";
+  if (!(header_sdlang.maybe.tags[hm].empty)) {
+    hs = "added_to_site";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "available";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "created";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "issued";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "modified";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "published";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "valid";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+  }
+  hm = "identifier";
+  if (!(header_sdlang.maybe.tags[hm].empty)) {
+    hs = "isbn";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "oclc";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "pg";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
   }
   hm = "links";
   if (!(header_sdlang.maybe.tags[hm].empty)) {
@@ -550,6 +800,47 @@ private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] doch
     //     to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
     // }
   }
+  hm = "notes";
+  if (!(header_sdlang.maybe.tags[hm].empty)) {
+    hs = "abstract";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "description";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+  }
+  hm = "original";
+  if (!(header_sdlang.maybe.tags[hm].empty)) {
+    hs = "language";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "source";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "title";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+  }
   hm = "publisher";
   if (!(header_sdlang.maybe.tags[hm].empty)) {
     hs = "name";
@@ -560,6 +851,36 @@ private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] doch
         to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
     }
   }
+  hm = "rights";
+  if (!(header_sdlang.maybe.tags[hm].empty)) {
+    hs = "copyright";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "cover";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "illustrations";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
+    hs = "license";
+    if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+    && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+      writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+      dochead_meta[hm][hs] =
+        to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+    }
   }
   +/
   auto t = tuple(dochead_make, dochead_meta);
diff --git a/org/ao_defaults.org b/org/ao_defaults.org
index a6baeb4..78b1de8 100644
--- a/org/ao_defaults.org
+++ b/org/ao_defaults.org
@@ -507,6 +507,10 @@ template InternalMarkup() {
 
 * regex ctRegex                                                       :regex:
 [[./sdp.org][sdp]]  [[./][org/]]
+http://dlang.org/phobos/std_regex.html
+- Plain string, in which case it's compiled to bytecode before matching.
+- Regex!char (wchar/dchar) that contains a pattern in the form of compiled bytecode.
+- StaticRegex!char (wchar/dchar) that contains a pattern in the form of compiled native machine code.
 
 ** misc                                                                :misc:
 
@@ -620,7 +624,7 @@ static para_attribs       = ctRegex!(`^_(([0-9])(_([0-9]))?|_([1-9])?[*]) `);
 #+name: ao_rgx
 #+BEGIN_SRC d
 /+ blocked markup +/
-static block_open                = ctRegex!("^((code|poem|group|block|quote|table)[{].*?$)|^`{3} (code|poem|group|block|quote|table)");
+static block_open                = ctRegex!("^((code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)[{].*?$)|^`{3} (code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)");
 // static block_open_less_code      = ctRegex!("^(((poem|group|block|quote|table)[{].*?$)|`{3} (poem|group|block|quote|table))");
 static block_poem_open                = ctRegex!("^((poem[{].*?$)|`{3} poem)");
 #+END_SRC
@@ -630,9 +634,9 @@ static block_poem_open                = ctRegex!("^((poem[{].*?$)|`{3} poem)");
 #+name: ao_rgx
 #+BEGIN_SRC d
 /+ blocked markup tics +/
-static block_tic_open            = ctRegex!("^`{3} (code|poem|group|block|quote|table)");
+static block_tic_open            = ctRegex!("^`{3} (code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)");
 // static block_tic_open_less_code  = ctRegex!("^`{3} (poem|group|block|quote|table)");
-static block_tic_code_open       = ctRegex!("^`{3} (code)");
+static block_tic_code_open       = ctRegex!("^`{3} (code)([.][a-z][0-9a-z_]+)?");
 static block_tic_poem_open       = ctRegex!("^`{3} (poem)");
 static block_tic_group_open      = ctRegex!("^`{3} (group)");
 static block_tic_block_open      = ctRegex!("^`{3} (block)");
@@ -646,9 +650,9 @@ static block_tic_close           = ctRegex!("^(`{3})$","m");
 #+name: ao_rgx
 #+BEGIN_SRC d
 /+ blocked markup curly +/
-static block_curly_open          = ctRegex!(`^((code|poem|group|block|quote|table)[{].*?$)`);
+static block_curly_open          = ctRegex!(`^((code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)[{].*?$)`);
 // static block_curly_open_less_code = ctRegex!(`^((poem|group|block|quote|table)[{].*?$)`);
-static block_curly_code_open     = ctRegex!(`^(code[{].*?$)`);
+static block_curly_code_open     = ctRegex!(`^(code([.][a-z][0-9a-z_]+)?[{].*?$)`);
 static block_curly_code_close    = ctRegex!(`^([}]code)`);
 static block_curly_poem_open     = ctRegex!(`^(poem[{].*?$)`);
 static block_curly_poem_close    = ctRegex!(`^([}]poem)`);
diff --git a/org/ao_output_debugs.org b/org/ao_output_debugs.org
index 0f001e1..d5d8177 100644
--- a/org/ao_output_debugs.org
+++ b/org/ao_output_debugs.org
@@ -14,6 +14,40 @@
 
 * output debugs                                                :debug:output:
 [[./sdp.org][sdp]]  [[./][org/]]
+
+** book index (sort &) report                                      :report:
+
+#+name: book_index_sorted_report
+#+BEGIN_SRC d
+struct BookIndexReport {
+// class BookIndexReport : AssertBookIndexReport {
+  int mkn, skn;
+  auto bookindex_report_sorted(
+    string[][string][string] bookindex_unordered_hashes
+  ) {
+    auto mainkeys=bookindex_unordered_hashes.byKey.array.
+      sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
+    foreach (mainkey; mainkeys) {
+      auto subkeys=bookindex_unordered_hashes[mainkey].byKey.array.
+        sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
+      foreach (subkey; subkeys) {
+        debug(bookindex) {
+          writeln(
+            mainkey, ": ",
+            subkey, ": ",
+            to!string(bookindex_unordered_hashes[mainkey][subkey])
+          );
+        }
+        // bookindex_the[mkn][mainkey][skn][subkey] ~= (bookindex_unordered_hashes[mainkey][subkey]);
+        ++skn;
+      }
+      ++mkn;
+    }
+    // return bookindex_the;
+  }
+}
+#+END_SRC
+
 ** (parent)                                                          :parent:
 
 #+name: ao_output_debugs
@@ -477,13 +511,14 @@ debug(checkdoc) {
   ao_output_debugs.d
 +/
 template SiSUoutputDebugs() {
+  <<book_index_sorted_report>>
   struct SDPoutputDebugs {
     auto abstract_doc_source_debugs(S)(
       auto ref const S         contents,
       string[][string][string] bookindex_unordered_hashes,
       JSONValue[]              biblio,
-      JSONValue[string]        dochead_make,
-      JSONValue[string]        dochead_meta,
+      string[string][string]   dochead_make,
+      string[string][string]   dochead_meta,
       string                   fn_src,
       bool[string]             opt_action_bool
     ) {
diff --git a/org/output.org b/org/output.org
index 69779f2..773aeef 100644
--- a/org/output.org
+++ b/org/output.org
@@ -15,7 +15,8 @@
 [[./sdp.org][sdp]]  [[./][org/]]
 * output                                                             :output:
 ** text                                                                :text:
-** html                                                                :html:
+** html [#A]                                                           :html:
+*** open
 
 #+name: output_html
 #+BEGIN_SRC d
@@ -1456,8 +1457,6 @@ struct SDPoutputHTML {
     string                   fn_src,
     bool[string]             opt_action_bool
   ) {
-    mixin ScreenTxtColors;
-    mixin RgxInit;
     auto rgx = Rgx();
     string[] toc;
     string[] body_;
@@ -1521,14 +1520,72 @@ struct SDPoutputHTML {
       // Handle error
     }
   }
+#+END_SRC
+
+*** close
+
+#+name: output_html
+#+BEGIN_SRC d
 }
 #+END_SRC
 
-** epub                                                                :epub:
+** epub [#B]                                                           :epub:
 ** pdf                                                                  :pdf:
 ** odt                                                                  :odt:
-** sqlite                                                            :sqlite:
+** sqlite [#B]                                                       :sqlite:
 ** pgsql                                                              :pgsql:
+** TODO check selection                                              :output:
+
+#+NAME: output_selection
+#+BEGIN_SRC d
+struct SDPoutput {
+  void hub(S)(
+    auto ref const S         contents,
+    string[][string][string] bookindex_unordered_hashes,
+    JSONValue[]              biblio,
+    string[string][string]   dochead_make_json,
+    string[string][string]   dochead_meta_json,
+    string                   fn_src,
+    bool[string]             opt_action_bool
+  ) {
+    auto rgx = Rgx();
+    if (opt_action_bool["source"]) {
+      writeln("sisupod source");
+    }
+    if (opt_action_bool["sisupod"]) {
+      writeln("sisupod source");
+    }
+    if (opt_action_bool["text"]) {
+      writeln("text processing");
+      // auto text=SDPoutput_text();
+      // text.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
+      // // text.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make, dochead_meta, fn_src, opt_action_bool);
+    }
+    if (opt_action_bool["html"]) {
+      auto html=SDPoutputHTML();
+      html.css_write;
+      html.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
+      // html.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make_aa, dochead_meta_aa, fn_src, opt_action_bool);
+    }
+    if (opt_action_bool["epub"]) {
+      writeln("epub processing");
+    }
+    if (opt_action_bool["pdf"]) {
+      writeln("pdf processing");
+    }
+    if (opt_action_bool["odt"]) {
+      writeln("odt processing");
+    }
+    if (opt_action_bool["sqlite"]) {
+      writeln("sqlite processing");
+    }
+    if (opt_action_bool["postgresql"]) {
+      writeln("pgsql processing");
+    }
+  }
+}
+#+END_SRC
+
 * tangles                                                            :tangle:
 ** code structure:                                                :output.d:
 
@@ -1538,10 +1595,12 @@ struct SDPoutputHTML {
   output_hub.d
 +/
 template SiSUoutputHub() {
+  <<output_selection>>
   <<output_html>>
 }
 #+END_SRC
 
+* +other+
 ** example head
 
 <!DOCTYPE html>
diff --git a/org/sdp.org b/org/sdp.org
index 4eec38d..b06c7ef 100644
--- a/org/sdp.org
+++ b/org/sdp.org
@@ -24,7 +24,7 @@ struct Version {
   int minor;
   int patch;
 }
-enum ver = Version(0, 6, 2);
+enum ver = Version(0, 6, 3);
 #+END_SRC
 
 * sdp.d   sisu document parser                                       :sdp.d:
@@ -84,7 +84,11 @@ import
 [[./ao_rgx.org][ao_rgx]]
 [[./output_hub.org][output hub]]
 
-**** sdlang                                                   :import:sdlang:
+**** TODO sdlang                                              :import:sdlang:
+keep up to date, configuration in ../maker.org
+check:
+- http://github.com/Abscissa/SDLang-D
+- https://github.com/abscissa/libInputVisitor
 
 #+NAME: imports_sdlang
 #+BEGIN_SRC d
@@ -151,64 +155,6 @@ mixin SiSUoutputHub;
 mixin ScreenTxtColors;
 #+END_SRC
 
-*** sdp output check selection                                      :output:
-
-#+NAME: sdp_output_selection
-#+BEGIN_SRC d
-struct SDPoutput {
-  auto hub(S)(
-    auto ref const S         contents,
-    string[][string][string] bookindex_unordered_hashes,
-    JSONValue[]              biblio,
-    string[string][string]   dochead_make_json,
-    string[string][string]   dochead_meta_json,
-    string                   fn_src,
-    bool[string]             opt_action_bool
-  ) {
-    mixin ScreenTxtColors;
-    mixin RgxInit;
-    mixin SiSUoutputHub;
-    auto rgx = Rgx();
-    uint return_ = 0;
-    if (opt_action_bool["source"]) {
-      writeln("sisupod source");
-    }
-    if (opt_action_bool["sisupod"]) {
-      writeln("sisupod source");
-    }
-    if (opt_action_bool["text"]) {
-      writeln("text processing");
-      // auto text=SDPoutput_text();
-      // text.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
-      // // text.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make, dochead_meta, fn_src, opt_action_bool);
-    }
-    if (opt_action_bool["html"]) {
-      auto html=SDPoutputHTML();
-      html.css_write;
-      html.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
-      // html.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make_aa, dochead_meta_aa, fn_src, opt_action_bool);
-    }
-    if (opt_action_bool["epub"]) {
-      writeln("epub processing");
-    }
-    if (opt_action_bool["pdf"]) {
-      writeln("pdf processing");
-    }
-    if (opt_action_bool["odt"]) {
-      writeln("odt processing");
-    }
-    if (opt_action_bool["sqlite"]) {
-      writeln("sqlite processing");
-    }
-    if (opt_action_bool["postgresql"]) {
-      writeln("pgsql processing");
-    }
-    return return_;
-  }
-}
-#+END_SRC
-
-
 *** init                                                               :init:
 
 #+NAME: sdp_args
@@ -233,7 +179,7 @@ string arg_unrecognized;
 auto rgx = Rgx();
 #+END_SRC
 
-*** scope                                                             :scope:
+*** scope (run complete)                                              :scope:
 
 #+NAME: sdp_args
 #+BEGIN_SRC d
@@ -251,8 +197,7 @@ scope(success) {
 scope(failure) {
   debug(checkdoc) {
     stderr.writefln(
-      "%s~ run failure ~%s",
-       scr_txt_color["fuchsia"], scr_txt_color["off"],
+      "run failure",
     );
   }
 }
@@ -342,7 +287,7 @@ auto conf_doc_make_aa = confsdl.documentMakeSDLangToAAmake(sdl_root_doc_make);
 
 ** each file (loop) [+2]                                         :loop:files:
 *** filename provided [+1]                                     :file:process:
-**** loop scope                                                       :scope:
+**** scope (loop)                                                     :scope:
 
 #+NAME: sdp_each_file_do
 #+BEGIN_SRC d
@@ -445,7 +390,7 @@ output.hub(
 );
 #+END_SRC
 
-**** on exit                                                     :scope:exit:
+**** scope (on loop exit)                                        :scope:exit:
 
 #+NAME: sdp_each_file_do
 #+BEGIN_SRC d
@@ -529,7 +474,7 @@ void main(string[] args) {
 ** program dir structure
 figure out best program dir structure for dub and compilers, issue with rdmd
 
-** sisu file structure
+** sisu document structure
 
 |---------------------+------------------------------------------+------------------------+--------|
 | header              | sisu /header markup/                       | markup                 |        |
@@ -561,6 +506,7 @@ figure out best program dir structure for dub and compilers, issue with rdmd
 
 ** config                                                            :config:
 using sdlang in sdp
+
 *** sdp config and header? file format? sdl ? yml ? json ?       :sdl:sdlang:
 
 [[https://sdlang.org/][SDL: Simple Declarative Language]]  [[http://sdl4r.rubyforge.org/syntaxhighlighter_brush.html][highlighter]]
@@ -610,27 +556,31 @@ http://forum.dlang.org/thread/gnfctbuhiemidetngrzi@forum.dlang.org?page=23#post-
 *** other links
 http://semitwist.com/sdlang-d-docs/v0.9.3/sdlang.html  http://semitwist.com/sdlang-d-docs/
 
-** read markup files
-**** regular .sst
-relatively straight forward
-**** master .ssm
-master files have been able to read in inser files .ssi and regular files .sst
-***** reading in .ssi files is straightforward
-***** reading in .sst files is more problematic
-.sst files have their own root (structure)
-either
-- the root needs to be disabled - not used
-or
-- the root tree needs to be demoted, which is only possible if markup from
-  heading D is not reached then A - C could be demoted to B - D
-- the other issue there is that it is common not to write out heading level A
-  text but to rely on the metadata for title and author, the issue there is that
-  at present the header for .sst files that are imported is just lopped off and
-  thrown away. At least the title and author information for each imported .sst
-  file would have to read and available for use in its header A that is demoted
-  to B
+** markup
+*** code
+
+#+BEGIN_SRC txt :tangle no
+code.ruby{
+
+}code
+
+code.python{
+
+}code
+
+code.sh{
+
+}code
+
+code.txt{
+
+}code
+
+code.d{
+
+}code
+#+END_SRC
 
-** processing files, currently using utf8
 ** src dir structure & files
 #+BEGIN_SRC txt :tangle no
 tree  /home/ralph/sisu_www/current/src/democratizing_innovation.eric_von_hippel.sst
@@ -653,7 +603,29 @@ democratizing_innovation.eric_von_hippel.sst
 
 #+END_SRC
 
+** read markup files
+**** regular .sst
+relatively straight forward
+**** master .ssm
+master files have been able to read in inser files .ssi and regular files .sst
+***** reading in .ssi files is straightforward
+***** reading in .sst files is more problematic
+.sst files have their own root (structure)
+either
+- the root needs to be disabled - not used
+or
+- the root tree needs to be demoted, which is only possible if markup from
+  heading D is not reached then A - C could be demoted to B - D
+- the other issue there is that it is common not to write out heading level A
+  text but to rely on the metadata for title and author, the issue there is that
+  at present the header for .sst files that are imported is just lopped off and
+  thrown away. At least the title and author information for each imported .sst
+  file would have to read and available for use in its header A that is demoted
+  to B
+
+** processing files, currently using utf8
 ** check
+
 #+BEGIN_SRC text
 ./.sisu ./_sisu ~/.sisu /etc/.sisu
 #+END_SRC
diff --git a/src/sdp.d b/src/sdp.d
index f03b7de..afc87a0 100755
--- a/src/sdp.d
+++ b/src/sdp.d
@@ -37,57 +37,7 @@ private import
   std.typecons,
   std.utf,
   std.conv : to;
-struct SDPoutput {
-  auto hub(S)(
-    auto ref const S         contents,
-    string[][string][string] bookindex_unordered_hashes,
-    JSONValue[]              biblio,
-    string[string][string]   dochead_make_json,
-    string[string][string]   dochead_meta_json,
-    string                   fn_src,
-    bool[string]             opt_action_bool
-  ) {
-    mixin ScreenTxtColors;
-    mixin RgxInit;
-    mixin SiSUoutputHub;
-    auto rgx = Rgx();
-    uint return_ = 0;
-    if (opt_action_bool["source"]) {
-      writeln("sisupod source");
-    }
-    if (opt_action_bool["sisupod"]) {
-      writeln("sisupod source");
-    }
-    if (opt_action_bool["text"]) {
-      writeln("text processing");
-      // auto text=SDPoutput_text();
-      // text.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
-      // // text.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make, dochead_meta, fn_src, opt_action_bool);
-    }
-    if (opt_action_bool["html"]) {
-      auto html=SDPoutputHTML();
-      html.css_write;
-      html.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
-      // html.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make_aa, dochead_meta_aa, fn_src, opt_action_bool);
-    }
-    if (opt_action_bool["epub"]) {
-      writeln("epub processing");
-    }
-    if (opt_action_bool["pdf"]) {
-      writeln("pdf processing");
-    }
-    if (opt_action_bool["odt"]) {
-      writeln("odt processing");
-    }
-    if (opt_action_bool["sqlite"]) {
-      writeln("sqlite processing");
-    }
-    if (opt_action_bool["postgresql"]) {
-      writeln("pgsql processing");
-    }
-    return return_;
-  }
-}
+
 mixin(import("version.txt"));
 mixin CompileTimeInfo;
 mixin RgxInit;
@@ -135,8 +85,7 @@ void main(string[] args) {
   scope(failure) {
     debug(checkdoc) {
       stderr.writefln(
-        "%s~ run failure ~%s",
-         scr_txt_color["fuchsia"], scr_txt_color["off"],
+        "run failure",
       );
     }
   }
diff --git a/src/sdp/ao_abstract_doc_source.d b/src/sdp/ao_abstract_doc_source.d
index 067e920..5095dab 100644
--- a/src/sdp/ao_abstract_doc_source.d
+++ b/src/sdp/ao_abstract_doc_source.d
@@ -538,7 +538,7 @@ template SiSUdocAbstraction() {
       obj_cite_number = bi_tuple[1];
       debug(bookindex) {                         // bookindex
         foreach (bi_entry; bookindex_section) {
-          writeln(bi_entry["obj"]);
+          writeln(bi_entry);
         }
       }
       auto document_the =
@@ -2509,32 +2509,6 @@ template SiSUdocAbstraction() {
       invariant() {
       }
     }
-    struct BookIndexReport {
-    // class BookIndexReport : AssertBookIndexReport {
-      int mkn, skn;
-      auto bookindex_report_sorted(
-        string[][string][string] bookindex_unordered_hashes
-      ) {
-        auto mainkeys=bookindex_unordered_hashes.byKey.array.
-          sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
-        foreach (mainkey; mainkeys) {
-          auto subkeys=bookindex_unordered_hashes[mainkey].byKey.array.
-            sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
-          foreach (subkey; subkeys) {
-            debug(bookindex) {
-              writeln(
-                mainkey, ": ",
-                subkey, ": ",
-                to!string(bookindex_unordered_hashes[mainkey][subkey])
-              );
-            }
-            ++skn;
-          }
-          ++mkn;
-        }
-        // return bookindex_the;
-      }
-    }
     struct BookIndexReportIndent {
       int mkn, skn;
       auto bookindex_report_indented(
diff --git a/src/sdp/ao_conf_make_meta_sdlang.d b/src/sdp/ao_conf_make_meta_sdlang.d
index 16a36e9..612c88a 100644
--- a/src/sdp/ao_conf_make_meta_sdlang.d
+++ b/src/sdp/ao_conf_make_meta_sdlang.d
@@ -32,6 +32,107 @@ template SiSUheaderExtractSDLang() {
     private auto documentMakeSDLangToAAmake(Tag document_make_sdlang) {
       auto dochead_make = sdlangToAAmake(make_aa, document_make_sdlang);
       /+
+      /+ dochead +/
+      string hm;
+      string hs;
+      /+ make +/
+      auto dochead_make = make_aa;
+      if (!(document_make_sdlang.maybe.tags["make"].empty)) {
+        hm = "make";
+        hs = "bold";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "breaks";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "cover_image";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "css";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "emphasis";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "footer";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "headings";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "home_button_image";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "home_button_text";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "italics";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "num_top";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "substitute";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "texpdf_font";
+        if (!(document_make_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (document_make_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_make[hm][hs] =
+            to!string(document_make_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+      }
+      +/
+      /+
       hm = "links";
       if (!(document_make_sdlang.maybe.tags[hm].empty)) {
         /+ TODO
@@ -153,6 +254,20 @@ template SiSUheaderExtractSDLang() {
           dochead_meta[hm][hs] =
             to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
         }
+        hs = "edition";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "note";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
       }
       hm = "creator";
       if (!(header_sdlang.maybe.tags[hm].empty)) {
@@ -169,6 +284,141 @@ template SiSUheaderExtractSDLang() {
           dochead_meta[hm][hs] =
             to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
         }
+        hs = "author_email";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "illustrator";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "translator";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+      }
+      hm = "classify";
+      if (!(header_sdlang.maybe.tags[hm].empty)) {
+        hs = "dewey";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "keywords";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "loc";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "subject";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "topic_register";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+      }
+      hm = "date";
+      if (!(header_sdlang.maybe.tags[hm].empty)) {
+        hs = "added_to_site";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "available";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "created";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "issued";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "modified";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "published";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "valid";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+      }
+      hm = "identifier";
+      if (!(header_sdlang.maybe.tags[hm].empty)) {
+        hs = "isbn";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "oclc";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "pg";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
       }
       hm = "links";
       if (!(header_sdlang.maybe.tags[hm].empty)) {
@@ -183,6 +433,47 @@ template SiSUheaderExtractSDLang() {
         //     to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
         // }
       }
+      hm = "notes";
+      if (!(header_sdlang.maybe.tags[hm].empty)) {
+        hs = "abstract";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "description";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+      }
+      hm = "original";
+      if (!(header_sdlang.maybe.tags[hm].empty)) {
+        hs = "language";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "source";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "title";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+      }
       hm = "publisher";
       if (!(header_sdlang.maybe.tags[hm].empty)) {
         hs = "name";
@@ -193,6 +484,36 @@ template SiSUheaderExtractSDLang() {
             to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
         }
       }
+      hm = "rights";
+      if (!(header_sdlang.maybe.tags[hm].empty)) {
+        hs = "copyright";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "cover";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "illustrations";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
+        hs = "license";
+        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty)
+        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) {
+          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value);
+          dochead_meta[hm][hs] =
+            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value);
+        }
       }
       +/
       auto t = tuple(dochead_make, dochead_meta);
diff --git a/src/sdp/ao_output_debugs.d b/src/sdp/ao_output_debugs.d
index 68a2d40..be08ebe 100644
--- a/src/sdp/ao_output_debugs.d
+++ b/src/sdp/ao_output_debugs.d
@@ -3,13 +3,40 @@
   ao_output_debugs.d
 +/
 template SiSUoutputDebugs() {
+  struct BookIndexReport {
+  // class BookIndexReport : AssertBookIndexReport {
+    int mkn, skn;
+    auto bookindex_report_sorted(
+      string[][string][string] bookindex_unordered_hashes
+    ) {
+      auto mainkeys=bookindex_unordered_hashes.byKey.array.
+        sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
+      foreach (mainkey; mainkeys) {
+        auto subkeys=bookindex_unordered_hashes[mainkey].byKey.array.
+          sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release;
+        foreach (subkey; subkeys) {
+          debug(bookindex) {
+            writeln(
+              mainkey, ": ",
+              subkey, ": ",
+              to!string(bookindex_unordered_hashes[mainkey][subkey])
+            );
+          }
+          // bookindex_the[mkn][mainkey][skn][subkey] ~= (bookindex_unordered_hashes[mainkey][subkey]);
+          ++skn;
+        }
+        ++mkn;
+      }
+      // return bookindex_the;
+    }
+  }
   struct SDPoutputDebugs {
     auto abstract_doc_source_debugs(S)(
       auto ref const S         contents,
       string[][string][string] bookindex_unordered_hashes,
       JSONValue[]              biblio,
-      JSONValue[string]        dochead_make,
-      JSONValue[string]        dochead_meta,
+      string[string][string]   dochead_make,
+      string[string][string]   dochead_meta,
       string                   fn_src,
       bool[string]             opt_action_bool
     ) {
diff --git a/src/sdp/ao_rgx.d b/src/sdp/ao_rgx.d
index bb032ea..15f9ed9 100644
--- a/src/sdp/ao_rgx.d
+++ b/src/sdp/ao_rgx.d
@@ -76,13 +76,13 @@ template RgxInit() {
     static para_indent_hang   = ctRegex!(`^_([0-9])_([0-9]) `);
     static para_attribs       = ctRegex!(`^_(([0-9])(_([0-9]))?|_([1-9])?[*]) `);
     /+ blocked markup +/
-    static block_open                = ctRegex!("^((code|poem|group|block|quote|table)[{].*?$)|^`{3} (code|poem|group|block|quote|table)");
+    static block_open                = ctRegex!("^((code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)[{].*?$)|^`{3} (code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)");
     // static block_open_less_code      = ctRegex!("^(((poem|group|block|quote|table)[{].*?$)|`{3} (poem|group|block|quote|table))");
     static block_poem_open                = ctRegex!("^((poem[{].*?$)|`{3} poem)");
     /+ blocked markup tics +/
-    static block_tic_open            = ctRegex!("^`{3} (code|poem|group|block|quote|table)");
+    static block_tic_open            = ctRegex!("^`{3} (code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)");
     // static block_tic_open_less_code  = ctRegex!("^`{3} (poem|group|block|quote|table)");
-    static block_tic_code_open       = ctRegex!("^`{3} (code)");
+    static block_tic_code_open       = ctRegex!("^`{3} (code)([.][a-z][0-9a-z_]+)?");
     static block_tic_poem_open       = ctRegex!("^`{3} (poem)");
     static block_tic_group_open      = ctRegex!("^`{3} (group)");
     static block_tic_block_open      = ctRegex!("^`{3} (block)");
@@ -90,9 +90,9 @@ template RgxInit() {
     static block_tic_table_open      = ctRegex!("^`{3} (table)");
     static block_tic_close           = ctRegex!("^(`{3})$","m");
     /+ blocked markup curly +/
-    static block_curly_open          = ctRegex!(`^((code|poem|group|block|quote|table)[{].*?$)`);
+    static block_curly_open          = ctRegex!(`^((code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)[{].*?$)`);
     // static block_curly_open_less_code = ctRegex!(`^((poem|group|block|quote|table)[{].*?$)`);
-    static block_curly_code_open     = ctRegex!(`^(code[{].*?$)`);
+    static block_curly_code_open     = ctRegex!(`^(code([.][a-z][0-9a-z_]+)?[{].*?$)`);
     static block_curly_code_close    = ctRegex!(`^([}]code)`);
     static block_curly_poem_open     = ctRegex!(`^(poem[{].*?$)`);
     static block_curly_poem_close    = ctRegex!(`^([}]poem)`);
diff --git a/src/sdp/output_hub.d b/src/sdp/output_hub.d
index f81c118..28784a3 100644
--- a/src/sdp/output_hub.d
+++ b/src/sdp/output_hub.d
@@ -3,6 +3,52 @@
   output_hub.d
 +/
 template SiSUoutputHub() {
+  struct SDPoutput {
+    void hub(S)(
+      auto ref const S         contents,
+      string[][string][string] bookindex_unordered_hashes,
+      JSONValue[]              biblio,
+      string[string][string]   dochead_make_json,
+      string[string][string]   dochead_meta_json,
+      string                   fn_src,
+      bool[string]             opt_action_bool
+    ) {
+      auto rgx = Rgx();
+      if (opt_action_bool["source"]) {
+        writeln("sisupod source");
+      }
+      if (opt_action_bool["sisupod"]) {
+        writeln("sisupod source");
+      }
+      if (opt_action_bool["text"]) {
+        writeln("text processing");
+        // auto text=SDPoutput_text();
+        // text.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
+        // // text.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make, dochead_meta, fn_src, opt_action_bool);
+      }
+      if (opt_action_bool["html"]) {
+        auto html=SDPoutputHTML();
+        html.css_write;
+        html.scroll(contents, bookindex_unordered_hashes, biblio, fn_src, opt_action_bool);
+        // html.scroll(contents, bookindex_unordered_hashes, biblio, dochead_make_aa, dochead_meta_aa, fn_src, opt_action_bool);
+      }
+      if (opt_action_bool["epub"]) {
+        writeln("epub processing");
+      }
+      if (opt_action_bool["pdf"]) {
+        writeln("pdf processing");
+      }
+      if (opt_action_bool["odt"]) {
+        writeln("odt processing");
+      }
+      if (opt_action_bool["sqlite"]) {
+        writeln("sqlite processing");
+      }
+      if (opt_action_bool["postgresql"]) {
+        writeln("pgsql processing");
+      }
+    }
+  }
   struct SDPoutputHTML {
     auto html_css() {
       string css;
@@ -1415,8 +1461,6 @@ template SiSUoutputHub() {
       string                   fn_src,
       bool[string]             opt_action_bool
     ) {
-      mixin ScreenTxtColors;
-      mixin RgxInit;
       auto rgx = Rgx();
       string[] toc;
       string[] body_;
diff --git a/views/version.txt b/views/version.txt
index cbd04bd..61c060a 100644
--- a/views/version.txt
+++ b/views/version.txt
@@ -4,4 +4,4 @@ struct Version {
   int minor;
   int patch;
 }
-enum ver = Version(0, 6, 2);
+enum ver = Version(0, 6, 3);
-- 
cgit v1.2.3