From 762439ade3de42d2043fafc0005b255c6c58ba49 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Sun, 11 Dec 2016 11:17:06 -0500
Subject: 0.10.0 generic object (ObjGenericComposite), removed "object_set"

---
 org/ao_abstract_doc_source.org | 1851 +++++++++++++++-------------------------
 org/ao_conf_make_meta.org      |    2 +-
 org/ao_defaults.org            |    2 +-
 org/ao_output_debugs.org       |   77 +-
 org/ao_read_source_files.org   |   54 +-
 org/compile_time_info.org      |    2 +-
 org/output.org                 |   34 +-
 org/sdp.org                    |   26 +-
 8 files changed, 760 insertions(+), 1288 deletions(-)

(limited to 'org')

diff --git a/org/ao_abstract_doc_source.org b/org/ao_abstract_doc_source.org
index 4292328..c11193c 100644
--- a/org/ao_abstract_doc_source.org
+++ b/org/ao_abstract_doc_source.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. Code Outline / Structure (tangles)                      :tangle:io:file:
+* 0. Code Skeleton / Outline / Structure (tangles)           :tangle:io:file:
 ** 1. ao abstract doc source:                         :ao_abstract_doc_source.d:
 
 #+BEGIN_SRC d :tangle ../src/sdp/ao_abstract_doc_source.d
@@ -139,17 +139,6 @@ template SiSUdocAbstraction() {
 template ObjectSetter() {
   /+ structs +/
   <<ao_structs_init>>
-  /+ structs setter +/
-  struct ObjectAbstractSet {
-    import std.conv : to;
-    <<ao_object_setter_comment>>
-    <<ao_object_setter_heading>>
-    <<ao_object_setter_para>>
-    <<ao_object_setter_endnote>>
-    <<ao_object_setter_block>>
-    <<ao_object_setter_block_code>>
-    <<ao_object_setter_block_obj_cite_number_string>>
-  }
 }
 #+END_SRC
 
@@ -183,13 +172,12 @@ mixin InternalMarkup;
 #+BEGIN_SRC d
 /+ initialize +/
 auto rgx = Rgx();
-ObjComposite[][string] the_table_of_contents_section;
-ObjComposite[] the_document_head_section, the_document_body_section, the_bibliography_section, the_glossary_section, the_blurb_section;
+ObjGenericComposite[][string] the_table_of_contents_section;
+ObjGenericComposite[] the_document_head_section, the_document_body_section, the_bibliography_section, the_glossary_section, the_blurb_section;
 string[string] an_object, processing;
 string an_object_key;
 string[] anchor_tags;
 string segment_anchor_tag_that_object_belongs_to;
-auto set_abstract_object = ObjectAbstractSet();
 auto note_section = NotesSection();
 /+ enum +/
 enum State { off, on }
@@ -238,13 +226,12 @@ string[][string][string] bookindex_unordered_hashes;
 auto bookindex_extract_hash = BookIndexNuggetHash();
 string[][string][string] bkidx_hash(
   string bookindex_section,
-  int obj_cite_number
+  int    obj_cite_number
 ) {
   return bookindex_extract_hash.bookindex_nugget_hash(bookindex_section, obj_cite_number);
 }
 /+ node +/
-string[string] _node_heading_str;
-int[string]    _node_heading_int;
+ObjGenericComposite comp_obj_heading, comp_obj_location, comp_obj_block, comp_obj_code, comp_obj_poem_ocn, comp_obj_comment;
 auto node_construct = NodeStructureMetadata();
 #+END_SRC
 
@@ -271,10 +258,9 @@ scope(exit) {
 
 #+name: abs_init_rest
 #+BEGIN_SRC d
-auto node_heading_int_ = node_metadata_heading_int;
-auto node_heading_str_ = node_metadata_heading_str;
 auto node_para_int_    = node_metadata_para_int;
 auto node_para_str_    = node_metadata_para_str;
+ObjGenericComposite comp_obj_heading_, comp_obj_para, comp_obj_toc;
 line_occur = [
   "heading"  : 0,
   "para"     : 0,
@@ -332,22 +318,20 @@ string _anchor_tag;
 string toc_txt_;
 an_object["glossary_nugget"] = "";
 an_object["blurb_nugget"] = "";
-node_heading_str_["is"]                           = "heading";
-node_heading_str_["ocn"]                          = "0";
-node_heading_str_["segment_anchor_tag"]           = "toc";
-node_heading_str_["attrib"]                       = "";
-node_heading_str_["marked_up_lev"]                = "1";
-node_heading_int_["heading_lev_markup"]           = 4;
-node_heading_int_["heading_lev_collapsed"]        = 2;
-node_heading_int_["parent_ocn"]                   = 1;
-node_heading_int_["parent_lev_markup"]            = 0;
-auto toc_head =
-  set_abstract_object.contents_heading(
-    "Table of Contents", // nugget/object
-    node_heading_str_,
-    node_heading_int_,
-    ["toc"],             // anchor tag
-  );
+comp_obj_heading_                       = comp_obj_heading_.init;
+comp_obj_heading_.use                   = "content";
+comp_obj_heading_.of                    = "para";
+comp_obj_heading_.is_a                  = "heading";
+comp_obj_heading_.text                  = "Table of Contents";
+comp_obj_heading_.ocn                   = 0;
+comp_obj_heading_.segment_anchor_tag    = "toc";
+comp_obj_heading_.marked_up_level       = "1";
+comp_obj_heading_.heading_lev_markup    = 4;
+comp_obj_heading_.heading_lev_collapsed = 2;
+comp_obj_heading_.parent_ocn            = 1;
+comp_obj_heading_.parent_lev_markup     = 0;
+comp_obj_heading_.anchor_tags           = ["toc"];
+auto toc_head                       = comp_obj_heading_;
 the_table_of_contents_section = [
   "seg": [toc_head],
   "scroll": [toc_head],
@@ -468,54 +452,47 @@ if there is a glossary section you need to:
     line_occur["para"] = State.off;
     an_object_key="glossary_nugget"; //
     if (matchFirst(line, rgx.heading_glossary)) {
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "B";
-      node_heading_int_["heading_lev_markup"]       = 1;
-      node_heading_int_["heading_lev_collapsed"]    = 1;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_glossary_section ~=
-        set_abstract_object.contents_heading(
-          "Glossary",       // nugget/object
-          node_heading_str_,
-          node_heading_int_,
-          [""],             // anchor tag
-        );
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "glossary";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "1";
-      node_heading_int_["heading_lev_markup"]       = 4;
-      node_heading_int_["heading_lev_collapsed"]    = 2;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_glossary_section ~=
-        set_abstract_object.contents_heading(
-          "Glossary",       // nugget/object
-          node_heading_str_,
-          node_heading_int_,
-          ["glossary"],     // anchor tag
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Glossary";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.marked_up_level       = "B";
+      comp_obj_heading_.heading_lev_markup    = 1;
+      comp_obj_heading_.heading_lev_collapsed = 1;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      the_glossary_section                    ~= comp_obj_heading_;
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Glossary";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.segment_anchor_tag    = "glossary";
+      comp_obj_heading_.marked_up_level       = "1";
+      comp_obj_heading_.heading_lev_markup    = 4;
+      comp_obj_heading_.heading_lev_collapsed = 2;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      comp_obj_heading_.anchor_tags           = ["glossary"];
+      the_glossary_section                ~= comp_obj_heading_;
     // } else if (matchFirst(line, rgx.heading)) {
     //   _heading_matched_(line, line_occur, an_object, an_object_key, lv, collapsed_lev, type, dochead_meta_aa); // levels?
     } else {
       _para_match_(line, an_object, an_object_key, indent, bullet, type, line_occur);
-      node_para_str_["is"]                           = "para";
-      node_para_str_["attrib"]                       = "";
-      node_para_int_["ocn"]                          = 0;
-      node_para_int_["indent_hang"]                  = indent["hang_position"];
-      node_para_int_["indent_base"]                  = indent["base_position"];
-      node_para_int_["bullet"]                       = (bullet) ? 1 : 0;
-      the_glossary_section ~=
-        set_abstract_object.contents_para(
-          to!string(line),           // an_object["substantive"],
-          node_para_str_,
-          node_para_int_,
-        );
+      comp_obj_para                       = comp_obj_para.init;
+      comp_obj_para.use                   = "content";
+      comp_obj_para.of                    = "para";
+      comp_obj_para.is_a                  = "para";
+      comp_obj_para.text                  = to!string(line).strip;
+      comp_obj_para.ocn                   = 0;
+      comp_obj_para.obj_cite_number       = "0";
+      comp_obj_para.indent_hang           = indent["hang_position"];
+      comp_obj_para.indent_base           = indent["base_position"];
+      comp_obj_para.bullet                = bullet;
+      the_glossary_section                ~= comp_obj_para;
     }
     type["ocn_status"] = TriState.off;
   }
@@ -557,71 +534,60 @@ if there is a blurb section you need to:
     line_occur["para"] = State.off;
     an_object_key="blurb_nugget";
     if (matchFirst(line, rgx.heading_blurb)) {
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "B";
-      node_heading_int_["heading_lev_markup"]       = 1;
-      node_heading_int_["heading_lev_collapsed"]    = 1;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_blurb_section ~=
-        set_abstract_object.contents_heading(
-          "Blurb",          // nugget/object
-          node_heading_str_,
-          node_heading_int_,
-          [""],             // anchor tag
-        );
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "blurb";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "1";
-      node_heading_int_["heading_lev_markup"]       = 4;
-      node_heading_int_["heading_lev_collapsed"]    = 2;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_blurb_section ~=
-        set_abstract_object.contents_heading(
-          "Blurb",          // nugget/object
-          node_heading_str_,
-          node_heading_int_,
-          ["blurb"],        // anchor tag
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Blurb";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.marked_up_level       = "B";
+      comp_obj_heading_.heading_lev_markup    = 1;
+      comp_obj_heading_.heading_lev_collapsed = 1;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      the_blurb_section                       ~= comp_obj_heading_;
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Blurb";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.segment_anchor_tag    = "blurb";
+      comp_obj_heading_.marked_up_level       = "1";
+      comp_obj_heading_.heading_lev_markup    = 4;
+      comp_obj_heading_.heading_lev_collapsed = 2;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      comp_obj_heading_.anchor_tags           = ["blurb"];
+      the_blurb_section                       ~= comp_obj_heading_;
     } else if ((matchFirst(line, rgx.heading))
     && (opt_action_bool["backmatter"] && opt_action_bool["section_blurb"])) {
-      _heading_matched_(line, line_occur, an_object, an_object_key, lv, collapsed_lev, type, dochead_meta_aa); // levels?
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "blurb";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = to!string(an_object["lev"]);
-      node_heading_int_["heading_lev_markup"]       = to!int(an_object["lev_markup_number"]);    // make int, remove need to conv
-      node_heading_int_["heading_lev_collapsed"]    = to!int(an_object["lev_collapsed_number"]); // make int, remove need to conv
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_blurb_section ~=
-        set_abstract_object.contents_heading(
-          to!string(line),           //  an_object["substantive"],
-          node_heading_str_,
-          node_heading_int_,
-          [""],                      // anchor tag
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = to!string(line);
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.segment_anchor_tag    = "blurb";
+      comp_obj_heading_.marked_up_level       = to!string(an_object["lev"]);
+      comp_obj_heading_.heading_lev_markup    = to!int(an_object["lev_markup_number"]);    // make int, remove need to conv
+      comp_obj_heading_.heading_lev_collapsed = to!int(an_object["lev_collapsed_number"]); // make int, remove need to conv
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      the_blurb_section                   ~= comp_obj_heading_;
     } else {
       _para_match_(line, an_object, an_object_key, indent, bullet, type, line_occur);
-      node_para_str_["is"]                           = "para";
-      node_para_str_["attrib"]                       = "";
-      node_para_int_["ocn"]                          = obj_cite_number;
-      node_para_int_["indent_hang"]                  = indent["hang_position"];
-      node_para_int_["indent_base"]                  = indent["base_position"];
-      node_para_int_["bullet"]                       = (bullet) ? 1 : 0;
-      the_blurb_section ~=
-        set_abstract_object.contents_para(
-          to!string(line),           //  an_object["substantive"],
-          node_para_str_,
-          node_para_int_,
-        );
+      comp_obj_para                       = comp_obj_para.init;
+      comp_obj_para.use                   = "content";
+      comp_obj_para.of                    = "para";
+      comp_obj_para.is_a                  = "para";
+      comp_obj_para.text                  = to!string(line).strip;
+      comp_obj_para.ocn                   = obj_cite_number;
+      comp_obj_para.obj_cite_number       = to!string(obj_cite_number);
+      comp_obj_para.indent_hang           = indent["hang_position"];
+      comp_obj_para.indent_base           = indent["base_position"];
+      comp_obj_para.bullet                = bullet;
+      the_blurb_section                   ~= comp_obj_para;
     }
     type["ocn_status"] = TriState.off;
   }
@@ -766,8 +732,12 @@ if ((matchFirst(line, rgx.book_index))
       writeln(line);
     }
     an_object[an_object_key] ~= line ~= "\n";
-    the_document_body_section ~=
-      set_abstract_object.contents_comment(strip(an_object[an_object_key]));
+    comp_obj_comment                   = comp_obj_comment.init;
+    comp_obj_comment.use               = "comment";
+    comp_obj_comment.of                = "comment";
+    comp_obj_comment.is_a              = "comment";
+    comp_obj_comment.text              = an_object[an_object_key].strip;
+    the_document_body_section          ~= comp_obj_comment;
     _common_reset_(line_occur, an_object, type);
     processing.remove("verse");
     ++cntr;
@@ -850,13 +820,12 @@ _block_flag_line_empty_(
   the_document_body_section,
   bookindex_unordered_hashes,
   obj_cite_number,
-  _node_heading_str,
-  _node_heading_int,
+  comp_obj_heading,
   cntr,
   type,
   obj_cite_number_poem,
   dochead_make_aa
-); // watch
+);
 #+END_SRC
 
 ****** line empty [+1]
@@ -911,8 +880,9 @@ if ((type["heading"] == State.on)
     html_segnames_ptr = html_segnames_ptr_cntr;
     html_segnames_ptr_cntr++;
   }
-  auto _node_t =
+  auto comp_obj_heading =
     node_construct.node_emitter_heading(
+      an_object["substantive"],                     // string
       an_object["lev"],                             // string
       an_object["lev_markup_number"],               // string
       an_object["lev_collapsed_number"],            // string
@@ -923,22 +893,12 @@ if ((type["heading"] == State.on)
       an_object["is"],                              // string
       html_segnames_ptr,                            // int
     );
-   _node_heading_str = _node_t[0];
-   _node_heading_int = _node_t[1];
-  an_object["attrib"] =
-    obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
   ++heading_ptr;
   debug(segments) {
     writeln(an_object["lev_markup_number"]);
     writeln(segment_anchor_tag_that_object_belongs_to);
   }
-  the_document_body_section ~=
-    set_abstract_object.contents_heading(
-      an_object["substantive"],
-      _node_heading_str,
-      _node_heading_int,
-      anchor_tags,
-    );
+  the_document_body_section ~= comp_obj_heading;
   // track previous heading and make assertions
   debug(objectrelated1) { // check
     writeln(line);
@@ -962,8 +922,8 @@ if ((type["heading"] == State.on)
   bookindex_unordered_hashes =
     bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
   an_object["is"] = "para";
-  auto _node_t =
-    node_construct.node_emitter(
+  auto comp_obj_heading =
+    node_construct.node_location_emitter(
       content_non_header,
       segment_anchor_tag_that_object_belongs_to,
       obj_cite_number,
@@ -971,26 +931,22 @@ if ((type["heading"] == State.on)
       heading_ptr-1,
       an_object["is"],
     );
-  _node_heading_str = _node_t[0];
-  _node_heading_int = _node_t[1];
   auto substantive_object_and_anchor_tags_tuple =
     obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa); // ...
   an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
   anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-  an_object["attrib"] =
-    obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-  node_para_str_["is"]                           = an_object["is"];
-  node_para_str_["attrib"]                       = an_object["attrib"];
-  node_para_int_["ocn"]                          = obj_cite_number;
-  node_para_int_["indent_hang"]                  = indent["hang_position"];
-  node_para_int_["indent_base"]                  = indent["base_position"];
-  node_para_int_["bullet"]                       = (bullet) ? 1 : 0;
-  the_document_body_section ~=
-    set_abstract_object.contents_para(
-      an_object["substantive"],
-      node_para_str_,
-      node_para_int_,
-    );
+  comp_obj_para                       = comp_obj_para.init;
+  comp_obj_para.use                   = "content";
+  comp_obj_para.of                    = "para";
+  comp_obj_para.is_a                  = "para";
+  comp_obj_para.text                  = to!string(an_object["substantive"]).strip;
+  comp_obj_para.ocn                   = obj_cite_number;
+  comp_obj_para.obj_cite_number       = to!string(obj_cite_number);
+  comp_obj_para.indent_hang           = indent["hang_position"];
+  comp_obj_para.indent_base           = indent["base_position"];
+  comp_obj_para.bullet                = bullet;
+  comp_obj_para.anchor_tags           = anchor_tags;
+  the_document_body_section           ~= comp_obj_para;
   _common_reset_(line_occur, an_object, type);
   indent=[
     "hang_position" : 0,
@@ -1022,14 +978,14 @@ if (the_document_body_section.length > 0) {
   && (the_document_body_section.length > previous_length)
 ) {
     if ((the_document_body_section[$-1].is_a == "heading")
-    && (the_document_body_section[$-1].heading_attrib.lev_int_markup < 5)) {
+    && (the_document_body_section[$-1].heading_lev_markup < 5)) {
       type["biblio_section"] = State.off;
       type["glossary_section"] = State.off;
       type["blurb_section"] = State.off;
     }
     previous_length = to!int(the_document_body_section.length);
     if (
-      match(the_document_body_section[$-1].object,
+      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);
@@ -1091,28 +1047,24 @@ debug(endnotes) {
 #+BEGIN_SRC d
 if (an_object["glossary_nugget"].length == 0) {
   writeln("no gloss");
-  node_heading_str_["is"]                       = "heading";
-  node_heading_str_["ocn"]                      = "0";
-  node_heading_str_["segment_anchor_tag"]       = "";
-  node_heading_str_["attrib"]                   = "";
-  node_heading_str_["marked_up_lev"]            = "B";
-  node_heading_int_["heading_lev_markup"]       = 1;
-  node_heading_int_["heading_lev_collapsed"]    = 1;
-  node_heading_int_["parent_ocn"]               = 1;
-  node_heading_int_["parent_lev_markup"]        = 0;
-  the_glossary_section ~=
-    set_abstract_object.contents_heading(
-      "(skip) there is no Glossary section",   // nugget/object
-      node_heading_str_,
-      node_heading_int_,
-      [""],             // anchor tag
-    );
+  comp_obj_heading_                       = comp_obj_heading_.init;
+  comp_obj_heading_.use                   = "content";
+  comp_obj_heading_.of                    = "para";
+  comp_obj_heading_.is_a                  = "heading";
+  comp_obj_heading_.text                  = "(skip) there is no Glossary section";
+  comp_obj_heading_.ocn                   = 0;
+  comp_obj_heading_.marked_up_level       = "B";
+  comp_obj_heading_.heading_lev_markup    = 1;
+  comp_obj_heading_.heading_lev_collapsed = 1;
+  comp_obj_heading_.parent_ocn            = 1;
+  comp_obj_heading_.parent_lev_markup     = 0;
+  the_glossary_section                ~= comp_obj_heading_;
 } else {
   writeln("gloss");
 }
 debug(glossary) {
   foreach (gloss; the_glossary_section) {
-    writeln(gloss.object);
+    writeln(gloss.text);
   }
 }
 #+END_SRC
@@ -1131,55 +1083,46 @@ auto biblio_ordered =
 #+name: abs_post
 #+BEGIN_SRC d
 if (biblio_ordered.length > 0) {
-  node_heading_str_["is"]                       = "heading";
-  node_heading_str_["ocn"]                      = "0";
-  node_heading_str_["segment_anchor_tag"]       = "";
-  node_heading_str_["attrib"]                   = "";
-  node_heading_str_["marked_up_lev"]            = "B";
-  node_heading_int_["heading_lev_markup"]       = 1;
-  node_heading_int_["heading_lev_collapsed"]    = 1;
-  node_heading_int_["parent_ocn"]               = 1;
-  node_heading_int_["parent_lev_markup"]        = 0;
-  the_bibliography_section ~=
-    set_abstract_object.contents_heading(
-      "Bibliography",   // nugget/object
-      node_heading_str_,
-      node_heading_int_,
-      [""],             // anchor tag
-    );
-  node_heading_str_["is"]                       = "heading";
-  node_heading_str_["ocn"]                      = "0";
-  node_heading_str_["segment_anchor_tag"]       = "bibliography";
-  node_heading_str_["attrib"]                   = "";
-  node_heading_str_["marked_up_lev"]            = "1";
-  node_heading_int_["heading_lev_markup"]       = 4;
-  node_heading_int_["heading_lev_collapsed"]    = 2;
-  node_heading_int_["parent_ocn"]               = 1;
-  node_heading_int_["parent_lev_markup"]        = 0;
-  the_bibliography_section ~=
-    set_abstract_object.contents_heading(
-      "Bibliography",
-      node_heading_str_,
-      node_heading_int_,
-      ["bibliography"], // anchor tag
-    );
+  comp_obj_heading_                       = comp_obj_heading_.init;
+  comp_obj_heading_.use                   = "content";
+  comp_obj_heading_.of                    = "para";
+  comp_obj_heading_.is_a                  = "heading";
+  comp_obj_heading_.text                  = "Bibliography";
+  comp_obj_heading_.ocn                   = 0;
+  comp_obj_heading_.marked_up_level       = "B";
+  comp_obj_heading_.heading_lev_markup    = 1;
+  comp_obj_heading_.heading_lev_collapsed = 1;
+  comp_obj_heading_.parent_ocn            = 1;
+  comp_obj_heading_.parent_lev_markup     = 0;
+  the_bibliography_section                ~= comp_obj_heading_;
+  // ---
+  comp_obj_heading_                       = comp_obj_heading_.init;
+  comp_obj_heading_.use                   = "content";
+  comp_obj_heading_.of                    = "para";
+  comp_obj_heading_.is_a                  = "heading";
+  comp_obj_heading_.text                  = "Bibliography";
+  comp_obj_heading_.ocn                   = 0;
+  comp_obj_heading_.segment_anchor_tag    = "bibliography";
+  comp_obj_heading_.marked_up_level       = "1";
+  comp_obj_heading_.heading_lev_markup    = 4;
+  comp_obj_heading_.heading_lev_collapsed = 2;
+  comp_obj_heading_.parent_ocn            = 1;
+  comp_obj_heading_.parent_lev_markup     = 0;
+  comp_obj_heading_.anchor_tags           = ["bibliography"];
+  the_bibliography_section                ~= comp_obj_heading_;
 } else {
-  node_heading_str_["is"]                       = "heading";
-  node_heading_str_["ocn"]                      = "0";
-  node_heading_str_["segment_anchor_tag"]       = "";
-  node_heading_str_["attrib"]                   = "";
-  node_heading_str_["marked_up_lev"]            = "B";
-  node_heading_int_["heading_lev_markup"]       = 1;
-  node_heading_int_["heading_lev_collapsed"]    = 1;
-  node_heading_int_["parent_ocn"]               = 1;
-  node_heading_int_["parent_lev_markup"]        = 0;
-  the_bibliography_section ~=
-    set_abstract_object.contents_heading(
-      "(skip) there is no Bibliography",   // nugget/object
-      node_heading_str_,
-      node_heading_int_,
-      [""],             // anchor tag
-    );
+  comp_obj_heading_                       = comp_obj_heading_.init;
+  comp_obj_heading_.use                   = "content";
+  comp_obj_heading_.of                    = "para";
+  comp_obj_heading_.is_a                  = "heading";
+  comp_obj_heading_.text                  = "(skip) there is no Bibliography";
+  comp_obj_heading_.ocn                   = 0;
+  comp_obj_heading_.marked_up_level       = "B";
+  comp_obj_heading_.heading_lev_markup    = 1;
+  comp_obj_heading_.heading_lev_collapsed = 1;
+  comp_obj_heading_.parent_ocn            = 1;
+  comp_obj_heading_.parent_lev_markup     = 0;
+  the_bibliography_section                ~= comp_obj_heading_;
 }
 #+END_SRC
 
@@ -1203,18 +1146,18 @@ foreach (entry; biblio_ordered) {
     ((entry["place"].str.empty) ? "" : ", " ~ entry["place"].str),
     ((entry["url"].str.empty) ? "" : ", [" ~ entry["url"].str ~ "]"),
   );
-  node_para_str_["is"]                           = "bibliography";
-  node_para_str_["attrib"]                       = "";
-  node_para_int_["ocn"]                          = 0;
-  node_para_int_["indent_hang"]                  = 0;
-  node_para_int_["indent_base"]                  = 1;
-  node_para_int_["bullet"]                       = 0;
-  the_bibliography_section ~=
-    set_abstract_object.contents_para(
-      out_,                                                // nugget/object
-      node_para_str_,
-      node_para_int_,
-    );
+  comp_obj_para                       = comp_obj_para.init;
+  comp_obj_para.use                   = "content";
+  comp_obj_para.of                    = "para";
+  comp_obj_para.is_a                  = "bibliography";
+  comp_obj_para.text                  = to!string(out_).strip;
+  comp_obj_para.ocn                   = 0;
+  comp_obj_para.obj_cite_number       = "0";
+  comp_obj_para.indent_hang           = 0;
+  comp_obj_para.indent_base           = 1;
+  comp_obj_para.bullet                = bullet;
+  comp_obj_para.anchor_tags           = anchor_tags;
+  the_bibliography_section            ~= comp_obj_para;
 }
 #+END_SRC
 
@@ -1222,7 +1165,7 @@ foreach (entry; biblio_ordered) {
 #+BEGIN_SRC d
 debug(bibliosection) {
   foreach (o; the_bibliography_section) {
-    writeln(o.object);
+    writeln(o.text);
   }
 }
 #+END_SRC
@@ -1287,28 +1230,25 @@ debug(bookindex) {                         // bookindex
 #+BEGIN_SRC d
 if (an_object["blurb_nugget"].length == 0) {
   writeln("no blurb");
-  node_heading_str_["is"]                       = "heading";
-  node_heading_str_["ocn"]                      = "0";
-  node_heading_str_["segment_anchor_tag"]       = "";
-  node_heading_str_["attrib"]                   = "";
-  node_heading_str_["marked_up_lev"]            = "B";
-  node_heading_int_["heading_lev_markup"]       = 1;
-  node_heading_int_["heading_lev_collapsed"]    = 1;
-  node_heading_int_["parent_ocn"]               = 1;
-  node_heading_int_["parent_lev_markup"]        = 0;
-  the_blurb_section ~=
-    set_abstract_object.contents_heading(
-      "(skip) there is no Blurb section",   // nugget/object
-      node_heading_str_,
-      node_heading_int_,
-      [""],             // anchor tag
-    );
+  comp_obj_heading_                       = comp_obj_heading_.init;
+  comp_obj_heading_.use                   = "content";
+  comp_obj_heading_.of                    = "para";
+  comp_obj_heading_.is_a                  = "heading";
+  comp_obj_heading_.text                  = "(skip) there is no Blurb section";
+  comp_obj_heading_.ocn                   = 0;
+  comp_obj_heading_.segment_anchor_tag    = "bibliography";
+  comp_obj_heading_.marked_up_level       = "1";
+  comp_obj_heading_.heading_lev_markup    = 4;
+  comp_obj_heading_.heading_lev_collapsed = 2;
+  comp_obj_heading_.parent_ocn            = 1;
+  comp_obj_heading_.parent_lev_markup     = 0;
+  the_blurb_section                   ~= comp_obj_heading_;
 } else {
   writeln("blurb");
 }
 debug(blurb) {
   foreach (blurb; the_blurb_section) {
-    writeln(blurb.object);
+    writeln(blurb.text);
   }
 }
 #+END_SRC
@@ -1322,6 +1262,15 @@ indent=[
   "hang_position" : 1,
   "base_position" : 1,
 ];
+comp_obj_toc                       = comp_obj_toc.init;
+comp_obj_toc.use                   = "content";
+comp_obj_toc.of                    = "para";
+comp_obj_toc.is_a                  = "toc";
+comp_obj_toc.ocn                   = 0;
+comp_obj_toc.obj_cite_number       = "0";
+comp_obj_toc.indent_hang           = indent["hang_position"];
+comp_obj_toc.indent_base           = indent["base_position"];
+comp_obj_toc.bullet                = false;
 if (the_endnotes_section["seg"].length > 1) {
   toc_txt_ = format(
     "{ %s }../%s.fn_suffix",
@@ -1329,15 +1278,8 @@ if (the_endnotes_section["seg"].length > 1) {
     "endnotes",            // segment_anchor_tag_that_object_belongs_to
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["seg"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["seg"]    ~= comp_obj_toc;
 }
 if (the_endnotes_section["scroll"].length > 1) {
   toc_txt_ = format(
@@ -1346,15 +1288,8 @@ if (the_endnotes_section["scroll"].length > 1) {
     "endnotes",            // _anchor_tag
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["scroll"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                  // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["scroll"] ~= comp_obj_toc;
 }
 if (the_glossary_section.length > 1) {
   toc_txt_ = format(
@@ -1363,30 +1298,16 @@ if (the_glossary_section.length > 1) {
     "glossary",  // segment_anchor_tag_that_object_belongs_to
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["seg"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["seg"]    ~= comp_obj_toc;
   toc_txt_ = format(
     "{ %s }#%s",
     "Glossary",
     "glossary",            // _anchor_tag
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["scroll"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["scroll"] ~= comp_obj_toc;
 }
 if (the_bibliography_section.length > 1){
   toc_txt_ = format(
@@ -1395,30 +1316,17 @@ if (the_bibliography_section.length > 1){
     "bibliography",        // segment_anchor_tag_that_object_belongs_to
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["seg"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["seg"]    ~= comp_obj_toc;
+
   toc_txt_ = format(
     "{ %s }#%s",
     "Bibliography",
     "bibliography",          // _anchor_tag
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["scroll"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["scroll"] ~= comp_obj_toc;
 }
 if (the_bookindex_section["seg"].length > 1) {
   toc_txt_ = format(
@@ -1427,15 +1335,8 @@ if (the_bookindex_section["seg"].length > 1) {
     "bookindex",          // segment_anchor_tag_that_object_belongs_to
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["seg"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["seg"]    ~= comp_obj_toc;
 }
 if (the_bookindex_section["scroll"].length > 1) {
   toc_txt_ = format(
@@ -1444,15 +1345,8 @@ if (the_bookindex_section["scroll"].length > 1) {
     "bookindex",            // _anchor_tag
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["scroll"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["scroll"] ~= comp_obj_toc;
 }
 if (the_blurb_section.length > 1) {
   toc_txt_ = format(
@@ -1461,30 +1355,16 @@ if (the_blurb_section.length > 1) {
     "blurb",                // segment_anchor_tag_that_object_belongs_to
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["seg"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["seg"]    ~= comp_obj_toc;
   toc_txt_ = format(
     "{ %s }#%s",
     "Blurb",
     "blurb",                // _anchor_tag
   );
   toc_txt_= munge.url_links(toc_txt_);
-  the_table_of_contents_section["scroll"] ~=
-    set_abstract_object.contents_toc(
-      "toc",
-      toc_txt_,
-      "",                   // attrib
-      0,
-      indent,
-      false
-    );
+  comp_obj_toc.text                       = to!string(toc_txt_).strip;
+  the_table_of_contents_section["scroll"] ~= comp_obj_toc;
 }
 debug(toc) {
   writefln(
@@ -1493,7 +1373,7 @@ debug(toc) {
     the_table_of_contents_section["seg"].length
   );
   foreach (toc_linked_heading; the_table_of_contents_section["seg"]) {
-    writeln(mkup.indent_by_spaces_provided(toc_linked_heading.para_attrib.indent_start), toc_linked_heading.object);
+    writeln(mkup.indent_by_spaces_provided(toc_linked_heading.indent_hang), toc_linked_heading.text);
   }
 }
 #+END_SRC
@@ -1508,7 +1388,9 @@ auto document_the = [
   "head":             the_document_head_section,
   "toc_seg":          the_table_of_contents_section["seg"],
   "toc_scroll":       the_table_of_contents_section["scroll"],
+  /+ substantive/body: +/
   "body":             the_document_body_section,
+  /+ backmatter: +/
   "endnotes_seg":     the_endnotes_section["seg"],
   "endnotes_scroll":  the_endnotes_section["scroll"],
   "glossary":         the_glossary_section,
@@ -1561,14 +1443,14 @@ auto object_reset(ref string[string] an_object) {
 #+name: abs_functions_header_set_common
 #+BEGIN_SRC d
 auto _common_reset_(
-  ref int[string] line_occur,
+  ref int[string]    line_occur,
   ref string[string] an_object,
-  ref int[string] type
+  ref int[string]    type
 ) {
   line_occur["heading"] = State.off;
-  line_occur["para"]= State.off;
-  type["heading"] = State.off;
-  type["para"] = State.off;
+  line_occur["para"]    = State.off;
+  type["heading"]       = State.off;
+  type["para"]          = State.off;
   object_reset(an_object);
 }
 #+END_SRC
@@ -1578,7 +1460,7 @@ auto _common_reset_(
 #+name: abs_functions_ocn_status
 #+BEGIN_SRC d
 void _check_ocn_status_(
-  char[] line,
+  char[]          line,
   ref int[string] type
 ) {
   if ((!line.empty) && (type["ocn_status_multi_obj"] == TriState.off)) {
@@ -1630,9 +1512,9 @@ void _check_ocn_status_(
 #+name: abs_functions_block
 #+BEGIN_SRC d
 void _start_block_(
-  char[] line,
+  char[]          line,
   ref int[string] type,
-  string[string] obj_cite_number_poem
+  string[string]  obj_cite_number_poem
 ) {
 #+END_SRC
 
@@ -1799,9 +1681,9 @@ void _start_block_(
 #+name: abs_functions_block_code
 #+BEGIN_SRC d
 void _code_block_(
-  char[] line,
+  char[]             line,
   ref string[string] an_object,
-  ref int[string] type
+  ref int[string]    type
 ) {
   if (type["curly_code"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_code_close)) {
@@ -2051,11 +1933,11 @@ why extra object stuff only in poem/verse?
 #+name: abs_functions_block_poem
 #+BEGIN_SRC d
 void _poem_block_(
-  char[] line,
-  ref string[string] an_object,
-  ref int[string] type,
-  ref int cntr,
-  string[string] obj_cite_number_poem,
+  char[]                 line,
+  ref string[string]     an_object,
+  ref int[string]        type,
+  ref int                cntr,
+  string[string]         obj_cite_number_poem,
   string[string][string] dochead_make_aa,
 ) {
   if (type["curly_poem"] == TriState.on) {
@@ -2090,15 +1972,14 @@ void _poem_block_(
           obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
         an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
         anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-        an_object["attrib"] =
-          obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-        the_document_body_section ~=
-          set_abstract_object.contents_block(
-            an_object["is"],
-            an_object["substantive"],
-            an_object["attrib"],
-            obj_cite_number
-          );
+        comp_obj_block                            = comp_obj_block.init;
+        comp_obj_block.use                        = "content";
+        comp_obj_block.of                         = "block";
+        comp_obj_block.is_a                       = an_object["is"];
+        comp_obj_block.ocn                        = obj_cite_number;
+        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+        comp_obj_block.text                       = an_object["substantive"];
+        the_document_body_section                 ~= comp_obj_block;
         object_reset(an_object);
         processing.remove("verse");
         ++cntr;
@@ -2130,7 +2011,7 @@ void _poem_block_(
         }
         processing.remove("verse");
         an_object["is"] = "verse";
-        auto _node_t = node_construct.node_emitter(
+        auto comp_obj_location = node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
           obj_cite_number,
@@ -2138,21 +2019,18 @@ void _poem_block_(
           heading_ptr-1,
           an_object["is"]
         );
-        _node_heading_str = _node_t[0];
-        _node_heading_int = _node_t[1];
         auto substantive_object_and_anchor_tags_tuple =
           obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
         an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
         anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-        an_object["attrib"] =
-          obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-        the_document_body_section ~=
-          set_abstract_object.contents_block(
-            an_object["is"],
-            an_object["substantive"],
-            an_object["attrib"],
-            obj_cite_number
-          );
+        comp_obj_block                            = comp_obj_block.init;
+        comp_obj_block.use                        = "content";
+        comp_obj_block.of                         = "block";
+        comp_obj_block.is_a                       = an_object["is"];
+        comp_obj_block.ocn                        = obj_cite_number;
+        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+        comp_obj_block.text                       = an_object["substantive"];
+        the_document_body_section                 ~= comp_obj_block;
         object_reset(an_object);
         processing.remove("verse");
         ++cntr;
@@ -2181,15 +2059,14 @@ void _poem_block_(
           obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
         an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
         anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-        an_object["attrib"] =
-          obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-        the_document_body_section ~=
-          set_abstract_object.contents_block(
-            an_object["is"],
-            an_object["substantive"],
-            an_object["attrib"],
-            obj_cite_number
-          );
+        comp_obj_block                            = comp_obj_block.init;
+        comp_obj_block.use                        = "content";
+        comp_obj_block.of                         = "block";
+        comp_obj_block.is_a                       = an_object["is"];
+        comp_obj_block.ocn                        = obj_cite_number;
+        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+        comp_obj_block.text                       = an_object["substantive"];
+        the_document_body_section                 ~= comp_obj_block;
         obj_cite_number_poem["end"] = to!string(obj_cite_number);
         object_reset(an_object);
         processing.remove("verse");
@@ -2220,8 +2097,8 @@ void _poem_block_(
         }
         processing.remove("verse");
         an_object["is"] = "verse";
-        auto _node_t =
-          node_construct.node_emitter(
+        auto comp_obj_location =
+          node_construct.node_location_emitter(
             content_non_header,
             segment_anchor_tag_that_object_belongs_to,
             obj_cite_number,
@@ -2229,21 +2106,18 @@ void _poem_block_(
             heading_ptr-1,
             an_object["is"]
           );
-        _node_heading_str = _node_t[0];
-        _node_heading_int = _node_t[1];
         auto substantive_object_and_anchor_tags_tuple =
           obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
         an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
         anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-        an_object["attrib"] =
-          obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-        the_document_body_section ~=
-          set_abstract_object.contents_block(
-            an_object["is"],
-            an_object["substantive"],
-            an_object["attrib"],
-            obj_cite_number
-          );
+        comp_obj_block                            = comp_obj_block.init;
+        comp_obj_block.use                        = "content";
+        comp_obj_block.of                         = "block";
+        comp_obj_block.is_a                       = an_object["is"];
+        comp_obj_block.ocn                        = obj_cite_number;
+        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+        comp_obj_block.text                       = an_object["substantive"];
+        the_document_body_section                 ~= comp_obj_block;
         object_reset(an_object);
         processing.remove("verse");
         ++cntr;
@@ -2258,9 +2132,9 @@ void _poem_block_(
 #+name: abs_functions_block_group
 #+BEGIN_SRC d
 void _group_block_(
-  char[] line,
+  char[]             line,
   ref string[string] an_object,
-  ref int[string] type
+  ref int[string]    type
 ) {
   if (type["curly_group"] == State.on) {
     if (matchFirst(line, rgx.block_curly_group_close)) {
@@ -2299,9 +2173,9 @@ void _group_block_(
 #+name: abs_functions_block_block
 #+BEGIN_SRC d
 void _block_block_(
-  char[] line,
+  char[]             line,
   ref string[string] an_object,
-  ref int[string] type
+  ref int[string]    type
 ) {
   if (type["curly_block"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_block_close)) {
@@ -2340,9 +2214,9 @@ void _block_block_(
 #+name: abs_functions_block_quote
 #+BEGIN_SRC d
 void _quote_block_(
-  char[] line,
+  char[]             line,
   ref string[string] an_object,
-  ref int[string] type
+  ref int[string]    type
 ) {
   if (type["curly_quote"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_quote_close)) {
@@ -2381,9 +2255,9 @@ void _quote_block_(
 #+name: abs_functions_block_table
 #+BEGIN_SRC d
 void _table_block_(
-  char[] line,
+  char[]             line,
   ref string[string] an_object,
-  ref int[string] type
+  ref int[string]    type
 ) {
   if (type["curly_table"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_table_close)) {
@@ -2422,17 +2296,16 @@ void _table_block_(
 #+name: abs_functions_block_line_status_empty
 #+BEGIN_SRC d
 void _block_flag_line_empty_(
-  char[] line,
-  ref string[string] an_object,
-  ref ObjComposite[] the_document_body_section,
+  char[]                       line,
+  ref string[string]           an_object,
+  ref ObjGenericComposite[]    the_document_body_section,
   ref string[][string][string] bookindex_unordered_hashes,
-  ref int obj_cite_number,
-  ref string[string] _node_heading_str,
-  ref int[string] _node_heading_int,
-  ref int cntr,
-  ref int[string] type,
-  string[string] obj_cite_number_poem,
-  string[string][string] dochead_make_aa,
+  ref int                      obj_cite_number,
+  ref ObjGenericComposite      _comp_obj_heading,
+  ref int                      cntr,
+  ref int[string]              type,
+  string[string]               obj_cite_number_poem,
+  string[string][string]       dochead_make_aa,
 ) {
   // line.empty, post contents, empty variables ---------------
   assert(
@@ -2452,8 +2325,8 @@ void _block_flag_line_empty_(
     bookindex_unordered_hashes =
       bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
     an_object["is"] = "code";
-    auto _node_t =
-      node_construct.node_emitter(
+    auto comp_obj_location =
+      node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
         obj_cite_number,
@@ -2461,21 +2334,18 @@ void _block_flag_line_empty_(
         heading_ptr-1,
         an_object["is"]
       );
-    _node_heading_str = _node_t[0];
-    _node_heading_int = _node_t[1];
     auto substantive_object_and_anchor_tags_tuple =
       obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
     an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
     anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-    an_object["attrib"] =
-      obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-    the_document_body_section ~=
-      set_abstract_object.contents_block_code(
-        an_object["is"],
-        an_object["substantive"],
-        an_object["attrib"],
-        obj_cite_number
-      );
+    comp_obj_code                             = comp_obj_code.init;
+    comp_obj_code.use                         = "content";
+    comp_obj_code.of                          = "block";
+    comp_obj_code.is_a                        = an_object["is"];
+    comp_obj_code.ocn                         = obj_cite_number;
+    comp_obj_code.obj_cite_number             = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+    comp_obj_code.text                        = an_object["substantive"];
+    the_document_body_section                 ~= comp_obj_code;
     object_reset(an_object);
     processing.remove("verse");
     ++cntr;
@@ -2487,8 +2357,8 @@ void _block_flag_line_empty_(
     bookindex_unordered_hashes =
       bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
     an_object["is"] = "verse"; // check also
-    auto _node_t =
-      node_construct.node_emitter( //
+    auto comp_obj_location =
+      node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
         obj_cite_number,
@@ -2496,16 +2366,14 @@ void _block_flag_line_empty_(
         heading_ptr-1,
         an_object["is"]
       );
-    _node_heading_str = _node_t[0];
-    _node_heading_int = _node_t[1];
-    the_document_body_section ~=
-      set_abstract_object.contents_block_obj_cite_number_string(
-        "poem",
-        "",
-        (obj_cite_number_poem["start"], obj_cite_number_poem["end"]),
-        _node_heading_str,
-        _node_heading_int,
-      ); // bookindex
+    comp_obj_poem_ocn                         = comp_obj_poem_ocn.init;
+    comp_obj_poem_ocn.use                     = "content";
+    comp_obj_poem_ocn.of                      = "block";
+    comp_obj_poem_ocn.is_a                    = "poem";
+    comp_obj_poem_ocn.ocn                     = obj_cite_number;
+    comp_obj_poem_ocn.obj_cite_number         = (obj_cite_number_poem["start"], obj_cite_number_poem["end"]); // not sure about this
+    comp_obj_poem_ocn.text                    = ""; // an_object["substantive"];
+    the_document_body_section                 ~= comp_obj_poem_ocn;
     object_reset(an_object);
     processing.remove("verse");
     type["blocks"] = TriState.off;
@@ -2518,8 +2386,8 @@ void _block_flag_line_empty_(
     bookindex_unordered_hashes =
       bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
     an_object["is"] = "table";
-    auto _node_t =
-      node_construct.node_emitter(
+    auto comp_obj_location =
+      node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
         obj_cite_number,
@@ -2527,21 +2395,18 @@ void _block_flag_line_empty_(
         heading_ptr-1,
         an_object["is"]
       );
-    _node_heading_str = _node_t[0];
-    _node_heading_int = _node_t[1];
     auto substantive_object_and_anchor_tags_tuple =
       obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
     an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
     anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-    an_object["attrib"] =
-      obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-    the_document_body_section ~=
-      set_abstract_object.contents_block(
-        an_object["is"],
-        an_object["substantive"],
-        an_object["attrib"],
-        obj_cite_number
-      );
+    comp_obj_block                            = comp_obj_block.init;
+    comp_obj_block.use                        = "content";
+    comp_obj_block.of                         = "block";
+    comp_obj_block.is_a                       = an_object["is"];
+    comp_obj_block.ocn                        = obj_cite_number;
+    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+    comp_obj_block.text                       = an_object["substantive"];
+    the_document_body_section                 ~= comp_obj_block;
     object_reset(an_object);
     processing.remove("verse");
     ++cntr;
@@ -2555,8 +2420,8 @@ void _block_flag_line_empty_(
     bookindex_unordered_hashes =
       bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
     an_object["is"] = "group";
-    auto _node_t =
-      node_construct.node_emitter(
+    auto comp_obj_location =
+      node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
         obj_cite_number,
@@ -2564,21 +2429,18 @@ void _block_flag_line_empty_(
         heading_ptr-1,
         an_object["is"]
       );
-    _node_heading_str = _node_t[0];
-    _node_heading_int = _node_t[1];
     auto substantive_object_and_anchor_tags_tuple =
       obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
     an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
     anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-    an_object["attrib"] =
-      obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-    the_document_body_section ~=
-      set_abstract_object.contents_block(
-        an_object["is"],
-        an_object["substantive"],
-        an_object["attrib"],
-        obj_cite_number
-      );
+    comp_obj_block                            = comp_obj_block.init;
+    comp_obj_block.use                        = "content";
+    comp_obj_block.of                         = "block";
+    comp_obj_block.is_a                       = an_object["is"];
+    comp_obj_block.ocn                        = obj_cite_number;
+    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+    comp_obj_block.text                       = an_object["substantive"];
+    the_document_body_section                 ~= comp_obj_block;
     object_reset(an_object);
     processing.remove("verse");
     ++cntr;
@@ -2591,8 +2453,8 @@ void _block_flag_line_empty_(
     bookindex_unordered_hashes =
       bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
     an_object["is"] = "block";
-    auto _node_t =
-      node_construct.node_emitter(
+    auto comp_obj_location =
+      node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
         obj_cite_number,
@@ -2600,21 +2462,18 @@ void _block_flag_line_empty_(
         heading_ptr-1,
         an_object["is"]
        );
-    _node_heading_str = _node_t[0];
-    _node_heading_int = _node_t[1];
     auto substantive_object_and_anchor_tags_tuple =
       obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
     an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
     anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-    an_object["attrib"] =
-      obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-    the_document_body_section ~=
-      set_abstract_object.contents_block(
-        an_object["is"],
-        an_object["substantive"],
-        an_object["attrib"],
-        obj_cite_number
-      );
+    comp_obj_block                            = comp_obj_block.init;
+    comp_obj_block.use                        = "content";
+    comp_obj_block.of                         = "block";
+    comp_obj_block.is_a                       = an_object["is"];
+    comp_obj_block.ocn                        = obj_cite_number;
+    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+    comp_obj_block.text                       = an_object["substantive"];
+    the_document_body_section                 ~= comp_obj_block;
     object_reset(an_object);
     processing.remove("verse");
     ++cntr;
@@ -2628,8 +2487,8 @@ void _block_flag_line_empty_(
     bookindex_unordered_hashes =
       bkidx_hash(an_object["bookindex_nugget"], obj_cite_number);
     an_object["is"] = "quote";
-    auto _node_t =
-      node_construct.node_emitter( //
+    auto comp_obj_location =
+      node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
         obj_cite_number,
@@ -2637,21 +2496,18 @@ void _block_flag_line_empty_(
         heading_ptr-1,
         an_object["is"]
       );
-    _node_heading_str = _node_t[0];
-    _node_heading_int = _node_t[1];
     auto substantive_object_and_anchor_tags_tuple =
       obj_im.obj_inline_markup_and_anchor_tags(an_object, an_object_key, dochead_make_aa);
     an_object["substantive"] = substantive_object_and_anchor_tags_tuple[0];
     anchor_tags = substantive_object_and_anchor_tags_tuple[1];
-    an_object["attrib"] =
-      obj_att.obj_attributes(an_object["is"], an_object[an_object_key], _node_heading_str, _node_heading_int);
-    the_document_body_section ~=
-      set_abstract_object.contents_block(
-        an_object["is"],
-        an_object["substantive"],
-        an_object["attrib"],
-        obj_cite_number
-      );
+    comp_obj_block                            = comp_obj_block.init;
+    comp_obj_block.use                        = "content";
+    comp_obj_block.of                         = "block";
+    comp_obj_block.is_a                       = an_object["is"];
+    comp_obj_block.ocn                        = obj_cite_number;
+    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+    comp_obj_block.text                       = an_object["substantive"];
+    the_document_body_section                 ~= comp_obj_block;
     object_reset(an_object);
     processing.remove("verse");
     ++cntr;
@@ -2722,11 +2578,11 @@ auto _book_index_(
 #+name: abs_functions_heading
 #+BEGIN_SRC d
 auto _heading_found_(
-  char[] line,
-  string dochead_make_identify_unmarked_headings,
-  ref string[string] heading_match_str,
+  char[]                   line,
+  string                   dochead_make_identify_unmarked_headings,
+  ref string[string]       heading_match_str,
   ref Regex!(char)[string] heading_match_rgx,
-  ref int[string] type
+  ref int[string]          type
 ) {
   if ((dochead_make_identify_unmarked_headings.length > 2)
   && (type["make_headings"] == State.off)) {
@@ -2812,10 +2668,10 @@ auto _heading_found_(
 #+name: abs_functions_heading
 #+BEGIN_SRC d
 auto _heading_make_set_(
-  ref char[] line,
-  ref int[string] line_occur,
+  ref char[]               line,
+  ref int[string]          line_occur,
   ref Regex!(char)[string] heading_match_rgx,
-  ref int[string] type
+  ref int[string]          type
 ) {
   if ((type["make_headings"] == State.on)
   && ((line_occur["para"] == State.off)
@@ -2874,13 +2730,13 @@ auto _heading_make_set_(
 #+name: abs_functions_heading
 #+BEGIN_SRC d
 auto _heading_matched_(
-  char[] line,
-  ref int[string] line_occur,
-  ref string[string] an_object,
-  ref string an_object_key,
-  ref int[string] lv,
-  ref int[string] collapsed_lev,
-  ref int[string] type,
+  char[]                     line,
+  ref int[string]            line_occur,
+  ref string[string]         an_object,
+  ref string                 an_object_key,
+  ref int[string]            lv,
+  ref int[string]            collapsed_lev,
+  ref int[string]            type,
   ref string[string][string] dochead_meta_aa
 ) {
   if (auto m = match(line, rgx.heading)) {
@@ -3023,13 +2879,13 @@ auto _heading_matched_(
 #+name: abs_functions_para
 #+BEGIN_SRC d
 auto _para_match_(
-  char[] line,
+  char[]             line,
   ref string[string] an_object,
-  ref string an_object_key,
-  ref int[string] indent,
-  ref bool bullet,
-  ref int[string] type,
-  ref int[string] line_occur,
+  ref string         an_object_key,
+  ref int[string]    indent,
+  ref bool           bullet,
+  ref int[string]    type,
+  ref int[string]    line_occur,
 ) {
   if (line_occur["para"] == State.off) {
     /+ para matches +/
@@ -3346,8 +3202,8 @@ struct ObjInlineMarkup {
 #+name: ao_emitters_obj_inline_markup_and_anchor_tags
 #+BEGIN_SRC d
   auto obj_inline_markup_and_anchor_tags(
-    string[string] obj_,
-    string obj_key_,
+    string[string]         obj_,
+    string                 obj_key_,
     string[string][string] dochead_make_aa
   )
   in { }
@@ -3429,27 +3285,21 @@ struct ObjInlineMarkup {
    return heading_toc_;
   };
   auto table_of_contents_gather_headings(
-    string[string] obj_,
-    string[string][string] dochead_make_aa,
-    string segment_anchor_tag_that_object_belongs_to,
-    string _anchor_tag,
-    ObjComposite[][string] the_table_of_contents_section,
+    string[string]                obj_,
+    string[string][string]        dochead_make_aa,
+    string                        segment_anchor_tag_that_object_belongs_to,
+    string                        _anchor_tag,
+    ObjGenericComposite[][string] the_table_of_contents_section,
   )
   in { }
   body {
+    ObjGenericComposite comp_obj_toc;
     char[] heading_toc_ = to!(char[])(obj_["body_nugget"].dup.strip);
     heading_toc_ = _clean_heading_toc_(heading_toc_);
     auto attrib="";
     string toc_txt_;
     int[string] indent;
-    auto set_abstract_object = ObjectAbstractSet();
     if (to!int(obj_["lev_markup_number"]) > 0) {
-      toc_txt_ = format(
-        "{ %s }#%s",
-        heading_toc_,
-        _anchor_tag,
-      );
-      toc_txt_= munge.url_links(toc_txt_);
       indent=[
         "hang_position" : to!int(obj_["lev_markup_number"]),
         "base_position" : to!int(obj_["lev_markup_number"]),
@@ -3460,30 +3310,41 @@ struct ObjInlineMarkup {
         _anchor_tag,
       );
       toc_txt_= munge.url_links(toc_txt_);
-      the_table_of_contents_section["scroll"] ~=
-        set_abstract_object.contents_toc(
-          "toc",
-          toc_txt_,
-          "",                   // attrib
-          0,
-          indent,
-          false
-        );
+      comp_obj_toc                       = comp_obj_toc.init;
+      comp_obj_toc.use                   = "content";
+      comp_obj_toc.of                    = "para";
+      comp_obj_toc.is_a                  = "toc";
+      comp_obj_toc.ocn                   = 0;
+      comp_obj_toc.obj_cite_number       = "0";
+      comp_obj_toc.indent_hang           = indent["hang_position"];
+      comp_obj_toc.indent_base           = indent["base_position"];
+      comp_obj_toc.bullet                = false;
+      comp_obj_toc.text                  = to!string(toc_txt_).strip;
+      the_table_of_contents_section["scroll"] ~= comp_obj_toc;
     } else {
       indent=[
         "hang_position" : 0,
         "base_position" : 0,
       ];
-      the_table_of_contents_section["scroll"] ~=
-        set_abstract_object.contents_toc(
-          "toc",
-          "Table of Contents",
-          "",                   // attrib
-          0,
-          indent,
-          false
-        );
+      comp_obj_toc                       = comp_obj_toc.init;
+      comp_obj_toc.use                   = "content";
+      comp_obj_toc.of                    = "para";
+      comp_obj_toc.is_a                  = "toc";
+      comp_obj_toc.ocn                   = 0;
+      comp_obj_toc.obj_cite_number       = "0";
+      comp_obj_toc.indent_hang           = indent["hang_position"];
+      comp_obj_toc.indent_base           = indent["base_position"];
+      comp_obj_toc.bullet                = false;
+      comp_obj_toc.text                  = "Table of Contents";
+      the_table_of_contents_section["scroll"] ~= comp_obj_toc;
     }
+    comp_obj_toc                       = comp_obj_toc.init;
+    comp_obj_toc.use                   = "content";
+    comp_obj_toc.of                    = "para";
+    comp_obj_toc.is_a                  = "toc";
+    comp_obj_toc.ocn                   = 0;
+    comp_obj_toc.obj_cite_number       = "0";
+    comp_obj_toc.bullet                = false;
     switch (to!int(obj_["lev_markup_number"])) {
     case 0:
       indent=[
@@ -3492,15 +3353,10 @@ struct ObjInlineMarkup {
       ];
       toc_txt_ = "{ Table of Contents }../toc.fn_suffix";
       toc_txt_= munge.url_links(toc_txt_);
-      the_table_of_contents_section["seg"] ~=
-        set_abstract_object.contents_toc(
-          "toc",
-          toc_txt_,
-          "",                   // attrib
-          0,
-          indent,
-          false
-        );
+      comp_obj_toc.indent_hang             = indent["hang_position"];
+      comp_obj_toc.indent_base             = indent["base_position"];
+      comp_obj_toc.text                    = to!string(toc_txt_).strip;
+      the_table_of_contents_section["seg"] ~= comp_obj_toc;
       break;
     case 1: .. case 3:
       indent=[
@@ -3512,15 +3368,10 @@ struct ObjInlineMarkup {
         heading_toc_,
       );
       toc_txt_= munge.url_links(toc_txt_);
-      the_table_of_contents_section["seg"] ~=
-        set_abstract_object.contents_toc(
-          "toc",
-          toc_txt_,
-          "",                   // attrib
-          0,
-          indent,
-          false
-        );
+      comp_obj_toc.indent_hang             = indent["hang_position"];
+      comp_obj_toc.indent_base             = indent["base_position"];
+      comp_obj_toc.text                    = to!string(toc_txt_).strip;
+      the_table_of_contents_section["seg"] ~= comp_obj_toc;
       break;
     case 4:
       toc_txt_ = format(
@@ -3533,15 +3384,10 @@ struct ObjInlineMarkup {
         "hang_position" : to!int(obj_["lev_markup_number"]),
         "base_position" : to!int(obj_["lev_markup_number"]),
       ];
-      the_table_of_contents_section["seg"] ~=
-        set_abstract_object.contents_toc(
-          "toc",
-          toc_txt_,
-          "",                   // attrib
-          0,
-          indent,
-          false
-        );
+      comp_obj_toc.indent_hang             = indent["hang_position"];
+      comp_obj_toc.indent_base             = indent["base_position"];
+      comp_obj_toc.text                    = to!string(toc_txt_).strip;
+      the_table_of_contents_section["seg"] ~= comp_obj_toc;
       break;
     case 5: .. case 7:
       toc_txt_ = format(
@@ -3555,15 +3401,10 @@ struct ObjInlineMarkup {
         "hang_position" : to!int(obj_["lev_markup_number"]),
         "base_position" : to!int(obj_["lev_markup_number"]),
       ];
-      the_table_of_contents_section["seg"] ~=
-        set_abstract_object.contents_toc(
-          "toc",
-          toc_txt_,
-          "",                   // attrib
-          0,
-          indent,
-          false
-        );
+      comp_obj_toc.indent_hang             = indent["hang_position"];
+      comp_obj_toc.indent_base             = indent["base_position"];
+      comp_obj_toc.text                    = to!string(toc_txt_).strip;
+      the_table_of_contents_section["seg"] ~= comp_obj_toc;
       break;
     default:
       break;
@@ -3586,10 +3427,9 @@ private:
 #+name: ao_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
 #+BEGIN_SRC d
   static string _configured_auto_heading_numbering_and_segment_anchor_tags(
-    string munge_,
-    string[string] obj_,
-    string[string][string]
-    dochead_make_aa
+    string                 munge_,
+    string[string]         obj_,
+    string[string][string] dochead_make_aa
   ) {
     if (dochead_make_aa["make"]["num_top"].length > 0) {
       if (!(match(munge_, rgx.heading_anchor_tag))) {
@@ -3806,20 +3646,17 @@ struct ObjAttributes {
 #+name: ao_emitters_obj_attributes_public
 #+BEGIN_SRC d
   string obj_attributes(
-    string obj_is_,
-    string obj_raw,
-    string[string] _node_heading_str,
-    int[string] _node_heading_int
+    string              obj_is_,
+    string              obj_raw,
+    ObjGenericComposite _comp_obj_heading,
   )
   in { }
   body {
     scope(exit) {
       destroy(obj_is_);
       destroy(obj_raw);
-      destroy(_node_heading_str);
-      destroy(_node_heading_int);
+      destroy(_comp_obj_heading);
     }
-    _obj_attrib.remove("json");
     _obj_attrib["json"] ="{";
     switch (obj_is_) {
     case "heading":
@@ -3857,7 +3694,7 @@ struct ObjAttributes {
       break;
     }
     _obj_attrib["json"] ~=" }";
-    _obj_attrib["json"]=_set_additional_values_parse_as_json(_obj_attrib["json"], obj_is_, _node_heading_str, _node_heading_int); // check
+    _obj_attrib["json"]=_set_additional_values_parse_as_json(_obj_attrib["json"], obj_is_, _comp_obj_heading); // check
     debug(structattrib) {
       if (oa_j["is"].str() == "heading") {
         writeln(_obj_attrib["json"]);
@@ -3892,24 +3729,24 @@ struct ObjAttributes {
     auto rgx = Rgx();
     if (matchFirst(obj_txt_in, rgx.para_bullet)) {
       _obj_attributes =" \"bullet\": \"true\","
-      ~ " \"indent_start\": 0,"
-      ~ " \"indent_rest\": 0,";
+      ~ " \"indent_hang\": 0,"
+      ~ " \"indent_base\": 0,";
     } else if (auto m = matchFirst(obj_txt_in, rgx.para_bullet_indent)) {
       _obj_attributes =" \"bullet\": \"true\","
-      ~ " \"indent_start\": " ~ to!string(m.captures[1]) ~ ","
-      ~ " \"indent_rest\": " ~ to!string(m.captures[1]) ~ ",";
+      ~ " \"indent_hang\": " ~ to!string(m.captures[1]) ~ ","
+      ~ " \"indent_base\": " ~ to!string(m.captures[1]) ~ ",";
     } else if (auto m = matchFirst(obj_txt_in, rgx.para_indent_hang)) {
       _obj_attributes =" \"bullet\": \"false\","
-      ~ " \"indent_start\": " ~ to!string(m.captures[1]) ~ ","
-      ~ " \"indent_rest\": " ~  to!string(m.captures[2]) ~ ",";
+      ~ " \"indent_hang\": " ~ to!string(m.captures[1]) ~ ","
+      ~ " \"indent_base\": " ~  to!string(m.captures[2]) ~ ",";
     } else if (auto m = matchFirst(obj_txt_in, rgx.para_indent)) {
       _obj_attributes =" \"bullet\": \"false\","
-      ~ " \"indent_start\": " ~ to!string(m.captures[1]) ~ ","
-      ~ " \"indent_rest\": " ~ to!string(m.captures[1]) ~ ",";
+      ~ " \"indent_hang\": " ~ to!string(m.captures[1]) ~ ","
+      ~ " \"indent_base\": " ~ to!string(m.captures[1]) ~ ",";
     } else {
       _obj_attributes =" \"bullet\": \"false\","
-      ~ " \"indent_start\": 0,"
-      ~ " \"indent_rest\": 0,";
+      ~ " \"indent_hang\": 0,"
+      ~ " \"indent_base\": 0,";
     }
     return _obj_attributes;
   }
@@ -4064,26 +3901,25 @@ struct ObjAttributes {
 #+name: ao_emitters_obj_attributes_private_json
 #+BEGIN_SRC d
   string _set_additional_values_parse_as_json(
-    string _obj_attrib,
-    string obj_is_,
-    string[string] _node_heading_str,
-    int[string] _node_heading_int
+    string              _obj_attrib,
+    string              obj_is_,
+    ObjGenericComposite _comp_obj_heading,
   ) {                                                  //
     JSONValue oa_j = parseJSON(_obj_attrib);
     assert(
       (oa_j.type == JSON_TYPE.OBJECT)
     );
     if (obj_is_ == "heading") {
-      oa_j.object["obj_cite_number"] = _node_heading_str["ocn"];
-      oa_j.object["lev_markup_number"] = _node_heading_int["heading_lev_markup"];
-      oa_j.object["lev_collapsed_number"] = _node_heading_int["heading_lev_collapsed"];
+      oa_j.object["obj_cite_number"] = _comp_obj_heading.ocn;
+      oa_j.object["lev_markup_number"] = _comp_obj_heading.heading_lev_markup;
+      oa_j.object["lev_collapsed_number"] = _comp_obj_heading.heading_lev_collapsed;
       oa_j.object["heading_ptr"] =
-        _node_heading_int["ptr_heading"];
+        _comp_obj_heading.ptr_heading;
       oa_j.object["doc_object_ptr"] =
-        _node_heading_int["ptr_doc_object"];
+        _comp_obj_heading.ptr_doc_object;
     }
-    oa_j.object["parent_obj_cite_number"] = _node_heading_int["parent_ocn"];         //
-    oa_j.object["parent_lev_markup_number"] = _node_heading_int["parent_lev_markup"];         //
+    oa_j.object["parent_obj_cite_number"] = _comp_obj_heading.parent_ocn;
+    oa_j.object["parent_lev_markup_number"] = _comp_obj_heading.parent_lev_markup;
     _obj_attrib = oa_j.toString();
     return _obj_attrib;
   }
@@ -4110,7 +3946,7 @@ struct BookIndexNuggetHash {
   string[] bi_main_terms_split_arr;
   string[][string][string] bookindex_nugget_hash(
     string bookindex_section,
-    int obj_cite_number
+    int    obj_cite_number
   )
   in {
     debug(bookindexraw) {
@@ -4264,68 +4100,48 @@ struct BookIndexReportSection {
     mixin SiSUnode;
     string type_is;
     string lev;
-    int lev_int_markup, lev_int_collapsed;
+    int heading_lev_markup, heading_lev_collapsed;
     string attrib;
     int[string] indent;
-    auto set_abstract_object = ObjectAbstractSet();
     auto mainkeys =
       bookindex_unordered_hashes.byKey.array.sort().release;
-    ObjComposite[][string] bookindex_section;
-    auto node_heading_int_ = node_metadata_heading_int;
-    auto node_heading_str_ = node_metadata_heading_str;
+    ObjGenericComposite[][string] bookindex_section;
+    ObjGenericComposite comp_obj_heading_, comp_obj_para;
     auto node_para_int_ = node_metadata_para_int;
     auto node_para_str_ = node_metadata_para_str;
     if ((mainkeys.length > 0)
     && (opt_action_bool["backmatter"] && opt_action_bool["section_bookindex"])) {
       string bi_tmp_seg, bi_tmp_scroll;
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "B";
-      node_heading_int_["heading_lev_markup"]       = 1;
-      node_heading_int_["heading_lev_collapsed"]    = 1;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      bookindex_section["scroll"] ~=
-        set_abstract_object.contents_heading(
-          "Book Index",
-          node_heading_str_,
-          node_heading_int_,
-          [],
-        );
-      bookindex_section["seg"] ~=
-        set_abstract_object.contents_heading(
-          "Book Index",
-          node_heading_str_,
-          node_heading_int_,
-          [],
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Book Index";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.marked_up_level       = "B";
+      comp_obj_heading_.heading_lev_markup    = 1;
+      comp_obj_heading_.heading_lev_collapsed = 1;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      bookindex_section["scroll"]             ~= comp_obj_heading_;
+      bookindex_section["seg"]                ~= comp_obj_heading_;
       ++obj_cite_number;
       ++mkn;
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "bookindex";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "1";
-      node_heading_int_["heading_lev_markup"]       = 4;
-      node_heading_int_["heading_lev_collapsed"]    = 2;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      bookindex_section["scroll"] ~=
-        set_abstract_object.contents_heading(
-          "Index",
-          node_heading_str_,
-          node_heading_int_,
-          ["bookindex"],
-        );
-      bookindex_section["seg"] ~=
-        set_abstract_object.contents_heading(
-          "Index",
-          node_heading_str_,
-          node_heading_int_,
-          ["bookindex"],
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Index";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.segment_anchor_tag    = "bookindex";
+      comp_obj_heading_.marked_up_level       = "1";
+      comp_obj_heading_.heading_lev_markup    = 4;
+      comp_obj_heading_.heading_lev_collapsed = 2;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      comp_obj_heading_.anchor_tags           = ["bookindex"];
+      bookindex_section["scroll"]             ~= comp_obj_heading_;
+      bookindex_section["seg"]                ~= comp_obj_heading_;
       ++obj_cite_number;
       ++mkn;
       foreach (mainkey; mainkeys) {
@@ -4359,52 +4175,33 @@ struct BookIndexReportSection {
         }
         bi_tmp_scroll = replaceFirst(bi_tmp_scroll, rgx.trailing_linebreak, "");
         bi_tmp_seg = replaceFirst(bi_tmp_seg, rgx.trailing_linebreak, "");
-        indent=[ "hang_position" : 0, "base_position" : 1, ];
-        node_para_str_["is"]                           = "para";
-        node_para_str_["attrib"]                       = "";
-        node_para_int_["ocn"]                          = obj_cite_number;
-        node_para_int_["indent_hang"]                  = 0;
-        node_para_int_["indent_base"]                  = 1;
-        node_para_int_["bullet"]                       = 0;
-        bookindex_section["scroll"] ~=
-          set_abstract_object.contents_para(
-            bi_tmp_scroll,
-            node_para_str_,
-            node_para_int_,
-          );
-        bookindex_section["seg"] ~=
-          set_abstract_object.contents_para(
-            bi_tmp_seg,
-            node_para_str_,
-            node_para_int_,
-          );
+        comp_obj_para                       = comp_obj_para.init;
+        comp_obj_para.use                   = "content";
+        comp_obj_para.of                    = "para";
+        comp_obj_para.is_a                  = "para";
+        comp_obj_para.text                  = to!string(bi_tmp_scroll).strip;
+        comp_obj_para.ocn                   = obj_cite_number;
+        comp_obj_para.obj_cite_number       = to!string(obj_cite_number);
+        comp_obj_para.indent_hang           = 0;
+        comp_obj_para.indent_base           = 1;
+        comp_obj_para.bullet                = false;
+        bookindex_section["scroll"]         ~= comp_obj_para;
+        comp_obj_para.text                  = to!string(bi_tmp_seg).strip;
+        bookindex_section["seg"]            ~= comp_obj_para;
         ++obj_cite_number;
         ++mkn;
       }
     } else {                              // no book index, (figure out what to do here)
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "B";
-      node_heading_int_["heading_lev_markup"]       = 1;
-      node_heading_int_["heading_lev_collapsed"]    = 1;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      bookindex_section["scroll"] ~=
-        set_abstract_object.contents_heading(
-          "(skip) there is no Book Index",
-          node_heading_str_,
-          node_heading_int_,
-          [""],
-        );
-      bookindex_section["seg"] ~=
-        set_abstract_object.contents_heading(
-          "(skip) there is no Book Index",
-          node_heading_str_,
-          node_heading_int_,
-          [""],
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.text                  = "(skip) there is no Book Index";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.marked_up_level       = "B";
+      comp_obj_heading_.heading_lev_markup    = 1;
+      comp_obj_heading_.heading_lev_collapsed = 1;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      bookindex_section["scroll"]             ~= comp_obj_heading_;
+      bookindex_section["seg"]                ~= comp_obj_heading_;
     }
     auto t = tuple(bookindex_section, obj_cite_number);
     return t;
@@ -4434,9 +4231,9 @@ struct NotesSection {
 #+name: ao_emitters_endnotes
 #+BEGIN_SRC d
   private auto gather_notes_for_endnote_section(
-    ObjComposite[] contents_am,
-    string         segment_anchor_tag_that_object_belongs_to,
-    int            cntr,
+    ObjGenericComposite[] contents_am,
+    string                segment_anchor_tag_that_object_belongs_to,
+    int                   cntr,
   )
   in {
     // endnotes/ footnotes for
@@ -4448,7 +4245,7 @@ struct NotesSection {
     assert(cntr >= previous_count);
     previous_count=cntr;
     assert(
-      match(contents_am[cntr].object,
+      match(contents_am[cntr].text,
       rgx.inline_notes_delimiter_al_regular_number_note)
     );
   }
@@ -4457,7 +4254,7 @@ struct NotesSection {
     foreach(
       m;
       matchAll(
-        contents_am[cntr].object,
+        contents_am[cntr].text,
         rgx.inline_notes_delimiter_al_regular_number_note
       )
     ) {
@@ -4521,102 +4318,88 @@ struct NotesSection {
   }
   body {
     mixin SiSUnode;
-    auto set_abstract_object = ObjectAbstractSet();
-    ObjComposite[][string] the_endnotes_section;
+    ObjGenericComposite[][string] the_endnotes_section;
     auto endnotes_ = gathered_notes();
     string type_is;
     string lev, lev_markup_number, lev_collapsed_number;
     string attrib;
     int[string] indent;
-    auto node_heading_int_ = node_metadata_heading_int;
-    auto node_heading_str_ = node_metadata_heading_str;
+    ObjGenericComposite comp_obj_heading_;
     if ((endnotes_["seg"].length > 0)
     && (opt_action_bool["backmatter"] && opt_action_bool["section_endnotes"])) {
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "B";
-      node_heading_int_["heading_lev_markup"]       = 1;
-      node_heading_int_["heading_lev_collapsed"]    = 1;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_endnotes_section["seg"] ~=
-        set_abstract_object.contents_heading(
-          "Endnotes",
-          node_heading_str_,
-          node_heading_int_,
-          [],
-        );
-      the_endnotes_section["scroll"] ~=
-        set_abstract_object.contents_heading(
-          "Endnotes",
-          node_heading_str_,
-          node_heading_int_,
-          [],
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Endnotes";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.marked_up_level       = "B";
+      comp_obj_heading_.heading_lev_markup    = 1;
+      comp_obj_heading_.heading_lev_collapsed = 1;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      the_endnotes_section["seg"]             ~= comp_obj_heading_;
+      the_endnotes_section["scroll"]          ~= comp_obj_heading_;
       ++obj_cite_number;
       ++mkn;
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "endnotes";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "1";
-      node_heading_int_["heading_lev_markup"]       = 4;
-      node_heading_int_["heading_lev_collapsed"]    = 2;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_endnotes_section["seg"] ~=
-        set_abstract_object.contents_heading(
-          "Endnotes",
-          node_heading_str_,
-          node_heading_int_,
-          ["endnotes"],
-        );
-      the_endnotes_section["scroll"] ~=
-        set_abstract_object.contents_heading(
-          "Endnotes",
-          node_heading_str_,
-          node_heading_int_,
-          ["endnotes"],
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "Endnotes";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.segment_anchor_tag    = "endnotes";
+      comp_obj_heading_.marked_up_level       = "1";
+      comp_obj_heading_.heading_lev_markup    = 4;
+      comp_obj_heading_.heading_lev_collapsed = 2;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      comp_obj_heading_.anchor_tags           = ["endnotes"];
+      the_endnotes_section["seg"]             ~= comp_obj_heading_;
+      the_endnotes_section["scroll"]          ~= comp_obj_heading_;
       ++obj_cite_number;
       ++mkn;
     } else {
-      node_heading_str_["is"]                       = "heading";
-      node_heading_str_["ocn"]                      = "0";
-      node_heading_str_["segment_anchor_tag"]       = "";
-      node_heading_str_["attrib"]                   = "";
-      node_heading_str_["marked_up_lev"]            = "B";
-      node_heading_int_["heading_lev_markup"]       = 1;
-      node_heading_int_["heading_lev_collapsed"]    = 1;
-      node_heading_int_["parent_ocn"]               = 1;
-      node_heading_int_["parent_lev_markup"]        = 0;
-      the_endnotes_section["seg"] ~=
-        set_abstract_object.contents_heading(
-          "(skip) there are no Endnotes",
-          node_heading_str_,
-          node_heading_int_,
-          [""],
-        );
-      the_endnotes_section["scroll"] ~=
-        set_abstract_object.contents_heading(
-          "(skip) there are no Endnotes",
-          node_heading_str_,
-          node_heading_int_,
-          [""],
-        );
+      comp_obj_heading_                       = comp_obj_heading_.init;
+      comp_obj_heading_.use                   = "content";
+      comp_obj_heading_.of                    = "para";
+      comp_obj_heading_.is_a                  = "heading";
+      comp_obj_heading_.text                  = "(skip) there are no Endnotes";
+      comp_obj_heading_.ocn                   = 0;
+      comp_obj_heading_.marked_up_level       = "B";
+      comp_obj_heading_.heading_lev_markup    = 1;
+      comp_obj_heading_.heading_lev_collapsed = 1;
+      comp_obj_heading_.parent_ocn            = 1;
+      comp_obj_heading_.parent_lev_markup     = 0;
+      the_endnotes_section["seg"]             ~= comp_obj_heading_;
+      the_endnotes_section["scroll"]          ~= comp_obj_heading_;
     }
     if (opt_action_bool["backmatter"] && opt_action_bool["section_endnotes"]) {
+      ObjGenericComposite comp_obj_endnote_;
+      comp_obj_endnote_                       = comp_obj_endnote_.init;
+      comp_obj_endnote_.use                   = "content";
+      comp_obj_endnote_.of                    = "para";
+      comp_obj_endnote_.is_a                  = "endnote";
+      comp_obj_endnote_.ocn                   = 0;
+      comp_obj_endnote_.obj_cite_number       = "0";
+      comp_obj_endnote_.indent_hang           = 0;
+      comp_obj_endnote_.indent_base           = 0;
+      comp_obj_endnote_.bullet                = false;
       foreach (i, endnote; endnotes_["seg"]) {
-        attrib="";
-        the_endnotes_section["seg"] ~=
-          set_abstract_object.contents_endnote(endnote, endnotes_["anchor"][i]);
+        auto     m                            = (matchFirst(endnote, rgx.note_ref));
+        string   notenumber                   = to!string(m.captures[1]);
+        string   anchor_tag                   = "note_" ~ notenumber;
+        comp_obj_endnote_.anchor_tags         ~= [ endnotes_["anchor"][i] ]; // fix
+        comp_obj_endnote_.text                = endnote.strip;
+        the_endnotes_section["seg"]           ~= comp_obj_endnote_;
       }
       foreach (i, endnote; endnotes_["scroll"]) {
-        attrib="";
-        the_endnotes_section["scroll"] ~=
-          set_abstract_object.contents_endnote(endnote, endnotes_["anchor"][i]);
+        auto     m                            = (matchFirst(endnote, rgx.note_ref));
+        string   notenumber                   = to!string(m.captures[1]);
+        string   anchor_tag                   = "note_" ~ notenumber;
+        comp_obj_endnote_.anchor_tags         ~= [ endnotes_["anchor"][i] ]; // fix
+        comp_obj_endnote_.text                = endnote.strip;
+        the_endnotes_section["scroll"]        ~= comp_obj_endnote_;
       }
     }
     auto t = tuple(the_endnotes_section, obj_cite_number);
@@ -4644,8 +4427,8 @@ struct Bibliography {
 #+name: ao_emitters_bibliography
 #+BEGIN_SRC d
   public JSONValue[] _bibliography_(
-    ref string[] biblio_unsorted_incomplete,
-    ref JSONValue[] bib_arr_json
+    ref string[]     biblio_unsorted_incomplete,
+    ref JSONValue[]  bib_arr_json
   )
   in { }
   body {
@@ -4675,7 +4458,7 @@ struct Bibliography {
 #+name: ao_emitters_bibliography
 #+BEGIN_SRC d
   final private JSONValue[] _biblio_unsorted_complete_(
-    string[] biblio_unordered,
+    string[]        biblio_unordered,
     ref JSONValue[] bib_arr_json
   ) {
     foreach (bibent; biblio_unordered) {
@@ -4763,11 +4546,11 @@ struct NodeStructureMetadata {
 
 #+name: ao_emitters_metadata
 #+BEGIN_SRC d
-  auto node_emitter(
+  ObjGenericComposite node_location_emitter(
     string lev_markup_number,
     string segment_anchor_tag,
     int    obj_cite_number_,
-    int   cntr_,
+    int    cntr_,
     int    ptr_,
     string is_
   )
@@ -4793,23 +4576,13 @@ struct NodeStructureMetadata {
       p_["lev_markup_number"] = DocStructMarkupHeading.h_text_1;
       p_["obj_cite_number"] = lv4;
     }
-    string[string] _node_heading_str = [
-      "is"                            : is_,
-      "ocn"                           : to!string(obj_cite_number_),
-      "marked_up_lev"                 : "",
-      "segment_anchor_tag"            : to!string(segment_anchor_tag),
-      "attrib"                        : "",
-    ];
-    int[string] _node_heading_int = [
-      "ocn"                           : obj_cite_number_,
-      "ptr_doc_object"                : 0,
-      "ptr_html_segnames"             : 0,
-      "ptr_heading"                   : 0,
-      "heading_lev_markup"            : 0,
-      "heading_lev_collapsed"         : 0,
-      "parent_ocn"                    : p_["obj_cite_number"],
-      "parent_lev_markup"             : p_["lev_markup_number"],
-    ];
+    ObjGenericComposite comp_obj_location;
+    comp_obj_location                       = comp_obj_location.init;
+    comp_obj_location.is_a                  = is_;
+    comp_obj_location.ocn                   = obj_cite_number_;
+    comp_obj_location.segment_anchor_tag    = to!string(segment_anchor_tag);
+    comp_obj_location.parent_ocn            = p_["obj_cite_number"];
+    comp_obj_location.parent_lev_markup     = p_["lev_markup_number"];
     debug(node) {
       if (match(lev_markup_number, rgx.levels_numbered_headings)) {
         writeln("x ", to!string(_node));
@@ -4817,14 +4590,10 @@ struct NodeStructureMetadata {
         writeln("- ", to!string(_node));
       }
     }
-    assert(_node_heading_int["parent_lev_markup"] >= 4);         //
-    assert(_node_heading_int["parent_lev_markup"] <= 7);         //
-    assert(_node_heading_int["parent_ocn"] >= 0);      // hmm, perhaps         //
-    auto t = tuple(
-      _node_heading_str,
-      _node_heading_int,
-    );
-    return t;
+    assert(comp_obj_location.parent_lev_markup >= 4);
+    assert(comp_obj_location.parent_lev_markup <= 7);
+    assert(comp_obj_location.parent_ocn >= 0);
+    return comp_obj_location;
   }
   invariant() {
   }
@@ -4834,7 +4603,8 @@ struct NodeStructureMetadata {
 
 #+name: ao_emitters_metadata
 #+BEGIN_SRC d
-  auto node_emitter_heading(
+  ObjGenericComposite node_emitter_heading(
+    string _text,
     string lev,
     string lev_markup_number,
     string lev_collapsed_number,
@@ -4843,7 +4613,7 @@ struct NodeStructureMetadata {
     int    cntr_,
     int    ptr_,
     string is_,
-    int html_segnames_ptr,
+    int    html_segnames_ptr,
   )
   in {
     auto rgx = Rgx();
@@ -4942,23 +4712,23 @@ struct NodeStructureMetadata {
     default:
       break;
     }
-    string[string] _node_heading_str = [
-      "is"                            : is_,
-      "ocn"                           : to!string(obj_cite_number_),
-      "marked_up_lev"                 : lev,
-      "segment_anchor_tag"            : to!string(segment_anchor_tag),
-      "attrib"                        : "",
-    ];
-    int[string] _node_heading_int = [
-      "ocn"                           : obj_cite_number_,
-      "ptr_doc_object"                : cntr_,
-      "ptr_html_segnames"             : ((lev_markup_number == "4") ? html_segnames_ptr : 0),
-      "ptr_heading"                   : ptr_,
-      "heading_lev_markup"            : (!(lev_markup_number.empty) ? to!int(lev_markup_number) : 0),       // switch to use int if possible
-      "heading_lev_collapsed"         : (!(lev_collapsed_number.empty) ? to!int(lev_collapsed_number) : 0), // switch to use int if possible
-      "parent_ocn"                    : p_["obj_cite_number"],
-      "parent_lev_markup"             : p_["lev_markup_number"],
-    ];
+    ObjGenericComposite _comp_obj_heading_;
+    _comp_obj_heading_                       = _comp_obj_heading_.init;
+    _comp_obj_heading_.use                   = "content";
+    _comp_obj_heading_.of                    = "para";
+    _comp_obj_heading_.is_a                  = "heading";
+    _comp_obj_heading_.text                  = to!string(_text).strip;
+    _comp_obj_heading_.ocn                   = obj_cite_number_;
+    _comp_obj_heading_.obj_cite_number       = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+    _comp_obj_heading_.segment_anchor_tag    = to!string(segment_anchor_tag);
+    _comp_obj_heading_.marked_up_level       = lev;
+    _comp_obj_heading_.heading_lev_markup    = (!(lev_markup_number.empty) ? to!int(lev_markup_number) : 0);
+    _comp_obj_heading_.heading_lev_collapsed = (!(lev_collapsed_number.empty) ? to!int(lev_collapsed_number) : 0);
+    _comp_obj_heading_.parent_ocn            = p_["obj_cite_number"];
+    _comp_obj_heading_.parent_lev_markup     = p_["lev_markup_number"];
+    _comp_obj_heading_.ptr_doc_object        = cntr_;
+    _comp_obj_heading_.ptr_html_segnames     = ((lev_markup_number == "4") ? html_segnames_ptr : 0);
+    _comp_obj_heading_.ptr_heading           = ptr_;
     debug(node) {
       if (match(lev_markup_number, rgx.levels_numbered_headings)) {
         writeln("* ", to!string(_node));
@@ -4969,44 +4739,37 @@ struct NodeStructureMetadata {
         writeln("* ", to!string(_node));
       }
     }
-    assert(_node_heading_int["parent_lev_markup"] <= 7);
-    assert(_node_heading_int["parent_ocn"] >= 0);
+    assert(_comp_obj_heading_.parent_lev_markup <= 7);
+    assert(_comp_obj_heading_.parent_ocn >= 0);
     if (match(lev_markup_number, rgx.levels_numbered_headings)) {
-      assert(_node_heading_int["heading_lev_markup"] <= 7);         // issues
-      assert(to!int(_node_heading_str["ocn"]) >= 0);
-      if (_node_heading_int["parent_lev_markup"] > 0) {
-        assert(_node_heading_int["parent_lev_markup"] < _node_heading_int["heading_lev_markup"]);
-        if (to!int(_node_heading_str["ocn"]) != 0) {
-          assert(_node_heading_int["parent_ocn"] < to!int(_node_heading_str["ocn"]));
+      assert(_comp_obj_heading_.heading_lev_markup <= 7);
+      assert(_comp_obj_heading_.ocn >= 0);
+      if (_comp_obj_heading_.parent_lev_markup > 0) {
+        assert(_comp_obj_heading_.parent_lev_markup < _comp_obj_heading_.heading_lev_markup);
+        if (_comp_obj_heading_.ocn != 0) {
+          assert(_comp_obj_heading_.parent_ocn < _comp_obj_heading_.ocn);
         }
       }
-      if (_node_heading_int["heading_lev_markup"] == 0) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_sect_A);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_sect_B) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_sect_A);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_sect_C) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_sect_B);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_sect_D) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_sect_C);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_text_1) {
-        assert(_node_heading_int["parent_lev_markup"] <= DocStructMarkupHeading.h_sect_D);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_text_2) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_text_1);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_text_3) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_text_2);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_text_4) {
-        assert(_node_heading_int["parent_lev_markup"] == DocStructMarkupHeading.h_text_3);
-      } else if  (_node_heading_int["heading_lev_markup"] == DocStructMarkupHeading.h_text_5) {
-        // // writeln(to!int(_node_heading_int["parent_lev_markup"]));
-        // // assert(to!int(_node_heading_int["parent_lev_markup"]) >= 4);
-        // // assert(to!int(_node_heading_int["parent_lev_markup"]) <= 7);
+      if (_comp_obj_heading_.heading_lev_markup == 0) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_sect_A);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_sect_B) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_sect_A);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_sect_C) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_sect_B);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_sect_D) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_sect_C);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_text_1) {
+        assert(_comp_obj_heading_.parent_lev_markup <= DocStructMarkupHeading.h_sect_D);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_text_2) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_text_1);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_text_3) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_text_2);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_text_4) {
+        assert(_comp_obj_heading_.parent_lev_markup == DocStructMarkupHeading.h_text_3);
+      } else if  (_comp_obj_heading_.heading_lev_markup == DocStructMarkupHeading.h_text_5) {
       }
     }
-    auto t = tuple(
-      _node_heading_str,
-      _node_heading_int,
-    );
-    return t;
+    return _comp_obj_heading_;
   }
   invariant() {
   }
@@ -5026,7 +4789,7 @@ struct NodeStructureMetadata {
 #+BEGIN_SRC d
 auto assertions_doc_structure(
   string[string] an_object,
-  int[string] lv
+  int[string]    lv
 ) {
   if (lv["h3"] > State.off) {
     assert(lv["h0"] > State.off);
@@ -5240,66 +5003,12 @@ set abstracted objects for downstream processing
 #+BEGIN_SRC d
 struct HeadingAttrib {
   string lev                            = "9";
-  int    lev_int_markup                 = 9;
-  int    lev_int_collapsed              = 9;
-  int[]  closes_lev_collapsed           = []; // TODO track
-  int[]  closes_lev_markup              = []; // TODO track
-  int    array_ptr                  = 0;
-// heading segments, 1~ lev4:
-  int    heading_array_ptr_segments = 0; // TODO
-}
-#+END_SRC
-
-*** paragraph attribute
-
-#+name: ao_structs_init
-#+BEGIN_SRC d
-struct ParaAttrib {
-  int indent_start            = 0;
-  int indent_rest             = 0;
-  bool bullet                 = false;
-}
-#+END_SRC
-
-*** block attribute
-
-#+name: ao_structs_init
-#+BEGIN_SRC d
-struct BlockAttrib {
-  string syntax               = "";
-}
-#+END_SRC
-
-*** comment attribute
-
-#+name: ao_structs_init
-#+BEGIN_SRC d
-struct Comment {
-  // no .attrib and no .obj_cite_number
-}
-#+END_SRC
-
-*** TODO node
-
-#+name: ao_structs_init
-#+BEGIN_SRC d
-struct Node {
-  int ocn                            = 0;
-  string seg_anchor_tag              = "";
-// parent
-  int parent_lev_int_markup          = 0;
-  int parent_ocn                     = 0;
-  int[] ancestors                    = []; // TODO track
-// heading:
-  int heading_lev_int_markup         = 0;
-  int heading_lev_int_collapsed      = 0;
-  int[] heading_closes_lev_collapsed = []; // TODO track
-  int[] heading_closes_lev_markup    = []; // TODO track
-  int heading_array_ptr          = 0;
-// heading segments, 1~ lev4:
-  int heading_array_ptr_segments = 0; // TODO
-// node info json string:
-  string[string][string] node;
+  int    heading_lev_markup             = 9;
+  int    heading_lev_collapsed          = 9;
+  int[]  closes_lev_collapsed           = [];
+  int[]  closes_lev_markup              = [];
+  int    array_ptr                      = 0;
+  int    heading_array_ptr_segments     = 0;
 }
 #+END_SRC
 
@@ -5307,202 +5016,46 @@ struct Node {
 
 #+name: ao_structs_init
 #+BEGIN_SRC d
-struct ObjComposite {
-  string use                  = "";
-  string of                   = "";
-  string is_a                 = "";
-  string object               = "";
-  string obj_cite_number      = "";  // not used for calculations? output only? else int
-  string[] anchor_tags        = [];
-  HeadingAttrib heading_attrib;
-  ParaAttrib para_attrib;
-  BlockAttrib block_attrib;
-  Node node_structure;
+struct ObjGenericComposite {
+  // size_t id;
+  string                 use                          = "";
+  string                 of                           = "";
+  string                 is_a                         = "";
+  string                 text                         = "";
+  string                 obj_cite_number              = "";
+  string[]               anchor_tags                  = [];
+  string                 marked_up_level              = "9";
+  int[]                  closes_lev_collapsed         = [];
+  int[]                  closes_lev_markup            = [];
+  int                    indent_base                  = 0;
+  int                    indent_hang                  = 0;
+  bool                   bullet                       = false;
+  string                 syntax                       = "";
+  int                    ocn                          = 0;
+  string                 segment_anchor_tag           = "";
+  int                    parent_lev_markup            = 0;
+  int                    parent_ocn                   = 0;
+  int[]                  ancestors                    = [];
+  int                    heading_lev_markup           = 9;
+  int                    heading_lev_collapsed        = 9;
+  int[]                  heading_closes_lev_collapsed = [];
+  int[]                  heading_closes_lev_markup    = [];
+  int                    heading_array_ptr            = 0;
+  int                    ptr_doc_object               = 0;
+  int                    ptr_html_segnames            = 0;
+  int                    ptr_heading                  = 0;
+  int                    array_ptr                    = 0;
+  int                    heading_array_ptr_segments   = 0;
+  string[string][string] node;
 }
 #+END_SRC
 
-*** object composite array
+*** The Objects: generic composite object array
 
 #+name: ao_structs_init
 #+BEGIN_SRC d
-struct ObjCompositeArr {
-  ObjComposite[] oca;
-}
-#+END_SRC
-
-** object setter                                                        :set:
-*** comment                                                         :comment:
-
-#+name: ao_object_setter_comment
-#+BEGIN_SRC d
-auto contents_comment(in string object) {
-  ObjComposite object_set;
-  object_set.use                  = "comment";
-  object_set.of                   = "comment";
-  object_set.is_a                 = "comment";
-  object_set.object               = object;
-  return object_set;
-}
-#+END_SRC
-
-*** heading                                                         :heading:
-
-#+name: ao_object_setter_heading
-#+BEGIN_SRC d
-auto contents_heading(
-  in string         object,
-  in string[string] _node_heading_str,
-  in int[string]    _node_heading_int,
-  in string[]       tags,
-) {
-  ObjComposite object_set;
-  object_set.use                                 = "content";
-  object_set.of                                  = "para";
-  object_set.is_a                                = "heading";
-  object_set.object                              = object.strip;
-  object_set.obj_cite_number                     = _node_heading_str["ocn"];
-  object_set.anchor_tags                         ~= tags;
-  object_set.heading_attrib.lev                  = _node_heading_str["marked_up_lev"];
-  object_set.heading_attrib.lev_int_markup       = _node_heading_int["heading_lev_markup"];
-  object_set.heading_attrib.lev_int_collapsed    = _node_heading_int["heading_lev_collapsed"];
-  return object_set;
-}
-#+END_SRC
-
-*** para                                                               :para:
-
-#+name: ao_object_setter_para
-#+BEGIN_SRC d
-auto contents_para(
-  in string         object,
-  in string[string] _node_para_str,
-  in int[string]    _node_para_int,
-) {
-  ObjComposite object_set;
-  object_set.use                      = "content";
-  object_set.of                       = "para";
-  object_set.is_a                     = "para";
-  object_set.object                   = object.strip;
-  object_set.obj_cite_number          = (_node_para_int["ocn"]==0) ? "" : to!string(_node_para_int["ocn"]);
-  object_set.anchor_tags              = [];
-  object_set.para_attrib.indent_start = _node_para_int["indent_hang"];
-  object_set.para_attrib.indent_rest  = _node_para_int["indent_base"];
-  object_set.para_attrib.bullet       = (_node_para_int["bullet"] == 1) ? true : false;
-  return object_set;
-}
-#+END_SRC
-
-*** toc                                                               :para:
-
-#+name: ao_object_setter_para
-#+BEGIN_SRC d
-auto contents_toc(
-  in string is_a,
-  in string object,
-  in string attrib,
-  in int obj_cite_number,
-  in int[string] indent,
-  in bool bullet,
-) {
-  ObjComposite object_set;
-  object_set.use                      = "content";
-  object_set.of                       = "para";
-  object_set.is_a                     = "toc";
-  object_set.object                   = object.strip;
-  object_set.obj_cite_number          = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
-  object_set.para_attrib.indent_start = to!int(indent["hang_position"]);
-  object_set.para_attrib.indent_rest  = to!int(indent["base_position"]);
-  object_set.para_attrib.bullet       = false; // bullet;
-  return object_set;
-}
-#+END_SRC
-
-*** para_endnote                                                       :para:
-
-#+name: ao_object_setter_endnote
-#+BEGIN_SRC d
-auto contents_endnote(
-  in string object,
-  in string tag,
-) {
-  auto m = (matchFirst(object, rgx.note_ref));
-  string notenumber = to!string(m.captures[1]);
-  string anchor_tag = "note_" ~ notenumber;
-  ObjComposite object_set;
-  object_set.use                      = "content";
-  object_set.of                       = "para";
-  object_set.is_a                     = "endnote";
-  object_set.object                   = object.strip;
-  object_set.obj_cite_number          = "";
-  object_set.anchor_tags              ~= [ tag ];
-  object_set.para_attrib.indent_start = 0;
-  object_set.para_attrib.indent_rest  = 0;
-  object_set.para_attrib.bullet       = false;
-  return object_set;
-}
-#+END_SRC
-
-*** block                                                             :block:
-
-#+name: ao_object_setter_block
-#+BEGIN_SRC d
-auto contents_block(
-  in string type_is,
-  in string object,
-  in string attrib,
-  in int obj_cite_number,
-) {
-  ObjComposite object_set;
-  object_set.use                 = "content";
-  object_set.of                  = "block";
-  object_set.is_a                = type_is;
-  object_set.object              = object;
-  object_set.obj_cite_number     = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
-  object_set.anchor_tags         = [];
-  return object_set;
-}
-#+END_SRC
-
-*** block code                                                   :block:code:
-
-#+name: ao_object_setter_block_code
-#+BEGIN_SRC d
-auto contents_block_code(
-  in string type_is,
-  in string object,
-  in string attrib_language_syntax,
-  in int obj_cite_number,
-) {
-  ObjComposite object_set;
-  object_set.use                 = "content";
-  object_set.of                  = "block";
-  object_set.is_a                = type_is;
-  object_set.block_attrib.syntax = attrib_language_syntax;
-  object_set.object              = object;
-  object_set.obj_cite_number     = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
-  object_set.anchor_tags         = [];
-  return object_set;
-}
-#+END_SRC
-
-*** block obj_cite_number string                                      :block:
-
-#+name: ao_object_setter_block_obj_cite_number_string
-#+BEGIN_SRC d
-auto contents_block_obj_cite_number_string(
-  in string         type_is,
-  in string         object,
-  in string         obj_cite_number,
-  in string[string] _node_str,
-  in int[string]    _node_int,
-) {
-  ObjComposite object_set;
-  object_set.use                               = "content";
-  object_set.of                                = "block";
-  object_set.is_a                              = type_is;
-  object_set.object                            = object;
-  object_set.obj_cite_number                   = obj_cite_number;
-  return object_set;
+struct TheObjects {
+  ObjGenericComposite[] oca;
 }
 #+END_SRC
 
diff --git a/org/ao_conf_make_meta.org b/org/ao_conf_make_meta.org
index bf39340..94236e7 100644
--- a/org/ao_conf_make_meta.org
+++ b/org/ao_conf_make_meta.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. Code Outline / Structure (tangles)                              :tangle:
+* 0. Code Skeleton / Outline / Structure (tangles)                   :tangle:
 ** 1. Header Hub                                 :ao_markup_header_extract:
 
 #+BEGIN_SRC d :tangle ../src/sdp/ao_conf_make_meta.d
diff --git a/org/ao_defaults.org b/org/ao_defaults.org
index 26f8ae8..2aad14e 100644
--- a/org/ao_defaults.org
+++ b/org/ao_defaults.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. Code Outline / Structure (tangles)                              :tangle:
+* 0. Code Skeleton / Outline / Structure (tangles)                   :tangle:
 ** 1. defaults:                                              :ao_defaults.d:
 
 #+name: tangle_ao_defaults
diff --git a/org/ao_output_debugs.org b/org/ao_output_debugs.org
index bea972e..28fcef2 100644
--- a/org/ao_output_debugs.org
+++ b/org/ao_output_debugs.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. Code Outline / Structure (tangles)                              :tangle:
+* 0. Code Skeleton / Outline / Structure (tangles)                   :tangle:
 ** code structure:                                          :ao_output_debugs.d:
 
 #+name: tangle_ao_output_debugs
@@ -74,8 +74,8 @@ debug(parent) {
             "%s node: %s heading: %s %s",
             obj.obj_cite_number,
             obj.node,
-            obj.lev_int_markup,
-            obj.object,
+            obj.heading_lev_markup,
+            obj.text,
           );
         }
       }
@@ -101,7 +101,7 @@ debug(dumpdoc) {
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -120,11 +120,11 @@ void out_toc(S)(
   if (contents[key].length > 1) {
     string indent_spaces;
     foreach (obj; contents[key]) {
-      indent_spaces=markup.indent_by_spaces_provided(obj.para_attrib.indent_start);
+      indent_spaces=markup.indent_by_spaces_provided(obj.indent_hang);
       writefln(
         "%s%s",
         indent_spaces,
-        obj.object
+        obj.text
       );
     }
   }
@@ -144,7 +144,7 @@ void out_endnotes(S)(
       writefln(
         "[%s]\n%s",
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -165,7 +165,7 @@ void out_bookindex(S)(
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -185,7 +185,7 @@ debug(section_head) {
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -235,7 +235,7 @@ debug(section_body) {
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -286,7 +286,7 @@ debug(section_glossary) {
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -305,7 +305,7 @@ debug(section_bibliography) {
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -356,7 +356,7 @@ debug(blurb_section) {
         "[%s][%s]\n%s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -381,7 +381,7 @@ debug(objects) {
         "* [%s][%s] %s",
         obj.obj_cite_number,
         obj.is_a,
-        obj.object
+        obj.text
       );
     }
   }
@@ -564,11 +564,11 @@ debug(anchor) {
       if (obj.is_a == "heading") {
         writefln(
           "%s~ [%s] %s %s",
-          obj.heading_attrib.lev,
+          obj.marked_up_level,
           obj.obj_cite_number,
           obj.anchor_tags,
           // "[", obj["is"], "] ",
-          obj.object
+          obj.text
         );
       }
     }
@@ -581,48 +581,15 @@ debug(anchor) {
 #+name: ao_output_debugs
 #+BEGIN_SRC d
 debug(heading) {                         // heading
-  string spc;
   foreach (k; document_section_keys_sequenced["seg"]) {
     foreach (o; contents[k]) {
       if (o.is_a == "heading") {
-        switch (o.heading_attrib.lev_int_markup) {
-        case 0:
-          spc="";
-          break;
-        case 1:
-          spc="  ";
-          break;
-        case 2:
-          spc="    ";
-          break;
-        case 3:
-          spc="      ";
-          break;
-        case 4:
-          spc="        ";
-          break;
-        case 5:
-          spc="          ";
-          break;
-        case 6:
-          spc="            ";
-          break;
-        case 7:
-          spc="              ";
-          break;
-        case 8:
-          spc="                ";
-          break;
-        default:
-          spc="";
-          break;
-        }
         writefln(
           "%s* %s\n                (markup level: %s; collapsed level: %s)",
-          spc,
-          strip(o.object),
-          o.heading_attrib.lev_int_markup,
-          o.heading_attrib.lev_int_collapsed
+          replicate("  ", o.heading_lev_markup),
+          strip(o.text),
+          o.heading_lev_markup,
+          o.heading_lev_collapsed,
         );
       }
     }
@@ -646,10 +613,10 @@ debug(headings) {
       if (obj.is_a == "heading") {
         writefln(
           "%s~ [%s] %s",
-          obj.heading_attrib.lev,
+          obj.marked_up_level,
           obj.obj_cite_number,
           // "[", obj["is"], "] ",
-          obj.object
+          obj.text
         );
       }
     }
diff --git a/org/ao_read_source_files.org b/org/ao_read_source_files.org
index 3a72106..05e15eb 100644
--- a/org/ao_read_source_files.org
+++ b/org/ao_read_source_files.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. Code Outline / Structure (tangles)                              :tangle:
+* 0. Code Skeleton / Outline / Structure (tangles)                   :tangle:
 ** 1. config files (conf.sdl & sisu_document_make)          :ao_config_files:
 *** config files, read in
 
@@ -525,58 +525,6 @@ debug(insert) {                              // insert file
 return contents;
 #+END_SRC
 
-** config files (conf.sdl & sisu_document_make)             :ao_config_files:
-
-*** config files, read in
-
-#+BEGIN_SRC d :tangle ../src/sdp/ao_read_config_files.d
-/++
-  read configuration files<BR>
-  - read config files<BR>
-  ao_config_files.d
-+/
-template SiSUconfigIn() {
-  private import
-    std.exception,
-    std.stdio,
-    std.utf,
-    std.conv : to;
-  private
-  struct ConfigIn {
-    private import std.file;
-    <<ao_config_file_in>>
-  }
-}
-#+END_SRC
-
-*** config files get sdlang root tag
-
-#+BEGIN_SRC d :tangle ../src/sdp/ao_read_config_files.d
-/+
-
-+/
-template SiSUconfigSDLang() {
-  struct ConfigSDLangRootTag {
-    <<ao_config_file_sdlang>>
-  }
-}
-#+END_SRC
-
-*** config files hub
-
-#+BEGIN_SRC d :tangle ../src/sdp/ao_read_config_files.d
-/+
-
-+/
-template SiSUconfigSDLangHub() {
-  mixin SiSUconfigIn;
-  mixin SiSUconfigSDLang;
-  struct ConfigHub {
-    <<ao_config_file_sdlang_hub>>
-  }
-}
-#+END_SRC
-
 * figure out
 ** break up file here to sisu markup content and header
 
diff --git a/org/compile_time_info.org b/org/compile_time_info.org
index ee143eb..4e7e3da 100644
--- a/org/compile_time_info.org
+++ b/org/compile_time_info.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/]]
-* Code Outline / Structure (tangles)                                 :tangle:
+* Code Skeleton / Outline / Structure (tangles)                      :tangle:
 ** compile_time_info:                                                      :compile_time_info.d:
 
 #+begin_src d  :tangle ../src/sdp/compile_time_info.d
diff --git a/org/output.org b/org/output.org
index 0bad148..976fcdd 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/]]
-* Code Outline / Structure (tangles)                                 :tangle:
+* Code Skeleton / Outline / Structure (tangles)                      :tangle:
 ** output hub template file [#A]
 
 #+BEGIN_SRC d :tangle ../src/sdp/output_hub.d
@@ -126,13 +126,13 @@ auto html_heading(O)(
   </div>¶",
   obj.obj_cite_number,
   obj.obj_cite_number,
-  obj.heading_attrib.lev_int_markup,
+  obj.heading_lev_markup,
   obj.is_a,
   obj.obj_cite_number,
   obj.obj_cite_number,
   tags,
-  obj.object,
-  obj.heading_attrib.lev_int_markup
+  obj.text,
+  obj.heading_lev_markup,
   );
   return o;
 }
@@ -157,10 +157,10 @@ auto html_para(O)(
       obj.obj_cite_number,
       obj.obj_cite_number,
       obj.is_a,
-      obj.para_attrib.indent_start,
-      obj.para_attrib.indent_rest,
+      obj.indent_hang,
+      obj.indent_base,
       tags,
-      obj.object
+      obj.text
     );
   } else {
     o = format(q"¶  <div class="substance">
@@ -172,11 +172,11 @@ auto html_para(O)(
       obj.obj_cite_number,
       obj.obj_cite_number,
       obj.is_a,
-      obj.para_attrib.indent_start,
-      obj.para_attrib.indent_rest,
+      obj.indent_hang,
+      obj.indent_base,
       obj.obj_cite_number,
       tags,
-      obj.object
+      obj.text
     );
   }
   return o;
@@ -201,7 +201,7 @@ auto html_nugget(O)(
   obj.obj_cite_number,
   obj.is_a,
   obj.obj_cite_number,
-  obj.object
+  obj.text
   );
   return o;
 }
@@ -258,9 +258,9 @@ auto html_toc(O)(
   </p>
 </div>¶",
   obj.is_a,
-  obj.para_attrib.indent_start,
-  obj.para_attrib.indent_rest,
-  obj.object
+  obj.indent_hang,
+  obj.indent_base,
+  obj.text
   );
   return o;
 }
@@ -278,9 +278,9 @@ auto html_endnote(O)(
   %s
 </p>¶",
     obj.is_a,
-    obj.para_attrib.indent_start,
-    obj.para_attrib.indent_rest,
-    obj.object
+    obj.indent_hang,
+    obj.indent_base,
+    obj.text
   );
   return o;
 }
diff --git a/org/sdp.org b/org/sdp.org
index e359c65..274c285 100644
--- a/org/sdp.org
+++ b/org/sdp.org
@@ -13,7 +13,7 @@
 #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)
 
 [[../maker.org][maker.org makefile]]  [[./][org/]]
-* 0. Code Outline / Structure (tangles)                      :tangle:
+* 0. Code Skeleton / Outline / Structure (tangles)                   :tangle:
 ** TODO version.txt: set version (sisu document parser)             :version:
 
 #+NAME: version_txt
@@ -24,7 +24,7 @@ struct Version {
   int minor;
   int patch;
 }
-enum ver = Version(0, 9, 6);
+enum ver = Version(0, 10, 0);
 #+END_SRC
 
 ** TODO sdp src/sdp.d                                               :sdp.d:
@@ -286,6 +286,7 @@ bool[string] opt_action_bool = [
   "section_bookindex"  : true,
   "section_blurb"      : true,
   "backmatter"         : true,
+  "skip_output"        : false,
 ];
 auto helpInfo = getopt(args,
   std.getopt.config.passThrough,
@@ -320,6 +321,7 @@ auto helpInfo = getopt(args,
   "section-bookindex",  "--section-bookindex process document bookindex (default)",   &opt_action_bool["section_bookindex"],
   "section-blurb",      "--section-blurb process document blurb (default)",           &opt_action_bool["section_blurb"],
   "backmatter",         "--section-backmatter process document backmatter (default)", &opt_action_bool["backmatter"],
+  "skip_output",        "--skip-output",                                              &opt_action_bool["skip_output"],
 );
 if (helpInfo.helpWanted) {
   defaultGetoptPrinter("Some information about the program.", helpInfo.options);
@@ -498,15 +500,17 @@ debug(checkdoc) {
 #+NAME: sdp_each_file_do_selected_output
 #+BEGIN_SRC d
 /+ ↓ output hub +/
-output.hub(
-  doc_ao_contents,
-  document_section_keys_sequenced,
-  doc_html_segnames,
-  dochead_make,
-  dochead_meta,
-  fn_src,
-  opt_action_bool
-);
+if (!(opt_action_bool["skip_output"])) {
+  output.hub(
+    doc_ao_contents,
+    document_section_keys_sequenced,
+    doc_html_segnames,
+    dochead_make,
+    dochead_meta,
+    fn_src,
+    opt_action_bool
+  );
+}
 #+END_SRC
 
 **** scope (on loop exit)                                        :scope:exit:
-- 
cgit v1.2.3