From 03e895b71544b10be9c12f6a8766ae4c02cea89c Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph.amissah@gmail.com>
Date: Wed, 6 May 2020 10:22:33 -0400
Subject: doc abstraction, pith replaces obj_type_status

- instructions sequence for headings & verse
---
 src/doc_reform/meta/metadoc_from_src.d | 180 +++++++++++++++------------------
 1 file changed, 83 insertions(+), 97 deletions(-)

(limited to 'src')

diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d
index d976b60..9817fac 100644
--- a/src/doc_reform/meta/metadoc_from_src.d
+++ b/src/doc_reform/meta/metadoc_from_src.d
@@ -21,17 +21,13 @@ template docAbstraction() {
   mixin ObjectSetter;
   mixin InternalMarkup;
   mixin spineRgxIn;
+                                                                                /+ ↓ abstraction struct init +/
   @safe static auto eN() {
     struct _e {
       enum bi {
         off,
         on,
       }
-      enum tri {
-        off,
-        on,
-        closing,
-      }
       enum ocn {
         off,
         on,
@@ -78,7 +74,6 @@ template docAbstraction() {
     }
     return _e();
   }
-                                                                                /+ ↓ abstraction struct init +/
   /+ initialize +/
   ObjGenericComposite[] the_table_of_contents_section;
   ObjGenericComposite[] the_document_head_section, the_document_body_section, the_bibliography_section, the_glossary_section, the_blurb_section;
@@ -431,18 +426,18 @@ template docAbstraction() {
       "quote"             : 0,
       "images"            : 0,
     ];
-    auto obj_type_status = flags_type_init;
-    int[string] pith = [
-      "ocn"                       : 1,
-      "section"                   : 0,
-      "txt_is"                    : 0,
-      "block_is"                  : 0,
-      "block_state"               : 0,
-      "block_delim"               : 0,
-      "obj"                       : 0,
-      "dummy_heading_status"      : 0,
-      "no_ocn_multiple_objects"   : 0,
-      "heading_multiple_objects"  : 0,
+    uint[string] pith = [
+      "ocn"                            : 1,
+      "section"                        : 0,
+      "txt_is"                         : 0,
+      "block_is"                       : 0,
+      "block_state"                    : 0,
+      "block_delim"                    : 0,
+      "make_headings"                  : 0,
+      "dummy_heading_status"           : 0,
+      "dummy_heading_multiple_objects" : 0,
+      "no_ocn_multiple_objects"        : 0,
+      "verse_new"                      : 0,
     ];
     string[string] object_number_poem = [
       "start" : "",
@@ -877,10 +872,10 @@ template docAbstraction() {
             an_object = line.flow_txt_block_block(an_object, pith);
             continue;
           } else if (pith["block_is"]    == eN.blk_is.poem) {
-            an_object = line.flow_txt_block_poem(an_object, obj_type_status, pith, cntr, object_number_poem, conf_make_meta, tag_in_seg);
+            an_object = line.flow_txt_block_poem(an_object, pith, cntr, object_number_poem, conf_make_meta, tag_in_seg);
             continue;
           } else if (pith["block_is"]    == eN.blk_is.table) {
-            an_object = line.flow_txt_block_table(an_object, obj_type_status, pith, conf_make_meta);
+            an_object = line.flow_txt_block_table(an_object, pith, conf_make_meta);
             continue;
           }
         } else {                                                                /+ not within a block group +/
@@ -895,7 +890,7 @@ template docAbstraction() {
               processing.remove("verse");
               object_number_poem["start"] = obj_cite_digits.object_number.to!string;
             }
-            line.flow_txt_block_start(obj_type_status, pith, dochas, object_number_poem);
+            line.flow_txt_block_start(pith, dochas, object_number_poem);
             continue;
           } else if (!line.empty) {                                             /+ line not empty +/
                                                                                 /+ non blocks (headings, paragraphs) & closed blocks +/
@@ -905,7 +900,7 @@ template docAbstraction() {
             );
             assert(
               (pith["block_state"] == eN.blk_state.off)
-              || (pith["block_state"] == eN.tri.closing),
+              || (pith["block_state"] == eN.blk_state.closing),
               "code block status: none or closed"
             );
             if (pith["block_state"] == eN.blk_state.closing) {
@@ -947,15 +942,15 @@ template docAbstraction() {
                 && pith["txt_is"] == eN.txt_is.off
               ) {                             /+ heading or para but neither flag nor line exists +/
                 if ((conf_make_meta.make.headings.length > 2)
-                && (obj_type_status["make_headings"] == eN.bi.off)) {                      /+ heading found +/
-                  heading_match_str = line.flow_heading_found_(heading_match_str, conf_make_meta.make.headings, heading_match_rgx, obj_type_status, pith);
+                && (pith["make_headings"] == eN.bi.off)) {                      /+ heading found +/
+                  heading_match_str = line.flow_heading_found_(heading_match_str, conf_make_meta.make.headings, heading_match_rgx, pith);
                 }
-                if (obj_type_status["make_headings"] == eN.bi.on
+                if (pith["make_headings"] == eN.bi.on
                   && (line_occur["para"] == eN.bi.off
                   && line_occur["heading"] == eN.bi.off)
                   && pith["txt_is"] == eN.txt_is.off
                 ) {                           /+ heading make set +/
-                  line = line.flow_heading_make_set_(line_occur, heading_match_rgx, obj_type_status, pith);
+                  line = line.flow_heading_make_set_(line_occur, heading_match_rgx, pith);
                 }
                 /+ TODO node info: all headings identified at this point,
                    - extract node info here??
@@ -971,7 +966,6 @@ template docAbstraction() {
                     an_object_key,
                     lv,
                     collapsed_lev,
-                    obj_type_status,
                     pith,
                     conf_make_meta,
                   );
@@ -999,7 +993,7 @@ template docAbstraction() {
                 ++line_occur["para"];
               }
             }
-          } else if (pith["block_state"] == eN.tri.closing) {            /+ line empty, with blocks flag +/
+          } else if (pith["block_state"] == eN.blk_state.closing) {             /+ line empty, with blocks flag +/
             an_object = line.flow_block_flag_line_empty_(
               an_object,
               bookindex_extract_hash,
@@ -2499,40 +2493,40 @@ template docAbstraction() {
   @system void flow_common_reset_()(
     return ref int[string]     line_occur,
     return ref string[string]  an_object,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
   ) {
     line_occur["heading"]      = eN.bi.off;
     line_occur["para"]         = eN.bi.off;
     pith["txt_is"]             = eN.txt_is.off;
     an_object                  = an_object.object_reset;
   }
-  @safe static int[string] _check_ocn_status_()(
+  @safe static uint[string] _check_ocn_status_()(
     char[]       line,
-    int[string]  pith,
+    uint[string] pith,
   ) {
     static auto rgx = RgxI();
     if (!(line.empty)) {
-      if (pith["no_ocn_multiple_objects"] == eN.ocn.off) {
+      if (pith["no_ocn_multiple_objects"] == eN.bi.off) {
         /+ not multi-line object, check whether object_number is on or turned off +/
         if (line.matchFirst(rgx.object_number_block_marks)) {                      /+ switch off object_number +/
           if (line.matchFirst(rgx.object_number_off_block)) {
-            pith["no_ocn_multiple_objects"] = eN.ocn.on;
-            pith["ocn"] = eN.ocn.off;
+            pith["no_ocn_multiple_objects"]             = eN.bi.on;
+            pith["ocn"]                                 = eN.ocn.off;
             debug(ocnoff) {
               writeln(line);
             }
           }
           if (line.matchFirst(rgx.object_number_off_block_dummy_heading)) {
-            pith["no_ocn_multiple_objects"]  = eN.ocn.on;
-            pith["heading_multiple_objects"] = eN.bi.on;
-            pith["ocn"]                      = eN.ocn.off;
+            pith["no_ocn_multiple_objects"]             = eN.bi.on;
+            pith["dummy_heading_multiple_objects"]      = eN.bi.on;
+            pith["ocn"]                                 = eN.ocn.off;
             debug(ocnoff) {
               writeln(line);
             }
           }
-        } else if (pith["no_ocn_multiple_objects"] == eN.ocn.off) {
+        } else if (pith["no_ocn_multiple_objects"] == eN.bi.off) {
             pith["dummy_heading_status"]     = eN.bi.off;
-            if (pith["heading_multiple_objects"]) {
+            if (pith["dummy_heading_multiple_objects"]) {
               pith["dummy_heading_status"] = eN.bi.on;
             }
             if (line.matchFirst(rgx.object_number_off)) {
@@ -2547,9 +2541,9 @@ template docAbstraction() {
           } else {
             pith["ocn"] = pith["no_ocn_multiple_objects"];
           }
-      } else if (pith["no_ocn_multiple_objects"] == eN.ocn.on) {
+      } else if (pith["no_ocn_multiple_objects"] == eN.bi.on) {
         if (line.matchFirst(rgx.object_number_off_block_close)) {
-          pith["no_ocn_multiple_objects"]    = eN.ocn.off;
+          pith["no_ocn_multiple_objects"]    = eN.bi.off;
           pith["ocn"]                        = eN.ocn.on;
           pith["dummy_heading_status"]       = eN.bi.off;
           debug(ocnoff) {
@@ -2602,8 +2596,7 @@ template docAbstraction() {
   }
   @safe void flow_txt_block_start()(
                char[]         line,
-    return ref int[string]    obj_type_status,
-    return ref int[string]    pith,
+    return ref uint[string]   pith,
     return ref uint[string]   dochas,
     return ref string[string] object_number_poem
   ) {
@@ -2637,7 +2630,7 @@ template docAbstraction() {
       pith["block_is"]       = eN.blk_is.poem;
       pith["block_state"]    = eN.blk_state.on;
       pith["block_delim"]    = eN.blk_delim.curly;
-      obj_type_status["verse_new"]  = eN.bi.on;
+      pith["verse_new"]  = eN.bi.on;
     } else if (auto m = line.matchFirst(rgx.block_curly_group_open)) {
       dochas["group"]++;
       an_object["syntax"]            = "";
@@ -2657,7 +2650,7 @@ template docAbstraction() {
       an_object["syntax"]            = "";
       an_object["attrib"]            = (m["attrib"]) ? m["attrib"].to!string : "";
       an_object["lang"]              = (m["lang"]) ? m["lang"].to!string : "";
-      debug(block) {                             // block (curly) open
+      debug(block) {
         writefln(
           "* [block curly] %s",
           line
@@ -2671,7 +2664,7 @@ template docAbstraction() {
       an_object["syntax"]            = "";
       an_object["attrib"]            = m["attrib"].to!string;
       an_object["lang"]              = m["lang"].to!string;
-      debug(quote) {                             // quote (curly) open
+      debug(quote) {
         writefln(
           "* [quote curly] %s",
           line
@@ -2705,7 +2698,7 @@ template docAbstraction() {
       an_object["lang"]              = "";
       an_object["attrib"]            = (m["attrib"]) ? m["attrib"].to!string : "";
       an_object["syntax"]            = (m["syntax"]) ? m["syntax"].to!string : "";
-      debug(codetic) {                              // code (tic) open
+      debug(codetic) {
         writefln(
           "* [code tic] %s",
           line
@@ -2719,7 +2712,7 @@ template docAbstraction() {
       an_object["syntax"]            = "";
       an_object["attrib"]            = (m["attrib"]) ? m["attrib"].to!string : "";
       an_object["lang"]              = (m["lang"]) ? m["lang"].to!string : "";
-      debug(poem) {                              // poem (tic) open
+      debug(poem) {
         writefln(
           "* [poem tic] %s",
           line
@@ -2729,13 +2722,13 @@ template docAbstraction() {
       pith["block_is"]       = eN.blk_is.poem;
       pith["block_state"]    = eN.blk_state.on;
       pith["block_delim"]    = eN.blk_delim.tic;
-      obj_type_status["verse_new"]  = eN.bi.on;
+      pith["verse_new"]  = eN.bi.on;
     } else if (auto m = line.matchFirst(rgx.block_tic_group_open)) {
       dochas["group"]++;
       an_object["syntax"]            = "";
       an_object["attrib"]            = (m["attrib"]) ? m["attrib"].to!string : "";
       an_object["lang"]              = (m["lang"]) ? m["lang"].to!string : "";
-      debug(group) {                             // group (tic) open
+      debug(group) {
         writefln(
           "* [group tic] %s",
           line
@@ -2749,7 +2742,7 @@ template docAbstraction() {
       an_object["syntax"]            = "";
       an_object["attrib"]            = (m["attrib"]) ? m["attrib"].to!string : "";
       an_object["lang"]              = (m["lang"]) ? m["lang"].to!string : "";
-      debug(block) {                             // block (tic) open
+      debug(block) {
         writefln(
           "* [block tic] %s",
           line
@@ -2763,7 +2756,7 @@ template docAbstraction() {
       an_object["syntax"]            = "";
       an_object["attrib"]            = m["attrib"].to!string;
       an_object["lang"]              = m["lang"].to!string;
-      debug(quote) {                             // quote (tic) open
+      debug(quote) {
         writefln(
           "* [quote tic] %s",
           line
@@ -2790,7 +2783,7 @@ template docAbstraction() {
   @safe string[string] flow_txt_block_quote()(
                char[]          line,
                string[string]  an_object,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
   ) {
     static auto rgx = RgxI();
     if (pith["block_is"] == eN.blk_is.quote){
@@ -2831,7 +2824,7 @@ template docAbstraction() {
   @safe string[string] flow_txt_block_group()(
                char[]          line,
                string[string]  an_object,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
   ) {
     static auto rgx = RgxI();
     if (pith["block_is"] == eN.blk_is.group) {
@@ -2872,7 +2865,7 @@ template docAbstraction() {
   @safe string[string] flow_txt_block_block()(
                char[]          line,
                string[string]  an_object,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
   ) {
     static auto rgx = RgxI();
     if (pith["block_is"] == eN.blk_is.block) {
@@ -2913,8 +2906,7 @@ template docAbstraction() {
   @safe string[string]  flow_txt_block_poem(CMM)(
                char[]          line,
                string[string]  an_object,
-    return ref int[string]     obj_type_status,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
     return ref int             cntr,
                string[string]  object_number_poem,
                CMM             conf_make_meta,
@@ -2985,15 +2977,15 @@ template docAbstraction() {
           pith["block_delim"] = eN.blk_delim.off;
         } else {
           processing["verse"] ~= line ~= "\n";
-          if (obj_type_status["verse_new"] == eN.bi.on) {
+          if (pith["verse_new"] == eN.bi.on) {
             obj_cite_digits = ocn_emit(pith["ocn"]);
-            obj_type_status["verse_new"] = eN.bi.off;
+            pith["verse_new"] = eN.bi.off;
           } else if (line.matchFirst(rgx.newline_eol_delimiter_only)) {
             processing["verse"] = processing["verse"].stripRight;
-            verse_line = eN.tri.off;
-            obj_type_status["verse_new"] = eN.bi.on;
+            verse_line = eN.bi.off;
+            pith["verse_new"] = eN.bi.on;
           }
-          if (obj_type_status["verse_new"] == eN.bi.on) {
+          if (pith["verse_new"] == eN.bi.on) {
             verse_line=1;
             an_object[an_object_key] = processing["verse"];
             debug(poem) {
@@ -3093,15 +3085,15 @@ template docAbstraction() {
           pith["block_delim"] = eN.blk_delim.off;
         } else {
           processing["verse"] ~= line ~= "\n";
-          if (obj_type_status["verse_new"] == eN.bi.on) {
+          if (pith["verse_new"] == eN.bi.on) {
             obj_cite_digits = ocn_emit(pith["ocn"]);
-            obj_type_status["verse_new"] = eN.bi.off;
+            pith["verse_new"] = eN.bi.off;
           } else if (line.matchFirst(rgx.newline_eol_delimiter_only)) {
             processing["verse"] = processing["verse"].stripRight;
-            obj_type_status["verse_new"] = eN.bi.on;
-            verse_line = eN.tri.off;
+            pith["verse_new"] = eN.bi.on;
+            verse_line = eN.bi.off;
           }
-          if (obj_type_status["verse_new"] == eN.bi.on) {
+          if (pith["verse_new"] == eN.bi.on) {
             verse_line=1;
             an_object[an_object_key] = processing["verse"];
             debug(poem) {
@@ -3158,7 +3150,7 @@ template docAbstraction() {
   @safe void flow_txt_block_code()(
                char[]          line,
     return ref string[string]  an_object,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
   ) {
     static auto rgx = RgxI();
     if ( pith["block_is"] == eN.blk_is.code) {
@@ -3202,8 +3194,7 @@ template docAbstraction() {
   @system string[string] flow_txt_block_table(CMM)(
                char[]          line,
                string[string]  an_object,
-    return ref int[string]     obj_type_status,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
     return ref CMM             conf_make_meta,
   ) {
     static auto rgx = RgxI();
@@ -3280,11 +3271,11 @@ template docAbstraction() {
     return btm[abr];
   }
   @system void flow_txt_block_biblio(
-    char[]                 line,
-    return ref int[string] pith,
-    return ref int         bib_entry,
-    return ref string      biblio_entry_str_json,
-    return ref string[]    biblio_arr_json,
+    char[]                  line,
+    return ref uint[string] pith,
+    return ref int          bib_entry,
+    return ref string       biblio_entry_str_json,
+    return ref string[]     biblio_arr_json,
   ) {
     mixin spineBiblio;
     auto jsn = BibJsnStr();
@@ -3318,7 +3309,7 @@ template docAbstraction() {
           }
           biblio_entry_str_json = jsn.biblio_entry_tags_jsonstr;
         }
-      } else { // CHECK ERROR
+      } else {
         writeln("?? 2. ERROR ", biblio_entry_str_json, "??");
         biblio_entry_str_json = "";
       }
@@ -3406,7 +3397,7 @@ template docAbstraction() {
     return ref N                     obj_cite_digits,
     return ref ObjGenericComposite   _comp_obj_heading,
     return ref int                   cntr,
-    return ref int[string]           pith,
+    return ref uint[string]          pith,
     CMM                              conf_make_meta
   ) {
     comp_obj_block = comp_obj_block.init;
@@ -3449,7 +3440,7 @@ template docAbstraction() {
     return ref N                        obj_cite_digits,
     return ref ObjGenericComposite      _comp_obj_heading,
     return ref int                      cntr,
-    return ref int[string]              pith,
+    return ref uint[string]             pith,
     string[string]                      object_number_poem,
     CMM                                 conf_make_meta,
     Ts                                  tag_in_seg,
@@ -3761,7 +3752,7 @@ template docAbstraction() {
                char[]          line,
                string[string]  an_object,
     return ref string          book_idx_tmp,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
                B               opt_action,
   ) {
     static auto rgx = RgxI();
@@ -3812,12 +3803,11 @@ template docAbstraction() {
                string[string]        heading_match_str,
                string[]              _make_unmarked_headings,
     return ref Regex!(char)[string]  heading_match_rgx,
-    return ref int[string]           obj_type_status,
-    return ref int[string]           pith,
+    return ref uint[string]          pith,
   ) {
     static auto rgx = RgxI();
     if ((_make_unmarked_headings.length > 2)
-    && (obj_type_status["make_headings"] == eN.bi.off)) {                        /+ headings found +/
+    && (pith["make_headings"] == eN.bi.off)) {                        /+ headings found +/
       debug(headingsfound) {
         writeln(_make_unmarked_headings);
       }
@@ -3885,7 +3875,7 @@ template docAbstraction() {
       default:
         break;
       }
-      obj_type_status["make_headings"] = eN.bi.on;
+      pith["make_headings"] = eN.bi.on;
     }
     return heading_match_str;
   }
@@ -3893,10 +3883,9 @@ template docAbstraction() {
                char[]                line,
                int[string]           line_occur,
     return ref Regex!(char)[string]  heading_match_rgx,
-    return ref int[string]           obj_type_status,
-    return ref int[string]           pith,
+    return ref uint[string]          pith,
   ) {
-    if (obj_type_status["make_headings"] == eN.bi.on
+    if (pith["make_headings"] == eN.bi.on
       && (line_occur["para"] == eN.bi.off
       && line_occur["heading"] == eN.bi.off)
       && pith["txt_is"] == eN.txt_is.off
@@ -3953,8 +3942,7 @@ template docAbstraction() {
     return ref string          an_object_key,
     return ref int[string]     lv,
     return ref int[string]     collapsed_lev,
-    return ref int[string]     obj_type_status,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
     return ref CMM             conf_make_meta,
   ) {
     static auto rgx = RgxI();
@@ -4103,7 +4091,7 @@ template docAbstraction() {
     return ref string          an_object_key,
     return ref int[string]     indent,
     return ref bool            bullet,
-    return ref int[string]     pith,
+    return ref uint[string]    pith,
     return ref int[string]     line_occur,
   ) {
     static auto rgx = RgxI();
@@ -4696,8 +4684,8 @@ template docAbstraction() {
         if (_new_doc) {
           anchor_tag = "";
         }
-        obj_txt["munge"]=_configured_auto_heading_numbering_and_segment_anchor_tags(obj_txt["munge"], obj_, conf_make_meta, _new_doc);
-        obj_txt["munge"]=_make_segment_anchor_tags_if_none_provided(obj_txt["munge"], obj_["lev"], _new_doc);
+        obj_txt["munge"] = _configured_auto_heading_numbering_and_segment_anchor_tags(obj_txt["munge"], obj_, conf_make_meta, _new_doc);
+        obj_txt["munge"] = _make_segment_anchor_tags_if_none_provided(obj_txt["munge"], obj_["lev"], _new_doc);
         if (auto m = obj_txt["munge"].match(rgx.heading_anchor_tag)) {
           anchor_tag = m.captures[1];
         } else if (obj_["lev"] == "1") {
@@ -5208,10 +5196,8 @@ template docAbstraction() {
         oa_j.object["object_number"]          = _comp_obj_heading.metainfo.ocn;
         oa_j.object["lev_markup_number"]      = _comp_obj_heading.metainfo.heading_lev_markup;
         oa_j.object["lev_collapsed_number"]   = _comp_obj_heading.metainfo.heading_lev_collapsed;
-        oa_j.object["heading_ptr"]
-          = _comp_obj_heading.ptr.heading;
-        oa_j.object["doc_object_ptr"]
-          = _comp_obj_heading.ptr.doc_object;
+        oa_j.object["heading_ptr"]            = _comp_obj_heading.ptr.heading;
+        oa_j.object["doc_object_ptr"]         = _comp_obj_heading.ptr.doc_object;
       }
       oa_j.object["parent_object_number"]     = _comp_obj_heading.metainfo.parent_ocn;
       oa_j.object["parent_lev_markup_number"] = _comp_obj_heading.metainfo.parent_lev_markup;
@@ -5256,7 +5242,7 @@ template docAbstraction() {
           ) {
             main_term = m.captures[1].strip;
             object_number_offset = m.captures[2].to!int;
-            object_number_endpoint=(obj_cite_digits.object_number + object_number_offset);
+            object_number_endpoint = (obj_cite_digits.object_number + object_number_offset);
             object_numbers ~= (obj_cite_digits.object_number.to!string
             ~ "-" ~ object_number_endpoint.to!string);
           } else {
@@ -5274,7 +5260,7 @@ template docAbstraction() {
               if (auto m = sub_terms_bits.match(rgx.bi_term_and_object_numbers_match)) {
                 sub_term = m.captures[1].strip;
                 object_number_offset = m.captures[2].to!int;
-                object_number_endpoint=(obj_cite_digits.object_number + object_number_offset);
+                object_number_endpoint = (obj_cite_digits.object_number + object_number_offset);
                 object_numbers ~= (obj_cite_digits.object_number.to!string
                 ~ " - " ~ object_number_endpoint.to!string);
               } else {
-- 
cgit v1.2.3