From 30faa243410ac4b335fbe09d9ca90091629078b7 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Thu, 2 Feb 2017 19:53:18 -0500
Subject: reorganize org file

---
 org/ao_debugs.org                | 863 ++++++++++++++++++++++++++++++++++
 org/ao_defaults.org              |   2 +-
 org/ao_doc_abstraction.org       |  34 +-
 org/ao_read_source_files.org     |   1 -
 org/ao_summary_and_debugs.org    | 983 ---------------------------------------
 org/output.org                   |  30 +-
 org/sdp.org                      | 177 ++++++-
 src/sdp/abstraction.d            |   4 +-
 src/sdp/abstraction_summary.d    |  32 +-
 src/sdp/ao_abstract_doc_source.d |  16 +-
 src/sdp/ao_doc_debugs.d          |  42 +-
 src/sdp/ao_rgx.d                 |   2 +-
 src/sdp/output_hub.d             |  16 +-
 13 files changed, 1124 insertions(+), 1078 deletions(-)
 create mode 100644 org/ao_debugs.org
 delete mode 100644 org/ao_summary_and_debugs.org

diff --git a/org/ao_debugs.org b/org/ao_debugs.org
new file mode 100644
index 0000000..7a63a3a
--- /dev/null
+++ b/org/ao_debugs.org
@@ -0,0 +1,863 @@
+#+TITLE: sdp output debugs
+#+AUTHOR: Ralph Amissah
+#+EMAIL: ralph.amissah@gmail.com
+#+STARTUP: indent
+#+LANGUAGE: en
+#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
+#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
+#+OPTIONS: author:nil email:nil creator:nil timestamp:nil
+#+PROPERTY: header-args :padline no :exports code :noweb yes
+#+EXPORT_SELECT_TAGS: export
+#+EXPORT_EXCLUDE_TAGS: noexport
+#+FILETAGS: :sdp:rel:ao:
+#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)
+
+[[./sdp.org][sdp]]  [[./][org/]]
+* 1. abstraction debugs                               :debug:doc:abstraction:
+** 0. code structure:                                        :ao_doc_debugs:
+
+#+BEGIN_SRC d :tangle ../src/sdp/ao_doc_debugs.d
+/++
+  output debugs
++/
+template SiSUdebugs() {
+  <<debug_imports>>
+  auto SiSUdebugs(S,T)(
+    auto ref const S         contents,
+    auto ref T               doc_matters,
+  ) {
+    mixin SiSUrgxInit;
+    mixin InternalMarkup;
+    <<initialize>>
+    <<ao_output_debugs>>
+    debug(checkdoc) {
+      if ((doc_matters.opt_action_bool["debug"])) {
+        <<ao_output_debugs_summary>>
+        <<ao_output_debugs_checkdoc>>
+      }
+    }
+  }
+}
+#+END_SRC
+
+** imports
+
+#+name: debug_imports
+#+BEGIN_SRC d
+import
+  ao_defaults,
+  ao_rgx;
+private import
+  std.algorithm,
+  std.array,
+  std.container,
+  std.exception,
+  std.json,
+  std.stdio,
+  std.file,
+  std.path,
+  std.range,
+  std.regex,
+  std.string,
+  std.traits,
+  std.typecons,
+  std.uni,
+  std.utf,
+  std.conv : to;
+#+END_SRC
+
+** initialize                                                       :report:
+
+#+name: initialize
+#+BEGIN_SRC d
+auto rgx = Rgx();
+auto markup = InlineMarkup();
+string key;
+#+END_SRC
+
+** (parent)                                                         :parent:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(parent) {
+  writefln(
+    "%s:%s",
+    __FILE__,
+    __LINE__,
+  );
+  foreach (key; doc_matters.keys_seq_seg) {
+    foreach (obj; contents[key]) {
+      if (obj.use != "empty") {
+        if (obj.is_a == "heading") {
+          writefln(
+            "%s node: %s heading: %s %s",
+            obj.obj_cite_number,
+            obj.node,
+            obj.heading_lev_markup,
+            obj.text,
+          );
+        }
+      }
+    }
+  }
+}
+#+END_SRC
+
+** (dumpdoc)                                                       :objects:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(dumpdoc) {
+  writefln(
+    "%s\n%s:%s",
+    "-------------------------------",
+    __FILE__,
+    __LINE__,
+  );
+  foreach (obj; contents) {
+    if (obj.use != "empty") {
+      writefln(
+        "[%s][%s]\n%s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+** (segnames)                                                      :objects:
+
+#+name: ao_output_debugs_checkdoc
+#+BEGIN_SRC d
+debug(checkdoc) {
+  void out_segnames(S,T)(
+    auto ref const S         contents,
+    auto ref T               doc_matters,
+  ) {
+    foreach (key; doc_matters.keys_seq_seg) {
+      if (contents[key].length > 1) {
+        foreach (obj; contents[key]) {
+          if (obj.heading_lev_markup == 4) {
+            writeln(obj.ptr_html_segnames, ". (", doc_matters.segnames[obj.ptr_html_segnames], ") -> ",  obj.text);
+          }
+        }
+      }
+    }
+  }
+}
+#+END_SRC
+
+** shared output section arrange
+*** out toc
+
+#+name: ao_output_debugs_checkdoc
+#+BEGIN_SRC d
+debug(checkdoc) {
+  void out_toc(S)(
+    auto ref const S         contents,
+    string                   key,
+  ) {
+    if (contents[key].length > 1) {
+      string indent_spaces;
+      foreach (obj; contents[key]) {
+        indent_spaces=markup.indent_by_spaces_provided(obj.indent_hang);
+        writefln(
+          "%s%s",
+          indent_spaces,
+          obj.text
+        );
+      }
+    }
+  }
+}
+#+END_SRC
+
+*** out endnotes                                                 :endnotes:
+
+#+name: ao_output_debugs_checkdoc
+#+BEGIN_SRC d
+debug(checkdoc) {
+  void out_endnotes(S)(
+    auto ref const S         contents,
+    string                   key,
+  ) {
+    if (contents[key].length > 1) {
+      foreach (obj; contents[key]) {
+        writefln(
+          "[%s]\n%s",
+          obj.is_a,
+          obj.text
+        );
+      }
+    }
+  }
+}
+#+END_SRC
+
+*** out bookindex                                               :bookindex:
+
+#+name: ao_output_debugs_checkdoc
+#+BEGIN_SRC d
+debug(checkdoc) {
+  void out_bookindex(S)(
+    auto ref const S         contents,
+    string                   key,
+  ) {
+    if (contents[key].length > 1) {
+      foreach (obj; contents[key]) {
+        writefln(
+          "[%s][%s]\n%s",
+          obj.obj_cite_number,
+          obj.is_a,
+          obj.text
+        );
+      }
+    }
+  }
+}
+#+END_SRC
+
+** sections
+*** heading_section                                               :heading:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_head) {
+  key="head";
+  if (contents[key].length > 1) {
+    foreach (obj; contents[key]) {
+      writefln(
+        "[%s][%s]\n%s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+*** toc_section (seg & scroll)
+**** toc
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_toc) {
+  key="toc_seg";
+  out_toc(contents, key);
+}
+#+END_SRC
+
+**** toc seg
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_toc_seg) {
+  key="toc_seg";
+  out_toc(contents, key);
+}
+#+END_SRC
+
+**** toc scroll
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_toc_scroll) {
+  key="toc_scroll";
+  out_toc(contents, key);
+}
+#+END_SRC
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(segnames) {
+  writeln(__LINE__);
+  out_segnames(contents, doc_matters);
+}
+#+END_SRC
+
+*** body_section                                                     :body:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_body) {
+  key="body";
+  if (contents[key].length > 1) {
+    foreach (obj; contents[key]) {
+      writefln(
+        "[%s][%s]\n%s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+*** dom structure                                                    :body:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(dom) {
+  enum DomTags { none, open, close, close_and_open, open_still, }
+  foreach (sect; doc_matters.keys_seq_seg) {
+    foreach (obj; contents[sect]) {
+      if (obj.is_a == "heading") {
+        foreach_reverse (k; 0 .. 7) {
+          switch (obj.dom_markedup[k]) {
+          case DomTags.close :
+            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
+            break;
+          case DomTags.close_and_open :
+            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
+            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
+            break;
+          case DomTags.open :
+            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
+            break;
+          default :
+            break;
+          }
+        }
+      }
+    }
+  }
+  writeln("--------------------");
+  foreach (sect; doc_matters.keys_seq_seg) {
+    foreach (obj; contents[sect]) {
+      if (obj.is_a == "heading") {
+        foreach_reverse (k; 0 .. 7) {
+          switch (obj.dom_collapsed[k]) {
+          case DomTags.close :
+            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
+            break;
+          case DomTags.close_and_open :
+            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
+            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
+            break;
+          case DomTags.open :
+            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
+            break;
+          default :
+            break;
+          }
+        }
+      }
+    }
+  }
+}
+#+END_SRC
+
+*** endnotes_section (seg & scroll)                              :endnotes:
+**** endnotes
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_endnotes) {
+  key="endnotes";
+  out_endnotes(contents, key);
+}
+#+END_SRC
+
+**** endnotes seg
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_endnotes_seg) {
+  key="endnotes";
+  out_endnotes(contents, key);
+}
+#+END_SRC
+
+*** glossary_section                                             :glossary:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_glossary) {
+  key="glossary";
+  if (contents[key].length > 1) {
+    foreach (obj; contents[key]) {
+      writefln(
+        "[%s][%s]\n%s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+*** bibliography_section (seg & scroll)                      :bibliography:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_bibliography) {
+  key="bibliography";
+  if (contents[key].length > 1) {
+    foreach (obj; contents[key]) {
+      writefln(
+        "[%s][%s]\n%s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+*** bookindex_section (seg & scroll)                            :bookindex:
+**** bookindex
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_bookindex) {
+  key="bookindex_seg";
+  out_bookindex(contents, key);
+}
+#+END_SRC
+
+**** bookindex seg
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_bookindex_seg) {
+  key="bookindex_seg";
+  out_bookindex(contents, key);
+}
+#+END_SRC
+
+**** bookindex scroll
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(section_bookindex_scroll) {
+  key="bookindex_scroll";
+  out_bookindex(contents, key);
+}
+#+END_SRC
+
+*** section_blurb                                                   :blurb:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(blurb_section) {
+  key="blurb";
+  if (contents[key].length > 1) {
+    foreach (obj; contents[key]) {
+      writefln(
+        "[%s][%s]\n%s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+** (objects)                                                       :objects:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(objects) {
+  writefln(
+    "%s\n%s:%s",
+    "-------------------------------",
+    __FILE__,
+    __LINE__,
+  );
+  foreach (obj; contents) {
+    if (obj.use != "empty") {
+      writefln(
+        "* [%s][%s] %s",
+        obj.obj_cite_number,
+        obj.is_a,
+        obj.text
+      );
+    }
+  }
+}
+#+END_SRC
+
+** (headermakejson)                                            :json:header:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(headermakejson) {
+  writefln(
+    "%s\n%s\n%s",
+    "document header, metadata & make instructions:",
+    doc_matters.dochead_meta,
+    ptr_head_main,
+  );
+  foreach (main_header; ptr_head_main) {
+    switch (main_header) {
+    case "make":
+      foreach (sub_header; ptr_head_sub_make) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    default:
+      break;
+    }
+  }
+}
+#+END_SRC
+
+** (headermetadatajson)                                        :json:header:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(headermetadatajson) {
+  writefln(
+    "%s\n%s\n%s",
+    "document header, metadata & make instructions:",
+    doc_matters.dochead_meta,
+    ptr_head_main,
+  );
+  foreach (main_header; ptr_head_main) {
+    switch (main_header) {
+    case "creator":
+      foreach (sub_header; ptr_head_sub_creator) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "title":
+      foreach (sub_header; ptr_head_sub_title) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "rights":
+      foreach (sub_header; ptr_head_sub_rights) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "date":
+      foreach (sub_header; ptr_head_sub_date) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "original":
+      foreach (sub_header; ptr_head_sub_original) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "classify":
+      foreach (sub_header; ptr_head_sub_classify) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "identifier":
+      foreach (sub_header; ptr_head_sub_identifier) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "notes":
+      foreach (sub_header; ptr_head_sub_notes) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    case "publisher":
+      foreach (sub_header; ptr_head_sub_publisher) {
+        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
+          writefln(
+            "%s:%s: %s",
+            main_header,
+            sub_header,
+            doc_matters.dochead_meta[main_header][sub_header]
+          );
+        }
+      }
+      break;
+    default:
+      break;
+    }
+  }
+}
+#+END_SRC
+
+** anchor tags
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(anchor) {
+  writefln(
+    "%s\n%s:%s",
+    "-------------------------------",
+    __FILE__,
+    __LINE__,
+  );
+  foreach (k; doc_matters.keys_seq_seg) {
+    foreach (obj; contents[k]) {
+      if (obj.is_a == "heading") {
+        writefln(
+          "%s~ [%s] %s %s",
+          obj.marked_up_level,
+          obj.obj_cite_number,
+          obj.anchor_tags,
+          // "[", obj["is"], "] ",
+          obj.text
+        );
+      }
+    }
+  }
+}
+#+END_SRC
+
+** (headings)                                                     :headings:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(heading) {                         // heading
+  foreach (k; doc_matters.keys_seq_seg) {
+    foreach (o; contents[k]) {
+      if (o.is_a == "heading") {
+        writefln(
+          "%s* %s\n                (markup level: %s; collapsed level: %s)",
+          replicate("  ", o.heading_lev_markup),
+          strip(o.text),
+          o.heading_lev_markup,
+          o.heading_lev_collapsed,
+        );
+      }
+    }
+  }
+}
+#+END_SRC
+
+** (summary) [+1]                                                  :summary:
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(headings) {
+  writefln(
+    "%s\n%s:%s",
+    "-------------------------------",
+    __FILE__,
+    __LINE__,
+  );
+  foreach (k; doc_matters.keys_seq_seg) {
+    foreach (obj; contents[k]) {
+      if (obj.is_a == "heading") {
+        writefln(
+          "%s~ [%s] %s",
+          obj.marked_up_level,
+          obj.obj_cite_number,
+          // "[", obj["is"], "] ",
+          obj.text
+        );
+      }
+    }
+  }
+}
+#+END_SRC
+
+#+name: ao_output_debugs
+#+BEGIN_SRC d
+debug(summary) {
+  string[string] check = [
+    "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
+  ];
+}
+#+END_SRC
+
+*** compare number of obj_cite_number for known sisu markup output (checkdoc)
+
+#+name: ao_output_debugs_summary
+#+BEGIN_SRC d
+debug(checkdoc) {
+  if (auto mfn=match(doc_matters.source_filename, rgx.src_fn)) {
+    if (doc_matters.opt_action_bool["assertions"]) {
+      switch (mfn.captures[2]) {
+      // live manual:
+      case "live-manual.ssm":
+        assert(check["last_obj_cite_number"] ==
+          "1019","last obj_cite_number should be: 1019 (check test, document is frequently updated)"); // ok
+        break;
+      // sisu_markup:
+      case "sisu_markup.sst":
+        assert(check["last_obj_cite_number"] ==
+          "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]); // ok
+        // assert(check["last_obj_cite_number"] == "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]);
+        // notes for first divergance study sisu headings 247 250
+        // sisu has issue with code that contains heading 1~ which results in no obj_cite_number! ??
+        // sisu currently has incorrect last body obj_cite_number of 294!
+        // bug in sisu? attend
+        break;
+      // sisu-markup-samples:
+      case "accelerando.charles_stross.sst":
+        assert(check["last_obj_cite_number"] ==
+          "2861","last obj_cite_number expected to be: 2861 rather than " ~ check["last_obj_cite_number"]); // ok
+        break;
+      case "alices_adventures_in_wonderland.lewis_carroll.sst":
+        assert(check["last_obj_cite_number"] ==
+          "805","last obj_cite_number expected to be: 805 rather than " ~ check["last_obj_cite_number"]); // 808
+        break;
+      case "autonomy_markup0.sst":
+        assert(check["last_obj_cite_number"] ==
+          "77","last obj_cite_number expected to be: 77 rather than " ~ check["last_obj_cite_number"]); // ok endnotes
+        // assert(check["last_obj_cite_number"] == "78","last obj_cite_number expected to be: 78 rather than " ~ check["last_obj_cite_number"]);
+        break;
+      case "content.cory_doctorow.sst":
+        assert(check["last_obj_cite_number"] ==
+          "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]); // 1007 way off, check obj_cite_number off switches
+        // assert(check["last_obj_cite_number"] == "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]);
+        break;
+      case "democratizing_innovation.eric_von_hippel.sst":
+        // fixed ERROR! range violation, broken check! endnotes, bookindex, biblio
+        // error in bookindex ... (ch1; ch6; ch8 )
+        assert(check["last_obj_cite_number"] ==
+          "905","last obj_cite_number expected to be: 905 rather than " ~ check["last_obj_cite_number"]); // 911
+        break;
+      case "down_and_out_in_the_magic_kingdom.cory_doctorow.sst":
+        assert(check["last_obj_cite_number"] ==
+          "1417","last obj_cite_number expected to be: 1417 rather than " ~ check["last_obj_cite_number"]); // 1455 check obj_cite_number off switches
+        break;
+      case "for_the_win.cory_doctorow.sst":
+        assert(check["last_obj_cite_number"] ==
+          "3510","last obj_cite_number expected to be: 3510 rather than " ~ check["last_obj_cite_number"]); // 3569 check obj_cite_number off switches
+        break;
+      case "free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst":
+        assert(check["last_obj_cite_number"] ==
+          "1082","last obj_cite_number expected to be: 1082 rather than " ~ check["last_obj_cite_number"]); // check 1079 too few
+        break;
+      case "free_culture.lawrence_lessig.sst":
+        assert(check["last_obj_cite_number"] ==
+          "1330","last obj_cite_number expected to be: 1330 rather than " ~ check["last_obj_cite_number"]); // 1312
+        // fixed ERROR! range violation, broken check!
+        // error in bookindex ... sections piracy (ch1) & property (ch10 market concentration) fixed
+        break;
+      case "free_for_all.peter_wayner.sst": // endnotes, bookindex, biblio
+        assert(check["last_obj_cite_number"] ==
+          "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]); // 1560, check obj_cite_number off switches, has endnotes so 2 too many
+        // assert(check["last_obj_cite_number"] == "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]);
+        break;
+      case "gpl2.fsf.sst":
+        assert(check["last_obj_cite_number"] ==
+          "65","last obj_cite_number expected to be: 65 rather than " ~ check["last_obj_cite_number"]); // ok endnotes? check
+        // assert(check["last_obj_cite_number"] == "66","last obj_cite_number expected to be: 66 rather than " ~ check["last_obj_cite_number"]);
+        break;
+      case "gpl3.fsf.sst":
+        assert(check["last_obj_cite_number"] ==
+          "123","last obj_cite_number expected to be: 123 rather than " ~ check["last_obj_cite_number"]); // ok
+        break;
+      case "gullivers_travels.jonathan_swift.sst":
+        assert(check["last_obj_cite_number"] ==
+          "668","last obj_cite_number expected to be: 668 rather than " ~ check["last_obj_cite_number"]); // 674
+        break;
+      case "little_brother.cory_doctorow.sst":
+        assert(check["last_obj_cite_number"] ==
+          "3130","last obj_cite_number expected to be: 3130 rather than " ~ check["last_obj_cite_number"]); // 3204, check obj_cite_number off switches
+        break;
+      case "the_cathedral_and_the_bazaar.eric_s_raymond.sst":
+        assert(check["last_obj_cite_number"] ==
+          "258","last obj_cite_number expected to be: 258 rather than " ~ check["last_obj_cite_number"]); // ok
+        break;
+      case "the_public_domain.james_boyle.sst":
+        assert(check["last_obj_cite_number"] ==
+          "970","last obj_cite_number expected to be: 970 rather than " ~ check["last_obj_cite_number"]); // 978
+        break;
+      case "the_wealth_of_networks.yochai_benkler.sst": // endnotes, bookindex
+        assert(check["last_obj_cite_number"] ==
+          "829","last obj_cite_number expected to be: 829 rather than " ~ check["last_obj_cite_number"]); // ok
+        // assert(check["last_obj_cite_number"] == "832","last obj_cite_number expected to be: 832 rather than " ~ check["last_obj_cite_number"]);
+        // has endnotes and bookindex, issue with sisu.rb
+        break;
+      case "through_the_looking_glass.lewis_carroll.sst":
+        assert(check["last_obj_cite_number"] ==
+          "949","last obj_cite_number expected to be: 949 rather than " ~ check["last_obj_cite_number"]); // 955
+        break;
+      case "two_bits.christopher_kelty.sst": // endnotes, bookindex, biblio
+        assert(check["last_obj_cite_number"] ==
+          "1190","last obj_cite_number expected to be: 1190 rather than " ~ check["last_obj_cite_number"]); // 1191
+        // assert(check["last_obj_cite_number"] == "1193","last obj_cite_number expected to be: 1193 rather than " ~ check["last_obj_cite_number"]); // 1191 ok?
+        // has endnotes and bookindex, issue with sisu.rb
+        break;
+        // fixed ERROR! range violation!
+        // error in bookindex ... (ch3 the movement)
+      case "un_contracts_international_sale_of_goods_convention_1980.sst":
+        assert(check["last_obj_cite_number"] ==
+          "377","last obj_cite_number expected to be: 377 rather than " ~ check["last_obj_cite_number"]); // ok
+        break;
+      case "viral_spiral.david_bollier.sst": // endnotes, bookindex
+        assert(check["last_obj_cite_number"] ==
+          "1078","last obj_cite_number expected to be: 1078 rather than " ~ check["last_obj_cite_number"]); // 1100
+        // fixed ERROR! range violation!
+        // error in bookindex ... (ch7 ... building the cc machine, an extra semi colon)
+        break;
+      default:
+        writeln(doc_matters.source_filename);
+        break;
+      }
+    }
+  }
+}
+#+END_SRC
diff --git a/org/ao_defaults.org b/org/ao_defaults.org
index a798763..2cb0eee 100644
--- a/org/ao_defaults.org
+++ b/org/ao_defaults.org
@@ -1007,7 +1007,7 @@ static inline_a_url                                    = ctRegex!(`(┤)(\S+?)(
 
 #+name: ao_rgx
 #+BEGIN_SRC d
-static image                                           = ctRegex!(`([a-zA-Z._-]+?\.(?:png|gif|jpg))`, "mg");
+static image                                           = ctRegex!(`([a-zA-Z0-9._-]+?\.(?:png|gif|jpg))`, "mg");
 #+END_SRC
 
 ** inline markup book index                               :inline:bookindex:
diff --git a/org/ao_doc_abstraction.org b/org/ao_doc_abstraction.org
index 33ebea3..e4f38d3 100644
--- a/org/ao_doc_abstraction.org
+++ b/org/ao_doc_abstraction.org
@@ -26,11 +26,11 @@ Process markup document, create document abstraction.
 +/
 template SiSUdocAbstraction() {
   /+ ↓ abstraction imports +/
-  <<abs_imports>>
+  <<abs_top_imports>>
   /+ ↓ abstraction mixins +/
-  <<abs_mixins>>
+  <<abs_top_mixins>>
   /+ ↓ abstraction struct init +/
-  <<abs_init_struct>>
+  <<abs_top_init_struct>>
   /+ ↓ abstract marked up document +/
   auto SiSUdocAbstraction(Src,Make,Meta,Opt)(
     Src                  markup_sourcefile_content,
@@ -137,10 +137,9 @@ template SiSUdocAbstraction() {
 
 ** 1. _pre loop processing_                                            :pre:
 *** imports                                                       :imports:
-
 [[./ao_defaults.org][ao_defaults]]
 
-#+name: abs_imports
+#+name: abs_top_imports
 #+BEGIN_SRC d
 import
   ao_object_setter,
@@ -170,7 +169,7 @@ private import
 
 *** mixins                                                         :mixins:
 
-#+name: abs_mixins
+#+name: abs_top_mixins
 #+BEGIN_SRC d
 mixin ObjectSetter;
 mixin InternalMarkup;
@@ -180,7 +179,7 @@ mixin SiSUrgxInit;
 *** initialize                                                 :initialize:
 **** initialize general
 
-#+name: abs_init_struct
+#+name: abs_top_init_struct
 #+BEGIN_SRC d
 /+ initialize +/
 ObjGenericComposite[][string] the_table_of_contents_section;
@@ -240,7 +239,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** initialize heading ancestors
 
-#+name: abs_init_struct
+#+name: abs_top_init_struct
 #+BEGIN_SRC d
 void heading_ancestors(O)(
   auto ref O         obj,
@@ -298,7 +297,7 @@ void heading_ancestors(O)(
 
 **** initialize dom markup tags
 
-#+name: abs_init_struct
+#+name: abs_top_init_struct
 #+BEGIN_SRC d
 auto dom_set_markup_tags(int[] dom, int lev) {
   foreach (i; 0 .. 8) {
@@ -343,7 +342,7 @@ auto dom_set_markup_tags(int[] dom, int lev) {
 
 **** initialize dom collapsed tags
 
-#+name: abs_init_struct
+#+name: abs_top_init_struct
 #+BEGIN_SRC d
 auto dom_set_collapsed_tags(int[] dom, int lev) {
   foreach (i; 0 .. 8) {
@@ -388,7 +387,7 @@ auto dom_set_collapsed_tags(int[] dom, int lev) {
 
 **** initialize ocn emit
 
-#+name: abs_init_struct
+#+name: abs_top_init_struct
 #+BEGIN_SRC d
 int ocn_emit(int ocn_status_flag) {
   return object_citation_number.ocn_emitter(ocn_status_flag);
@@ -1172,10 +1171,10 @@ if (the_document_body_section.length > 0) {
       type["blurb_section"] = State.off;
     }
     previous_length = to!int(the_document_body_section.length);
-    if (
-      match(the_document_body_section[$-1].text,
-      rgx.inline_notes_delimiter_al_regular_number_note)
-    ) {
+    if (match(
+      the_document_body_section[$-1].text,
+      rgx.inline_notes_delimiter_al_regular_number_note
+    )) {
       previous_count=to!int(the_document_body_section.length -1);
       note_section.gather_notes_for_endnote_section(
         the_document_body_section,
@@ -1962,7 +1961,7 @@ if (the_blurb_section.length > 1) {
 #+END_SRC
 
 ** 4. _return document tuple_                                         :post:
-*** the document                                                 :document:
+*** _the document_                                               :document:
 
 #+name: abs_post
 #+BEGIN_SRC d
@@ -2026,8 +2025,9 @@ if ((opt_action_bool["html"])
 *** clean out structure
 
 #+name: abs_post
+#+BEGIN_SRC d
 destroy(the_document_head_section);
-destroy(the_document_table_of_contents_section);
+destroy(the_table_of_contents_section);
 destroy(the_document_body_section);
 destroy(the_endnotes_section);
 destroy(the_glossary_section);
diff --git a/org/ao_read_source_files.org b/org/ao_read_source_files.org
index c325517..73594dd 100644
--- a/org/ao_read_source_files.org
+++ b/org/ao_read_source_files.org
@@ -81,7 +81,6 @@ template ConfigSDLang() {
 }
 #+END_SRC
 
-
 ** config file get sdl root tag                           :file:conf:sdlang:
 
 #+name: ao_config_file_sdlang
diff --git a/org/ao_summary_and_debugs.org b/org/ao_summary_and_debugs.org
deleted file mode 100644
index 2fc405e..0000000
--- a/org/ao_summary_and_debugs.org
+++ /dev/null
@@ -1,983 +0,0 @@
-#+TITLE: sdp output debugs
-#+AUTHOR: Ralph Amissah
-#+EMAIL: ralph.amissah@gmail.com
-#+STARTUP: indent
-#+LANGUAGE: en
-#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
-#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
-#+OPTIONS: author:nil email:nil creator:nil timestamp:nil
-#+PROPERTY: header-args :padline no :exports code :noweb yes
-#+EXPORT_SELECT_TAGS: export
-#+EXPORT_EXCLUDE_TAGS: noexport
-#+FILETAGS: :sdp:rel:ao:
-#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)
-
-[[./sdp.org][sdp]]  [[./][org/]]
-* 1. abstraction summary [#A]                       :summary:doc:abstraction:
-** 0. code structure:                                  :abstraction_summary:
-
-#+BEGIN_SRC d :tangle ../src/sdp/abstraction_summary.d
-template SiSUabstractionSummary() {
-  auto SiSUabstractionSummary(S,T)(
-    auto ref const S         contents,
-    auto ref T               doc_matters,
-  ) {
-    <<abstraction_summary_imports>>
-    mixin InternalMarkup;
-    <<abstraction_summary_initialize>>
-    if (doc_matters.opt_action_bool["verbose"]) {
-      <<ao_abstraction_summary>>
-    }
-  }
-}
-#+END_SRC
-
-** imports
-
-#+name: abstraction_summary_imports
-#+BEGIN_SRC d
-import
-  ao_defaults,
-  ao_rgx;
-import
-  std.array,
-  std.exception,
-  std.stdio,
-  std.regex,
-  std.string,
-  std.traits,
-  std.typecons,
-  std.uni,
-  std.utf,
-  std.conv : to;
-#+END_SRC
-
-** initialize                                                       :report:
-
-#+name: abstraction_summary_initialize
-#+BEGIN_SRC d
-auto markup = InlineMarkup();
-#+END_SRC
-
-** (last ocn)
-
-#+name: ao_abstraction_summary
-#+BEGIN_SRC d
-string[string] check = [
-  "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
-];
-foreach (k; doc_matters.keys_seq_seg) {
-  foreach (obj; contents[k]) {
-    if (obj.use != "empty") {
-      if (!empty(obj.obj_cite_number)) {
-        check["last_obj_cite_number"] = obj.obj_cite_number;
-      }
-    }
-  }
-}
-#+END_SRC
-
-** summary
-
-#+name: ao_abstraction_summary
-#+BEGIN_SRC d
-// auto char_repeat_number = doc_matters.source_filename.length;
-// char_repeat_number = (char_repeat_number > 33)
-auto min_repeat_number = 66;
-auto char_repeat_number = (doc_matters.dochead_meta["title"]["full"].length
-  + doc_matters.dochead_meta["creator"]["author"].length + 4);
-char_repeat_number = (char_repeat_number > min_repeat_number)
-? char_repeat_number
-: min_repeat_number;
-// writeln(char_repeat_number);
-writefln(
-  "%s\n\"%s\", %s\n%s\n%s\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n(%s: %s)\n%s",
-  markup.repeat_character_by_number_provided("-", char_repeat_number),
-  doc_matters.dochead_meta["title"]["full"],
-  doc_matters.dochead_meta["creator"]["author"],
-  doc_matters.source_filename,
-  markup.repeat_character_by_number_provided("-", char_repeat_number),
-  "length toc array:      ",
-  to!int(contents["toc_seg"].length),
-  "length contents array: ",
-  to!int(contents["body"].length),
-  "last obj_cite_number:  ",
-  to!int(check["last_obj_cite_number"]),
-  "length endnotes:       ",
-  (contents["endnotes"].length > 1)
-  ? (to!int(contents["endnotes"].length))
-  : 0,
-  "length glossary:       ",
-  (contents["glossary"].length > 1)
-  ? (to!int(contents["glossary"].length))
-  : 0,
-  "length biblio:         ",
-  (contents["bibliography"].length > 1)
-  ? (to!int(contents["bibliography"].length))
-  : 0,
-  "length bookindex:      ",
-  (contents["bookindex_seg"].length > 1)
-  ? (to!int(contents["bookindex_seg"].length))
-  : 0,
-  "length blurb:          ",
-  (contents["blurb"].length > 1)
-  ? (to!int(contents["blurb"].length))
-  : 0,
-  __FILE__,
-  __LINE__,
-  markup.repeat_character_by_number_provided("-", min_repeat_number),
-);
-#+END_SRC
-
-markup.repeat_character_by_number_provided("-", 10)
-markup.repeat_character_by_number_provided("-", (doc_matters.dochead_meta["title"]["full"].length))
-markup.repeat_character_by_number_provided("-", (doc_matters.source_filename.length))
-
-* 2. abstraction debugs                               :debug:doc:abstraction:
-** 0. code structure:                                        :ao_doc_debugs:
-
-#+BEGIN_SRC d :tangle ../src/sdp/ao_doc_debugs.d
-/++
-  output debugs
-+/
-template SiSUdebugs() {
-  <<debug_imports>>
-  auto SiSUdebugs(S,T)(
-    auto ref const S         contents,
-    auto ref T               doc_matters,
-  ) {
-    mixin SiSUrgxInit;
-    mixin InternalMarkup;
-    <<initialize>>
-    <<ao_output_debugs>>
-    debug(checkdoc) {
-      if ((doc_matters.opt_action_bool["debug"])) {
-        <<ao_output_debugs_summary>>
-        <<ao_output_debugs_checkdoc>>
-      }
-    }
-  }
-}
-#+END_SRC
-
-** imports
-
-#+name: debug_imports
-#+BEGIN_SRC d
-import
-  ao_defaults,
-  ao_rgx;
-private import
-  std.algorithm,
-  std.array,
-  std.container,
-  std.exception,
-  std.json,
-  std.stdio,
-  std.file,
-  std.path,
-  std.range,
-  std.regex,
-  std.string,
-  std.traits,
-  std.typecons,
-  std.uni,
-  std.utf,
-  std.conv : to;
-#+END_SRC
-
-** initialize                                                       :report:
-
-#+name: initialize
-#+BEGIN_SRC d
-auto rgx = Rgx();
-auto markup = InlineMarkup();
-string key;
-#+END_SRC
-
-** (parent)                                                         :parent:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(parent) {
-  writefln(
-    "%s:%s",
-    __FILE__,
-    __LINE__,
-  );
-  foreach (key; doc_matters.keys_seq_seg) {
-    foreach (obj; contents[key]) {
-      if (obj.use != "empty") {
-        if (obj.is_a == "heading") {
-          writefln(
-            "%s node: %s heading: %s %s",
-            obj.obj_cite_number,
-            obj.node,
-            obj.heading_lev_markup,
-            obj.text,
-          );
-        }
-      }
-    }
-  }
-}
-#+END_SRC
-
-** (dumpdoc)                                                       :objects:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(dumpdoc) {
-  writefln(
-    "%s\n%s:%s",
-    "-------------------------------",
-    __FILE__,
-    __LINE__,
-  );
-  foreach (obj; contents) {
-    if (obj.use != "empty") {
-      writefln(
-        "[%s][%s]\n%s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-** (segnames)                                                      :objects:
-
-#+name: ao_output_debugs_checkdoc
-#+BEGIN_SRC d
-debug(checkdoc) {
-  void out_segnames(S,T)(
-    auto ref const S         contents,
-    auto ref T               doc_matters,
-  ) {
-    foreach (key; doc_matters.keys_seq_seg) {
-      if (contents[key].length > 1) {
-        foreach (obj; contents[key]) {
-          if (obj.heading_lev_markup == 4) {
-            writeln(obj.ptr_html_segnames, ". (", doc_matters.segnames[obj.ptr_html_segnames], ") -> ",  obj.text);
-          }
-        }
-      }
-    }
-  }
-}
-#+END_SRC
-
-** shared output section arrange
-*** out toc
-
-#+name: ao_output_debugs_checkdoc
-#+BEGIN_SRC d
-debug(checkdoc) {
-  void out_toc(S)(
-    auto ref const S         contents,
-    string                   key,
-  ) {
-    if (contents[key].length > 1) {
-      string indent_spaces;
-      foreach (obj; contents[key]) {
-        indent_spaces=markup.indent_by_spaces_provided(obj.indent_hang);
-        writefln(
-          "%s%s",
-          indent_spaces,
-          obj.text
-        );
-      }
-    }
-  }
-}
-#+END_SRC
-
-*** out endnotes                                                 :endnotes:
-
-#+name: ao_output_debugs_checkdoc
-#+BEGIN_SRC d
-debug(checkdoc) {
-  void out_endnotes(S)(
-    auto ref const S         contents,
-    string                   key,
-  ) {
-    if (contents[key].length > 1) {
-      foreach (obj; contents[key]) {
-        writefln(
-          "[%s]\n%s",
-          obj.is_a,
-          obj.text
-        );
-      }
-    }
-  }
-}
-#+END_SRC
-
-*** out bookindex                                               :bookindex:
-
-#+name: ao_output_debugs_checkdoc
-#+BEGIN_SRC d
-debug(checkdoc) {
-  void out_bookindex(S)(
-    auto ref const S         contents,
-    string                   key,
-  ) {
-    if (contents[key].length > 1) {
-      foreach (obj; contents[key]) {
-        writefln(
-          "[%s][%s]\n%s",
-          obj.obj_cite_number,
-          obj.is_a,
-          obj.text
-        );
-      }
-    }
-  }
-}
-#+END_SRC
-
-** sections
-*** heading_section                                               :heading:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_head) {
-  key="head";
-  if (contents[key].length > 1) {
-    foreach (obj; contents[key]) {
-      writefln(
-        "[%s][%s]\n%s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-*** toc_section (seg & scroll)
-**** toc
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_toc) {
-  key="toc_seg";
-  out_toc(contents, key);
-}
-#+END_SRC
-
-**** toc seg
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_toc_seg) {
-  key="toc_seg";
-  out_toc(contents, key);
-}
-#+END_SRC
-
-**** toc scroll
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_toc_scroll) {
-  key="toc_scroll";
-  out_toc(contents, key);
-}
-#+END_SRC
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(segnames) {
-  writeln(__LINE__);
-  out_segnames(contents, doc_matters);
-}
-#+END_SRC
-
-*** body_section                                                     :body:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_body) {
-  key="body";
-  if (contents[key].length > 1) {
-    foreach (obj; contents[key]) {
-      writefln(
-        "[%s][%s]\n%s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-*** dom structure                                                    :body:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(dom) {
-  enum DomTags { none, open, close, close_and_open, open_still, }
-  foreach (sect; doc_matters.keys_seq_seg) {
-    foreach (obj; contents[sect]) {
-      if (obj.is_a == "heading") {
-        foreach_reverse (k; 0 .. 7) {
-          switch (obj.dom_markedup[k]) {
-          case DomTags.close :
-            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
-            break;
-          case DomTags.close_and_open :
-            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
-            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
-            break;
-          case DomTags.open :
-            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
-            break;
-          default :
-            break;
-          }
-        }
-      }
-    }
-  }
-  writeln("--------------------");
-  foreach (sect; doc_matters.keys_seq_seg) {
-    foreach (obj; contents[sect]) {
-      if (obj.is_a == "heading") {
-        foreach_reverse (k; 0 .. 7) {
-          switch (obj.dom_collapsed[k]) {
-          case DomTags.close :
-            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
-            break;
-          case DomTags.close_and_open :
-            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
-            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
-            break;
-          case DomTags.open :
-            writeln(markup.indent_by_spaces_provided(k), "<", k, ">", obj.text);
-            break;
-          default :
-            break;
-          }
-        }
-      }
-    }
-  }
-}
-#+END_SRC
-
-*** endnotes_section (seg & scroll)                              :endnotes:
-**** endnotes
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_endnotes) {
-  key="endnotes";
-  out_endnotes(contents, key);
-}
-#+END_SRC
-
-**** endnotes seg
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_endnotes_seg) {
-  key="endnotes";
-  out_endnotes(contents, key);
-}
-#+END_SRC
-
-*** glossary_section                                             :glossary:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_glossary) {
-  key="glossary";
-  if (contents[key].length > 1) {
-    foreach (obj; contents[key]) {
-      writefln(
-        "[%s][%s]\n%s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-*** bibliography_section (seg & scroll)                      :bibliography:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_bibliography) {
-  key="bibliography";
-  if (contents[key].length > 1) {
-    foreach (obj; contents[key]) {
-      writefln(
-        "[%s][%s]\n%s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-*** bookindex_section (seg & scroll)                            :bookindex:
-**** bookindex
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_bookindex) {
-  key="bookindex_seg";
-  out_bookindex(contents, key);
-}
-#+END_SRC
-
-**** bookindex seg
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_bookindex_seg) {
-  key="bookindex_seg";
-  out_bookindex(contents, key);
-}
-#+END_SRC
-
-**** bookindex scroll
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(section_bookindex_scroll) {
-  key="bookindex_scroll";
-  out_bookindex(contents, key);
-}
-#+END_SRC
-
-*** section_blurb                                                   :blurb:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(blurb_section) {
-  key="blurb";
-  if (contents[key].length > 1) {
-    foreach (obj; contents[key]) {
-      writefln(
-        "[%s][%s]\n%s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-** (objects)                                                       :objects:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(objects) {
-  writefln(
-    "%s\n%s:%s",
-    "-------------------------------",
-    __FILE__,
-    __LINE__,
-  );
-  foreach (obj; contents) {
-    if (obj.use != "empty") {
-      writefln(
-        "* [%s][%s] %s",
-        obj.obj_cite_number,
-        obj.is_a,
-        obj.text
-      );
-    }
-  }
-}
-#+END_SRC
-
-** (headermakejson)                                            :json:header:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(headermakejson) {
-  writefln(
-    "%s\n%s\n%s",
-    "document header, metadata & make instructions:",
-    doc_matters.dochead_meta,
-    ptr_head_main,
-  );
-  foreach (main_header; ptr_head_main) {
-    switch (main_header) {
-    case "make":
-      foreach (sub_header; ptr_head_sub_make) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    default:
-      break;
-    }
-  }
-}
-#+END_SRC
-
-** (headermetadatajson)                                        :json:header:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(headermetadatajson) {
-  writefln(
-    "%s\n%s\n%s",
-    "document header, metadata & make instructions:",
-    doc_matters.dochead_meta,
-    ptr_head_main,
-  );
-  foreach (main_header; ptr_head_main) {
-    switch (main_header) {
-    case "creator":
-      foreach (sub_header; ptr_head_sub_creator) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "title":
-      foreach (sub_header; ptr_head_sub_title) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "rights":
-      foreach (sub_header; ptr_head_sub_rights) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "date":
-      foreach (sub_header; ptr_head_sub_date) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "original":
-      foreach (sub_header; ptr_head_sub_original) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "classify":
-      foreach (sub_header; ptr_head_sub_classify) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "identifier":
-      foreach (sub_header; ptr_head_sub_identifier) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "notes":
-      foreach (sub_header; ptr_head_sub_notes) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    case "publisher":
-      foreach (sub_header; ptr_head_sub_publisher) {
-        if (to!string(doc_matters.dochead_meta[main_header][sub_header]).length > 2) {
-          writefln(
-            "%s:%s: %s",
-            main_header,
-            sub_header,
-            doc_matters.dochead_meta[main_header][sub_header]
-          );
-        }
-      }
-      break;
-    default:
-      break;
-    }
-  }
-}
-#+END_SRC
-
-** anchor tags
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(anchor) {
-  writefln(
-    "%s\n%s:%s",
-    "-------------------------------",
-    __FILE__,
-    __LINE__,
-  );
-  foreach (k; doc_matters.keys_seq_seg) {
-    foreach (obj; contents[k]) {
-      if (obj.is_a == "heading") {
-        writefln(
-          "%s~ [%s] %s %s",
-          obj.marked_up_level,
-          obj.obj_cite_number,
-          obj.anchor_tags,
-          // "[", obj["is"], "] ",
-          obj.text
-        );
-      }
-    }
-  }
-}
-#+END_SRC
-
-** (headings)                                                     :headings:
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(heading) {                         // heading
-  foreach (k; doc_matters.keys_seq_seg) {
-    foreach (o; contents[k]) {
-      if (o.is_a == "heading") {
-        writefln(
-          "%s* %s\n                (markup level: %s; collapsed level: %s)",
-          replicate("  ", o.heading_lev_markup),
-          strip(o.text),
-          o.heading_lev_markup,
-          o.heading_lev_collapsed,
-        );
-      }
-    }
-  }
-}
-#+END_SRC
-
-** (summary) [+1]                                                  :summary:
-
-#+name: ao_output_debugs_summary
-#+BEGIN_SRC d
-debug(headings) {
-  writefln(
-    "%s\n%s:%s",
-    "-------------------------------",
-    __FILE__,
-    __LINE__,
-  );
-  foreach (k; doc_matters.keys_seq_seg) {
-    foreach (obj; contents[k]) {
-      if (obj.is_a == "heading") {
-        writefln(
-          "%s~ [%s] %s",
-          obj.marked_up_level,
-          obj.obj_cite_number,
-          // "[", obj["is"], "] ",
-          obj.text
-        );
-      }
-    }
-  }
-}
-#+END_SRC
-
-#+name: ao_output_debugs
-#+BEGIN_SRC d
-debug(summary) {
-  string[string] check = [
-    "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
-  ];
-}
-#+END_SRC
-
-*** compare number of obj_cite_number for known sisu markup output (checkdoc)
-
-#+name: ao_output_debugs_summary
-#+BEGIN_SRC d
-debug(checkdoc) {
-  if (auto mfn=match(doc_matters.source_filename, rgx.src_fn)) {
-    if (doc_matters.opt_action_bool["assertions"]) {
-      switch (mfn.captures[2]) {
-      // live manual:
-      case "live-manual.ssm":
-        assert(check["last_obj_cite_number"] ==
-          "1019","last obj_cite_number should be: 1019 (check test, document is frequently updated)"); // ok
-        break;
-      // sisu_markup:
-      case "sisu_markup.sst":
-        assert(check["last_obj_cite_number"] ==
-          "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]); // ok
-        // assert(check["last_obj_cite_number"] == "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]);
-        // notes for first divergance study sisu headings 247 250
-        // sisu has issue with code that contains heading 1~ which results in no obj_cite_number! ??
-        // sisu currently has incorrect last body obj_cite_number of 294!
-        // bug in sisu? attend
-        break;
-      // sisu-markup-samples:
-      case "accelerando.charles_stross.sst":
-        assert(check["last_obj_cite_number"] ==
-          "2861","last obj_cite_number expected to be: 2861 rather than " ~ check["last_obj_cite_number"]); // ok
-        break;
-      case "alices_adventures_in_wonderland.lewis_carroll.sst":
-        assert(check["last_obj_cite_number"] ==
-          "805","last obj_cite_number expected to be: 805 rather than " ~ check["last_obj_cite_number"]); // 808
-        break;
-      case "autonomy_markup0.sst":
-        assert(check["last_obj_cite_number"] ==
-          "77","last obj_cite_number expected to be: 77 rather than " ~ check["last_obj_cite_number"]); // ok endnotes
-        // assert(check["last_obj_cite_number"] == "78","last obj_cite_number expected to be: 78 rather than " ~ check["last_obj_cite_number"]);
-        break;
-      case "content.cory_doctorow.sst":
-        assert(check["last_obj_cite_number"] ==
-          "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]); // 1007 way off, check obj_cite_number off switches
-        // assert(check["last_obj_cite_number"] == "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]);
-        break;
-      case "democratizing_innovation.eric_von_hippel.sst":
-        // fixed ERROR! range violation, broken check! endnotes, bookindex, biblio
-        // error in bookindex ... (ch1; ch6; ch8 )
-        assert(check["last_obj_cite_number"] ==
-          "905","last obj_cite_number expected to be: 905 rather than " ~ check["last_obj_cite_number"]); // 911
-        break;
-      case "down_and_out_in_the_magic_kingdom.cory_doctorow.sst":
-        assert(check["last_obj_cite_number"] ==
-          "1417","last obj_cite_number expected to be: 1417 rather than " ~ check["last_obj_cite_number"]); // 1455 check obj_cite_number off switches
-        break;
-      case "for_the_win.cory_doctorow.sst":
-        assert(check["last_obj_cite_number"] ==
-          "3510","last obj_cite_number expected to be: 3510 rather than " ~ check["last_obj_cite_number"]); // 3569 check obj_cite_number off switches
-        break;
-      case "free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst":
-        assert(check["last_obj_cite_number"] ==
-          "1082","last obj_cite_number expected to be: 1082 rather than " ~ check["last_obj_cite_number"]); // check 1079 too few
-        break;
-      case "free_culture.lawrence_lessig.sst":
-        assert(check["last_obj_cite_number"] ==
-          "1330","last obj_cite_number expected to be: 1330 rather than " ~ check["last_obj_cite_number"]); // 1312
-        // fixed ERROR! range violation, broken check!
-        // error in bookindex ... sections piracy (ch1) & property (ch10 market concentration) fixed
-        break;
-      case "free_for_all.peter_wayner.sst": // endnotes, bookindex, biblio
-        assert(check["last_obj_cite_number"] ==
-          "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]); // 1560, check obj_cite_number off switches, has endnotes so 2 too many
-        // assert(check["last_obj_cite_number"] == "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]);
-        break;
-      case "gpl2.fsf.sst":
-        assert(check["last_obj_cite_number"] ==
-          "65","last obj_cite_number expected to be: 65 rather than " ~ check["last_obj_cite_number"]); // ok endnotes? check
-        // assert(check["last_obj_cite_number"] == "66","last obj_cite_number expected to be: 66 rather than " ~ check["last_obj_cite_number"]);
-        break;
-      case "gpl3.fsf.sst":
-        assert(check["last_obj_cite_number"] ==
-          "123","last obj_cite_number expected to be: 123 rather than " ~ check["last_obj_cite_number"]); // ok
-        break;
-      case "gullivers_travels.jonathan_swift.sst":
-        assert(check["last_obj_cite_number"] ==
-          "668","last obj_cite_number expected to be: 668 rather than " ~ check["last_obj_cite_number"]); // 674
-        break;
-      case "little_brother.cory_doctorow.sst":
-        assert(check["last_obj_cite_number"] ==
-          "3130","last obj_cite_number expected to be: 3130 rather than " ~ check["last_obj_cite_number"]); // 3204, check obj_cite_number off switches
-        break;
-      case "the_cathedral_and_the_bazaar.eric_s_raymond.sst":
-        assert(check["last_obj_cite_number"] ==
-          "258","last obj_cite_number expected to be: 258 rather than " ~ check["last_obj_cite_number"]); // ok
-        break;
-      case "the_public_domain.james_boyle.sst":
-        assert(check["last_obj_cite_number"] ==
-          "970","last obj_cite_number expected to be: 970 rather than " ~ check["last_obj_cite_number"]); // 978
-        break;
-      case "the_wealth_of_networks.yochai_benkler.sst": // endnotes, bookindex
-        assert(check["last_obj_cite_number"] ==
-          "829","last obj_cite_number expected to be: 829 rather than " ~ check["last_obj_cite_number"]); // ok
-        // assert(check["last_obj_cite_number"] == "832","last obj_cite_number expected to be: 832 rather than " ~ check["last_obj_cite_number"]);
-        // has endnotes and bookindex, issue with sisu.rb
-        break;
-      case "through_the_looking_glass.lewis_carroll.sst":
-        assert(check["last_obj_cite_number"] ==
-          "949","last obj_cite_number expected to be: 949 rather than " ~ check["last_obj_cite_number"]); // 955
-        break;
-      case "two_bits.christopher_kelty.sst": // endnotes, bookindex, biblio
-        assert(check["last_obj_cite_number"] ==
-          "1190","last obj_cite_number expected to be: 1190 rather than " ~ check["last_obj_cite_number"]); // 1191
-        // assert(check["last_obj_cite_number"] == "1193","last obj_cite_number expected to be: 1193 rather than " ~ check["last_obj_cite_number"]); // 1191 ok?
-        // has endnotes and bookindex, issue with sisu.rb
-        break;
-        // fixed ERROR! range violation!
-        // error in bookindex ... (ch3 the movement)
-      case "un_contracts_international_sale_of_goods_convention_1980.sst":
-        assert(check["last_obj_cite_number"] ==
-          "377","last obj_cite_number expected to be: 377 rather than " ~ check["last_obj_cite_number"]); // ok
-        break;
-      case "viral_spiral.david_bollier.sst": // endnotes, bookindex
-        assert(check["last_obj_cite_number"] ==
-          "1078","last obj_cite_number expected to be: 1078 rather than " ~ check["last_obj_cite_number"]); // 1100
-        // fixed ERROR! range violation!
-        // error in bookindex ... (ch7 ... building the cc machine, an extra semi colon)
-        break;
-      default:
-        writeln(doc_matters.source_filename);
-        break;
-      }
-    }
-  }
-}
-#+END_SRC
diff --git a/org/output.org b/org/output.org
index 2d15db3..673fc4f 100644
--- a/org/output.org
+++ b/org/output.org
@@ -13,7 +13,7 @@
 #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)
 
 [[./sdp.org][sdp]]  [[./][org/]]
-* 0. output hub template file [#A]
+* 0. output hub [#A]
 
 #+BEGIN_SRC d :tangle ../src/sdp/output_hub.d
 /++
@@ -47,7 +47,7 @@ template outputHub() {
   import
     ao_rgx,
     output_xhtmls;
-  void outputHub(C,D)(C contents, D doc_matters) {
+  void outputHub(D,I)(D doc_abstraction, I doc_matters) {
     mixin SiSUrgxInit;
     auto rgx = Rgx();
     if ((doc_matters.opt_action_bool["verbose"])) {
@@ -68,23 +68,23 @@ template outputHub() {
     }
     if (doc_matters.opt_action_bool["html"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("html scroll processing... ");}
-      outputHTML!().scroll(contents,doc_matters);
+      outputHTML!().scroll(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html scroll done");}
       if ((doc_matters.opt_action_bool["verbose"])) {write("html seg processing... ");}
-      outputHTML!().seg(contents,doc_matters);
+      outputHTML!().seg(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html seg done");}
-    } else if(doc_matters.opt_action_bool["html_seg"]) {
+    } else if (doc_matters.opt_action_bool["html_seg"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("html seg processing... ");}
-      outputHTML!().seg(contents,doc_matters);
+      outputHTML!().seg(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html seg done");}
-    } else if(doc_matters.opt_action_bool["html_scroll"]) {
+    } else if (doc_matters.opt_action_bool["html_scroll"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("html scroll processing... ");}
-      outputHTML!().scroll(contents,doc_matters);
+      outputHTML!().scroll(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html scroll done");}
     }
     if (doc_matters.opt_action_bool["epub"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("epub processing... ");}
-      outputEPub!()(contents, doc_matters);
+      outputEPub!()(doc_abstraction, doc_matters);
       // epub.css_write;
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("epub done");}
     }
@@ -137,8 +137,8 @@ import
   output_xhtmls;
 #+END_SRC
 
-** sisupod                                                         :sisupod:
-*** sisupod template                                             :template:
+** _sisupod_                                                         :sisupod:
+*** template                                                     :template:
 
 #+BEGIN_SRC d :tangle ../src/sdp/source_sisupod.d
 template SiSUpod() {
@@ -534,8 +534,8 @@ auto endnote(O)(
     }
 #+END_SRC
 
-*** html [#A]                                                        :html:
-**** html template                                              :template:
+*** _html_ [#A]                                                        :html:
+**** template                                                   :template:
 
 #+BEGIN_SRC d :tangle ../src/sdp/output_html.d
 template outputHTML() {
@@ -2212,8 +2212,8 @@ auto css_write() {
 }
 #+END_SRC
 
-*** epub [#B]                                                        :epub:
-**** epub template                                              :template:
+*** _epub_ [#B]                                                        :epub:
+**** template                                                   :template:
 
 #+BEGIN_SRC d :tangle ../src/sdp/output_epub.d
 template outputEPub() {
diff --git a/org/sdp.org b/org/sdp.org
index 9cb677b..658c0b9 100644
--- a/org/sdp.org
+++ b/org/sdp.org
@@ -365,7 +365,11 @@ enforce(
 );
 #+END_SRC
 
-*** 1. _document abstraction_
+*** 1. _document abstraction_ [#A]
+
+- return tuple of:
+  - doc_abstraction (the document)
+  - doc_matters
 
 #+NAME: sdp_abstraction
 #+BEGIN_SRC d
@@ -378,7 +382,7 @@ auto doc_matters = t[1];
 #+END_SRC
 
 *** 2. _output processing_ (post abstraction processing)
-**** 0. abstraction summary                          :abstraction:summary:
+**** 0. abstraction _print summary_                    :abstraction:summary:
 
 #+NAME: sdp_each_file_do_debugs_checkdoc
 #+BEGIN_SRC d
@@ -434,8 +438,8 @@ writeln("no recognized filename");
 break; // terminate, stop
 #+END_SRC
 
-* 2. _document abstraction_
-** 0. abstraction template                                        :template:
+* 2. _document abstraction functions_
+** 0. abstraction template [#A]                                   :template:
 
 #+BEGIN_SRC d  :tangle ../src/sdp/abstraction.d
 template SiSUabstraction() {
@@ -458,9 +462,19 @@ template SiSUabstraction() {
 }
 #+END_SRC
 
-** 1. (a) _read in raw file_ & (b) split content into: _doc header & doc content_
+** 1. (a) _read in raw file_ (b) split content into: _doc header & doc content_
 - [[./ao_read_source_files.org][ao_read_source_files]]
 
+- read in the source marked up document and
+  - split the document into:
+    - document header
+    - document body
+  - if a master document make a list of insert files
+- return a tuple of:
+  - header
+  - body
+  - insert file list
+
 #+NAME: sdp_each_file_do_read_and_split_sisu_markup_file_content_into_header_and_body
 #+BEGIN_SRC d
 /+ ↓ read file (filename with path) +/
@@ -476,9 +490,19 @@ debug(header_and_body) {
 }
 #+END_SRC
 
-** 2. split doc header into: _metadata & make_      :doc:header:metadata:make:
+** 2. _document metadata_ & _make instructions_       :doc:header:metadata:make:
 - [[./ao_conf_make_meta.org][ao_conf_make_meta]]
 
+- read document header, split into:
+  - metadata
+  - make instructions
+- read config files
+  - consolidate make instructions
+- return tuple of:
+  - document metadata
+  - make instructions (from configuration files & document header make
+    instructions)
+
 #+NAME: sdp_each_file_do_split_sisu_markup_file_header_into_make_and_meta
 #+BEGIN_SRC d
 /+ ↓ split header into make and meta +/
@@ -491,6 +515,17 @@ static assert(_0_make_1_dochead_meta_tuple.length==2);
 ** 3. _document abstraction, tuple_ (pre-processing)              :processing:
 - [[./ao_abstract_doc_source.org][ao_abstract_doc_source]]
 
+- prepare the document abstraction used in downstream processing
+
+- return tuple of:
+  - document abstraction (the_document or doc_abstraction)
+  - document abstraction keys
+    - (head, toc, body, endnotes, glossary, bibliography, bookindex, blurb,
+      tail)
+    - (passed in doc_matters)
+  - segnames for html epub (passed in doc_matters)
+  - image list (passed in doc_matters)
+
 #+NAME: sdp_each_file_do_document_abstraction
 #+BEGIN_SRC d
 /+ ↓ document abstraction: process document, return abstraction as tuple +/
@@ -502,13 +537,16 @@ auto da = SiSUdocAbstraction!()(
 );
 static assert(!isTypeTuple!(da));
 static assert(da.length==4);
-auto doc_abstraction = da[0]; // head ~ toc ~ contents ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb;
+auto doc_abstraction = da[0]; // head ~ toc ~ body ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb;
 string[][string] _document_section_keys_sequenced = da[1];
 string[] _doc_html_segnames = da[2];
 auto _images = da[3];
 #+END_SRC
 
-** 4. _document matters_ (compiled from various sources)
+** 4. _document matters_ (doc info gathered, various sources)
+
+- prepare document_matters, miscellany about processing and the document of use
+  in downstream processing
 
 #+NAME: sdp_each_file_do_document_matters
 #+BEGIN_SRC d
@@ -530,7 +568,7 @@ struct DocumentMatters {
     return _k;
   }
   auto dochead_meta() {
-    string[string][string] _k =  _0_make_1_dochead_meta_tuple[1];
+    string[string][string] _k = _0_make_1_dochead_meta_tuple[1];
     return _k;
   }
   auto source_filename() {
@@ -556,3 +594,124 @@ struct DocumentMatters {
 }
 auto doc_matters = DocumentMatters();
 #+END_SRC
+
+* 3. document abstraction _summary_                               :summary:doc:
+** 0. template:                                                   :template:
+
+#+BEGIN_SRC d :tangle ../src/sdp/abstraction_summary.d
+template SiSUabstractionSummary() {
+  auto SiSUabstractionSummary(S,T)(
+    auto ref const S         doc_abstraction,
+    auto ref T               doc_matters,
+  ) {
+    <<abstraction_summary_imports>>
+    mixin InternalMarkup;
+    <<abstraction_summary_initialize>>
+    if (doc_matters.opt_action_bool["verbose"]) {
+      <<ao_abstraction_summary>>
+    }
+  }
+}
+#+END_SRC
+
+** init
+*** imports
+
+#+name: abstraction_summary_imports
+#+BEGIN_SRC d
+import
+  ao_defaults,
+  ao_rgx;
+import
+  std.array,
+  std.exception,
+  std.stdio,
+  std.regex,
+  std.string,
+  std.traits,
+  std.typecons,
+  std.uni,
+  std.utf,
+  std.conv : to;
+#+END_SRC
+
+*** initialize                                                     :report:
+
+#+name: abstraction_summary_initialize
+#+BEGIN_SRC d
+auto markup = InlineMarkup();
+#+END_SRC
+
+** (last ocn)
+
+#+name: ao_abstraction_summary
+#+BEGIN_SRC d
+string[string] check = [
+  "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
+];
+foreach (k; doc_matters.keys_seq_seg) {
+  foreach (obj; doc_abstraction[k]) {
+    if (obj.use != "empty") {
+      if (!empty(obj.obj_cite_number)) {
+        check["last_obj_cite_number"] = obj.obj_cite_number;
+      }
+    }
+  }
+}
+#+END_SRC
+
+** summary
+
+#+name: ao_abstraction_summary
+#+BEGIN_SRC d
+// auto char_repeat_number = doc_matters.source_filename.length;
+// char_repeat_number = (char_repeat_number > 33)
+auto min_repeat_number = 66;
+auto char_repeat_number = (doc_matters.dochead_meta["title"]["full"].length
+  + doc_matters.dochead_meta["creator"]["author"].length + 4);
+char_repeat_number = (char_repeat_number > min_repeat_number)
+? char_repeat_number
+: min_repeat_number;
+// writeln(char_repeat_number);
+writefln(
+  "%s\n\"%s\", %s\n%s\n%s\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n%s%10d\n(%s: %s)\n%s",
+  markup.repeat_character_by_number_provided("-", char_repeat_number),
+  doc_matters.dochead_meta["title"]["full"],
+  doc_matters.dochead_meta["creator"]["author"],
+  doc_matters.source_filename,
+  markup.repeat_character_by_number_provided("-", char_repeat_number),
+  "length toc arr:      ",
+  to!int(doc_abstraction["toc_seg"].length),
+  "length doc_abstraction arr: ",
+  to!int(doc_abstraction["body"].length),
+  "last obj_cite_number:  ",
+  to!int(check["last_obj_cite_number"]),
+  "length endnotes:       ",
+  (doc_abstraction["endnotes"].length > 1)
+  ? (to!int(doc_abstraction["endnotes"].length))
+  : 0,
+  "length glossary:       ",
+  (doc_abstraction["glossary"].length > 1)
+  ? (to!int(doc_abstraction["glossary"].length))
+  : 0,
+  "length biblio:         ",
+  (doc_abstraction["bibliography"].length > 1)
+  ? (to!int(doc_abstraction["bibliography"].length))
+  : 0,
+  "length bookindex:      ",
+  (doc_abstraction["bookindex_seg"].length > 1)
+  ? (to!int(doc_abstraction["bookindex_seg"].length))
+  : 0,
+  "length blurb:          ",
+  (doc_abstraction["blurb"].length > 1)
+  ? (to!int(doc_abstraction["blurb"].length))
+  : 0,
+  __FILE__,
+  __LINE__,
+  markup.repeat_character_by_number_provided("-", min_repeat_number),
+);
+#+END_SRC
+
+markup.repeat_character_by_number_provided("-", 10)
+markup.repeat_character_by_number_provided("-", (doc_matters.dochead_meta["title"]["full"].length))
+markup.repeat_character_by_number_provided("-", (doc_matters.source_filename.length))
diff --git a/src/sdp/abstraction.d b/src/sdp/abstraction.d
index d358f33..c1907f7 100644
--- a/src/sdp/abstraction.d
+++ b/src/sdp/abstraction.d
@@ -71,7 +71,7 @@ template SiSUabstraction() {
     );
     static assert(!isTypeTuple!(da));
     static assert(da.length==4);
-    auto doc_abstraction = da[0]; // head ~ toc ~ contents ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb;
+    auto doc_abstraction = da[0]; // head ~ toc ~ body ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb;
     string[][string] _document_section_keys_sequenced = da[1];
     string[] _doc_html_segnames = da[2];
     auto _images = da[3];
@@ -93,7 +93,7 @@ template SiSUabstraction() {
         return _k;
       }
       auto dochead_meta() {
-        string[string][string] _k =  _0_make_1_dochead_meta_tuple[1];
+        string[string][string] _k = _0_make_1_dochead_meta_tuple[1];
         return _k;
       }
       auto source_filename() {
diff --git a/src/sdp/abstraction_summary.d b/src/sdp/abstraction_summary.d
index 237d1e0..75faf0e 100644
--- a/src/sdp/abstraction_summary.d
+++ b/src/sdp/abstraction_summary.d
@@ -1,6 +1,6 @@
 template SiSUabstractionSummary() {
   auto SiSUabstractionSummary(S,T)(
-    auto ref const S         contents,
+    auto ref const S         doc_abstraction,
     auto ref T               doc_matters,
   ) {
     import
@@ -24,7 +24,7 @@ template SiSUabstractionSummary() {
         "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
       ];
       foreach (k; doc_matters.keys_seq_seg) {
-        foreach (obj; contents[k]) {
+        foreach (obj; doc_abstraction[k]) {
           if (obj.use != "empty") {
             if (!empty(obj.obj_cite_number)) {
               check["last_obj_cite_number"] = obj.obj_cite_number;
@@ -48,31 +48,31 @@ template SiSUabstractionSummary() {
         doc_matters.dochead_meta["creator"]["author"],
         doc_matters.source_filename,
         markup.repeat_character_by_number_provided("-", char_repeat_number),
-        "length toc array:      ",
-        to!int(contents["toc_seg"].length),
-        "length contents array: ",
-        to!int(contents["body"].length),
+        "length toc arr:      ",
+        to!int(doc_abstraction["toc_seg"].length),
+        "length doc_abstraction arr: ",
+        to!int(doc_abstraction["body"].length),
         "last obj_cite_number:  ",
         to!int(check["last_obj_cite_number"]),
         "length endnotes:       ",
-        (contents["endnotes"].length > 1)
-        ? (to!int(contents["endnotes"].length))
+        (doc_abstraction["endnotes"].length > 1)
+        ? (to!int(doc_abstraction["endnotes"].length))
         : 0,
         "length glossary:       ",
-        (contents["glossary"].length > 1)
-        ? (to!int(contents["glossary"].length))
+        (doc_abstraction["glossary"].length > 1)
+        ? (to!int(doc_abstraction["glossary"].length))
         : 0,
         "length biblio:         ",
-        (contents["bibliography"].length > 1)
-        ? (to!int(contents["bibliography"].length))
+        (doc_abstraction["bibliography"].length > 1)
+        ? (to!int(doc_abstraction["bibliography"].length))
         : 0,
         "length bookindex:      ",
-        (contents["bookindex_seg"].length > 1)
-        ? (to!int(contents["bookindex_seg"].length))
+        (doc_abstraction["bookindex_seg"].length > 1)
+        ? (to!int(doc_abstraction["bookindex_seg"].length))
         : 0,
         "length blurb:          ",
-        (contents["blurb"].length > 1)
-        ? (to!int(contents["blurb"].length))
+        (doc_abstraction["blurb"].length > 1)
+        ? (to!int(doc_abstraction["blurb"].length))
         : 0,
         __FILE__,
         __LINE__,
diff --git a/src/sdp/ao_abstract_doc_source.d b/src/sdp/ao_abstract_doc_source.d
index 12bbd71..119a718 100644
--- a/src/sdp/ao_abstract_doc_source.d
+++ b/src/sdp/ao_abstract_doc_source.d
@@ -853,10 +853,10 @@ template SiSUdocAbstraction() {
             type["blurb_section"] = State.off;
           }
           previous_length = to!int(the_document_body_section.length);
-          if (
-            match(the_document_body_section[$-1].text,
-            rgx.inline_notes_delimiter_al_regular_number_note)
-          ) {
+          if (match(
+            the_document_body_section[$-1].text,
+            rgx.inline_notes_delimiter_al_regular_number_note
+          )) {
             previous_count=to!int(the_document_body_section.length -1);
             note_section.gather_notes_for_endnote_section(
               the_document_body_section,
@@ -1552,6 +1552,14 @@ template SiSUdocAbstraction() {
       document_section_keys_sequenced["seg"]    ~= "tail";
       document_section_keys_sequenced["scroll"] ~= "tail";
     }
+    destroy(the_document_head_section);
+    destroy(the_table_of_contents_section);
+    destroy(the_document_body_section);
+    destroy(the_endnotes_section);
+    destroy(the_glossary_section);
+    destroy(the_bibliography_section);
+    destroy(the_bookindex_section);
+    destroy(the_blurb_section);
     auto t = tuple(
       document_the,
       document_section_keys_sequenced,
diff --git a/src/sdp/ao_doc_debugs.d b/src/sdp/ao_doc_debugs.d
index adc8c53..feb7de4 100644
--- a/src/sdp/ao_doc_debugs.d
+++ b/src/sdp/ao_doc_debugs.d
@@ -423,6 +423,27 @@ template SiSUdebugs() {
         }
       }
     }
+    debug(headings) {
+      writefln(
+        "%s\n%s:%s",
+        "-------------------------------",
+        __FILE__,
+        __LINE__,
+      );
+      foreach (k; doc_matters.keys_seq_seg) {
+        foreach (obj; contents[k]) {
+          if (obj.is_a == "heading") {
+            writefln(
+              "%s~ [%s] %s",
+              obj.marked_up_level,
+              obj.obj_cite_number,
+              // "[", obj["is"], "] ",
+              obj.text
+            );
+          }
+        }
+      }
+    }
     debug(summary) {
       string[string] check = [
         "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
@@ -430,27 +451,6 @@ template SiSUdebugs() {
     }
     debug(checkdoc) {
       if ((doc_matters.opt_action_bool["debug"])) {
-        debug(headings) {
-          writefln(
-            "%s\n%s:%s",
-            "-------------------------------",
-            __FILE__,
-            __LINE__,
-          );
-          foreach (k; doc_matters.keys_seq_seg) {
-            foreach (obj; contents[k]) {
-              if (obj.is_a == "heading") {
-                writefln(
-                  "%s~ [%s] %s",
-                  obj.marked_up_level,
-                  obj.obj_cite_number,
-                  // "[", obj["is"], "] ",
-                  obj.text
-                );
-              }
-            }
-          }
-        }
         debug(checkdoc) {
           if (auto mfn=match(doc_matters.source_filename, rgx.src_fn)) {
             if (doc_matters.opt_action_bool["assertions"]) {
diff --git a/src/sdp/ao_rgx.d b/src/sdp/ao_rgx.d
index 2d83d06..b91ae35 100644
--- a/src/sdp/ao_rgx.d
+++ b/src/sdp/ao_rgx.d
@@ -155,7 +155,7 @@ template SiSUrgxInit() {
     static inline_link_endnote_url_helper_punctuated       = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg");
     static inline_link_endnote_url_helper                  = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+)`, "mg");
     static inline_a_url                                    = ctRegex!(`(┤)(\S+?)(├)`, "mg");
-    static image                                           = ctRegex!(`([a-zA-Z._-]+?\.(?:png|gif|jpg))`, "mg");
+    static image                                           = ctRegex!(`([a-zA-Z0-9._-]+?\.(?:png|gif|jpg))`, "mg");
     /+ inline markup book index +/
     static book_index                                     = ctRegex!(`^=\{\s*(.+?)\}$`, "m");
     static book_index_open                                = ctRegex!(`^=\{\s*([^}]+?)$`);
diff --git a/src/sdp/output_hub.d b/src/sdp/output_hub.d
index c5c5510..6d6c134 100644
--- a/src/sdp/output_hub.d
+++ b/src/sdp/output_hub.d
@@ -29,7 +29,7 @@ template outputHub() {
   import
     ao_rgx,
     output_xhtmls;
-  void outputHub(C,D)(C contents, D doc_matters) {
+  void outputHub(D,I)(D doc_abstraction, I doc_matters) {
     mixin SiSUrgxInit;
     auto rgx = Rgx();
     if ((doc_matters.opt_action_bool["verbose"])) {
@@ -50,23 +50,23 @@ template outputHub() {
     }
     if (doc_matters.opt_action_bool["html"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("html scroll processing... ");}
-      outputHTML!().scroll(contents,doc_matters);
+      outputHTML!().scroll(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html scroll done");}
       if ((doc_matters.opt_action_bool["verbose"])) {write("html seg processing... ");}
-      outputHTML!().seg(contents,doc_matters);
+      outputHTML!().seg(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html seg done");}
-    } else if(doc_matters.opt_action_bool["html_seg"]) {
+    } else if (doc_matters.opt_action_bool["html_seg"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("html seg processing... ");}
-      outputHTML!().seg(contents,doc_matters);
+      outputHTML!().seg(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html seg done");}
-    } else if(doc_matters.opt_action_bool["html_scroll"]) {
+    } else if (doc_matters.opt_action_bool["html_scroll"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("html scroll processing... ");}
-      outputHTML!().scroll(contents,doc_matters);
+      outputHTML!().scroll(doc_abstraction, doc_matters);
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("html scroll done");}
     }
     if (doc_matters.opt_action_bool["epub"]) {
       if ((doc_matters.opt_action_bool["verbose"])) {write("epub processing... ");}
-      outputEPub!()(contents, doc_matters);
+      outputEPub!()(doc_abstraction, doc_matters);
       // epub.css_write;
       if ((doc_matters.opt_action_bool["verbose"])) {writeln("epub done");}
     }
-- 
cgit v1.2.3