From f07892081b81ada7c03d90e9f89a00df0866ca30 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Tue, 25 Jul 2017 04:25:16 -0400
Subject: meta_abstraction, work on ocn

---
 org/meta_abstraction.org        | 331 +++++++++++++++++++++++-----------------
 org/sdp.org                     |  66 ++++----
 src/sdp/meta/metadoc_from_src.d | 328 ++++++++++++++++++++++-----------------
 src/sdp/meta/object_setter.d    |   3 +
 4 files changed, 417 insertions(+), 311 deletions(-)

diff --git a/org/meta_abstraction.org b/org/meta_abstraction.org
index e3b7b5f..1ddec75 100644
--- a/org/meta_abstraction.org
+++ b/org/meta_abstraction.org
@@ -198,6 +198,8 @@ enum DocStructMarkupHeading {
   h_text_5, // extra level, drop
   content_non_header
 } // header section A-D; header text 1-4
+enum OCNstatus { inc, exc, bkidx, closing, reset, }
+enum OCNtype { ocn, non, bkidx, }
 /+ biblio variables +/
 string biblio_tag_name, biblio_tag_entry, st;
 string[] biblio_arr_json;
@@ -218,7 +220,7 @@ string content_non_header = "8";
 static auto obj_im = ObjInlineMarkup();
 static auto obj_att = ObjAttributes();
 /+ ocn +/
-int obj_cite_number, obj_cite_number_;
+int obj_cite_digit, obj_cite_digit_, obj_cite_digit_bkidx;
 auto object_citation_number = OCNemitter();
 int[] dom_markedup = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
 int[] dom_markedup_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
@@ -684,7 +686,7 @@ if there is a glossary section you need to:
       comp_obj_para.bullet                = bullet;
       the_glossary_section                ~= comp_obj_para;
     }
-    obj_type_status["ocn_status"] = TriState.off;
+    obj_type_status["ocn_status"] = OCNstatus.inc;
   }
   continue;
 #+END_SRC
@@ -790,7 +792,7 @@ if there is a blurb section you need to:
       comp_obj_para.bullet                = bullet;
       the_blurb_section                   ~= comp_obj_para;
     }
-    obj_type_status["ocn_status"] = TriState.off;
+    obj_type_status["ocn_status"] = OCNstatus.inc;
   }
   continue;
 #+END_SRC
@@ -878,7 +880,7 @@ if (line.matchFirst(rgx.block_poem_open)) {
   /+ poem to verse exceptions! +/
   object_reset(an_object);
   processing.remove("verse");
-  obj_cite_number_poem["start"] = obj_cite_number.to!string;
+  obj_cite_number_poem["start"] = obj_cite_digit.to!string;
 }
 _start_block_(line, obj_type_status, obj_cite_number_poem);
 continue;
@@ -1031,7 +1033,7 @@ _block_flag_line_empty_(
   an_object,
   the_document_body_section,
   bookindex_unordered_hashes,
-  obj_cite_number,
+  obj_cite_digit,
   comp_obj_heading,
   cntr,
   obj_type_status,
@@ -1063,9 +1065,9 @@ assert(
 if ((obj_type_status["heading"] == State.on)
 && (line_occur["heading"] > State.off)) {
   /+ heading object (current line empty) +/
-  obj_cite_number = (an_object["lev_markup_number"].to!int == 0)
-  ? (ocn_emit(3))
-  : (obj_cite_number = ocn_emit(obj_type_status["ocn_status"]));
+  obj_cite_digit = (an_object["lev_markup_number"].to!int == 0)
+  ? (ocn_emit(OCNstatus.reset))
+  : (obj_cite_digit = ocn_emit(obj_type_status["ocn_status"]));
   an_object["is"] = "heading";
   an_object_key="body_nugget";
   auto substantive_object_and_anchor_tags_tuple =
@@ -1078,7 +1080,7 @@ if ((obj_type_status["heading"] == State.on)
     anchor_tag_ = anchor_tags[0];
   } else if (an_object["lev_markup_number"].to!int > 4) {
     segment_anchor_tag_that_object_belongs_to = anchor_tag_;
-    segment_anchor_tag_that_object_belongs_to_uri = anchor_tag_ ~ ".fnSuffix#" ~ obj_cite_number.to!string;
+    segment_anchor_tag_that_object_belongs_to_uri = anchor_tag_ ~ ".fnSuffix#" ~ obj_cite_digit.to!string;
   } else if (an_object["lev_markup_number"].to!int < 4) {
   string segn;
     switch (an_object["lev_markup_number"].to!int) {
@@ -1106,9 +1108,9 @@ if ((obj_type_status["heading"] == State.on)
   an_object["bookindex_nugget"] =
     ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
   bookindex_unordered_hashes =
-    bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_number, segment_anchor_tag_that_object_belongs_to);
+    bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_digit, segment_anchor_tag_that_object_belongs_to);
   /+ (incrementally build toc) table of contents here! +/
-  _anchor_tag=to!string(obj_cite_number);
+  _anchor_tag=to!string(obj_cite_digit);
   the_table_of_contents_section = obj_im.table_of_contents_gather_headings(
     an_object,
     dochead_make_aa,
@@ -1129,7 +1131,7 @@ if ((obj_type_status["heading"] == State.on)
       an_object["lev_markup_number"],               // string
       an_object["lev_collapsed_number"],            // string
       segment_anchor_tag_that_object_belongs_to,    // string
-      obj_cite_number,                              // int
+      obj_cite_digit,                               // int
       cntr,                                         // int
       heading_ptr,                                  // int
       lv_ancestors_txt,                             // string[]
@@ -1162,17 +1164,17 @@ if ((obj_type_status["heading"] == State.on)
 } else if ((obj_type_status["para"] == State.on)
 && (line_occur["para"] > State.off)) {
   /+ paragraph object (current line empty) +/
-  obj_cite_number = ocn_emit(obj_type_status["ocn_status"]);
+  obj_cite_digit = ocn_emit(obj_type_status["ocn_status"]);
   an_object["bookindex_nugget"] =
     ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
   bookindex_unordered_hashes =
-    bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_number, segment_anchor_tag_that_object_belongs_to);
+    bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_digit, segment_anchor_tag_that_object_belongs_to);
   an_object["is"] = "para";
   auto comp_obj_heading =
     node_construct.node_location_emitter(
       content_non_header,
       segment_anchor_tag_that_object_belongs_to,
-      obj_cite_number,
+      obj_cite_digit,
       cntr,
       heading_ptr-1,
       an_object["is"],
@@ -1187,8 +1189,8 @@ if ((obj_type_status["heading"] == State.on)
   comp_obj_para.is_of                 = "para";
   comp_obj_para.is_a                  = "para";
   comp_obj_para.text                  = an_object["substantive"].to!string.strip;
-  comp_obj_para.ocn                   = obj_cite_number;
-  comp_obj_para.obj_cite_number       = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+  comp_obj_para.ocn                   = obj_cite_digit;
+  comp_obj_para.obj_cite_number       = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
   comp_obj_para.indent_hang           = indent["hang_position"];
   comp_obj_para.indent_base           = indent["base_position"];
   comp_obj_para.bullet                = bullet;
@@ -1242,7 +1244,7 @@ if (the_document_body_section.length > 0) {
             note_section.gather_notes_for_endnote_section(
               the_document_body_section,
               segment_anchor_tag_that_object_belongs_to,
-              to!int(i),
+              (i).to!int,
             );
           }
         }
@@ -1257,7 +1259,7 @@ if (the_document_body_section.length > 0) {
         note_section.gather_notes_for_endnote_section(
           the_document_body_section,
           segment_anchor_tag_that_object_belongs_to,
-          to!int(the_document_body_section.length-1),
+          (the_document_body_section.length-1).to!int,
         );
       }
     }
@@ -1284,10 +1286,10 @@ if (the_document_body_section.length > 0) {
 #+name: abs_post
 #+BEGIN_SRC d
 auto en_tuple =
-  note_section.endnote_objects(obj_cite_number, opt_action);
+  note_section.endnote_objects(obj_cite_digit, opt_action);
 static assert(!isTypeTuple!(en_tuple));
 auto the_endnotes_section = en_tuple[0];
-obj_cite_number = en_tuple[1];
+obj_cite_digit = en_tuple[1];
 debug(endnotes) {
   writefln(
     "%s %s",
@@ -1476,13 +1478,13 @@ auto bi = BookIndexReportSection();
 auto bi_tuple =
   bi.bookindex_build_abstraction_section(
     bookindex_unordered_hashes,
-    obj_cite_number,
+    obj_cite_digit,
     opt_action,
   );
 destroy(bookindex_unordered_hashes);
 static assert(!isTypeTuple!(bi_tuple));
 auto the_bookindex_section = bi_tuple[0];
-obj_cite_number = bi_tuple[1];
+obj_cite_digit = bi_tuple[1];
 debug(bookindex) {
   foreach (bi_entry; the_bookindex_section["seg"]) {
     writeln(bi_entry);
@@ -1997,6 +1999,9 @@ if (the_glossary_section.length > 1) {
       debug(dom) {
         writeln(obj.text);
       }
+      obj_cite_digit = ocn_emit(OCNstatus.inc);
+      obj.ocn = obj_cite_digit;
+      obj.obj_cite_number = obj_cite_digit.to!string;
       if (obj.heading_lev_markup <= 4) {
         segnames_0_4 ~= obj.segment_anchor_tag;
         if (obj.heading_lev_markup == 4) {
@@ -2018,6 +2023,10 @@ if (the_glossary_section.length > 1) {
         obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
       }
       obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+    } else if (obj.is_a == "glossary") {
+      obj_cite_digit = ocn_emit(OCNstatus.inc);
+      obj.ocn = obj_cite_digit;
+      obj.obj_cite_number = obj_cite_digit.to!string;
     }
   }
 }
@@ -2034,6 +2043,9 @@ if (the_bibliography_section.length > 1) {
       debug(dom) {
         writeln(obj.text);
       }
+      obj_cite_digit = ocn_emit(OCNstatus.inc);
+      obj.ocn = obj_cite_digit;
+      obj.obj_cite_number = obj_cite_digit.to!string;
       if (obj.heading_lev_markup <= 4) {
         segnames_0_4 ~= obj.segment_anchor_tag;
         if (obj.heading_lev_markup == 4) {
@@ -2055,6 +2067,10 @@ if (the_bibliography_section.length > 1) {
         obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
       }
       obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+    } else if (obj.is_a == "bibliography") {
+      obj_cite_digit = ocn_emit(OCNstatus.inc);
+      obj.ocn = obj_cite_digit;
+      obj.obj_cite_number = obj_cite_digit.to!string;
     }
   }
 }
@@ -2065,6 +2081,9 @@ if (the_bibliography_section.length > 1) {
 #+name: abs_post
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
+int ocn_ = obj_cite_digit;
+int ocn_bkidx_ = 0;
+int ocn_bidx_;
 if (the_bookindex_section["scroll"].length > 1) {
   /+ scroll +/
   dom_markedup_buffer = dom_markedup.dup;
@@ -2073,6 +2092,9 @@ if (the_bookindex_section["scroll"].length > 1) {
     if (obj.is_a == "heading") {
       debug(dom) {
       }
+      obj_cite_digit = ocn_emit(OCNstatus.inc);
+      obj.ocn = obj_cite_digit;
+      obj.obj_cite_number = obj_cite_digit.to!string;
       if (obj.heading_lev_markup <= 4) {
         segnames_0_4 ~= obj.segment_anchor_tag;
         if (obj.heading_lev_markup == 4) {
@@ -2094,6 +2116,10 @@ if (the_bookindex_section["scroll"].length > 1) {
         obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
       }
       obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+    } else if (obj.is_a == "bookindex") {
+      obj_cite_digit_bkidx = ocn_emit(OCNstatus.bkidx);
+      obj.obj_cite_number_bkidx = obj_cite_digit_bkidx.to!string; // FIX need to distinguish from regular ocn
+      obj.obj_cite_number_type = OCNtype.bkidx;
     }
   }
   /+ seg +/
@@ -2104,6 +2130,8 @@ if (the_bookindex_section["scroll"].length > 1) {
       debug(dom) {
         writeln(obj.text);
       }
+      obj.ocn = ++ocn_;
+      obj.obj_cite_number = obj.ocn.to!string;
       if (obj.heading_lev_markup <= 4) {
         segnames_0_4 ~= obj.segment_anchor_tag;
         if (obj.heading_lev_markup == 4) {
@@ -2125,8 +2153,14 @@ if (the_bookindex_section["scroll"].length > 1) {
         obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
       }
       obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+    } else if (obj.is_a == "bookindex") {
+      ocn_bidx_ = ++ocn_bkidx_;
+      obj.obj_cite_number_bkidx = ocn_bidx_.to!string; // FIX need to distinguish from regular ocn
+      obj.obj_cite_number_type = OCNtype.bkidx;
     }
   }
+  assert(obj_cite_digit == ocn_);
+  assert(obj_cite_digit_bkidx == ocn_bidx_);
 }
 #+END_SRC
 
@@ -2141,6 +2175,9 @@ if (the_blurb_section.length > 1) {
       debug(dom) {
         writeln(obj.text);
       }
+      obj_cite_digit = ocn_emit(OCNstatus.inc);
+      obj.ocn = obj_cite_digit;
+      obj.obj_cite_number = obj_cite_digit.to!string;
       if (obj.heading_lev_markup <= 4) {
         segnames_0_4 ~= obj.segment_anchor_tag;
         if (obj.heading_lev_markup == 4) {
@@ -2162,6 +2199,10 @@ if (the_blurb_section.length > 1) {
         obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
       }
       obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+    } else if (obj.is_a == "blurb") {
+      obj_cite_digit = ocn_emit(OCNstatus.exc);
+      obj.obj_cite_number_non = obj_cite_digit.to!string;
+      obj.obj_cite_number_type = OCNtype.non;
     }
   }
 }
@@ -2288,8 +2329,8 @@ destroy(html_segnames);
 destroy(bookindex_unordered_hashes);
 destroy(an_object);
 biblio_arr_json = [];
-obj_cite_number=0;
-obj_cite_number_=0;
+obj_cite_digit=0;
+obj_cite_digit_=0;
 html_segnames_ptr=0;
 html_segnames_ptr_cntr=0;
 content_non_header = "8";
@@ -2389,11 +2430,11 @@ static auto _check_ocn_status_(L,T)(
     } else {
       if (obj_type_status["ocn_status_off_for_multiple_objects"] == TriState.off) {
         if (line.matchFirst(rgx.obj_cite_number_off)) {
-          obj_type_status["ocn_status"] = TriState.on;
+          obj_type_status["ocn_status"] = OCNstatus.exc;
         } else if (line.matchFirst(rgx.obj_cite_number_off_dh)) {
-          obj_type_status["ocn_status"] = TriState.closing;
+          obj_type_status["ocn_status"] = OCNstatus.closing;
         } else {
-          obj_type_status["ocn_status"] = TriState.off;
+          obj_type_status["ocn_status"] = OCNstatus.inc;
         }
       } else {
         obj_type_status["ocn_status"] =
@@ -2403,7 +2444,7 @@ static auto _check_ocn_status_(L,T)(
   } else if ((!line.empty) && (obj_type_status["ocn_status_off_for_multiple_objects"] > TriState.off)) {
     if (line.matchFirst(rgx.obj_cite_number_off_block_close)) {
       obj_type_status["ocn_status_off_for_multiple_objects"] = TriState.off;
-      obj_type_status["ocn_status"]                          = TriState.off;
+      obj_type_status["ocn_status"]                          = OCNstatus.inc;
       debug(ocnoff) {
         writeln(line);
       }
@@ -2460,7 +2501,7 @@ void _start_block_(L,T,N)(
       );
     }
     obj_cite_number_poem["start"] =
-      obj_cite_number.to!string;
+      obj_cite_digit.to!string;
     obj_type_status["blocks"]     = TriState.on;
     obj_type_status["verse_new"]  = State.on;
     obj_type_status["poem"]       = TriState.on;
@@ -2545,7 +2586,7 @@ void _start_block_(L,T,N)(
         line
       );
     }
-    obj_cite_number_poem["start"] = obj_cite_number.to!string;
+    obj_cite_number_poem["start"] = obj_cite_digit.to!string;
     obj_type_status["blocks"]    = TriState.on;
     obj_type_status["verse_new"] = State.on;
     obj_type_status["poem"]      = TriState.on;
@@ -3072,14 +3113,14 @@ void _poem_block_(L,O,T,C,N,Ma)(
           writeln(__LINE__);
           writefln(
             "* %s %s",
-            obj_cite_number,
+            obj_cite_digit,
             line
           );
         }
         if (an_object.length > 0) {
           debug(poem) {                             // poem (curly) close
             writeln(
-              obj_cite_number,
+              obj_cite_digit,
               an_object[an_object_key]
             );
           }
@@ -3093,8 +3134,8 @@ void _poem_block_(L,O,T,C,N,Ma)(
           comp_obj_block.of_section                 = "body";
           comp_obj_block.is_of                      = "block";
           comp_obj_block.is_a                       = "verse";
-          comp_obj_block.ocn                        = obj_cite_number;
-          comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+          comp_obj_block.ocn                        = obj_cite_digit;
+          comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
           comp_obj_block.text                       = an_object["substantive"];
           comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
           comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3106,14 +3147,14 @@ void _poem_block_(L,O,T,C,N,Ma)(
         ++cntr;
       }
       obj_cite_number_poem["end"] =
-        obj_cite_number.to!string;
+        obj_cite_digit.to!string;
       obj_type_status["blocks"]     = TriState.closing;
       obj_type_status["poem"]       = TriState.closing;
       obj_type_status["curly_poem"] = TriState.off;
     } else {
       processing["verse"] ~= line ~= "\n";
       if (obj_type_status["verse_new"] == State.on) {
-        obj_cite_number =
+        obj_cite_digit =
           ocn_emit(obj_type_status["ocn_status"]);
         obj_type_status["verse_new"] = State.off;
       } else if (line.matchFirst(rgx.newline_eol_delimiter_only)) {
@@ -3127,7 +3168,7 @@ void _poem_block_(L,O,T,C,N,Ma)(
         debug(poem) {                          // poem verse
           writefln(
             "* %s curly\n%s",
-            obj_cite_number,
+            obj_cite_digit,
             an_object[an_object_key]
           );
         }
@@ -3136,7 +3177,7 @@ void _poem_block_(L,O,T,C,N,Ma)(
         auto comp_obj_location = node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -3150,8 +3191,8 @@ void _poem_block_(L,O,T,C,N,Ma)(
         comp_obj_block.of_section                 = "body";
         comp_obj_block.is_of                      = "block";
         comp_obj_block.is_a                       = "verse";
-        comp_obj_block.ocn                        = obj_cite_number;
-        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+        comp_obj_block.ocn                        = obj_cite_digit;
+        comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
         comp_obj_block.text                       = an_object["substantive"];
         comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
         comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3177,7 +3218,7 @@ void _poem_block_(L,O,T,C,N,Ma)(
       if (an_object.length > 0) {
         debug(poem) {                                     // poem (tic) close
           writeln(__LINE__);
-          writeln(obj_cite_number, line);
+          writeln(obj_cite_digit, line);
         }
         processing.remove("verse");
         an_object["is"]                           = "verse";
@@ -3190,14 +3231,14 @@ void _poem_block_(L,O,T,C,N,Ma)(
         comp_obj_block.of_section                 = "body";
         comp_obj_block.is_of                      = "block";
         comp_obj_block.is_a                       = "verse";
-        comp_obj_block.ocn                        = obj_cite_number;
-        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+        comp_obj_block.ocn                        = obj_cite_digit;
+        comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
         comp_obj_block.text                       = an_object["substantive"];
         comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
         comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
         comp_obj_block.inline_links               = substantive_obj_misc_tuple[sObj.links];
         the_document_body_section                 ~= comp_obj_block;
-        obj_cite_number_poem["end"]               = obj_cite_number.to!string;
+        obj_cite_number_poem["end"]               = obj_cite_digit.to!string;
         object_reset(an_object);
         processing.remove("verse");
         ++cntr;
@@ -3208,7 +3249,7 @@ void _poem_block_(L,O,T,C,N,Ma)(
     } else {
       processing["verse"] ~= line ~= "\n";
       if (obj_type_status["verse_new"] == State.on) {
-        obj_cite_number =
+        obj_cite_digit =
           ocn_emit(obj_type_status["ocn_status"]);
         obj_type_status["verse_new"] = State.off;
       } else if (line.matchFirst(rgx.newline_eol_delimiter_only)) {
@@ -3222,7 +3263,7 @@ void _poem_block_(L,O,T,C,N,Ma)(
         debug(poem) {                            // poem (tic) close
           writefln(
             "* %s tic\n%s",
-            obj_cite_number,
+            obj_cite_digit,
             an_object[an_object_key]
           );
         }
@@ -3232,7 +3273,7 @@ void _poem_block_(L,O,T,C,N,Ma)(
           node_construct.node_location_emitter(
             content_non_header,
             segment_anchor_tag_that_object_belongs_to,
-            obj_cite_number,
+            obj_cite_digit,
             cntr,
             heading_ptr-1,
             an_object["is"]
@@ -3246,8 +3287,8 @@ void _poem_block_(L,O,T,C,N,Ma)(
         comp_obj_block.of_section                 = "body";
         comp_obj_block.is_of                      = "block";
         comp_obj_block.is_a                       = "verse";
-        comp_obj_block.ocn                        = obj_cite_number;
-        comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+        comp_obj_block.ocn                        = obj_cite_digit;
+        comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
         comp_obj_block.text                       = an_object["substantive"];
         comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
         comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3317,7 +3358,7 @@ void _table_block_(L,O,T,Ma)(
         line,
         an_object,
         the_document_body_section,
-        obj_cite_number,
+        obj_cite_digit,
         comp_obj_heading,
         cntr,
         obj_type_status,
@@ -3361,20 +3402,20 @@ void _table_closed_make_special_notation_table_(
   char[]                           line,
   return ref string[string]        an_object,
   return ref ObjGenericComposite[] the_document_body_section,
-  return ref int                   obj_cite_number,
+  return ref int                   obj_cite_digit,
   return ref ObjGenericComposite   _comp_obj_heading,
   return ref int                   cntr,
   return ref int[string]           obj_type_status,
   string[string][string]           dochead_make_aa,
 ) {
     comp_obj_block = comp_obj_block.init;
-    obj_cite_number =
+    obj_cite_digit =
       ocn_emit(obj_type_status["ocn_status"]);
     auto comp_obj_location =
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         "table"
@@ -3383,8 +3424,8 @@ void _table_closed_make_special_notation_table_(
     auto substantive_obj_misc_tuple =
       obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, "body_nugget", dochead_make_aa);
     an_object["substantive"]         = substantive_obj_misc_tuple[sObj.content];
-    comp_obj_block.ocn               = obj_cite_number;
-    comp_obj_block.obj_cite_number   = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    comp_obj_block.ocn               = obj_cite_digit;
+    comp_obj_block.obj_cite_number   = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     comp_obj_block                   = table_instructions(comp_obj_block, an_object["table_head"]);
     comp_obj_block                   = table_substantive_munge_special(comp_obj_block, an_object["substantive"]);
     the_document_body_section        ~= comp_obj_block;
@@ -3406,7 +3447,7 @@ void _block_flag_line_empty_(B)(
   return ref string[string]           an_object,
   return ref ObjGenericComposite[]    the_document_body_section,
   return ref string[][string][string] bookindex_unordered_hashes,
-  return ref int                      obj_cite_number,
+  return ref int                      obj_cite_digit,
   return ref ObjGenericComposite      _comp_obj_heading,
   return ref int                      cntr,
   return ref int[string]              obj_type_status,
@@ -3430,14 +3471,14 @@ void _block_flag_line_empty_(B)(
 #+name: abs_functions_block_line_status_empty
 #+BEGIN_SRC d
   if (obj_type_status["quote"] == TriState.closing) {
-    obj_cite_number =
+    obj_cite_digit =
       ocn_emit(obj_type_status["ocn_status"]);
     an_object["bookindex_nugget"] =
       ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
     bookindex_unordered_hashes =
       bookindex_extract_hash.bookindex_nugget_hash(
         an_object["bookindex_nugget"],
-        obj_cite_number,
+        obj_cite_digit,
         segment_anchor_tag_that_object_belongs_to
       );
     an_object["is"] = "quote";
@@ -3445,7 +3486,7 @@ void _block_flag_line_empty_(B)(
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         an_object["is"]
@@ -3459,8 +3500,8 @@ void _block_flag_line_empty_(B)(
     comp_obj_block.of_section                 = "body";
     comp_obj_block.is_of                      = "block";
     comp_obj_block.is_a                       = "quote";
-    comp_obj_block.ocn                        = obj_cite_number;
-    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    comp_obj_block.ocn                        = obj_cite_digit;
+    comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     comp_obj_block.text                       = an_object["substantive"];
     comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
     comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3478,14 +3519,14 @@ void _block_flag_line_empty_(B)(
 #+name: abs_functions_block_line_status_empty
 #+BEGIN_SRC d
   } else if (obj_type_status["group"] == TriState.closing) {
-    obj_cite_number =
+    obj_cite_digit =
       ocn_emit(obj_type_status["ocn_status"]);
     an_object["bookindex_nugget"] =
       ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
     bookindex_unordered_hashes =
       bookindex_extract_hash.bookindex_nugget_hash(
         an_object["bookindex_nugget"],
-        obj_cite_number,
+        obj_cite_digit,
         segment_anchor_tag_that_object_belongs_to
       );
     an_object["is"] = "group";
@@ -3493,7 +3534,7 @@ void _block_flag_line_empty_(B)(
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         an_object["is"]
@@ -3507,8 +3548,8 @@ void _block_flag_line_empty_(B)(
     comp_obj_block.of_section                 = "body";
     comp_obj_block.is_of                      = "block";
     comp_obj_block.is_a                       = "group";
-    comp_obj_block.ocn                        = obj_cite_number;
-    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    comp_obj_block.ocn                        = obj_cite_digit;
+    comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     comp_obj_block.text                       = an_object["substantive"];
     comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
     comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3526,13 +3567,13 @@ void _block_flag_line_empty_(B)(
 #+name: abs_functions_block_line_status_empty
 #+BEGIN_SRC d
   } else if (obj_type_status["block"] == TriState.closing) {
-    obj_cite_number = ocn_emit(obj_type_status["ocn_status"]);
+    obj_cite_digit = ocn_emit(obj_type_status["ocn_status"]);
     an_object["bookindex_nugget"] =
       ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
     bookindex_unordered_hashes =
       bookindex_extract_hash.bookindex_nugget_hash(
         an_object["bookindex_nugget"],
-        obj_cite_number,
+        obj_cite_digit,
         segment_anchor_tag_that_object_belongs_to
       );
     an_object["is"] = "block";
@@ -3540,7 +3581,7 @@ void _block_flag_line_empty_(B)(
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         an_object["is"]
@@ -3553,8 +3594,8 @@ void _block_flag_line_empty_(B)(
     comp_obj_block.of_section                 = "body";
     comp_obj_block.is_of                      = "block";
     comp_obj_block.is_a                       = "block";
-    comp_obj_block.ocn                        = obj_cite_number;
-    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    comp_obj_block.ocn                        = obj_cite_digit;
+    comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     comp_obj_block.text                       = an_object["substantive"];
     comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
     comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3577,7 +3618,7 @@ void _block_flag_line_empty_(B)(
     bookindex_unordered_hashes =
       bookindex_extract_hash.bookindex_nugget_hash(
         an_object["bookindex_nugget"],
-        obj_cite_number,
+        obj_cite_digit,
         segment_anchor_tag_that_object_belongs_to
       );
     an_object["is"]                           = "verse";
@@ -3585,7 +3626,7 @@ void _block_flag_line_empty_(B)(
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         an_object["is"]
@@ -3595,7 +3636,7 @@ void _block_flag_line_empty_(B)(
     comp_obj_poem_ocn.of_section              = "body";
     comp_obj_poem_ocn.is_of                   = "block";
     comp_obj_poem_ocn.is_a                    = "poem";
-    comp_obj_poem_ocn.ocn                     = obj_cite_number;
+    comp_obj_poem_ocn.ocn                     = obj_cite_digit;
     comp_obj_poem_ocn.obj_cite_number         = (obj_cite_number_poem["start"], obj_cite_number_poem["end"]);
     comp_obj_poem_ocn.text                    = "";
     the_document_body_section                 ~= comp_obj_poem_ocn;
@@ -3610,14 +3651,14 @@ void _block_flag_line_empty_(B)(
 #+name: abs_functions_block_line_status_empty
 #+BEGIN_SRC d
   } else if (obj_type_status["code"] == TriState.closing) {
-    obj_cite_number =
+    obj_cite_digit =
       ocn_emit(obj_type_status["ocn_status"]);
     an_object["bookindex_nugget"] =
       ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
     bookindex_unordered_hashes =
       bookindex_extract_hash.bookindex_nugget_hash(
         an_object["bookindex_nugget"],
-        obj_cite_number,
+        obj_cite_digit,
         segment_anchor_tag_that_object_belongs_to
       );
     an_object["is"] = "code";
@@ -3625,7 +3666,7 @@ void _block_flag_line_empty_(B)(
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         an_object["is"]
@@ -3639,8 +3680,8 @@ void _block_flag_line_empty_(B)(
     comp_obj_code.of_section                  = "body";
     comp_obj_code.is_of                       = "block";
     comp_obj_code.is_a                        = "code";
-    comp_obj_code.ocn                         = obj_cite_number;
-    comp_obj_code.obj_cite_number             = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    comp_obj_code.ocn                         = obj_cite_digit;
+    comp_obj_code.obj_cite_number             = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     comp_obj_code.text                        = an_object["substantive"];
     comp_obj_code.inline_notes_reg            = substantive_obj_misc_tuple[sObj.notes_reg];
     comp_obj_code.inline_notes_star           = substantive_obj_misc_tuple[sObj.notes_star];
@@ -3659,14 +3700,14 @@ void _block_flag_line_empty_(B)(
 #+BEGIN_SRC d
   } else if (obj_type_status["table"] == TriState.closing) {
     comp_obj_block = comp_obj_block.init;
-    obj_cite_number =
+    obj_cite_digit =
       ocn_emit(obj_type_status["ocn_status"]);
     an_object["bookindex_nugget"] =
       ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
     bookindex_unordered_hashes =
       bookindex_extract_hash.bookindex_nugget_hash(
         an_object["bookindex_nugget"],
-        obj_cite_number,
+        obj_cite_digit,
         segment_anchor_tag_that_object_belongs_to
       );
     an_object["is"] = "table";
@@ -3674,7 +3715,7 @@ void _block_flag_line_empty_(B)(
       node_construct.node_location_emitter(
         content_non_header,
         segment_anchor_tag_that_object_belongs_to,
-        obj_cite_number,
+        obj_cite_digit,
         cntr,
         heading_ptr-1,
         an_object["is"]
@@ -3683,8 +3724,8 @@ void _block_flag_line_empty_(B)(
       obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, dochead_make_aa);
     an_object["substantive"] = substantive_obj_misc_tuple[sObj.content];
     comp_obj_block                            = comp_obj_block.init;
-    comp_obj_block.ocn                        = obj_cite_number;
-    comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    comp_obj_block.ocn                        = obj_cite_digit;
+    comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     comp_obj_block = table_instructions(comp_obj_block, an_object["table_head"]);
     comp_obj_block = table_substantive_munge(comp_obj_block, an_object["substantive"]);
     the_document_body_section                 ~= comp_obj_block;
@@ -4426,19 +4467,31 @@ auto table_substantive_munge_special(O,T)(
 #+name: meta_emitters_ocn
 #+BEGIN_SRC d
 pure struct OCNemitter {
-  int obj_cite_number, obj_cite_number_;
+  int ocn_, ocn_in, ocn_in_, ocn_out_, ocn_bkidx_;
   int ocn_emitter(int ocn_status_flag)
-  in { assert(ocn_status_flag <= 3); }
+  in { assert(ocn_status_flag <= OCNstatus.reset); }
   body {
-    if (ocn_status_flag == 3) {
-      obj_cite_number = obj_cite_number_ = 1;
-    } else {
-      obj_cite_number=(ocn_status_flag == 0)
-      ? ++obj_cite_number_
-      : 0;
+    switch(ocn_status_flag) {
+    case OCNstatus.reset:
+      ocn_ = ocn_in_ = ocn_out_ = 1;
+      ocn_bkidx_ = 0;
+      break;
+    case OCNstatus.inc:
+      ocn_ = ++ocn_in_;
+      break;
+    case OCNstatus.exc:
+      ocn_ = ++ocn_out_;
+      break;
+    case OCNstatus.bkidx:
+      ocn_ = ++ocn_bkidx_;
+      break;
+    case OCNstatus.closing:
+      break;
+    default:
+      ocn_ = 0;
     }
-    assert(obj_cite_number >= 0);
-    return obj_cite_number;
+    assert(ocn_ >= 0);
+    return ocn_;
   }
   invariant() {
   }
@@ -5760,19 +5813,19 @@ struct BookIndexNuggetHash {
   string[] bi_main_terms_split_arr;
   string[][string][string] bookindex_nugget_hash(BI,N,S)(
     BI bookindex_section,
-    N  obj_cite_number,
+    N  obj_cite_digit,
     S  segment_anchor_tag,
   )
   in {
     debug(asserts) {
       static assert(is(typeof(bookindex_section) == string));
-      static assert(is(typeof(obj_cite_number)   == int));
+      static assert(is(typeof(obj_cite_digit)   == int));
     }
     debug(bookindexraw) {
       if (!bookindex_section.empty) {
         writeln(
           "* [bookindex] ",
-          "[", obj_cite_number.to!string, ": ", segment_anchor_tag, "] ", bookindex_section
+          "[", obj_cite_digit.to!string, ": ", segment_anchor_tag, "] ", bookindex_section
         );
       }
     }
@@ -5790,12 +5843,12 @@ struct BookIndexNuggetHash {
         ) {
           main_term = m.captures[1].strip;
           obj_cite_number_offset = m.captures[2].to!int;
-          obj_cite_number_endpoint=(obj_cite_number + obj_cite_number_offset);
-          obj_cite_numbers ~= (obj_cite_number.to!string ~ "-" ~ to!string(obj_cite_number_endpoint)
+          obj_cite_number_endpoint=(obj_cite_digit + obj_cite_number_offset);
+          obj_cite_numbers ~= (obj_cite_digit.to!string ~ "-" ~ to!string(obj_cite_number_endpoint)
           ~ ":" ~ segment_anchor_tag);
         } else {
           main_term = bi_main_term_and_rest[0].strip;
-          obj_cite_numbers ~= obj_cite_number.to!string
+          obj_cite_numbers ~= obj_cite_digit.to!string
           ~ ":" ~ segment_anchor_tag;
         }
         bi[main_term]["_a"] ~= obj_cite_numbers;
@@ -5809,12 +5862,12 @@ struct BookIndexNuggetHash {
             if (auto m = sub_terms_bits.match(rgx.bi_term_and_obj_cite_numbers_match)) {
               sub_term = m.captures[1].strip;
               obj_cite_number_offset = m.captures[2].to!int;
-              obj_cite_number_endpoint=(obj_cite_number + obj_cite_number_offset);
-              obj_cite_numbers ~= (obj_cite_number.to!string ~ " - " ~ to!string(obj_cite_number_endpoint)
+              obj_cite_number_endpoint=(obj_cite_digit + obj_cite_number_offset);
+              obj_cite_numbers ~= (obj_cite_digit.to!string ~ " - " ~ to!string(obj_cite_number_endpoint)
               ~ ":" ~ segment_anchor_tag);
             } else {
               sub_term = sub_terms_bits.strip;
-              obj_cite_numbers ~= to!string(obj_cite_number)
+              obj_cite_numbers ~= to!string(obj_cite_digit)
               ~ ":" ~ segment_anchor_tag;
             }
             if (!empty(sub_term)) {
@@ -5920,12 +5973,12 @@ struct BookIndexReportSection {
 #+BEGIN_SRC d
   auto bookindex_build_abstraction_section(BI,N,B)(
     BI bookindex_unordered_hashes,
-    N  obj_cite_number,
+    N  obj_cite_digit,
     B  opt_action,
   ) {
     debug(asserts) {
       static assert(is(typeof(bookindex_unordered_hashes)                == string[][string][string]));
-      static assert(is(typeof(obj_cite_number)                           == int));
+      static assert(is(typeof(obj_cite_digit)                           == int));
       static assert(is(typeof(opt_action)                                == bool[string]));
     }
     mixin SiSUnode;
@@ -5964,7 +6017,6 @@ struct BookIndexReportSection {
       comp_obj_heading.inline_links           = true;
       bookindex_section["scroll"]             ~= comp_obj_heading_;
       bookindex_section["seg"]                ~= comp_obj_heading_;
-      ++obj_cite_number;
       ++mkn;
       comp_obj_heading_                       = comp_obj_heading_.init;
       comp_obj_heading_.of_part               = "backmatter";
@@ -5984,7 +6036,6 @@ struct BookIndexReportSection {
       comp_obj_heading_.anchor_tags           = ["bookindex"];
       bookindex_section["scroll"]             ~= comp_obj_heading_;
       bookindex_section["seg"]                ~= comp_obj_heading_;
-      ++obj_cite_number;
       ++mkn;
       import std.array : appender;
       auto buffer = appender!(char[])();
@@ -6049,8 +6100,8 @@ struct BookIndexReportSection {
         comp_obj_para.is_of                 = "para";
         comp_obj_para.is_a                  = "bookindex";
         comp_obj_para.text                  = bi_tmp_scroll.to!string.strip;
-        comp_obj_para.ocn                   = obj_cite_number;
-        comp_obj_para.obj_cite_number       = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+        comp_obj_para.ocn                   = 0;
+        comp_obj_para.obj_cite_number       = "";
         comp_obj_para.anchor_tags           = bi_tmp_tags;
         comp_obj_para.indent_hang           = 0;
         comp_obj_para.indent_base           = 1;
@@ -6059,7 +6110,6 @@ struct BookIndexReportSection {
         bookindex_section["scroll"]         ~= comp_obj_para;
         comp_obj_para.text                  = bi_tmp_seg.to!string.strip;
         bookindex_section["seg"]            ~= comp_obj_para;
-        ++obj_cite_number;
         ++mkn;
       }
     } else {                              // no book index, (figure out what to do here)
@@ -6075,7 +6125,7 @@ struct BookIndexReportSection {
       bookindex_section["scroll"]             ~= comp_obj_heading_;
       bookindex_section["seg"]                ~= comp_obj_heading_;
     }
-    auto t = tuple(bookindex_section, obj_cite_number);
+    auto t = tuple(bookindex_section, obj_cite_digit);
     return t;
   }
 #+END_SRC
@@ -6185,7 +6235,7 @@ struct NotesSection {
 #+name: meta_emitters_endnotes
 #+BEGIN_SRC d
   private auto endnote_objects(
-    int            obj_cite_number,
+    int            obj_cite_digit,
     bool[string]   opt_action,
   )
   in {
@@ -6216,7 +6266,7 @@ struct NotesSection {
       comp_obj_heading_.parent_ocn            = 1;
       comp_obj_heading_.parent_lev_markup     = 0;
       the_endnotes_section                    ~= comp_obj_heading_;
-      ++obj_cite_number;
+      ++obj_cite_digit;
       ++mkn;
       comp_obj_heading_                       = comp_obj_heading_.init;
       comp_obj_heading_.of_part               = "backmatter";
@@ -6234,7 +6284,7 @@ struct NotesSection {
       comp_obj_heading_.parent_lev_markup     = 0;
       comp_obj_heading_.anchor_tags           = ["endnotes"];
       the_endnotes_section                    ~= comp_obj_heading_;
-      ++obj_cite_number;
+      ++obj_cite_digit;
       ++mkn;
     } else {
       comp_obj_heading_                       = comp_obj_heading_.init;
@@ -6274,7 +6324,7 @@ struct NotesSection {
         the_endnotes_section                  ~= comp_obj_endnote_;
       }
     }
-    auto t = tuple(the_endnotes_section, obj_cite_number);
+    auto t = tuple(the_endnotes_section, obj_cite_digit);
     return t;
   }
 #+END_SRC
@@ -6429,7 +6479,7 @@ struct Bibliography {
 #+BEGIN_SRC d
 struct NodeStructureMetadata {
   int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7;
-  int obj_cite_number;
+  int obj_cite_digit;
   int[string] p_; // p_ parent_
   static auto rgx = Rgx();
 #+END_SRC
@@ -6441,7 +6491,7 @@ struct NodeStructureMetadata {
   ObjGenericComposite node_location_emitter(Lv,Ta,N,C,P,I)(
     Lv lev_markup_number,
     Ta segment_anchor_tag,
-    N  obj_cite_number_,
+    N  obj_cite_digit_,
     C  cntr_,
     P  ptr_,
     I  is_
@@ -6450,18 +6500,18 @@ struct NodeStructureMetadata {
     debug(asserts) {
       static assert(is(typeof(lev_markup_number)  == string));
       static assert(is(typeof(segment_anchor_tag) == string));
-      static assert(is(typeof(obj_cite_number_)   == int));
+      static assert(is(typeof(obj_cite_digit_)    == int));
       static assert(is(typeof(cntr_)              == int));
       static assert(is(typeof(ptr_)               == int));
       static assert(is(typeof(is_)                == string));
     }
     assert(is_ != "heading");
-    assert(obj_cite_number_.to!int >= 0);
+    assert(obj_cite_digit_.to!int >= 0);
   }
   body {
     assert(is_ != "heading"); // should not be necessary
-    assert(obj_cite_number_.to!int >= 0); // should not be necessary
-    int obj_cite_number = obj_cite_number_.to!int;
+    assert(obj_cite_digit_.to!int >= 0); // should not be necessary
+    int obj_cite_digit = obj_cite_digit_.to!int;
     if (lv7 > State.off) {
       p_["lev_markup_number"] = DocStructMarkupHeading.h_text_4;
       p_["obj_cite_number"] = lv7;
@@ -6478,7 +6528,7 @@ struct NodeStructureMetadata {
     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.ocn                   = obj_cite_digit_;
     comp_obj_location.segment_anchor_tag    = segment_anchor_tag.to!string;
     comp_obj_location.parent_ocn            = p_["obj_cite_number"];
     comp_obj_location.parent_lev_markup     = p_["lev_markup_number"];
@@ -6508,7 +6558,7 @@ struct NodeStructureMetadata {
     Lm  lev_markup_number,
     Lc  lev_collapsed_number,
     Ta  segment_anchor_tag,
-    N   obj_cite_number_,
+    N   obj_cite_digit_,
     C   cntr_,
     P   ptr_,
     LA  lv_ancestors_txt,
@@ -6525,7 +6575,7 @@ struct NodeStructureMetadata {
       static assert(is(typeof(lev_markup_number)    == string));
       static assert(is(typeof(lev_collapsed_number) == string));
       static assert(is(typeof(segment_anchor_tag)   == string));
-      static assert(is(typeof(obj_cite_number_)     == int));
+      static assert(is(typeof(obj_cite_digit_)      == int));
       static assert(is(typeof(cntr_)                == int));
       static assert(is(typeof(ptr_)                 == int));
       static assert(is(typeof(lv_ancestors_txt)     == string[]));
@@ -6533,30 +6583,30 @@ struct NodeStructureMetadata {
       static assert(is(typeof(html_segnames_ptr)    == int));
     }
     assert(is_ == "heading");
-    assert(to!int(obj_cite_number_) >= 0);
+    assert((obj_cite_digit_).to!int >= 0);
     assert(
       lev_markup_number.match(rgx.levels_numbered),
-      ("not a valid heading level: " ~ lev_markup_number ~ " at " ~ obj_cite_number_.to!string)
+      ("not a valid heading level: " ~ lev_markup_number ~ " at " ~ obj_cite_digit_.to!string)
     );
     if (lev_markup_number.match(rgx.levels_numbered)) {
       if (lev_markup_number.to!int == 0) {
-        assert(obj_cite_number_.to!int == 1);
+        assert(obj_cite_digit_.to!int == 1);
       }
     }
   }
   body {
-    int obj_cite_number = obj_cite_number_.to!int;
+    int obj_cite_digit = obj_cite_digit_.to!int;
     switch (lev_markup_number.to!int) {
     case 0:
       lv = DocStructMarkupHeading.h_sect_A;
-      lv0 = obj_cite_number;
+      lv0 = obj_cite_digit;
       lv1=0; lv2=0; lv3=0; lv4=0; lv5=0; lv6=0; lv7=0;
       p_["lev_markup_number"] = 0;
       p_["obj_cite_number"] = 0;
       break;
     case 1:
       lv = DocStructMarkupHeading.h_sect_B;
-      lv1 = obj_cite_number;
+      lv1 = obj_cite_digit;
       lv2=0; lv3=0; lv4=0; lv5=0; lv6=0; lv7=0;
       p_["lev_markup_number"] =
         DocStructMarkupHeading.h_sect_A;
@@ -6564,7 +6614,7 @@ struct NodeStructureMetadata {
       break;
     case 2:
       lv = DocStructMarkupHeading.h_sect_C;
-      lv2 = obj_cite_number;
+      lv2 = obj_cite_digit;
       lv3=0; lv4=0; lv5=0; lv6=0; lv7=0;
       p_["lev_markup_number"] =
         DocStructMarkupHeading.h_sect_B;
@@ -6572,7 +6622,7 @@ struct NodeStructureMetadata {
       break;
     case 3:
       lv = DocStructMarkupHeading.h_sect_D;
-      lv3=obj_cite_number;
+      lv3=obj_cite_digit;
       lv4=0; lv5=0; lv6=0; lv7=0;
       p_["lev_markup_number"] =
         DocStructMarkupHeading.h_sect_C;
@@ -6580,7 +6630,7 @@ struct NodeStructureMetadata {
       break;
     case 4:
       lv = DocStructMarkupHeading.h_text_1;
-      lv4 = obj_cite_number;
+      lv4 = obj_cite_digit;
       lv5=0; lv6=0; lv7=0;
       if (lv3 > State.off) {
         p_["lev_markup_number"] =
@@ -6602,7 +6652,7 @@ struct NodeStructureMetadata {
       break;
     case 5:
       lv = DocStructMarkupHeading.h_text_2;
-      lv5 = obj_cite_number;
+      lv5 = obj_cite_digit;
       lv6=0; lv7=0;
       p_["lev_markup_number"] =
         DocStructMarkupHeading.h_text_1;
@@ -6610,7 +6660,7 @@ struct NodeStructureMetadata {
       break;
     case 6:
       lv = DocStructMarkupHeading.h_text_3;
-      lv6 = obj_cite_number;
+      lv6 = obj_cite_digit;
       lv7=0;
       p_["lev_markup_number"] =
         DocStructMarkupHeading.h_text_2;
@@ -6618,7 +6668,7 @@ struct NodeStructureMetadata {
       break;
     case 7:
       lv = DocStructMarkupHeading.h_text_4;
-      lv7 = obj_cite_number;
+      lv7 = obj_cite_digit;
       p_["lev_markup_number"] =
         DocStructMarkupHeading.h_text_3;
       p_["obj_cite_number"] = lv6;
@@ -6633,8 +6683,8 @@ struct NodeStructureMetadata {
     _comp_obj_heading_.is_of                     = "para";
     _comp_obj_heading_.is_a                      = "heading";
     _comp_obj_heading_.text                      = _text.to!string.strip;
-    _comp_obj_heading_.ocn                       = obj_cite_number_;
-    _comp_obj_heading_.obj_cite_number           = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+    _comp_obj_heading_.ocn                       = obj_cite_digit_;
+    _comp_obj_heading_.obj_cite_number           = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
     _comp_obj_heading_.segment_anchor_tag        = segment_anchor_tag.to!string;
     _comp_obj_heading_.marked_up_level           = lev;
     _comp_obj_heading_.heading_lev_markup        = (!(lev_markup_number.empty) ? lev_markup_number.to!int : 0);
@@ -6987,6 +7037,9 @@ struct ObjGenericComposite {
   string                 is_a                         = "";
   string                 text                         = "";
   string                 obj_cite_number              = "";
+  string                 obj_cite_number_non          = "";
+  string                 obj_cite_number_bkidx        = "";
+  int                    obj_cite_number_type         = 0;
   string[]               anchor_tags                  = [];
   int                    indent_base                  = 0;
   int                    indent_hang                  = 0;
diff --git a/org/sdp.org b/org/sdp.org
index e06135f..cc9eee2 100644
--- a/org/sdp.org
+++ b/org/sdp.org
@@ -137,13 +137,13 @@ import
 ├── src
 │   ├── sdp.d
 │   └── sdp
-│       ├── meta_metadoc_from_src.d
+│       ├── metadoc_from_src.d
 │       ├── ...
 │       └── compile_time_info.d
 └── views
     └── version.txt
 
-[[./meta_metadoc_from_src.org][meta_metadoc_from_src]]
+[[./meta_abstraction.org][meta_abstraction]]
 [[./meta_conf_make_meta.org][meta_conf_make_meta]]
 [[./meta_defaults.org][meta_defaults]]
 [[./meta_output_debugs.org][meta_output_debugs]]
@@ -925,37 +925,37 @@ consider
 
 **** ocn
 
-|-------------+----------------------+-----------------------+--------------+---|
-| *objects     | section / part       | ocn described         | how used*     |   |
-|-------------+----------------------+-----------------------+--------------+---|
-| regular ocn |                      |                       |              |   |
-|-------------+----------------------+-----------------------+--------------+---|
-|             | body objects         | seq. digit            | anchor       |   |
-|             |                      |                       | visible      |   |
-|-------------+----------------------+-----------------------+--------------+---|
-|             | glossary objects     | seq. digit            | anchor       |   |
-|             |                      |                       | not-visible  |   |
-|             |                      |                       | (for search) |   |
-|-------------+----------------------+-----------------------+--------------+---|
-|             | bibliography objects | seq. digit            | anchor       |   |
-|             |                      |                       | not-visible  |   |
-|             |                      |                       | (for search) |   |
-|-------------+----------------------+-----------------------+--------------+---|
-| special ocn |                      |                       |              |   |
-|-------------+----------------------+-----------------------+--------------+---|
-|             | non-substantive text | x char + seq. digit   | anchor       |   |
-|             |                      |                       | not-visible  |   |
-|             |                      |                       | (for search) |   |
-|-------------+----------------------+-----------------------+--------------+---|
-|             | book index           | i char + seq. digit   | anchor       |   |
-|             |                      |                       | not-visible  |   |
-|             |                      |                       | (for search) |   |
-|-------------+----------------------+-----------------------+--------------+---|
-| exceptions  |                      |                       |              |   |
-|-------------+----------------------+-----------------------+--------------+---|
-|             | endnotes             | ocn of parent object  | anchor       |   |
-|             |                      | + footnote seq. digit | visible      |   |
-|-------------+----------------------+-----------------------+--------------+---|
+|-------------+-----------------------+-----------------------+----------------+------|
+| *objects     | section / part        | ocn described         | how used*       | type |
+|-------------+-----------------------+-----------------------+----------------+------|
+| regular ocn |                       |                       |                |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+|             | body objects          | seq. digit            | anchor         | ocn  |
+|             |                       | [0-9]+                | visible        |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+|             | glossary objects      | seq. digit            | anchor         | ocn  |
+|             |                       | [0-9]+                | not-visible    |      |
+|             |                       |                       | (for search)   |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+|             | bibliography objects  | seq. digit            | anchor         | ocn  |
+|             |                       | [0-9]+                | not-visible    |      |
+|             |                       |                       | (for search)   |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+| special ocn |                       |                       |                |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+|             | non-substantive text  | x char + seq. digit   | anchor         | non  |
+|             | (within body & blurb) | x[0-9]+               | not-visible    |      |
+|             |                       |                       | (for search)   |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+|             | book index            | i char + seq. digit   | anchor         | idx  |
+|             |                       | i[0-9]+               | not-visible    |      |
+|             |                       |                       | (for search)   |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+| without ocn |                       |                       |                |      |
+|-------------+-----------------------+-----------------------+----------------+------|
+|             | endnotes              | ocn of parent object  | no ocn         | fn   |
+|             |                       | + footnote seq. digit | anchor visible |      |
+|-------------+-----------------------+-----------------------+----------------+------|
 
 ** make config - _composite make_
 
diff --git a/src/sdp/meta/metadoc_from_src.d b/src/sdp/meta/metadoc_from_src.d
index d5ff450..82c6249 100644
--- a/src/sdp/meta/metadoc_from_src.d
+++ b/src/sdp/meta/metadoc_from_src.d
@@ -47,6 +47,8 @@ template SiSUdocAbstraction() {
     h_text_5, // extra level, drop
     content_non_header
   } // header section A-D; header text 1-4
+  enum OCNstatus { inc, exc, bkidx, closing, reset, }
+  enum OCNtype { ocn, non, bkidx, }
   /+ biblio variables +/
   string biblio_tag_name, biblio_tag_entry, st;
   string[] biblio_arr_json;
@@ -67,7 +69,7 @@ template SiSUdocAbstraction() {
   static auto obj_im = ObjInlineMarkup();
   static auto obj_att = ObjAttributes();
   /+ ocn +/
-  int obj_cite_number, obj_cite_number_;
+  int obj_cite_digit, obj_cite_digit_, obj_cite_digit_bkidx;
   auto object_citation_number = OCNemitter();
   int[] dom_markedup = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
   int[] dom_markedup_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
@@ -481,7 +483,7 @@ template SiSUdocAbstraction() {
               comp_obj_para.bullet                = bullet;
               the_glossary_section                ~= comp_obj_para;
             }
-            obj_type_status["ocn_status"] = TriState.off;
+            obj_type_status["ocn_status"] = OCNstatus.inc;
           }
           continue;
         } else if (line.matchFirst(rgx.heading_blurb)
@@ -574,7 +576,7 @@ template SiSUdocAbstraction() {
               comp_obj_para.bullet                = bullet;
               the_blurb_section                   ~= comp_obj_para;
             }
-            obj_type_status["ocn_status"] = TriState.off;
+            obj_type_status["ocn_status"] = OCNstatus.inc;
           }
           continue;
         } else if (obj_type_status["quote"] == TriState.on) {
@@ -621,7 +623,7 @@ template SiSUdocAbstraction() {
               /+ poem to verse exceptions! +/
               object_reset(an_object);
               processing.remove("verse");
-              obj_cite_number_poem["start"] = obj_cite_number.to!string;
+              obj_cite_number_poem["start"] = obj_cite_digit.to!string;
             }
             _start_block_(line, obj_type_status, obj_cite_number_poem);
             continue;
@@ -730,7 +732,7 @@ template SiSUdocAbstraction() {
               an_object,
               the_document_body_section,
               bookindex_unordered_hashes,
-              obj_cite_number,
+              obj_cite_digit,
               comp_obj_heading,
               cntr,
               obj_type_status,
@@ -751,9 +753,9 @@ template SiSUdocAbstraction() {
             if ((obj_type_status["heading"] == State.on)
             && (line_occur["heading"] > State.off)) {
               /+ heading object (current line empty) +/
-              obj_cite_number = (an_object["lev_markup_number"].to!int == 0)
-              ? (ocn_emit(3))
-              : (obj_cite_number = ocn_emit(obj_type_status["ocn_status"]));
+              obj_cite_digit = (an_object["lev_markup_number"].to!int == 0)
+              ? (ocn_emit(OCNstatus.reset))
+              : (obj_cite_digit = ocn_emit(obj_type_status["ocn_status"]));
               an_object["is"] = "heading";
               an_object_key="body_nugget";
               auto substantive_object_and_anchor_tags_tuple =
@@ -766,7 +768,7 @@ template SiSUdocAbstraction() {
                 anchor_tag_ = anchor_tags[0];
               } else if (an_object["lev_markup_number"].to!int > 4) {
                 segment_anchor_tag_that_object_belongs_to = anchor_tag_;
-                segment_anchor_tag_that_object_belongs_to_uri = anchor_tag_ ~ ".fnSuffix#" ~ obj_cite_number.to!string;
+                segment_anchor_tag_that_object_belongs_to_uri = anchor_tag_ ~ ".fnSuffix#" ~ obj_cite_digit.to!string;
               } else if (an_object["lev_markup_number"].to!int < 4) {
               string segn;
                 switch (an_object["lev_markup_number"].to!int) {
@@ -794,9 +796,9 @@ template SiSUdocAbstraction() {
               an_object["bookindex_nugget"] =
                 ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
               bookindex_unordered_hashes =
-                bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_number, segment_anchor_tag_that_object_belongs_to);
+                bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_digit, segment_anchor_tag_that_object_belongs_to);
               /+ (incrementally build toc) table of contents here! +/
-              _anchor_tag=to!string(obj_cite_number);
+              _anchor_tag=to!string(obj_cite_digit);
               the_table_of_contents_section = obj_im.table_of_contents_gather_headings(
                 an_object,
                 dochead_make_aa,
@@ -817,7 +819,7 @@ template SiSUdocAbstraction() {
                   an_object["lev_markup_number"],               // string
                   an_object["lev_collapsed_number"],            // string
                   segment_anchor_tag_that_object_belongs_to,    // string
-                  obj_cite_number,                              // int
+                  obj_cite_digit,                               // int
                   cntr,                                         // int
                   heading_ptr,                                  // int
                   lv_ancestors_txt,                             // string[]
@@ -844,17 +846,17 @@ template SiSUdocAbstraction() {
             } else if ((obj_type_status["para"] == State.on)
             && (line_occur["para"] > State.off)) {
               /+ paragraph object (current line empty) +/
-              obj_cite_number = ocn_emit(obj_type_status["ocn_status"]);
+              obj_cite_digit = ocn_emit(obj_type_status["ocn_status"]);
               an_object["bookindex_nugget"] =
                 ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
               bookindex_unordered_hashes =
-                bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_number, segment_anchor_tag_that_object_belongs_to);
+                bookindex_extract_hash.bookindex_nugget_hash(an_object["bookindex_nugget"], obj_cite_digit, segment_anchor_tag_that_object_belongs_to);
               an_object["is"] = "para";
               auto comp_obj_heading =
                 node_construct.node_location_emitter(
                   content_non_header,
                   segment_anchor_tag_that_object_belongs_to,
-                  obj_cite_number,
+                  obj_cite_digit,
                   cntr,
                   heading_ptr-1,
                   an_object["is"],
@@ -869,8 +871,8 @@ template SiSUdocAbstraction() {
               comp_obj_para.is_of                 = "para";
               comp_obj_para.is_a                  = "para";
               comp_obj_para.text                  = an_object["substantive"].to!string.strip;
-              comp_obj_para.ocn                   = obj_cite_number;
-              comp_obj_para.obj_cite_number       = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+              comp_obj_para.ocn                   = obj_cite_digit;
+              comp_obj_para.obj_cite_number       = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
               comp_obj_para.indent_hang           = indent["hang_position"];
               comp_obj_para.indent_base           = indent["base_position"];
               comp_obj_para.bullet                = bullet;
@@ -921,7 +923,7 @@ template SiSUdocAbstraction() {
                   note_section.gather_notes_for_endnote_section(
                     the_document_body_section,
                     segment_anchor_tag_that_object_belongs_to,
-                    to!int(i),
+                    (i).to!int,
                   );
                 }
               }
@@ -936,7 +938,7 @@ template SiSUdocAbstraction() {
               note_section.gather_notes_for_endnote_section(
                 the_document_body_section,
                 segment_anchor_tag_that_object_belongs_to,
-                to!int(the_document_body_section.length-1),
+                (the_document_body_section.length-1).to!int,
               );
             }
           }
@@ -946,10 +948,10 @@ template SiSUdocAbstraction() {
     } /+ ← closed: loop markup document/text line by line +/
     /+ ↓ post loop markup document/text +/
     auto en_tuple =
-      note_section.endnote_objects(obj_cite_number, opt_action);
+      note_section.endnote_objects(obj_cite_digit, opt_action);
     static assert(!isTypeTuple!(en_tuple));
     auto the_endnotes_section = en_tuple[0];
-    obj_cite_number = en_tuple[1];
+    obj_cite_digit = en_tuple[1];
     debug(endnotes) {
       writefln(
         "%s %s",
@@ -1074,13 +1076,13 @@ template SiSUdocAbstraction() {
     auto bi_tuple =
       bi.bookindex_build_abstraction_section(
         bookindex_unordered_hashes,
-        obj_cite_number,
+        obj_cite_digit,
         opt_action,
       );
     destroy(bookindex_unordered_hashes);
     static assert(!isTypeTuple!(bi_tuple));
     auto the_bookindex_section = bi_tuple[0];
-    obj_cite_number = bi_tuple[1];
+    obj_cite_digit = bi_tuple[1];
     debug(bookindex) {
       foreach (bi_entry; the_bookindex_section["seg"]) {
         writeln(bi_entry);
@@ -1468,6 +1470,9 @@ template SiSUdocAbstraction() {
           debug(dom) {
             writeln(obj.text);
           }
+          obj_cite_digit = ocn_emit(OCNstatus.inc);
+          obj.ocn = obj_cite_digit;
+          obj.obj_cite_number = obj_cite_digit.to!string;
           if (obj.heading_lev_markup <= 4) {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
@@ -1489,6 +1494,10 @@ template SiSUdocAbstraction() {
             obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
           }
           obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+        } else if (obj.is_a == "glossary") {
+          obj_cite_digit = ocn_emit(OCNstatus.inc);
+          obj.ocn = obj_cite_digit;
+          obj.obj_cite_number = obj_cite_digit.to!string;
         }
       }
     }
@@ -1499,6 +1508,9 @@ template SiSUdocAbstraction() {
           debug(dom) {
             writeln(obj.text);
           }
+          obj_cite_digit = ocn_emit(OCNstatus.inc);
+          obj.ocn = obj_cite_digit;
+          obj.obj_cite_number = obj_cite_digit.to!string;
           if (obj.heading_lev_markup <= 4) {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
@@ -1520,10 +1532,17 @@ template SiSUdocAbstraction() {
             obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
           }
           obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+        } else if (obj.is_a == "bibliography") {
+          obj_cite_digit = ocn_emit(OCNstatus.inc);
+          obj.ocn = obj_cite_digit;
+          obj.obj_cite_number = obj_cite_digit.to!string;
         }
       }
     }
     /+ optional only one 1~ level +/
+    int ocn_ = obj_cite_digit;
+    int ocn_bkidx_ = 0;
+    int ocn_bidx_;
     if (the_bookindex_section["scroll"].length > 1) {
       /+ scroll +/
       dom_markedup_buffer = dom_markedup.dup;
@@ -1532,6 +1551,9 @@ template SiSUdocAbstraction() {
         if (obj.is_a == "heading") {
           debug(dom) {
           }
+          obj_cite_digit = ocn_emit(OCNstatus.inc);
+          obj.ocn = obj_cite_digit;
+          obj.obj_cite_number = obj_cite_digit.to!string;
           if (obj.heading_lev_markup <= 4) {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
@@ -1553,6 +1575,10 @@ template SiSUdocAbstraction() {
             obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
           }
           obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+        } else if (obj.is_a == "bookindex") {
+          obj_cite_digit_bkidx = ocn_emit(OCNstatus.bkidx);
+          obj.obj_cite_number_bkidx = obj_cite_digit_bkidx.to!string; // FIX need to distinguish from regular ocn
+          obj.obj_cite_number_type = OCNtype.bkidx;
         }
       }
       /+ seg +/
@@ -1563,6 +1589,8 @@ template SiSUdocAbstraction() {
           debug(dom) {
             writeln(obj.text);
           }
+          obj.ocn = ++ocn_;
+          obj.obj_cite_number = obj.ocn.to!string;
           if (obj.heading_lev_markup <= 4) {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
@@ -1584,8 +1612,14 @@ template SiSUdocAbstraction() {
             obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
           }
           obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+        } else if (obj.is_a == "bookindex") {
+          ocn_bidx_ = ++ocn_bkidx_;
+          obj.obj_cite_number_bkidx = ocn_bidx_.to!string; // FIX need to distinguish from regular ocn
+          obj.obj_cite_number_type = OCNtype.bkidx;
         }
       }
+      assert(obj_cite_digit == ocn_);
+      assert(obj_cite_digit_bkidx == ocn_bidx_);
     }
     /+ optional only one 1~ level +/
     if (the_blurb_section.length > 1) {
@@ -1594,6 +1628,9 @@ template SiSUdocAbstraction() {
           debug(dom) {
             writeln(obj.text);
           }
+          obj_cite_digit = ocn_emit(OCNstatus.inc);
+          obj.ocn = obj_cite_digit;
+          obj.obj_cite_number = obj_cite_digit.to!string;
           if (obj.heading_lev_markup <= 4) {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
@@ -1615,6 +1652,10 @@ template SiSUdocAbstraction() {
             obj = obj_dom_set_collapsed_tags(obj, dom_collapsed, obj.heading_lev_collapsed);
           }
           obj = obj_heading_ancestors(obj, lv_ancestors_txt);
+        } else if (obj.is_a == "blurb") {
+          obj_cite_digit = ocn_emit(OCNstatus.exc);
+          obj.obj_cite_number_non = obj_cite_digit.to!string;
+          obj.obj_cite_number_type = OCNtype.non;
         }
       }
     }
@@ -1710,8 +1751,8 @@ template SiSUdocAbstraction() {
     destroy(bookindex_unordered_hashes);
     destroy(an_object);
     biblio_arr_json = [];
-    obj_cite_number=0;
-    obj_cite_number_=0;
+    obj_cite_digit=0;
+    obj_cite_digit_=0;
     html_segnames_ptr=0;
     html_segnames_ptr_cntr=0;
     content_non_header = "8";
@@ -1785,11 +1826,11 @@ template SiSUdocAbstraction() {
       } else {
         if (obj_type_status["ocn_status_off_for_multiple_objects"] == TriState.off) {
           if (line.matchFirst(rgx.obj_cite_number_off)) {
-            obj_type_status["ocn_status"] = TriState.on;
+            obj_type_status["ocn_status"] = OCNstatus.exc;
           } else if (line.matchFirst(rgx.obj_cite_number_off_dh)) {
-            obj_type_status["ocn_status"] = TriState.closing;
+            obj_type_status["ocn_status"] = OCNstatus.closing;
           } else {
-            obj_type_status["ocn_status"] = TriState.off;
+            obj_type_status["ocn_status"] = OCNstatus.inc;
           }
         } else {
           obj_type_status["ocn_status"] =
@@ -1799,7 +1840,7 @@ template SiSUdocAbstraction() {
     } else if ((!line.empty) && (obj_type_status["ocn_status_off_for_multiple_objects"] > TriState.off)) {
       if (line.matchFirst(rgx.obj_cite_number_off_block_close)) {
         obj_type_status["ocn_status_off_for_multiple_objects"] = TriState.off;
-        obj_type_status["ocn_status"]                          = TriState.off;
+        obj_type_status["ocn_status"]                          = OCNstatus.inc;
         debug(ocnoff) {
           writeln(line);
         }
@@ -1842,7 +1883,7 @@ template SiSUdocAbstraction() {
         );
       }
       obj_cite_number_poem["start"] =
-        obj_cite_number.to!string;
+        obj_cite_digit.to!string;
       obj_type_status["blocks"]     = TriState.on;
       obj_type_status["verse_new"]  = State.on;
       obj_type_status["poem"]       = TriState.on;
@@ -1921,7 +1962,7 @@ template SiSUdocAbstraction() {
           line
         );
       }
-      obj_cite_number_poem["start"] = obj_cite_number.to!string;
+      obj_cite_number_poem["start"] = obj_cite_digit.to!string;
       obj_type_status["blocks"]    = TriState.on;
       obj_type_status["verse_new"] = State.on;
       obj_type_status["poem"]      = TriState.on;
@@ -2138,14 +2179,14 @@ template SiSUdocAbstraction() {
             writeln(__LINE__);
             writefln(
               "* %s %s",
-              obj_cite_number,
+              obj_cite_digit,
               line
             );
           }
           if (an_object.length > 0) {
             debug(poem) {                             // poem (curly) close
               writeln(
-                obj_cite_number,
+                obj_cite_digit,
                 an_object[an_object_key]
               );
             }
@@ -2159,8 +2200,8 @@ template SiSUdocAbstraction() {
             comp_obj_block.of_section                 = "body";
             comp_obj_block.is_of                      = "block";
             comp_obj_block.is_a                       = "verse";
-            comp_obj_block.ocn                        = obj_cite_number;
-            comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+            comp_obj_block.ocn                        = obj_cite_digit;
+            comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
             comp_obj_block.text                       = an_object["substantive"];
             comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
             comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2172,14 +2213,14 @@ template SiSUdocAbstraction() {
           ++cntr;
         }
         obj_cite_number_poem["end"] =
-          obj_cite_number.to!string;
+          obj_cite_digit.to!string;
         obj_type_status["blocks"]     = TriState.closing;
         obj_type_status["poem"]       = TriState.closing;
         obj_type_status["curly_poem"] = TriState.off;
       } else {
         processing["verse"] ~= line ~= "\n";
         if (obj_type_status["verse_new"] == State.on) {
-          obj_cite_number =
+          obj_cite_digit =
             ocn_emit(obj_type_status["ocn_status"]);
           obj_type_status["verse_new"] = State.off;
         } else if (line.matchFirst(rgx.newline_eol_delimiter_only)) {
@@ -2193,7 +2234,7 @@ template SiSUdocAbstraction() {
           debug(poem) {                          // poem verse
             writefln(
               "* %s curly\n%s",
-              obj_cite_number,
+              obj_cite_digit,
               an_object[an_object_key]
             );
           }
@@ -2202,7 +2243,7 @@ template SiSUdocAbstraction() {
           auto comp_obj_location = node_construct.node_location_emitter(
             content_non_header,
             segment_anchor_tag_that_object_belongs_to,
-            obj_cite_number,
+            obj_cite_digit,
             cntr,
             heading_ptr-1,
             an_object["is"]
@@ -2216,8 +2257,8 @@ template SiSUdocAbstraction() {
           comp_obj_block.of_section                 = "body";
           comp_obj_block.is_of                      = "block";
           comp_obj_block.is_a                       = "verse";
-          comp_obj_block.ocn                        = obj_cite_number;
-          comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+          comp_obj_block.ocn                        = obj_cite_digit;
+          comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
           comp_obj_block.text                       = an_object["substantive"];
           comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
           comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2243,7 +2284,7 @@ template SiSUdocAbstraction() {
         if (an_object.length > 0) {
           debug(poem) {                                     // poem (tic) close
             writeln(__LINE__);
-            writeln(obj_cite_number, line);
+            writeln(obj_cite_digit, line);
           }
           processing.remove("verse");
           an_object["is"]                           = "verse";
@@ -2256,14 +2297,14 @@ template SiSUdocAbstraction() {
           comp_obj_block.of_section                 = "body";
           comp_obj_block.is_of                      = "block";
           comp_obj_block.is_a                       = "verse";
-          comp_obj_block.ocn                        = obj_cite_number;
-          comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+          comp_obj_block.ocn                        = obj_cite_digit;
+          comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
           comp_obj_block.text                       = an_object["substantive"];
           comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
           comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
           comp_obj_block.inline_links               = substantive_obj_misc_tuple[sObj.links];
           the_document_body_section                 ~= comp_obj_block;
-          obj_cite_number_poem["end"]               = obj_cite_number.to!string;
+          obj_cite_number_poem["end"]               = obj_cite_digit.to!string;
           object_reset(an_object);
           processing.remove("verse");
           ++cntr;
@@ -2274,7 +2315,7 @@ template SiSUdocAbstraction() {
       } else {
         processing["verse"] ~= line ~= "\n";
         if (obj_type_status["verse_new"] == State.on) {
-          obj_cite_number =
+          obj_cite_digit =
             ocn_emit(obj_type_status["ocn_status"]);
           obj_type_status["verse_new"] = State.off;
         } else if (line.matchFirst(rgx.newline_eol_delimiter_only)) {
@@ -2288,7 +2329,7 @@ template SiSUdocAbstraction() {
           debug(poem) {                            // poem (tic) close
             writefln(
               "* %s tic\n%s",
-              obj_cite_number,
+              obj_cite_digit,
               an_object[an_object_key]
             );
           }
@@ -2298,7 +2339,7 @@ template SiSUdocAbstraction() {
             node_construct.node_location_emitter(
               content_non_header,
               segment_anchor_tag_that_object_belongs_to,
-              obj_cite_number,
+              obj_cite_digit,
               cntr,
               heading_ptr-1,
               an_object["is"]
@@ -2312,8 +2353,8 @@ template SiSUdocAbstraction() {
           comp_obj_block.of_section                 = "body";
           comp_obj_block.is_of                      = "block";
           comp_obj_block.is_a                       = "verse";
-          comp_obj_block.ocn                        = obj_cite_number;
-          comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+          comp_obj_block.ocn                        = obj_cite_digit;
+          comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
           comp_obj_block.text                       = an_object["substantive"];
           comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
           comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2408,7 +2449,7 @@ template SiSUdocAbstraction() {
           line,
           an_object,
           the_document_body_section,
-          obj_cite_number,
+          obj_cite_digit,
           comp_obj_heading,
           cntr,
           obj_type_status,
@@ -2584,20 +2625,20 @@ template SiSUdocAbstraction() {
     char[]                           line,
     return ref string[string]        an_object,
     return ref ObjGenericComposite[] the_document_body_section,
-    return ref int                   obj_cite_number,
+    return ref int                   obj_cite_digit,
     return ref ObjGenericComposite   _comp_obj_heading,
     return ref int                   cntr,
     return ref int[string]           obj_type_status,
     string[string][string]           dochead_make_aa,
   ) {
       comp_obj_block = comp_obj_block.init;
-      obj_cite_number =
+      obj_cite_digit =
         ocn_emit(obj_type_status["ocn_status"]);
       auto comp_obj_location =
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           "table"
@@ -2606,8 +2647,8 @@ template SiSUdocAbstraction() {
       auto substantive_obj_misc_tuple =
         obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, "body_nugget", dochead_make_aa);
       an_object["substantive"]         = substantive_obj_misc_tuple[sObj.content];
-      comp_obj_block.ocn               = obj_cite_number;
-      comp_obj_block.obj_cite_number   = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      comp_obj_block.ocn               = obj_cite_digit;
+      comp_obj_block.obj_cite_number   = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       comp_obj_block                   = table_instructions(comp_obj_block, an_object["table_head"]);
       comp_obj_block                   = table_substantive_munge_special(comp_obj_block, an_object["substantive"]);
       the_document_body_section        ~= comp_obj_block;
@@ -2621,7 +2662,7 @@ template SiSUdocAbstraction() {
     return ref string[string]           an_object,
     return ref ObjGenericComposite[]    the_document_body_section,
     return ref string[][string][string] bookindex_unordered_hashes,
-    return ref int                      obj_cite_number,
+    return ref int                      obj_cite_digit,
     return ref ObjGenericComposite      _comp_obj_heading,
     return ref int                      cntr,
     return ref int[string]              obj_type_status,
@@ -2639,14 +2680,14 @@ template SiSUdocAbstraction() {
     );
     assertions_flag_types_block_status_none_or_closed(obj_type_status);
     if (obj_type_status["quote"] == TriState.closing) {
-      obj_cite_number =
+      obj_cite_digit =
         ocn_emit(obj_type_status["ocn_status"]);
       an_object["bookindex_nugget"] =
         ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
       bookindex_unordered_hashes =
         bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
-          obj_cite_number,
+          obj_cite_digit,
           segment_anchor_tag_that_object_belongs_to
         );
       an_object["is"] = "quote";
@@ -2654,7 +2695,7 @@ template SiSUdocAbstraction() {
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -2668,8 +2709,8 @@ template SiSUdocAbstraction() {
       comp_obj_block.of_section                 = "body";
       comp_obj_block.is_of                      = "block";
       comp_obj_block.is_a                       = "quote";
-      comp_obj_block.ocn                        = obj_cite_number;
-      comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      comp_obj_block.ocn                        = obj_cite_digit;
+      comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       comp_obj_block.text                       = an_object["substantive"];
       comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
       comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2681,14 +2722,14 @@ template SiSUdocAbstraction() {
       processing.remove("verse");
       ++cntr;
     } else if (obj_type_status["group"] == TriState.closing) {
-      obj_cite_number =
+      obj_cite_digit =
         ocn_emit(obj_type_status["ocn_status"]);
       an_object["bookindex_nugget"] =
         ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
       bookindex_unordered_hashes =
         bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
-          obj_cite_number,
+          obj_cite_digit,
           segment_anchor_tag_that_object_belongs_to
         );
       an_object["is"] = "group";
@@ -2696,7 +2737,7 @@ template SiSUdocAbstraction() {
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -2710,8 +2751,8 @@ template SiSUdocAbstraction() {
       comp_obj_block.of_section                 = "body";
       comp_obj_block.is_of                      = "block";
       comp_obj_block.is_a                       = "group";
-      comp_obj_block.ocn                        = obj_cite_number;
-      comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      comp_obj_block.ocn                        = obj_cite_digit;
+      comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       comp_obj_block.text                       = an_object["substantive"];
       comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
       comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2723,13 +2764,13 @@ template SiSUdocAbstraction() {
       processing.remove("verse");
       ++cntr;
     } else if (obj_type_status["block"] == TriState.closing) {
-      obj_cite_number = ocn_emit(obj_type_status["ocn_status"]);
+      obj_cite_digit = ocn_emit(obj_type_status["ocn_status"]);
       an_object["bookindex_nugget"] =
         ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
       bookindex_unordered_hashes =
         bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
-          obj_cite_number,
+          obj_cite_digit,
           segment_anchor_tag_that_object_belongs_to
         );
       an_object["is"] = "block";
@@ -2737,7 +2778,7 @@ template SiSUdocAbstraction() {
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -2750,8 +2791,8 @@ template SiSUdocAbstraction() {
       comp_obj_block.of_section                 = "body";
       comp_obj_block.is_of                      = "block";
       comp_obj_block.is_a                       = "block";
-      comp_obj_block.ocn                        = obj_cite_number;
-      comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      comp_obj_block.ocn                        = obj_cite_digit;
+      comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       comp_obj_block.text                       = an_object["substantive"];
       comp_obj_block.inline_notes_reg           = substantive_obj_misc_tuple[sObj.notes_reg];
       comp_obj_block.inline_notes_star          = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2768,7 +2809,7 @@ template SiSUdocAbstraction() {
       bookindex_unordered_hashes =
         bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
-          obj_cite_number,
+          obj_cite_digit,
           segment_anchor_tag_that_object_belongs_to
         );
       an_object["is"]                           = "verse";
@@ -2776,7 +2817,7 @@ template SiSUdocAbstraction() {
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -2786,7 +2827,7 @@ template SiSUdocAbstraction() {
       comp_obj_poem_ocn.of_section              = "body";
       comp_obj_poem_ocn.is_of                   = "block";
       comp_obj_poem_ocn.is_a                    = "poem";
-      comp_obj_poem_ocn.ocn                     = obj_cite_number;
+      comp_obj_poem_ocn.ocn                     = obj_cite_digit;
       comp_obj_poem_ocn.obj_cite_number         = (obj_cite_number_poem["start"], obj_cite_number_poem["end"]);
       comp_obj_poem_ocn.text                    = "";
       the_document_body_section                 ~= comp_obj_poem_ocn;
@@ -2795,14 +2836,14 @@ template SiSUdocAbstraction() {
       object_reset(an_object);
       processing.remove("verse");
     } else if (obj_type_status["code"] == TriState.closing) {
-      obj_cite_number =
+      obj_cite_digit =
         ocn_emit(obj_type_status["ocn_status"]);
       an_object["bookindex_nugget"] =
         ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
       bookindex_unordered_hashes =
         bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
-          obj_cite_number,
+          obj_cite_digit,
           segment_anchor_tag_that_object_belongs_to
         );
       an_object["is"] = "code";
@@ -2810,7 +2851,7 @@ template SiSUdocAbstraction() {
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -2824,8 +2865,8 @@ template SiSUdocAbstraction() {
       comp_obj_code.of_section                  = "body";
       comp_obj_code.is_of                       = "block";
       comp_obj_code.is_a                        = "code";
-      comp_obj_code.ocn                         = obj_cite_number;
-      comp_obj_code.obj_cite_number             = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      comp_obj_code.ocn                         = obj_cite_digit;
+      comp_obj_code.obj_cite_number             = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       comp_obj_code.text                        = an_object["substantive"];
       comp_obj_code.inline_notes_reg            = substantive_obj_misc_tuple[sObj.notes_reg];
       comp_obj_code.inline_notes_star           = substantive_obj_misc_tuple[sObj.notes_star];
@@ -2838,14 +2879,14 @@ template SiSUdocAbstraction() {
       ++cntr;
     } else if (obj_type_status["table"] == TriState.closing) {
       comp_obj_block = comp_obj_block.init;
-      obj_cite_number =
+      obj_cite_digit =
         ocn_emit(obj_type_status["ocn_status"]);
       an_object["bookindex_nugget"] =
         ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
       bookindex_unordered_hashes =
         bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
-          obj_cite_number,
+          obj_cite_digit,
           segment_anchor_tag_that_object_belongs_to
         );
       an_object["is"] = "table";
@@ -2853,7 +2894,7 @@ template SiSUdocAbstraction() {
         node_construct.node_location_emitter(
           content_non_header,
           segment_anchor_tag_that_object_belongs_to,
-          obj_cite_number,
+          obj_cite_digit,
           cntr,
           heading_ptr-1,
           an_object["is"]
@@ -2862,8 +2903,8 @@ template SiSUdocAbstraction() {
         obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, dochead_make_aa);
       an_object["substantive"] = substantive_obj_misc_tuple[sObj.content];
       comp_obj_block                            = comp_obj_block.init;
-      comp_obj_block.ocn                        = obj_cite_number;
-      comp_obj_block.obj_cite_number            = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      comp_obj_block.ocn                        = obj_cite_digit;
+      comp_obj_block.obj_cite_number            = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       comp_obj_block = table_instructions(comp_obj_block, an_object["table_head"]);
       comp_obj_block = table_substantive_munge(comp_obj_block, an_object["substantive"]);
       the_document_body_section                 ~= comp_obj_block;
@@ -3517,19 +3558,31 @@ template SiSUdocAbstraction() {
   /+ abstraction functions ↑ +/
   /+ ↓ abstraction function emitters +/
   pure struct OCNemitter {
-    int obj_cite_number, obj_cite_number_;
+    int ocn_, ocn_in, ocn_in_, ocn_out_, ocn_bkidx_;
     int ocn_emitter(int ocn_status_flag)
-    in { assert(ocn_status_flag <= 3); }
+    in { assert(ocn_status_flag <= OCNstatus.reset); }
     body {
-      if (ocn_status_flag == 3) {
-        obj_cite_number = obj_cite_number_ = 1;
-      } else {
-        obj_cite_number=(ocn_status_flag == 0)
-        ? ++obj_cite_number_
-        : 0;
+      switch(ocn_status_flag) {
+      case OCNstatus.reset:
+        ocn_ = ocn_in_ = ocn_out_ = 1;
+        ocn_bkidx_ = 0;
+        break;
+      case OCNstatus.inc:
+        ocn_ = ++ocn_in_;
+        break;
+      case OCNstatus.exc:
+        ocn_ = ++ocn_out_;
+        break;
+      case OCNstatus.bkidx:
+        ocn_ = ++ocn_bkidx_;
+        break;
+      case OCNstatus.closing:
+        break;
+      default:
+        ocn_ = 0;
       }
-      assert(obj_cite_number >= 0);
-      return obj_cite_number;
+      assert(ocn_ >= 0);
+      return ocn_;
     }
     invariant() {
     }
@@ -4583,19 +4636,19 @@ template SiSUdocAbstraction() {
     string[] bi_main_terms_split_arr;
     string[][string][string] bookindex_nugget_hash(BI,N,S)(
       BI bookindex_section,
-      N  obj_cite_number,
+      N  obj_cite_digit,
       S  segment_anchor_tag,
     )
     in {
       debug(asserts) {
         static assert(is(typeof(bookindex_section) == string));
-        static assert(is(typeof(obj_cite_number)   == int));
+        static assert(is(typeof(obj_cite_digit)   == int));
       }
       debug(bookindexraw) {
         if (!bookindex_section.empty) {
           writeln(
             "* [bookindex] ",
-            "[", obj_cite_number.to!string, ": ", segment_anchor_tag, "] ", bookindex_section
+            "[", obj_cite_digit.to!string, ": ", segment_anchor_tag, "] ", bookindex_section
           );
         }
       }
@@ -4613,12 +4666,12 @@ template SiSUdocAbstraction() {
           ) {
             main_term = m.captures[1].strip;
             obj_cite_number_offset = m.captures[2].to!int;
-            obj_cite_number_endpoint=(obj_cite_number + obj_cite_number_offset);
-            obj_cite_numbers ~= (obj_cite_number.to!string ~ "-" ~ to!string(obj_cite_number_endpoint)
+            obj_cite_number_endpoint=(obj_cite_digit + obj_cite_number_offset);
+            obj_cite_numbers ~= (obj_cite_digit.to!string ~ "-" ~ to!string(obj_cite_number_endpoint)
             ~ ":" ~ segment_anchor_tag);
           } else {
             main_term = bi_main_term_and_rest[0].strip;
-            obj_cite_numbers ~= obj_cite_number.to!string
+            obj_cite_numbers ~= obj_cite_digit.to!string
             ~ ":" ~ segment_anchor_tag;
           }
           bi[main_term]["_a"] ~= obj_cite_numbers;
@@ -4632,12 +4685,12 @@ template SiSUdocAbstraction() {
               if (auto m = sub_terms_bits.match(rgx.bi_term_and_obj_cite_numbers_match)) {
                 sub_term = m.captures[1].strip;
                 obj_cite_number_offset = m.captures[2].to!int;
-                obj_cite_number_endpoint=(obj_cite_number + obj_cite_number_offset);
-                obj_cite_numbers ~= (obj_cite_number.to!string ~ " - " ~ to!string(obj_cite_number_endpoint)
+                obj_cite_number_endpoint=(obj_cite_digit + obj_cite_number_offset);
+                obj_cite_numbers ~= (obj_cite_digit.to!string ~ " - " ~ to!string(obj_cite_number_endpoint)
                 ~ ":" ~ segment_anchor_tag);
               } else {
                 sub_term = sub_terms_bits.strip;
-                obj_cite_numbers ~= to!string(obj_cite_number)
+                obj_cite_numbers ~= to!string(obj_cite_digit)
                 ~ ":" ~ segment_anchor_tag;
               }
               if (!empty(sub_term)) {
@@ -4718,12 +4771,12 @@ template SiSUdocAbstraction() {
     }
     auto bookindex_build_abstraction_section(BI,N,B)(
       BI bookindex_unordered_hashes,
-      N  obj_cite_number,
+      N  obj_cite_digit,
       B  opt_action,
     ) {
       debug(asserts) {
         static assert(is(typeof(bookindex_unordered_hashes)                == string[][string][string]));
-        static assert(is(typeof(obj_cite_number)                           == int));
+        static assert(is(typeof(obj_cite_digit)                           == int));
         static assert(is(typeof(opt_action)                                == bool[string]));
       }
       mixin SiSUnode;
@@ -4762,7 +4815,6 @@ template SiSUdocAbstraction() {
         comp_obj_heading.inline_links           = true;
         bookindex_section["scroll"]             ~= comp_obj_heading_;
         bookindex_section["seg"]                ~= comp_obj_heading_;
-        ++obj_cite_number;
         ++mkn;
         comp_obj_heading_                       = comp_obj_heading_.init;
         comp_obj_heading_.of_part               = "backmatter";
@@ -4782,7 +4834,6 @@ template SiSUdocAbstraction() {
         comp_obj_heading_.anchor_tags           = ["bookindex"];
         bookindex_section["scroll"]             ~= comp_obj_heading_;
         bookindex_section["seg"]                ~= comp_obj_heading_;
-        ++obj_cite_number;
         ++mkn;
         import std.array : appender;
         auto buffer = appender!(char[])();
@@ -4847,8 +4898,8 @@ template SiSUdocAbstraction() {
           comp_obj_para.is_of                 = "para";
           comp_obj_para.is_a                  = "bookindex";
           comp_obj_para.text                  = bi_tmp_scroll.to!string.strip;
-          comp_obj_para.ocn                   = obj_cite_number;
-          comp_obj_para.obj_cite_number       = (obj_cite_number==0) ? "" : to!string(obj_cite_number);
+          comp_obj_para.ocn                   = 0;
+          comp_obj_para.obj_cite_number       = "";
           comp_obj_para.anchor_tags           = bi_tmp_tags;
           comp_obj_para.indent_hang           = 0;
           comp_obj_para.indent_base           = 1;
@@ -4857,7 +4908,6 @@ template SiSUdocAbstraction() {
           bookindex_section["scroll"]         ~= comp_obj_para;
           comp_obj_para.text                  = bi_tmp_seg.to!string.strip;
           bookindex_section["seg"]            ~= comp_obj_para;
-          ++obj_cite_number;
           ++mkn;
         }
       } else {                              // no book index, (figure out what to do here)
@@ -4873,7 +4923,7 @@ template SiSUdocAbstraction() {
         bookindex_section["scroll"]             ~= comp_obj_heading_;
         bookindex_section["seg"]                ~= comp_obj_heading_;
       }
-      auto t = tuple(bookindex_section, obj_cite_number);
+      auto t = tuple(bookindex_section, obj_cite_digit);
       return t;
     }
   }
@@ -4954,7 +5004,7 @@ template SiSUdocAbstraction() {
       return endnotes_;
     }
     private auto endnote_objects(
-      int            obj_cite_number,
+      int            obj_cite_digit,
       bool[string]   opt_action,
     )
     in {
@@ -4985,7 +5035,7 @@ template SiSUdocAbstraction() {
         comp_obj_heading_.parent_ocn            = 1;
         comp_obj_heading_.parent_lev_markup     = 0;
         the_endnotes_section                    ~= comp_obj_heading_;
-        ++obj_cite_number;
+        ++obj_cite_digit;
         ++mkn;
         comp_obj_heading_                       = comp_obj_heading_.init;
         comp_obj_heading_.of_part               = "backmatter";
@@ -5003,7 +5053,7 @@ template SiSUdocAbstraction() {
         comp_obj_heading_.parent_lev_markup     = 0;
         comp_obj_heading_.anchor_tags           = ["endnotes"];
         the_endnotes_section                    ~= comp_obj_heading_;
-        ++obj_cite_number;
+        ++obj_cite_digit;
         ++mkn;
       } else {
         comp_obj_heading_                       = comp_obj_heading_.init;
@@ -5043,7 +5093,7 @@ template SiSUdocAbstraction() {
           the_endnotes_section                  ~= comp_obj_endnote_;
         }
       }
-      auto t = tuple(the_endnotes_section, obj_cite_number);
+      auto t = tuple(the_endnotes_section, obj_cite_digit);
       return t;
     }
   }
@@ -5150,13 +5200,13 @@ template SiSUdocAbstraction() {
   /+ +/
   struct NodeStructureMetadata {
     int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7;
-    int obj_cite_number;
+    int obj_cite_digit;
     int[string] p_; // p_ parent_
     static auto rgx = Rgx();
     ObjGenericComposite node_location_emitter(Lv,Ta,N,C,P,I)(
       Lv lev_markup_number,
       Ta segment_anchor_tag,
-      N  obj_cite_number_,
+      N  obj_cite_digit_,
       C  cntr_,
       P  ptr_,
       I  is_
@@ -5165,18 +5215,18 @@ template SiSUdocAbstraction() {
       debug(asserts) {
         static assert(is(typeof(lev_markup_number)  == string));
         static assert(is(typeof(segment_anchor_tag) == string));
-        static assert(is(typeof(obj_cite_number_)   == int));
+        static assert(is(typeof(obj_cite_digit_)    == int));
         static assert(is(typeof(cntr_)              == int));
         static assert(is(typeof(ptr_)               == int));
         static assert(is(typeof(is_)                == string));
       }
       assert(is_ != "heading");
-      assert(obj_cite_number_.to!int >= 0);
+      assert(obj_cite_digit_.to!int >= 0);
     }
     body {
       assert(is_ != "heading"); // should not be necessary
-      assert(obj_cite_number_.to!int >= 0); // should not be necessary
-      int obj_cite_number = obj_cite_number_.to!int;
+      assert(obj_cite_digit_.to!int >= 0); // should not be necessary
+      int obj_cite_digit = obj_cite_digit_.to!int;
       if (lv7 > State.off) {
         p_["lev_markup_number"] = DocStructMarkupHeading.h_text_4;
         p_["obj_cite_number"] = lv7;
@@ -5193,7 +5243,7 @@ template SiSUdocAbstraction() {
       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.ocn                   = obj_cite_digit_;
       comp_obj_location.segment_anchor_tag    = segment_anchor_tag.to!string;
       comp_obj_location.parent_ocn            = p_["obj_cite_number"];
       comp_obj_location.parent_lev_markup     = p_["lev_markup_number"];
@@ -5217,7 +5267,7 @@ template SiSUdocAbstraction() {
       Lm  lev_markup_number,
       Lc  lev_collapsed_number,
       Ta  segment_anchor_tag,
-      N   obj_cite_number_,
+      N   obj_cite_digit_,
       C   cntr_,
       P   ptr_,
       LA  lv_ancestors_txt,
@@ -5234,7 +5284,7 @@ template SiSUdocAbstraction() {
         static assert(is(typeof(lev_markup_number)    == string));
         static assert(is(typeof(lev_collapsed_number) == string));
         static assert(is(typeof(segment_anchor_tag)   == string));
-        static assert(is(typeof(obj_cite_number_)     == int));
+        static assert(is(typeof(obj_cite_digit_)      == int));
         static assert(is(typeof(cntr_)                == int));
         static assert(is(typeof(ptr_)                 == int));
         static assert(is(typeof(lv_ancestors_txt)     == string[]));
@@ -5242,30 +5292,30 @@ template SiSUdocAbstraction() {
         static assert(is(typeof(html_segnames_ptr)    == int));
       }
       assert(is_ == "heading");
-      assert(to!int(obj_cite_number_) >= 0);
+      assert((obj_cite_digit_).to!int >= 0);
       assert(
         lev_markup_number.match(rgx.levels_numbered),
-        ("not a valid heading level: " ~ lev_markup_number ~ " at " ~ obj_cite_number_.to!string)
+        ("not a valid heading level: " ~ lev_markup_number ~ " at " ~ obj_cite_digit_.to!string)
       );
       if (lev_markup_number.match(rgx.levels_numbered)) {
         if (lev_markup_number.to!int == 0) {
-          assert(obj_cite_number_.to!int == 1);
+          assert(obj_cite_digit_.to!int == 1);
         }
       }
     }
     body {
-      int obj_cite_number = obj_cite_number_.to!int;
+      int obj_cite_digit = obj_cite_digit_.to!int;
       switch (lev_markup_number.to!int) {
       case 0:
         lv = DocStructMarkupHeading.h_sect_A;
-        lv0 = obj_cite_number;
+        lv0 = obj_cite_digit;
         lv1=0; lv2=0; lv3=0; lv4=0; lv5=0; lv6=0; lv7=0;
         p_["lev_markup_number"] = 0;
         p_["obj_cite_number"] = 0;
         break;
       case 1:
         lv = DocStructMarkupHeading.h_sect_B;
-        lv1 = obj_cite_number;
+        lv1 = obj_cite_digit;
         lv2=0; lv3=0; lv4=0; lv5=0; lv6=0; lv7=0;
         p_["lev_markup_number"] =
           DocStructMarkupHeading.h_sect_A;
@@ -5273,7 +5323,7 @@ template SiSUdocAbstraction() {
         break;
       case 2:
         lv = DocStructMarkupHeading.h_sect_C;
-        lv2 = obj_cite_number;
+        lv2 = obj_cite_digit;
         lv3=0; lv4=0; lv5=0; lv6=0; lv7=0;
         p_["lev_markup_number"] =
           DocStructMarkupHeading.h_sect_B;
@@ -5281,7 +5331,7 @@ template SiSUdocAbstraction() {
         break;
       case 3:
         lv = DocStructMarkupHeading.h_sect_D;
-        lv3=obj_cite_number;
+        lv3=obj_cite_digit;
         lv4=0; lv5=0; lv6=0; lv7=0;
         p_["lev_markup_number"] =
           DocStructMarkupHeading.h_sect_C;
@@ -5289,7 +5339,7 @@ template SiSUdocAbstraction() {
         break;
       case 4:
         lv = DocStructMarkupHeading.h_text_1;
-        lv4 = obj_cite_number;
+        lv4 = obj_cite_digit;
         lv5=0; lv6=0; lv7=0;
         if (lv3 > State.off) {
           p_["lev_markup_number"] =
@@ -5311,7 +5361,7 @@ template SiSUdocAbstraction() {
         break;
       case 5:
         lv = DocStructMarkupHeading.h_text_2;
-        lv5 = obj_cite_number;
+        lv5 = obj_cite_digit;
         lv6=0; lv7=0;
         p_["lev_markup_number"] =
           DocStructMarkupHeading.h_text_1;
@@ -5319,7 +5369,7 @@ template SiSUdocAbstraction() {
         break;
       case 6:
         lv = DocStructMarkupHeading.h_text_3;
-        lv6 = obj_cite_number;
+        lv6 = obj_cite_digit;
         lv7=0;
         p_["lev_markup_number"] =
           DocStructMarkupHeading.h_text_2;
@@ -5327,7 +5377,7 @@ template SiSUdocAbstraction() {
         break;
       case 7:
         lv = DocStructMarkupHeading.h_text_4;
-        lv7 = obj_cite_number;
+        lv7 = obj_cite_digit;
         p_["lev_markup_number"] =
           DocStructMarkupHeading.h_text_3;
         p_["obj_cite_number"] = lv6;
@@ -5342,8 +5392,8 @@ template SiSUdocAbstraction() {
       _comp_obj_heading_.is_of                     = "para";
       _comp_obj_heading_.is_a                      = "heading";
       _comp_obj_heading_.text                      = _text.to!string.strip;
-      _comp_obj_heading_.ocn                       = obj_cite_number_;
-      _comp_obj_heading_.obj_cite_number           = (obj_cite_number==0) ? "" : obj_cite_number.to!string;
+      _comp_obj_heading_.ocn                       = obj_cite_digit_;
+      _comp_obj_heading_.obj_cite_number           = (obj_cite_digit==0) ? "" : obj_cite_digit.to!string;
       _comp_obj_heading_.segment_anchor_tag        = segment_anchor_tag.to!string;
       _comp_obj_heading_.marked_up_level           = lev;
       _comp_obj_heading_.heading_lev_markup        = (!(lev_markup_number.empty) ? lev_markup_number.to!int : 0);
diff --git a/src/sdp/meta/object_setter.d b/src/sdp/meta/object_setter.d
index 48bef54..805afd3 100644
--- a/src/sdp/meta/object_setter.d
+++ b/src/sdp/meta/object_setter.d
@@ -23,6 +23,9 @@ template ObjectSetter() {
     string                 is_a                         = "";
     string                 text                         = "";
     string                 obj_cite_number              = "";
+    string                 obj_cite_number_non          = "";
+    string                 obj_cite_number_bkidx        = "";
+    int                    obj_cite_number_type         = 0;
     string[]               anchor_tags                  = [];
     int                    indent_base                  = 0;
     int                    indent_hang                  = 0;
-- 
cgit v1.2.3