diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/doc_reform/meta/metadoc.d | 5 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc_from_src.d | 2460 | 
2 files changed, 1465 insertions, 1000 deletions
| diff --git a/src/doc_reform/meta/metadoc.d b/src/doc_reform/meta/metadoc.d index cefee5b..a577530 100644 --- a/src/doc_reform/meta/metadoc.d +++ b/src/doc_reform/meta/metadoc.d @@ -132,9 +132,8 @@ template spineAbstraction() {        _manifest,        true,      ); -    static assert(da.length==2); -    auto doc_abstraction = da[docAbst.doc_abstract_obj]; /+ head ~ toc ~ body ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~ blurb; +/ -    auto _doc_has_struct = da[docAbst.doc_has]; +    auto doc_abstraction = da.document_the; +    auto _doc_has_struct = da.doc_has;      if ((_opt_action.debug_do)        || (_opt_action.debug_do_stages)      ) { diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d index 59cbc0b..620f884 100644 --- a/src/doc_reform/meta/metadoc_from_src.d +++ b/src/doc_reform/meta/metadoc_from_src.d @@ -126,7 +126,17 @@ template docAbstraction() {    }    /+ initialize +/    ObjGenericComposite[] the_document_toc_section, the_document_head_section, the_document_body_section, the_document_bibliography_section, the_document_glossary_section, the_document_blurb_section, the_document_xml_dom_tail_section; -  string[string] an_object, processing; +  struct _theDoc { +    ObjGenericComposite[] toc; +    ObjGenericComposite[] head; +    ObjGenericComposite[] body; +    ObjGenericComposite[] bibliography; +    ObjGenericComposite[] glossary; +    ObjGenericComposite[] bookindex; +    ObjGenericComposite[] blurb; +    ObjGenericComposite[] endnotes; +  } +  string[string] an_object, processing, object_notes;    string an_object_key;    string[] anchor_tags;    string anchor_tag; @@ -605,708 +615,872 @@ template docAbstraction() {          writeln("substitution to make: ", conf_make_meta.make.italics[Substitute.markup]);        }      } -                                                                                /+ ↓ ↻ loop markup document/text line by line +/ -    srcDocLoop: -    foreach (line; markup_sourcefile_content) {                                 /+ ↓ markup document/text line by line +/ -                                                                                // "line" variable can be empty but should never be null -      /+ scope +/ -      scope(exit) { } -      scope(failure) { -        stderr.writefln( -          "\n%s\n%s\n\n%s:%s\nFAILED while processing the file: ❮❮ %s ❯❯ on line with text:\n%s\n", -          __MODULE__, __FUNCTION__, -          __FILE__, __LINE__, -          manifested.src.filename, line, -        ); -      } -      debug(source) { -        writeln(line); -      } -      debug(srclines) { -        if (!line.empty) { -          writefln("* %s", line); +    auto loopMarkupSrcByLine( +      char[][]         markup_sourcefile_content, +      string[string]   an_object, +      uint[string]     pith, +    ) { +      struct _loopMarkupSrcByLineStruct { +        ObjGenericComposite[] toc; +        ObjGenericComposite[] body; +        ObjGenericComposite[] glossary; +        ObjGenericComposite[] blurb; +        string[string]        object_notes; +        string[][string]      segnames; +      } +      _loopMarkupSrcByLineStruct ret; +      srcDocLoopLineByLine_: +      foreach (line; markup_sourcefile_content) {                                 /+ ↓ markup document/text line by line +/ +                                                                                  // "line" variable can be empty but should never be null +        /+ scope +/ +        scope(exit) { } +        scope(failure) { +          stderr.writefln( +            "\n%s\n%s\n\n%s:%s\nFAILED while processing the file: ❮❮ %s ❯❯ on line with text:\n%s\n", +            __MODULE__, __FUNCTION__, +            __FILE__, __LINE__, +            manifested.src.filename, line, +          );          } -      } -      if (!line.empty) { -        pith = line._check_ocn_status_(pith); -      } -      if ( pith["block_is"] == eN.blk_is.code -        && pith["block_state"] == eN.blk_state.on -      ) { -        /+ block object: code +/ -        line.flow_txt_block_code(an_object, pith); -        continue; -      } else if (!matchFirst(line, rgx.skip_from_regular_parse)) {              /+ object other than "code block" object +/ -                                                                                /+ (includes regular text paragraph, headings & blocks other than code) +/ -                                                                                /+ heading, glossary, blurb, poem, group, block, quote, table +/ -        line = line.inline_markup_faces; // by text line (rather than by text object), linebreaks in para problematic -        if (line.matchFirst(rgx.heading_biblio) -        || (pith["section"] == eN.sect.bibliography -          && ((!(line.matchFirst(rgx.heading_glossary))) -          && (!(line.matchFirst(rgx.heading_blurb))) -          && (!(line.matchFirst(rgx.heading))) -          && (!(line.matchFirst(rgx.comment))))) +        debug(source) { +          writeln(line); +        } +        debug(srclines) { +          if (!line.empty) { writefln("* %s", line); } +        } +        if (!line.empty) { pith = line._check_ocn_status_(pith); } +        if ( pith["block_is"] == eN.blk_is.code +          && pith["block_state"] == eN.blk_state.on          ) { -          pith["section"] = eN.sect.bibliography; -          if (opt_action.backmatter && opt_action.section_biblio) { -            line.flow_txt_block_biblio(pith, bib_entry, biblio_entry_str_json, biblio_arr_json); -            debug(bibliobuild) { -              writeln("-  ", biblio_entry_str_json); -              writeln("-> ", biblio_arr_json.length); -            } +          /+ block object: code +/ +          { +            auto _get = line.txt_by_line_block_code(an_object, pith); +            an_object = _get.this_object; +            pith      = _get.pith;            }            continue; -        } else if (line.matchFirst(rgx.heading_glossary) -        || (pith["section"] == eN.sect.glossary -          && ((!(line.matchFirst(rgx.heading_biblio))) -          && (!(line.matchFirst(rgx.heading_blurb))) -          && (!(line.matchFirst(rgx.heading))) -          && (!(line.matchFirst(rgx.comment))))) -        ) { -          /+ within section (block object): glossary +/ -          debug(glossary) { -            writeln(__LINE__); -            writeln(line); -          } -          pith["section"] = eN.sect.glossary; -          if (opt_action.backmatter && opt_action.section_glossary) { -            indent = [ -              "hang_position" : 0, -              "base_position" : 0, -            ]; -            bullet = false; -            pith["txt_is"]           = eN.txt_is.para; -            line_occur["para"]       = eN.bi.off; -            an_object_key = "glossary_nugget"; -            if (line.matchFirst(rgx.heading_glossary)) { +        } else if (!matchFirst(line, rgx.skip_from_regular_parse)) {              /+ object other than "code block" object +/ +                                                                                  /+ (includes regular text paragraph, headings & blocks other than code) +/ +                                                                                  /+ heading, glossary, blurb, poem, group, block, quote, table +/ +          line = line.inline_markup_faces; // by text line (rather than by text object), linebreaks in para problematic +          if (line.matchFirst(rgx.heading_biblio) +          || (pith["section"] == eN.sect.bibliography +            && ((!(line.matchFirst(rgx.heading_glossary))) +            && (!(line.matchFirst(rgx.heading_blurb))) +            && (!(line.matchFirst(rgx.heading))) +            && (!(line.matchFirst(rgx.comment))))) +          ) { +            pith["section"] = eN.sect.bibliography; +            if (opt_action.backmatter && opt_action.section_biblio) {                { -                comp_obj_heading_                                = comp_obj_heading_.init; -                comp_obj_heading_.metainfo.is_of_part            = "backmatter"; -                comp_obj_heading_.metainfo.is_of_section         = "glossary"; -                comp_obj_heading_.metainfo.is_of_type            = "para"; -                comp_obj_heading_.metainfo.is_a                  = "heading"; -                comp_obj_heading_.text                           = "Glossary"; -                comp_obj_heading_.metainfo.ocn                   = 0; -                comp_obj_heading_.metainfo.identifier            = ""; -                comp_obj_heading_.metainfo.dummy_heading         = false; -                comp_obj_heading_.metainfo.object_number_off     = false; -                comp_obj_heading_.metainfo.object_number_type    = 0; -                comp_obj_heading_.tags.segment_anchor_tag_epub   = "_part_glossary"; -                comp_obj_heading_.tags.anchor_tag_html           = comp_obj_heading_.tags.segment_anchor_tag_epub; -                comp_obj_heading_.tags.in_segment_html           = "glossary"; -                comp_obj_heading_.tags.anchor_tags               = ["section_glossary"]; -                comp_obj_heading_.metainfo.heading_lev_markup    = 1; -                comp_obj_heading_.metainfo.heading_lev_collapsed = 1; -                comp_obj_heading_.metainfo.parent_ocn            = 1; -                comp_obj_heading_.metainfo.parent_lev_markup     = 0; -                comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 0, 0, 0, 0]; -                comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 0, 0, 0, 0, 0, 0]; -                the_document_glossary_section                    ~= comp_obj_heading_; -                tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; -                tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +                auto _get = line.txt_by_line_block_biblio(pith, bib_entry, biblio_entry_str_json, biblio_arr_json); +                { +                  pith                  = _get.pith; +                  bib_entry             = _get.bib_entry; +                  biblio_entry_str_json = _get.biblio_entry_str_json; +                  biblio_arr_json       = _get.biblio_arr_json; +                }                } -              { -                comp_obj_heading_                                = comp_obj_heading_.init; -                comp_obj_heading_.metainfo.is_of_part            = "backmatter"; -                comp_obj_heading_.metainfo.is_of_section         = "glossary"; -                comp_obj_heading_.metainfo.is_of_type            = "para"; -                comp_obj_heading_.metainfo.is_a                  = "heading"; -                comp_obj_heading_.text                           = "Glossary"; -                comp_obj_heading_.metainfo.ocn                   = 0; -                comp_obj_heading_.metainfo.identifier            = ""; -                comp_obj_heading_.metainfo.dummy_heading         = true; -                comp_obj_heading_.metainfo.object_number_off     = true; -                comp_obj_heading_.metainfo.object_number_type    = 0; -                comp_obj_heading_.tags.segment_anchor_tag_epub   = "glossary"; -                comp_obj_heading_.tags.anchor_tag_html           = comp_obj_heading_.tags.segment_anchor_tag_epub; -                comp_obj_heading_.tags.in_segment_html           = comp_obj_heading_.tags.anchor_tag_html; -                comp_obj_heading_.metainfo.heading_lev_markup    = 4; -                comp_obj_heading_.metainfo.heading_lev_collapsed = 2; -                comp_obj_heading_.metainfo.parent_ocn            = 1; -                comp_obj_heading_.metainfo.parent_lev_markup     = 0; -                comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 1, 0, 0, 0]; -                comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 1, 0, 0, 0, 0, 0]; -                comp_obj_heading_.tags.anchor_tags               = ["glossary"]; -                the_document_glossary_section                    ~= comp_obj_heading_; -                tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; -                tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +              debug(bibliobuild) { +                writeln("-  ", biblio_entry_str_json); +                writeln("-> ", biblio_arr_json.length);                } -            } else { -              an_object = line.flow_para_match_(an_object, an_object_key, indent, bullet, pith, line_occur); -              comp_obj_para                               = comp_obj_para.init; -              comp_obj_para.metainfo.is_of_part           = "backmatter"; -              comp_obj_para.metainfo.is_of_section        = "glossary"; -              comp_obj_para.metainfo.is_of_type           = "para"; -              comp_obj_para.metainfo.is_a                 = "glossary"; -              comp_obj_para.text                          = links_and_images(line.to!string.strip).replaceFirst(rgx.para_attribs, ""); -              comp_obj_para.metainfo.ocn                  = 0; -              comp_obj_para.metainfo.identifier           = ""; -              comp_obj_para.metainfo.object_number_off    = true; -              comp_obj_para.metainfo.object_number_type   = 0; -              comp_obj_para.attrib.indent_hang            = indent["hang_position"]; -              comp_obj_para.attrib.indent_base            = indent["base_position"]; -              comp_obj_para.attrib.bullet                 = bullet; -              the_document_glossary_section               ~= comp_obj_para;              } -            pith["ocn"] = eN.ocn.on; -          } -          continue; -        } else if (line.matchFirst(rgx.heading_blurb) -        || (pith["section"] == eN.sect.blurb -          && ((!(line.matchFirst(rgx.heading_glossary))) -          && (!(line.matchFirst(rgx.heading_biblio))) -          && (!(line.matchFirst(rgx.heading))) -          && (!(line.matchFirst(rgx.comment))))) -        ) { -          pith["section"] = eN.sect.blurb; -          debug(blurb) { -            writeln(__LINE__); -            writeln(line); -          } -          if (opt_action.backmatter && opt_action.section_blurb) { -            indent = [ -              "hang_position" : 0, -              "base_position" : 0, -            ]; -            bullet = false; -            if (auto m = line.matchFirst(rgx.para_indent)) { -              debug(paraindent) { -                writeln(line); -              } -              indent["hang_position"] = (m["indent"]).to!int; -              indent["base_position"] = (m["indent"]).to!int; -            } else if (line.matchFirst(rgx.para_bullet)) { -              debug(parabullet) { -                writeln(line); -              } -              bullet = true; -            } else if (auto m = line.matchFirst(rgx.para_indent_hang)) { -              debug(paraindenthang) { -                writeln(line); -              } +            continue; +          } else if (line.matchFirst(rgx.heading_glossary) +          || (pith["section"] == eN.sect.glossary +            && ((!(line.matchFirst(rgx.heading_biblio))) +            && (!(line.matchFirst(rgx.heading_blurb))) +            && (!(line.matchFirst(rgx.heading))) +            && (!(line.matchFirst(rgx.comment))))) +          ) { +            /+ within section (block object): glossary +/ +            debug(glossary) { +              writeln(__LINE__); +              writeln(line); +            } +            pith["section"] = eN.sect.glossary; +            if (opt_action.backmatter && opt_action.section_glossary) {                indent = [ -                "hang_position" : (m["hang"]).to!int, -                "base_position" : (m["indent"]).to!int, +                "hang_position" : 0, +                "base_position" : 0,                ]; -            } else if (auto m = line.matchFirst(rgx.para_bullet_indent)) { -              debug(parabulletindent) { -                writeln(line); +              bullet = false; +              pith["txt_is"]           = eN.txt_is.para; +              line_occur["para"]       = eN.bi.off; +              an_object_key = "glossary_nugget"; +              if (line.matchFirst(rgx.heading_glossary)) { +                { +                  comp_obj_heading_                                = comp_obj_heading_.init; +                  comp_obj_heading_.metainfo.is_of_part            = "backmatter"; +                  comp_obj_heading_.metainfo.is_of_section         = "glossary"; +                  comp_obj_heading_.metainfo.is_of_type            = "para"; +                  comp_obj_heading_.metainfo.is_a                  = "heading"; +                  comp_obj_heading_.text                           = "Glossary"; +                  comp_obj_heading_.metainfo.ocn                   = 0; +                  comp_obj_heading_.metainfo.identifier            = ""; +                  comp_obj_heading_.metainfo.dummy_heading         = false; +                  comp_obj_heading_.metainfo.object_number_off     = false; +                  comp_obj_heading_.metainfo.object_number_type    = 0; +                  comp_obj_heading_.tags.segment_anchor_tag_epub   = "_part_glossary"; +                  comp_obj_heading_.tags.anchor_tag_html           = comp_obj_heading_.tags.segment_anchor_tag_epub; +                  comp_obj_heading_.tags.in_segment_html           = "glossary"; +                  comp_obj_heading_.tags.anchor_tags               = ["section_glossary"]; +                  comp_obj_heading_.metainfo.heading_lev_markup    = 1; +                  comp_obj_heading_.metainfo.heading_lev_collapsed = 1; +                  comp_obj_heading_.metainfo.parent_ocn            = 1; +                  comp_obj_heading_.metainfo.parent_lev_markup     = 0; +                  comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 0, 0, 0, 0]; +                  comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 0, 0, 0, 0, 0, 0]; +                  the_document_glossary_section                    ~= comp_obj_heading_; +                  tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; +                  tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +                } +                { +                  comp_obj_heading_                                = comp_obj_heading_.init; +                  comp_obj_heading_.metainfo.is_of_part            = "backmatter"; +                  comp_obj_heading_.metainfo.is_of_section         = "glossary"; +                  comp_obj_heading_.metainfo.is_of_type            = "para"; +                  comp_obj_heading_.metainfo.is_a                  = "heading"; +                  comp_obj_heading_.text                           = "Glossary"; +                  comp_obj_heading_.metainfo.ocn                   = 0; +                  comp_obj_heading_.metainfo.identifier            = ""; +                  comp_obj_heading_.metainfo.dummy_heading         = true; +                  comp_obj_heading_.metainfo.object_number_off     = true; +                  comp_obj_heading_.metainfo.object_number_type    = 0; +                  comp_obj_heading_.tags.segment_anchor_tag_epub   = "glossary"; +                  comp_obj_heading_.tags.anchor_tag_html           = comp_obj_heading_.tags.segment_anchor_tag_epub; +                  comp_obj_heading_.tags.in_segment_html           = comp_obj_heading_.tags.anchor_tag_html; +                  comp_obj_heading_.metainfo.heading_lev_markup    = 4; +                  comp_obj_heading_.metainfo.heading_lev_collapsed = 2; +                  comp_obj_heading_.metainfo.parent_ocn            = 1; +                  comp_obj_heading_.metainfo.parent_lev_markup     = 0; +                  comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 1, 0, 0, 0]; +                  comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 1, 0, 0, 0, 0, 0]; +                  comp_obj_heading_.tags.anchor_tags               = ["glossary"]; +                  the_document_glossary_section                    ~= comp_obj_heading_; +                  tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; +                  tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +                } +              } else { +                { +                  auto _get = line.flow_para_match_(an_object, an_object_key, indent, bullet, pith, line_occur); +                  { +                    an_object     = _get.this_object; +                    an_object_key = _get.this_object_key; +                    pith          = _get.pith; +                    indent        = _get.indent; +                    bullet        = _get.bullet; +                    line_occur    = _get.line_occur; +                  } +                } +                comp_obj_para                               = comp_obj_para.init; +                comp_obj_para.metainfo.is_of_part           = "backmatter"; +                comp_obj_para.metainfo.is_of_section        = "glossary"; +                comp_obj_para.metainfo.is_of_type           = "para"; +                comp_obj_para.metainfo.is_a                 = "glossary"; +                comp_obj_para.text                          = links_and_images(line.to!string.strip).replaceFirst(rgx.para_attribs, ""); +                comp_obj_para.metainfo.ocn                  = 0; +                comp_obj_para.metainfo.identifier           = ""; +                comp_obj_para.metainfo.object_number_off    = true; +                comp_obj_para.metainfo.object_number_type   = 0; +                comp_obj_para.attrib.indent_hang            = indent["hang_position"]; +                comp_obj_para.attrib.indent_base            = indent["base_position"]; +                comp_obj_para.attrib.bullet                 = bullet; +                the_document_glossary_section               ~= comp_obj_para;                } +              pith["ocn"] = eN.ocn.on; +            } +            continue; +          } else if (line.matchFirst(rgx.heading_blurb) +          || (pith["section"] == eN.sect.blurb +            && ((!(line.matchFirst(rgx.heading_glossary))) +            && (!(line.matchFirst(rgx.heading_biblio))) +            && (!(line.matchFirst(rgx.heading))) +            && (!(line.matchFirst(rgx.comment))))) +          ) { +            pith["section"] = eN.sect.blurb; +            debug(blurb) { +              writeln(__LINE__); +              writeln(line); +            } +            if (opt_action.backmatter && opt_action.section_blurb) {                indent = [ -                "hang_position" : (m["indent"]).to!int, -                "base_position" : (m["indent"]).to!int, +                "hang_position" : 0, +                "base_position" : 0,                ]; -              bullet = true; -            } -            pith["txt_is"]           = eN.txt_is.para; -            line_occur["para"]       = eN.bi.off; -            an_object_key = "blurb_nugget"; -            if (line.matchFirst(rgx.heading_blurb)) { -              { -                comp_obj_heading_                                              = comp_obj_heading_.init; -                comp_obj_heading_.metainfo.is_of_part                          = "backmatter"; -                comp_obj_heading_.metainfo.is_of_section                       = "blurb"; -                comp_obj_heading_.metainfo.is_of_type                          = "para"; -                comp_obj_heading_.metainfo.is_a                                = "heading"; -                comp_obj_heading_.text                                         = "Blurb"; -                comp_obj_heading_.metainfo.ocn                                 = 0; -                comp_obj_heading_.metainfo.identifier                          = ""; -                comp_obj_heading_.metainfo.dummy_heading                       = false; -                comp_obj_heading_.metainfo.object_number_off                   = false; -                comp_obj_heading_.metainfo.object_number_type                  = 0; -                comp_obj_heading_.tags.segment_anchor_tag_epub                 = "_part_blurb"; -                comp_obj_heading_.tags.anchor_tag_html                         = comp_obj_heading_.tags.segment_anchor_tag_epub; -                comp_obj_heading_.tags.in_segment_html                         = "blurb"; -                comp_obj_heading_.tags.anchor_tags                             = ["section_blurb"]; -                comp_obj_heading_.metainfo.heading_lev_markup                  = 1; -                comp_obj_heading_.metainfo.heading_lev_collapsed               = 1; -                comp_obj_heading_.metainfo.parent_ocn                          = 1; -                comp_obj_heading_.metainfo.parent_lev_markup                   = 0; -                comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 0, 0, 0, 0]; -                comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 0, 0, 0, 0, 0, 0]; -                the_document_blurb_section                                     ~= comp_obj_heading_; -                tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; -                tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +              bullet = false; +              if (auto m = line.matchFirst(rgx.para_indent)) { +                debug(paraindent) { +                  writeln(line); +                } +                indent["hang_position"] = (m["indent"]).to!int; +                indent["base_position"] = (m["indent"]).to!int; +              } else if (line.matchFirst(rgx.para_bullet)) { +                debug(parabullet) { +                  writeln(line); +                } +                bullet = true; +              } else if (auto m = line.matchFirst(rgx.para_indent_hang)) { +                debug(paraindenthang) { +                  writeln(line); +                } +                indent = [ +                  "hang_position" : (m["hang"]).to!int, +                  "base_position" : (m["indent"]).to!int, +                ]; +              } else if (auto m = line.matchFirst(rgx.para_bullet_indent)) { +                debug(parabulletindent) { +                  writeln(line); +                } +                indent = [ +                  "hang_position" : (m["indent"]).to!int, +                  "base_position" : (m["indent"]).to!int, +                ]; +                bullet = true;                } -              { +              pith["txt_is"]           = eN.txt_is.para; +              line_occur["para"]       = eN.bi.off; +              an_object_key = "blurb_nugget"; +              if (line.matchFirst(rgx.heading_blurb)) { +                { +                  comp_obj_heading_                                              = comp_obj_heading_.init; +                  comp_obj_heading_.metainfo.is_of_part                          = "backmatter"; +                  comp_obj_heading_.metainfo.is_of_section                       = "blurb"; +                  comp_obj_heading_.metainfo.is_of_type                          = "para"; +                  comp_obj_heading_.metainfo.is_a                                = "heading"; +                  comp_obj_heading_.text                                         = "Blurb"; +                  comp_obj_heading_.metainfo.ocn                                 = 0; +                  comp_obj_heading_.metainfo.identifier                          = ""; +                  comp_obj_heading_.metainfo.dummy_heading                       = false; +                  comp_obj_heading_.metainfo.object_number_off                   = false; +                  comp_obj_heading_.metainfo.object_number_type                  = 0; +                  comp_obj_heading_.tags.segment_anchor_tag_epub                 = "_part_blurb"; +                  comp_obj_heading_.tags.anchor_tag_html                         = comp_obj_heading_.tags.segment_anchor_tag_epub; +                  comp_obj_heading_.tags.in_segment_html                         = "blurb"; +                  comp_obj_heading_.tags.anchor_tags                             = ["section_blurb"]; +                  comp_obj_heading_.metainfo.heading_lev_markup                  = 1; +                  comp_obj_heading_.metainfo.heading_lev_collapsed               = 1; +                  comp_obj_heading_.metainfo.parent_ocn                          = 1; +                  comp_obj_heading_.metainfo.parent_lev_markup                   = 0; +                  comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 0, 0, 0, 0]; +                  comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 0, 0, 0, 0, 0, 0]; +                  the_document_blurb_section                                     ~= comp_obj_heading_; +                  tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; +                  tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +                } +                { +                  comp_obj_heading_                                              = comp_obj_heading_.init; +                  comp_obj_heading_.metainfo.is_of_part                          = "backmatter"; +                  comp_obj_heading_.metainfo.is_of_section                       = "blurb"; +                  comp_obj_heading_.metainfo.is_of_type                          = "para"; +                  comp_obj_heading_.metainfo.is_a                                = "heading"; +                  comp_obj_heading_.text                                         = "Blurb"; +                  comp_obj_heading_.metainfo.ocn                                 = 0; +                  comp_obj_heading_.metainfo.identifier                          = ""; +                  comp_obj_heading_.metainfo.dummy_heading                       = true; +                  comp_obj_heading_.metainfo.object_number_off                   = true; +                  comp_obj_heading_.metainfo.object_number_type                  = 0; +                  comp_obj_heading_.tags.segment_anchor_tag_epub                 = "blurb"; +                  comp_obj_heading_.tags.anchor_tag_html                         = comp_obj_heading_.tags.segment_anchor_tag_epub; +                  comp_obj_heading_.tags.in_segment_html                         = comp_obj_heading_.tags.anchor_tag_html; +                  comp_obj_heading_.metainfo.heading_lev_markup                  = 4; +                  comp_obj_heading_.metainfo.heading_lev_collapsed               = 2; +                  comp_obj_heading_.metainfo.parent_ocn                          = 1; +                  comp_obj_heading_.metainfo.parent_lev_markup                   = 0; +                  comp_obj_heading_.tags.anchor_tags                             = ["blurb"]; +                  comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 1, 0, 0, 0]; +                  comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 1, 0, 0, 0, 0, 0]; +                  the_document_blurb_section                                     ~= comp_obj_heading_; +                  tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; +                  tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +                } +              } else if (line.matchFirst(rgx.headings) +              && (opt_action.backmatter && opt_action.section_blurb)) {                  comp_obj_heading_                                              = comp_obj_heading_.init;                  comp_obj_heading_.metainfo.is_of_part                          = "backmatter";                  comp_obj_heading_.metainfo.is_of_section                       = "blurb";                  comp_obj_heading_.metainfo.is_of_type                          = "para";                  comp_obj_heading_.metainfo.is_a                                = "heading"; -                comp_obj_heading_.text                                         = "Blurb"; +                comp_obj_heading_.text                                         = line.to!string;                  comp_obj_heading_.metainfo.ocn                                 = 0;                  comp_obj_heading_.metainfo.identifier                          = ""; -                comp_obj_heading_.metainfo.dummy_heading                       = true; +                comp_obj_heading_.metainfo.dummy_heading                       = false;                  comp_obj_heading_.metainfo.object_number_off                   = true;                  comp_obj_heading_.metainfo.object_number_type                  = 0;                  comp_obj_heading_.tags.segment_anchor_tag_epub                 = "blurb";                  comp_obj_heading_.tags.anchor_tag_html                         = comp_obj_heading_.tags.segment_anchor_tag_epub;                  comp_obj_heading_.tags.in_segment_html                         = comp_obj_heading_.tags.anchor_tag_html; -                comp_obj_heading_.metainfo.heading_lev_markup                  = 4; -                comp_obj_heading_.metainfo.heading_lev_collapsed               = 2; +                comp_obj_heading_.metainfo.heading_lev_markup                  = an_object["lev_markup_number"].to!int;    // make int, remove need to conv +                comp_obj_heading_.metainfo.heading_lev_collapsed               = an_object["lev_collapsed_number"].to!int; // make int, remove need to conv                  comp_obj_heading_.metainfo.parent_ocn                          = 1;                  comp_obj_heading_.metainfo.parent_lev_markup                   = 0; -                comp_obj_heading_.tags.anchor_tags                             = ["blurb"]; -                comp_obj_heading_.metainfo.dom_structure_markedup_tags_status  = [ 1, 1, 0, 0, 1, 0, 0, 0]; -                comp_obj_heading_.metainfo.dom_structure_collapsed_tags_status = [ 1, 1, 1, 0, 0, 0, 0, 0];                  the_document_blurb_section                                     ~= comp_obj_heading_;                  tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html;                  tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; +              } else if (!(line.empty)) { +                { +                  auto _get = line.flow_para_match_(an_object, an_object_key, indent, bullet, pith, line_occur); +                  { +                    an_object     = _get.this_object; +                    an_object_key = _get.this_object_key; +                    pith          = _get.pith; +                    indent        = _get.indent; +                    bullet        = _get.bullet; +                    line_occur    = _get.line_occur; +                  } +                } +                comp_obj_para                               = comp_obj_para.init; +                comp_obj_para.metainfo.is_of_part           = "backmatter"; +                comp_obj_para.metainfo.is_of_section        = "blurb"; +                comp_obj_para.metainfo.is_of_type           = "para"; +                comp_obj_para.metainfo.is_a                 = "blurb"; +                comp_obj_para.text                          = links_and_images(line.to!string.strip).replaceFirst(rgx.para_attribs, ""); +                comp_obj_para.metainfo.ocn                  = 0; +                comp_obj_para.metainfo.identifier           = ""; +                comp_obj_para.metainfo.object_number_off    = true; +                comp_obj_para.metainfo.object_number_type   = 0; +                comp_obj_para.attrib.indent_hang            = indent["hang_position"]; +                comp_obj_para.attrib.indent_base            = indent["base_position"]; +                comp_obj_para.has.inline_links              = true; +                comp_obj_para.attrib.bullet                 = bullet; +                the_document_blurb_section                  ~= comp_obj_para;                } -            } else if (line.matchFirst(rgx.headings) -            && (opt_action.backmatter && opt_action.section_blurb)) { -              comp_obj_heading_                                              = comp_obj_heading_.init; -              comp_obj_heading_.metainfo.is_of_part                          = "backmatter"; -              comp_obj_heading_.metainfo.is_of_section                       = "blurb"; -              comp_obj_heading_.metainfo.is_of_type                          = "para"; -              comp_obj_heading_.metainfo.is_a                                = "heading"; -              comp_obj_heading_.text                                         = line.to!string; -              comp_obj_heading_.metainfo.ocn                                 = 0; -              comp_obj_heading_.metainfo.identifier                          = ""; -              comp_obj_heading_.metainfo.dummy_heading                       = false; -              comp_obj_heading_.metainfo.object_number_off                   = true; -              comp_obj_heading_.metainfo.object_number_type                  = 0; -              comp_obj_heading_.tags.segment_anchor_tag_epub                 = "blurb"; -              comp_obj_heading_.tags.anchor_tag_html                         = comp_obj_heading_.tags.segment_anchor_tag_epub; -              comp_obj_heading_.tags.in_segment_html                         = comp_obj_heading_.tags.anchor_tag_html; -              comp_obj_heading_.metainfo.heading_lev_markup                  = an_object["lev_markup_number"].to!int;    // make int, remove need to conv -              comp_obj_heading_.metainfo.heading_lev_collapsed               = an_object["lev_collapsed_number"].to!int; // make int, remove need to conv -              comp_obj_heading_.metainfo.parent_ocn                          = 1; -              comp_obj_heading_.metainfo.parent_lev_markup                   = 0; -              the_document_blurb_section                                     ~= comp_obj_heading_; -              tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html; -              tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub; -            } else if (!(line.empty)) { -              an_object = line.flow_para_match_(an_object, an_object_key, indent, bullet, pith, line_occur); -              comp_obj_para                               = comp_obj_para.init; -              comp_obj_para.metainfo.is_of_part           = "backmatter"; -              comp_obj_para.metainfo.is_of_section        = "blurb"; -              comp_obj_para.metainfo.is_of_type           = "para"; -              comp_obj_para.metainfo.is_a                 = "blurb"; -              comp_obj_para.text                          = links_and_images(line.to!string.strip).replaceFirst(rgx.para_attribs, ""); -              comp_obj_para.metainfo.ocn                  = 0; -              comp_obj_para.metainfo.identifier           = ""; -              comp_obj_para.metainfo.object_number_off    = true; -              comp_obj_para.metainfo.object_number_type   = 0; -              comp_obj_para.attrib.indent_hang            = indent["hang_position"]; -              comp_obj_para.attrib.indent_base            = indent["base_position"]; -              comp_obj_para.has.inline_links              = true; -              comp_obj_para.attrib.bullet                 = bullet; -              the_document_blurb_section                  ~= comp_obj_para; +              pith["ocn"] = eN.ocn.on;              } -            pith["ocn"] = eN.ocn.on; -          } -          continue; -        } else if (pith["block_state"] == eN.blk_state.on) { -          if (pith["block_is"]    == eN.blk_is.quote) { -            line = line -              ._doc_header_and_make_substitutions_(conf_make_meta) -              ._doc_header_and_make_substitutions_fontface_(conf_make_meta); -            an_object = line.flow_txt_block_quote(an_object, pith); -            continue; -          } else if (pith["block_is"]    == eN.blk_is.group) { -            line = line -              ._doc_header_and_make_substitutions_(conf_make_meta) -              ._doc_header_and_make_substitutions_fontface_(conf_make_meta) -              .replaceAll(rgx.para_delimiter, mkup.br_line_spaced ~ "$1"); -            an_object = line.flow_txt_block_group(an_object, pith);              continue; -          } else if (pith["block_is"]    == eN.blk_is.block) { -            line = line -              ._doc_header_and_make_substitutions_(conf_make_meta) -              ._doc_header_and_make_substitutions_fontface_(conf_make_meta); -            if (auto m = line.match(rgx.spaces_keep)) { +          } else if (pith["block_state"] == eN.blk_state.on) { +            if (pith["block_is"]    == eN.blk_is.quote) {                line = line -                .replaceAll(rgx.spaces_keep, (m.captures[1]).translate([ ' ' : mkup.nbsp ])); -            } -            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, 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, pith, conf_make_meta); -            continue; -          } -        } else {                                                                /+ not within a block group +/ -          assert( -            (pith["block_state"] == eN.blk_state.off) -            || (pith["block_state"] == eN.blk_state.closing), -            "block status: none or closed" -          ); -          if (line.matchFirst(rgx.block_open)) { -            if (line.matchFirst(rgx.block_poem_open)) {                                    /+ poem to verse exceptions! +/ -              object_reset(an_object); -              processing.remove("verse"); -              object_number_poem["start"] = obj_cite_digits.object_number.to!string; +                ._doc_header_and_make_substitutions_(conf_make_meta) +                ._doc_header_and_make_substitutions_fontface_(conf_make_meta); +              { +                auto _get = line.txt_by_line_block_quote(an_object, pith); +                { +                  an_object = _get.this_object; +                  pith      = _get.pith; +                } +              } +              continue; +            } else if (pith["block_is"]    == eN.blk_is.group) { +              line = line +                ._doc_header_and_make_substitutions_(conf_make_meta) +                ._doc_header_and_make_substitutions_fontface_(conf_make_meta) +                .replaceAll(rgx.para_delimiter, mkup.br_line_spaced ~ "$1"); +              { +                auto _get = line.txt_by_line_block_group(an_object, pith); +                { +                  an_object = _get.this_object; +                  pith      = _get.pith; +                } +              } +              continue; +            } else if (pith["block_is"]    == eN.blk_is.block) { +              line = line +                ._doc_header_and_make_substitutions_(conf_make_meta) +                ._doc_header_and_make_substitutions_fontface_(conf_make_meta); +              if (auto m = line.match(rgx.spaces_keep)) { +                line = line +                  .replaceAll(rgx.spaces_keep, (m.captures[1]).translate([ ' ' : mkup.nbsp ])); +              } +              { +                auto _get = line.txt_by_line_block_block(an_object, pith); +                { +                  an_object = _get.this_object; +                  pith      = _get.pith; +                } +              } +              continue; +            } else if (pith["block_is"]    == eN.blk_is.poem) { +              { +                auto _get = line.txt_by_line_block_poem(an_object, pith, cntr, object_number_poem, conf_make_meta, tag_in_seg); +                { +                  an_object = _get.this_object; +                  pith      = _get.pith; +                  cntr      = _get.cntr; +                } +              } +              continue; +            } else if (pith["block_is"]    == eN.blk_is.table) { +              { +                auto _get = line.txt_by_line_block_table(an_object, pith, conf_make_meta); +                { +                  an_object      = _get.this_object; +                  pith           = _get.pith; +                  conf_make_meta = _get.conf_make_meta; +                } +              } +              continue;              } -            line.flow_txt_block_start(pith, dochas, object_number_poem); -            continue; -          } else if (!line.empty) {                                             /+ line not empty +/ -                                                                                /+ non blocks (headings, paragraphs) & closed blocks +/ -            assert( -              !line.empty, -              "line tested, line not empty surely:\n  \"" ~ line ~ "\"" -            ); +          } else {                                                                /+ not within a block group +/              assert(                (pith["block_state"] == eN.blk_state.off)                || (pith["block_state"] == eN.blk_state.closing), -              "code block status: none or closed" +              "block status: none or closed"              ); -            if (pith["block_state"] == eN.blk_state.closing) { -              debug(check) { -                writeln(__LINE__); -                writeln(line); +            if (line.matchFirst(rgx.block_open)) { +              if (line.matchFirst(rgx.block_poem_open)) {                                    /+ poem to verse exceptions! +/ +                object_reset(an_object); +                processing.remove("verse"); +                object_number_poem["start"] = obj_cite_digits.object_number.to!string; +              } +              { +                auto _get = line.txt_by_line_block_start(pith, dochas, object_number_poem); +                { +                  pith               = _get.pith; +                  dochas             = _get.dochas; +                  object_number_poem = _get.object_number_poem; +                }                } +              continue; +            } else if (!line.empty) {                                             /+ line not empty - non blocks (headings, paragraphs) & closed blocks +/                assert( -                line.matchFirst(rgx.book_index_item) -                || line.matchFirst(rgx.book_index_item_open) -                || pith["section"] == eN.sect.book_index, -                "\nblocks closed, unless followed by book index, non-matching line:\n  \"" -                ~ line ~ "\"" +                !line.empty, +                "line tested, line not empty surely:\n  \"" ~ line ~ "\""                ); -            } -            if (line.matchFirst(rgx.book_index_item) -            || line.matchFirst(rgx.book_index_item_open) -            || pith["section"] == eN.sect.book_index)  {                            /+ book_index +/ -              an_object = line.flow_book_index_(an_object, book_idx_tmp, pith, opt_action); -            } else {                                                                       /+ not book_index +/ -              an_object_key = "body_nugget"; -              if (auto m = line.matchFirst(rgx.comment)) {                                 /+ matched comment +/ -                debug(comment) { +              assert( +                (pith["block_state"] == eN.blk_state.off) +                || (pith["block_state"] == eN.blk_state.closing), +                "code block status: none or closed" +              ); +              if (pith["block_state"] == eN.blk_state.closing) { +                debug(check) { +                  writeln(__LINE__);                    writeln(line);                  } -                an_object[an_object_key]                ~= line ~= "\n"; -                comp_obj_comment                        = comp_obj_comment.init; -                comp_obj_comment.metainfo.is_of_part    = "comment"; // breaks flow -                comp_obj_comment.metainfo.is_of_section = "comment"; // breaks flow -                comp_obj_comment.metainfo.is_of_type    = "comment"; -                comp_obj_comment.metainfo.is_a          = "comment"; -                comp_obj_comment.text                   = an_object[an_object_key].strip; -                the_document_body_section               ~= comp_obj_comment; -                flow_common_reset_(line_occur, an_object, pith); -                processing.remove("verse"); -                ++cntr; -              } else if ((line_occur["para"] == eN.bi.off -                && line_occur["heading"] == eN.bi.off) -                && pith["txt_is"] == eN.txt_is.off -              ) {                             /+ heading or para but neither flag nor line exists +/ -                if ((conf_make_meta.make.headings.length > 2) -                && (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); +                assert( +                  line.matchFirst(rgx.book_index_item) +                  || line.matchFirst(rgx.book_index_item_open) +                  || pith["section"] == eN.sect.book_index, +                  "\nblocks closed, unless followed by book index, non-matching line:\n  \"" +                  ~ line ~ "\"" +                ); +              } +              if (line.matchFirst(rgx.book_index_item) +              || line.matchFirst(rgx.book_index_item_open) +              || pith["section"] == eN.sect.book_index)  {                            /+ book_index +/ +                { +                  auto _get = line.flow_book_index_(an_object, book_idx_tmp, pith, opt_action); +                  { +                    an_object = _get.this_object; +                    pith      = _get.pith; +                    book_idx_tmp      = _get.book_idx_tmp; +                  }                  } -                if (pith["make_headings"] == eN.bi.on -                  && (line_occur["para"] == eN.bi.off +              } else {                                                                /+ not book_index +/ +                an_object_key = "body_nugget"; +                if (auto m = line.matchFirst(rgx.comment)) {                                 /+ matched comment +/ +                  debug(comment) { +                    writeln(line); +                  } +                  an_object[an_object_key]                ~= line ~= "\n"; +                  comp_obj_comment                        = comp_obj_comment.init; +                  comp_obj_comment.metainfo.is_of_part    = "comment"; // breaks flow +                  comp_obj_comment.metainfo.is_of_section = "comment"; // breaks flow +                  comp_obj_comment.metainfo.is_of_type    = "comment"; +                  comp_obj_comment.metainfo.is_a          = "comment"; +                  comp_obj_comment.text                   = an_object[an_object_key].strip; +                  the_document_body_section               ~= comp_obj_comment; +                  { +                    auto _get = txt_by_line_common_reset_(line_occur, an_object, pith); +                    { +                      line_occur = _get.line_occur; +                      an_object  = _get.this_object; +                      pith       = _get.pith; +                    } +                  } +                  processing.remove("verse"); +                  ++cntr; +                } else if ((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, pith); -                } -                /+ TODO node info: all headings identified at this point, -                   - extract node info here?? -                   - how long can it wait? -                   - should be incorporated in composite objects -                   - should happen before endnote links set (they need to be moved down?) -                +/ -                if (line.matchFirst(rgx.headings)) {                                        /+ heading match +/ -                  line = line._doc_header_and_make_substitutions_(conf_make_meta); -                  an_object = line.flow_heading_matched_( -                    an_object, -                    line_occur, -                    an_object_key, -                    lv, -                    collapsed_lev, -                    pith, -                    conf_make_meta, -                  ); -                } else if (line_occur["para"] == eN.bi.off) {                              /+ para match +/ -                  an_object_key = "body_nugget"; +                ) {                             /+ heading or para but neither flag nor line exists +/ +                  if ((conf_make_meta.make.headings.length > 2) +                  && (pith["make_headings"] == eN.bi.off)) {                      /+ heading found +/ +                    { +                      auto _get = line.flow_heading_found_(heading_match_str, conf_make_meta.make.headings, heading_match_rgx, pith); +                      { +                        heading_match_str = _get.heading_match_str; +                        heading_match_rgx = _get.heading_match_rgx; +                        pith              = _get.pith; +                      } +                    } +                  } +                  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 +/ +                    { +                      auto _get = line.flow_heading_make_set_(line_occur, heading_match_rgx, pith); +                      { +                        line      = _get.line; +                        an_object = _get.this_object; +                        pith      = _get.pith; +                      } +                    } +                  } +                  /+ TODO node info: all headings identified at this point, +                     - extract node info here?? +                     - how long can it wait? +                     - should be incorporated in composite objects +                     - should happen before endnote links set (they need to be moved down?) +                  +/ +                  if (line.matchFirst(rgx.headings)) {                                        /+ heading match +/ +                    line = line._doc_header_and_make_substitutions_(conf_make_meta); +                    { +                      auto _get = line.flow_heading_matched_( +                        an_object, +                        line_occur, +                        an_object_key, +                        lv, +                        collapsed_lev, +                        pith, +                        conf_make_meta, +                      ); +                      { +                        an_object = _get.this_object; +                        pith      = _get.pith; +                      } +                    } +                  } else if (line_occur["para"] == eN.bi.off) {                              /+ para match +/ +                    an_object_key = "body_nugget"; +                    line = line +                      ._doc_header_and_make_substitutions_(conf_make_meta) +                      ._doc_header_and_make_substitutions_fontface_(conf_make_meta); +                    { +                      auto _get = line.flow_para_match_(an_object, an_object_key, indent, bullet, pith, line_occur); +                      { +                        an_object     = _get.this_object; +                        an_object_key = _get.this_object_key; +                        pith          = _get.pith; +                        indent        = _get.indent; +                        bullet        = _get.bullet; +                        line_occur    = _get.line_occur; +                      } +                    } +                  } +                } else if (line_occur["heading"] > eN.bi.off) {                              /+ heading +/ +                  debug(heading) { +                    writeln(line); +                  } +                  an_object[an_object_key] ~= line ~= "\n"; +                  ++line_occur["heading"]; +                } else if (line_occur["para"] > eN.bi.off) {                                 /+ paragraph +/ +                  debug(para) { +                    writeln(an_object_key, "-> ", line); +                  }                    line = line                      ._doc_header_and_make_substitutions_(conf_make_meta)                      ._doc_header_and_make_substitutions_fontface_(conf_make_meta); -                  an_object = line.flow_para_match_(an_object, an_object_key, indent, bullet, pith, line_occur); +                  an_object[an_object_key] ~= " " ~ line; +                  ++line_occur["para"];                  } -              } else if (line_occur["heading"] > eN.bi.off) {                              /+ heading +/ -                debug(heading) { -                  writeln(line); -                } -                an_object[an_object_key] ~= line ~= "\n"; -                ++line_occur["heading"]; -              } else if (line_occur["para"] > eN.bi.off) {                                 /+ paragraph +/ -                debug(para) { -                  writeln(an_object_key, "-> ", line); +              } +            } else if (pith["block_state"] == eN.blk_state.closing) {             /+ line empty, with blocks flag +/ +              { +                auto _get = line.flow_block_flag_line_empty_( +                  an_object, +                  bookindex_extract_hash, +                  the_document_body_section, +                  bookindex_unordered_hashes, +                  obj_cite_digits, +                  comp_obj_heading, +                  cntr, +                  pith, +                  object_number_poem, +                  conf_make_meta, +                  tag_in_seg, +                ); +                { +                  an_object                  = _get.this_object; +                  the_document_body_section  = _get.the_document_body_section; +                  bookindex_unordered_hashes = _get.bookindex_unordered_hashes; +                  obj_cite_digits            = _get.obj_cite_digits; +                  comp_obj_heading           = _get.comp_obj_heading; +                  cntr                       = _get.cntr; +                  pith                       = _get.pith;                  } -                line = line -                  ._doc_header_and_make_substitutions_(conf_make_meta) -                  ._doc_header_and_make_substitutions_fontface_(conf_make_meta); -                an_object[an_object_key] ~= " " ~ line; -                ++line_occur["para"];                } -            } -          } 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, -              the_document_body_section, -              bookindex_unordered_hashes, -              obj_cite_digits, -              comp_obj_heading, -              cntr, -              pith, -              object_number_poem, -              conf_make_meta, -              tag_in_seg, -            ); -          } else {                                                              /+ line.empty, post contents, empty variables: +/ -            assert( -              line.empty, -              "\nline should be empty:\n  \"" -              ~ line ~ "\"" -            ); -            assert( -              (pith["block_state"] == eN.blk_state.off), -              "code block status: none" -            ); -            if (_new_doc) { -              tag_assoc   = tag_assoc.init; -              lv0to3_tags = lv0to3_tags.init; -              tag_in_seg  = tag_in_seg.init; -            } -            if (pith["txt_is"] == eN.txt_is.heading -              && line_occur["heading"] > eN.bi.off -            ) {                                      /+ heading object (current line empty) +/ -              obj_cite_digits = (an_object["lev_markup_number"].to!int == 0) -              ? ocn_emit(eN.ocn.reset) -              : ocn_emit(pith["ocn"]); -              an_object["is"] = "heading"; -              an_object_key = "body_nugget"; -              TxtAndAnchorTagPlusHasFootnotesUrlsImages substantive_object_and_anchor_tags_tuple -                = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, ((_new_doc) ? Yes._new_doc : No._new_doc)); -              an_object["substantive"] = substantive_object_and_anchor_tags_tuple[sObj.content]; -              anchor_tag = substantive_object_and_anchor_tags_tuple[sObj.anchor_tag]; +            } else {                                                              /+ line.empty, post contents, empty variables: +/ +              assert( +                line.empty, +                "\nline should be empty:\n  \"" +                ~ line ~ "\"" +              ); +              assert( +                (pith["block_state"] == eN.blk_state.off), +                "code block status: none" +              );                if (_new_doc) { -                cnt1 = 1; -                cnt2 = 1; -                cnt3 = 1; -                _new_doc = false; +                tag_assoc   = tag_assoc.init; +                lv0to3_tags = lv0to3_tags.init; +                tag_in_seg  = tag_in_seg.init;                } -              if ( -                an_object["lev_markup_number"].to!int == 4 -                && (!(anchor_tag.empty) -                || (lv0to3_tags.length > 0)) -              ) { -                tag_in_seg["seg_lv4"]    = anchor_tag; -                tag_in_seg["seg_lv1to4"] = anchor_tag; -                lev_anchor_tag = anchor_tag; -                tag_assoc[anchor_tag]["seg_lv4"]    = tag_in_seg["seg_lv4"]; -                tag_assoc[anchor_tag]["seg_lv1to4"] = tag_in_seg["seg_lv1to4"]; -                if (lv0to3_tags.length > 0) { /+ names used for html markup segments 1 to 4 (rather than epub which has separate segments for A to D) +/ -                  foreach (lv0_to_lv3_html_tag; lv0to3_tags) { -                    tag_assoc[lv0_to_lv3_html_tag]["seg_lv4"] = anchor_tag; +              if (pith["txt_is"] == eN.txt_is.heading +                && line_occur["heading"] > eN.bi.off +              ) {                                      /+ heading object (current line empty) +/ +                obj_cite_digits = (an_object["lev_markup_number"].to!int == 0) +                ? ocn_emit(eN.ocn.reset) +                : ocn_emit(pith["ocn"]); +                an_object["is"] = "heading"; +                an_object_key = "body_nugget"; +                TxtAndAnchorTagPlusHasFootnotesUrlsImages substantive_object_and_anchor_tags_tuple +                  = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, ((_new_doc) ? Yes._new_doc : No._new_doc)); +                an_object["substantive"] = substantive_object_and_anchor_tags_tuple[sObj.content]; +                anchor_tag = substantive_object_and_anchor_tags_tuple[sObj.anchor_tag]; +                if (_new_doc) { +                  cnt1 = 1; +                  cnt2 = 1; +                  cnt3 = 1; +                  _new_doc = false; +                } +                if ( +                  an_object["lev_markup_number"].to!int == 4 +                  && (!(anchor_tag.empty) +                  || (lv0to3_tags.length > 0)) +                ) { +                  tag_in_seg["seg_lv4"]    = anchor_tag; +                  tag_in_seg["seg_lv1to4"] = anchor_tag; +                  lev_anchor_tag = anchor_tag; +                  tag_assoc[anchor_tag]["seg_lv4"]    = tag_in_seg["seg_lv4"]; +                  tag_assoc[anchor_tag]["seg_lv1to4"] = tag_in_seg["seg_lv1to4"]; +                  if (lv0to3_tags.length > 0) { /+ names used for html markup segments 1 to 4 (rather than epub which has separate segments for A to D) +/ +                    foreach (lv0_to_lv3_html_tag; lv0to3_tags) { +                      tag_assoc[lv0_to_lv3_html_tag]["seg_lv4"] = anchor_tag; +                    } +                  } +                  anchor_tag_ = anchor_tag; +                  lv0to3_tags = lv0to3_tags.init; +                } else if (an_object["lev_markup_number"].to!int > 4) { +                  tag_in_seg["seg_lv4"]    = anchor_tag_; +                  tag_in_seg["seg_lv1to4"] = anchor_tag_; +                  lev_anchor_tag           = anchor_tag; +                  tag_assoc[anchor_tag]["seg_lv4"] = tag_in_seg["seg_lv4"]; +                  tag_assoc[anchor_tag]["seg_lv1to4"] = tag_in_seg["seg_lv1to4"]; +                } else if (an_object["lev_markup_number"].to!int < 4) { +                  string segn; +                  switch (an_object["lev_markup_number"].to!int) {                           /+ names used for epub markup segments A to D +/ +                  case 0: +                    segn = "_the_title"; +                    goto default; +                  case 1: +                    segn = "_part_" ~ cnt1.to!string; +                    ++cnt1; +                    goto default; +                  case 2: +                    segn = "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string; +                    ++cnt2; +                    goto default; +                  case 3: +                    segn =  "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string ~ "_" ~ cnt3.to!string; +                    ++cnt3; +                    goto default; +                  default: +                    lv0to3_tags ~= obj_cite_digits.object_number.to!string; +                    lv0to3_tags ~= segn; +                    tag_in_seg["seg_lv4"]    = segn; // for html segname need following lv4 not yet known +                    tag_in_seg["seg_lv1to4"] = segn; +                    break;                    }                  } -                anchor_tag_ = anchor_tag; -                lv0to3_tags = lv0to3_tags.init; -              } else if (an_object["lev_markup_number"].to!int > 4) { -                tag_in_seg["seg_lv4"]    = anchor_tag_; -                tag_in_seg["seg_lv1to4"] = anchor_tag_; -                lev_anchor_tag           = anchor_tag; -                tag_assoc[anchor_tag]["seg_lv4"] = tag_in_seg["seg_lv4"]; -                tag_assoc[anchor_tag]["seg_lv1to4"] = tag_in_seg["seg_lv1to4"]; -              } else if (an_object["lev_markup_number"].to!int < 4) { -                string segn; -                switch (an_object["lev_markup_number"].to!int) {                           /+ names used for epub markup segments A to D +/ -                case 0: -                  segn = "_the_title"; -                  goto default; -                case 1: -                  segn = "_part_" ~ cnt1.to!string; -                  ++cnt1; -                  goto default; -                case 2: -                  segn = "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string; -                  ++cnt2; -                  goto default; -                case 3: -                  segn =  "_part_" ~ cnt1.to!string ~ "_" ~ cnt2.to!string ~ "_" ~ cnt3.to!string; -                  ++cnt3; -                  goto default; -                default: -                  lv0to3_tags ~= obj_cite_digits.object_number.to!string; -                  lv0to3_tags ~= segn; -                  tag_in_seg["seg_lv4"]    = segn; // for html segname need following lv4 not yet known -                  tag_in_seg["seg_lv1to4"] = segn; -                  break; +                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_digits, tag_in_seg); +                /+ (incrementally build toc) table of contents here! +/ +                _anchor_tag                   = obj_cite_digits.identifier; +                { +                  auto _get = obj_im.flow_table_of_contents_gather_headings( +                    an_object, +                    conf_make_meta, +                    tag_in_seg, +                    _anchor_tag, +                    lev4_subtoc, +                    the_document_toc_section, +                  ); +                  { +                    the_document_toc_section = _get.the_document_toc_section; +                    lev4_subtoc              = _get.lev4_subtoc; +                  }                  } +                if (an_object["lev_markup_number"] == "4") { +                  segnames["html"] ~= tag_in_seg["seg_lv4"]; +                  html_segnames_ptr = html_segnames_ptr_cntr; +                  html_segnames_ptr_cntr++; +                } +                if (an_object["lev_markup_number"].to!int <= 4) { +                  segnames["epub"] ~= tag_in_seg["seg_lv1to4"]; +                } +                auto comp_obj_heading = node_construct.node_emitter_heading( +                    an_object["substantive"], +                    an_object["lev_markup_number"], +                    an_object["lev_collapsed_number"], +                    an_object["dummy_heading_status"], +                    tag_in_seg, +                    lev_anchor_tag, +                    tag_assoc, +                    obj_cite_digits,                              // OCNset +                    cntr,                                         // int +                    heading_ptr,                                  // int +                    lv_ancestors_txt,                             // string[] +                    an_object["is"],                              // string +                    html_segnames_ptr,                            // int +                    substantive_object_and_anchor_tags_tuple[sObj.notes_reg], +                    substantive_object_and_anchor_tags_tuple[sObj.notes_star], +                    substantive_object_and_anchor_tags_tuple[sObj.links], +                  ); +                ++heading_ptr; +                debug(segments) { +                  writeln(an_object["lev_markup_number"]); +                  writeln(tag_in_seg["seg_lv4"]); +                  writeln(tag_in_seg["seg_lv1to4"]); +                } +                the_document_body_section ~= comp_obj_heading; +                debug(objectrelated1) { // check +                  writeln(line); +                } +                { +                  auto _get = txt_by_line_common_reset_(line_occur, an_object, pith); +                  { +                    line_occur = _get.line_occur; +                    an_object  = _get.this_object; +                    pith       = _get.pith; +                  } +                } +                an_object.remove("lev"); +                an_object.remove("lev_markup_number"); +                processing.remove("verse"); +                ++cntr; +              } else if (pith["txt_is"] == eN.txt_is.para +                && line_occur["para"] > eN.bi.off +              ) { /+ paragraph object (current line empty) - repeated character paragraph separator +/ +                if ((an_object[an_object_key].to!string).matchFirst(rgx.repeated_character_line_separator)) { +                  pith["ocn"] = eN.ocn.off; +                } +                obj_cite_digits = ocn_emit(pith["ocn"]); +                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_digits, tag_in_seg); +                an_object["is"] = "para"; +                auto comp_obj_heading = node_construct.node_location_emitter( +                    content_non_header, +                    tag_in_seg, +                    lev_anchor_tag, +                    tag_assoc, +                    obj_cite_digits, +                    cntr, +                    heading_ptr-1, +                    an_object["is"], +                  ); +                TxtAndAnchorTagPlusHasFootnotesUrlsImages substantive_obj_misc_tuple +                  = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, No._new_doc); +                an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; +                anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; +                comp_obj_para                                       = comp_obj_para.init; +                comp_obj_para.metainfo.is_of_part                   = "body"; +                comp_obj_para.metainfo.is_of_section                = "body"; +                comp_obj_para.metainfo.is_of_type                   = "para"; +                comp_obj_para.metainfo.is_a                         = "para"; +                comp_obj_para.text                                  = an_object["substantive"].to!string.strip; +                comp_obj_para.tags.html_segment_anchor_tag_is       = tag_in_seg["seg_lv4"]; +                comp_obj_para.tags.epub_segment_anchor_tag_is       = tag_in_seg["seg_lv1to4"]; +                comp_obj_para.metainfo.ocn                          = obj_cite_digits.object_number; +                comp_obj_para.metainfo.identifier                   = obj_cite_digits.identifier; +                comp_obj_para.metainfo.object_number_off            = (obj_cite_digits.off == 0)   ? true : false; // TODO +                comp_obj_para.metainfo.o_n_book_index               = obj_cite_digits.bkidx; +                comp_obj_para.metainfo.object_number_type           = obj_cite_digits.type; +                comp_obj_para.attrib.indent_hang                    = indent["hang_position"]; +                comp_obj_para.attrib.indent_base                    = indent["base_position"]; +                comp_obj_para.attrib.bullet                         = bullet; +                comp_obj_para.tags.anchor_tags                      = [anchor_tag]; anchor_tag=""; +                comp_obj_para.has.inline_notes_reg                  = substantive_obj_misc_tuple[sObj.notes_reg]; +                comp_obj_para.has.inline_notes_star                 = substantive_obj_misc_tuple[sObj.notes_star]; +                comp_obj_para.has.inline_links                      = substantive_obj_misc_tuple[sObj.links]; +                comp_obj_para.has.image_without_dimensions          = substantive_obj_misc_tuple[sObj.image_no_dimensions]; +                the_document_body_section                           ~= comp_obj_para; +                tag_assoc                                           = an_object.inline_para_link_anchor(tag_in_seg, tag_assoc); +                { +                  auto _get = txt_by_line_common_reset_(line_occur, an_object, pith); +                  { +                    line_occur = _get.line_occur; +                    an_object  = _get.this_object; +                    pith       = _get.pith; +                  } +                } +                indent = [ +                  "hang_position" : 0, +                  "base_position" : 0, +                ]; +                bullet = false; +                processing.remove("verse"); +                ++cntr; +              // } else { // could be useful to test line variable should be empty and never null                } -              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_digits, tag_in_seg); -              /+ (incrementally build toc) table of contents here! +/ -              _anchor_tag                   = obj_cite_digits.identifier; -              the_document_toc_section      = obj_im.flow_table_of_contents_gather_headings( -                an_object, -                conf_make_meta, -                tag_in_seg, -                _anchor_tag, -                lev4_subtoc, -                the_document_toc_section, -              ); -              if (an_object["lev_markup_number"] == "4") { -                segnames["html"] ~= tag_in_seg["seg_lv4"]; -                html_segnames_ptr = html_segnames_ptr_cntr; -                html_segnames_ptr_cntr++; -              } -              if (an_object["lev_markup_number"].to!int <= 4) { -                segnames["epub"] ~= tag_in_seg["seg_lv1to4"]; +            }                                                                     // close else for line empty +          }                                                                       // close else for not the above +        }                                                                         // close after non code, other blocks or regular text +        /+ unless (the_document_body_section.length == 0) ? +/ +        if (the_document_body_section.length > 0) { +          if (((the_document_body_section[$-1].metainfo.is_a == "para") +            || (the_document_body_section[$-1].metainfo.is_a == "heading") +            || (the_document_body_section[$-1].metainfo.is_a == "quote") +            || (the_document_body_section[$-1].metainfo.is_a == "group") +            || (the_document_body_section[$-1].metainfo.is_a == "block") +            || (the_document_body_section[$-1].metainfo.is_a == "verse")) +          && (the_document_body_section.length > previous_length)) { +            if ((the_document_body_section[$-1].metainfo.is_a == "heading") +            && (the_document_body_section[$-1].metainfo.heading_lev_markup < 5)) { +              pith["section"] = eN.sect.unset; +            } +            if (the_document_body_section[$-1].metainfo.is_a == "verse") {             /+ scan for endnotes for whole poem (each verse in poem) +/ +              foreach (i; previous_length .. the_document_body_section.length) { +                if (the_document_body_section[i].metainfo.is_a == "verse") { +                  if ((the_document_body_section[i].text).match( +                    rgx.inline_notes_al_all_note +                  )) { +                    object_notes = note_section.gather_notes_for_endnote_section( +                      the_document_body_section, +                      tag_in_seg, +                      (i).to!int, +                    ); +                  } +                }                } -              auto comp_obj_heading -                = node_construct.node_emitter_heading( -                  an_object["substantive"], -                  an_object["lev_markup_number"], -                  an_object["lev_collapsed_number"], -                  an_object["dummy_heading_status"], +            } else {                                                                   /+ scan object for endnotes +/ +              previous_length = the_document_body_section.length.to!int; +              if ((the_document_body_section[$-1].text).match( +                rgx.inline_notes_al_all_note +              )) { +                previous_count = (the_document_body_section.length -1).to!int; +                object_notes = note_section.gather_notes_for_endnote_section( +                  the_document_body_section,                    tag_in_seg, -                  lev_anchor_tag, -                  tag_assoc, -                  obj_cite_digits,                              // OCNset -                  cntr,                                         // int -                  heading_ptr,                                  // int -                  lv_ancestors_txt,                             // string[] -                  an_object["is"],                              // string -                  html_segnames_ptr,                            // int -                  substantive_object_and_anchor_tags_tuple[sObj.notes_reg], -                  substantive_object_and_anchor_tags_tuple[sObj.notes_star], -                  substantive_object_and_anchor_tags_tuple[sObj.links], +                  (the_document_body_section.length-1).to!int,                  ); -              ++heading_ptr; -              debug(segments) { -                writeln(an_object["lev_markup_number"]); -                writeln(tag_in_seg["seg_lv4"]); -                writeln(tag_in_seg["seg_lv1to4"]); -              } -              the_document_body_section ~= comp_obj_heading; -              debug(objectrelated1) { // check -                writeln(line); -              } -              flow_common_reset_(line_occur, an_object, pith); -              an_object.remove("lev"); -              an_object.remove("lev_markup_number"); -              processing.remove("verse"); -              ++cntr; -            } else if (pith["txt_is"] == eN.txt_is.para -              && line_occur["para"] > eN.bi.off -            ) { -              /+ paragraph object (current line empty) +/ -              /+ repeated character paragraph separator +/ -              if ((an_object[an_object_key].to!string).matchFirst(rgx.repeated_character_line_separator)) { -                pith["ocn"] = eN.ocn.off; -              } -              obj_cite_digits = ocn_emit(pith["ocn"]); -              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_digits, tag_in_seg); -              an_object["is"] = "para"; -              auto comp_obj_heading -                = node_construct.node_location_emitter( -                  content_non_header, -                  tag_in_seg, -                  lev_anchor_tag, -                  tag_assoc, -                  obj_cite_digits, -                  cntr, -                  heading_ptr-1, -                  an_object["is"], -                ); -              TxtAndAnchorTagPlusHasFootnotesUrlsImages substantive_obj_misc_tuple -                = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, No._new_doc); -              an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; -              anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; -              comp_obj_para                                       = comp_obj_para.init; -              comp_obj_para.metainfo.is_of_part                   = "body"; -              comp_obj_para.metainfo.is_of_section                = "body"; -              comp_obj_para.metainfo.is_of_type                   = "para"; -              comp_obj_para.metainfo.is_a                         = "para"; -              comp_obj_para.text                                  = an_object["substantive"].to!string.strip; -              comp_obj_para.tags.html_segment_anchor_tag_is       = tag_in_seg["seg_lv4"]; -              comp_obj_para.tags.epub_segment_anchor_tag_is       = tag_in_seg["seg_lv1to4"]; -              comp_obj_para.metainfo.ocn                          = obj_cite_digits.object_number; -              comp_obj_para.metainfo.identifier                   = obj_cite_digits.identifier; -              comp_obj_para.metainfo.object_number_off            = (obj_cite_digits.off == 0)   ? true : false; // TODO -              comp_obj_para.metainfo.o_n_book_index               = obj_cite_digits.bkidx; -              comp_obj_para.metainfo.object_number_type           = obj_cite_digits.type; -              comp_obj_para.attrib.indent_hang                    = indent["hang_position"]; -              comp_obj_para.attrib.indent_base                    = indent["base_position"]; -              comp_obj_para.attrib.bullet                         = bullet; -              comp_obj_para.tags.anchor_tags                      = [anchor_tag]; anchor_tag=""; -              comp_obj_para.has.inline_notes_reg                  = substantive_obj_misc_tuple[sObj.notes_reg]; -              comp_obj_para.has.inline_notes_star                 = substantive_obj_misc_tuple[sObj.notes_star]; -              comp_obj_para.has.inline_links                      = substantive_obj_misc_tuple[sObj.links]; -              comp_obj_para.has.image_without_dimensions          = substantive_obj_misc_tuple[sObj.image_no_dimensions]; -              the_document_body_section                           ~= comp_obj_para; -              tag_assoc                                           = an_object.inline_para_link_anchor(tag_in_seg, tag_assoc); -              flow_common_reset_(line_occur, an_object, pith); -              indent = [ -                "hang_position" : 0, -                "base_position" : 0, -              ]; -              bullet = false; -              processing.remove("verse"); -              ++cntr; -            } else { -              // could be useful to test line variable should be empty and never null -            } -          }                                                                     // close else for line empty -        }                                                                       // close else for not the above -      }                                                                         // close after non code, other blocks or regular text -      /+ unless (the_document_body_section.length == 0) ? +/ -      if (the_document_body_section.length > 0) { -        if (((the_document_body_section[$-1].metainfo.is_a == "para") -          || (the_document_body_section[$-1].metainfo.is_a == "heading") -          || (the_document_body_section[$-1].metainfo.is_a == "quote") -          || (the_document_body_section[$-1].metainfo.is_a == "group") -          || (the_document_body_section[$-1].metainfo.is_a == "block") -          || (the_document_body_section[$-1].metainfo.is_a == "verse")) -        && (the_document_body_section.length > previous_length)) { -          if ((the_document_body_section[$-1].metainfo.is_a == "heading") -          && (the_document_body_section[$-1].metainfo.heading_lev_markup < 5)) { -            pith["section"] = eN.sect.unset; -          } -          if (the_document_body_section[$-1].metainfo.is_a == "verse") {             /+ scan for endnotes for whole poem (each verse in poem) +/ -            foreach (i; previous_length .. the_document_body_section.length) { -              if (the_document_body_section[i].metainfo.is_a == "verse") { -                if ((the_document_body_section[i].text).match( -                  rgx.inline_notes_al_all_note -                )) { -                  note_section.gather_notes_for_endnote_section( -                    the_document_body_section, -                    tag_in_seg, -                    (i).to!int, -                  ); -                }                }              } -          } else {                                                                   /+ scan object for endnotes +/              previous_length = the_document_body_section.length.to!int; -            if ((the_document_body_section[$-1].text).match( -              rgx.inline_notes_al_all_note -            )) { -              previous_count = (the_document_body_section.length -1).to!int; -              note_section.gather_notes_for_endnote_section( -                the_document_body_section, -                tag_in_seg, -                (the_document_body_section.length-1).to!int, -              ); -            }            } -          previous_length = the_document_body_section.length.to!int;          }        } -    }                                                                           /+ ← srcDocLoop closed: loop markup document/text line by line +/ -    /+ ↓ post loop markup document/text +/ +      ret.toc          = the_document_toc_section; +      ret.body         = the_document_body_section; +      ret.glossary     = the_document_glossary_section; +      ret.blurb        = the_document_blurb_section; +      ret.object_notes = object_notes; +      ret.segnames     = segnames; +      return ret; +    } +    { // loopMarkupSrcByLine +      auto _doc_by_line = loopMarkupSrcByLine(markup_sourcefile_content, an_object, pith); +      the_document_toc_section      = _doc_by_line.toc; +      the_document_body_section     = _doc_by_line.body; +      the_document_glossary_section = _doc_by_line.glossary; +      the_document_blurb_section    = _doc_by_line.blurb; +      segnames                      = _doc_by_line.segnames; +      object_notes                  = _doc_by_line.object_notes; // endnotes, compare, not sure is used +      destroy(_doc_by_line); +    }      { // EOF        comp_obj_heading_                                              = comp_obj_heading_.init;        comp_obj_heading_.metainfo.is_of_part                          = "backmatter"; @@ -1333,7 +1507,7 @@ template docAbstraction() {        tag_assoc[comp_obj_heading_.tags.anchor_tag_html]["seg_lv4"]            = comp_obj_heading_.tags.in_segment_html;        tag_assoc[comp_obj_heading_.tags.segment_anchor_tag_epub]["seg_lv1to4"] = comp_obj_heading_.tags.segment_anchor_tag_epub;      } -    auto en_tuple = note_section.endnote_objects(obj_cite_digits, opt_action); +    auto en_tuple = note_section.endnote_objects(obj_cite_digits, opt_action); // endnotes, check      auto the_document_endnotes_section = en_tuple[0];      obj_cite_digits = en_tuple[1];      debug(endnotes) { @@ -1370,8 +1544,15 @@ template docAbstraction() {      }      auto biblio_unsorted_incomplete = biblio_arr_json.dup;      auto biblio = Bibliography(); -    auto biblio_ordered -      = biblio.flow_bibliography_(biblio_unsorted_incomplete, bib_arr_json); +    JSONValue[] biblio_ordered; +    { +      auto _get = biblio.flow_bibliography_(biblio_unsorted_incomplete, bib_arr_json); +      { +        biblio_ordered             = _get.biblio_sorted; +        bib_arr_json               = _get.bib_arr_json; +        biblio_unsorted_incomplete = _get.biblio_unsorted_incomplete; +      } +    }      if (biblio_ordered.length > 0) {        {          comp_obj_heading_                                 = comp_obj_heading_.init; @@ -2513,181 +2694,94 @@ template docAbstraction() {      dom_structure_collapsed_tags_status_buffer  = [ 0, 0, 0, 0, 0, 0, 0, 0,];      lev_anchor_tag = "";      anchor_tag = ""; -    @safe auto doc_has() { -      struct DocHas_ { -        uint inline_links() { -          return dochas["inline_links"]; -        } -        uint inline_notes_reg() { -          return dochas["inline_notes"]; -        } -        uint inline_notes_star() { -          return dochas["inline_notes_star"]; -        } -        uint codeblocks() { -          return dochas["codeblock"]; -        } -        uint tables() { -          return dochas["table"]; -        } -        uint blocks() { -          return dochas["block"]; -        } -        uint groups() { -          return dochas["group"]; -        } -        uint poems() { -          return dochas["poem"]; -        } -        uint quotes() { -          return dochas["quote"]; -        } -        ulong images() { // TODO not ideal rethink -          return (image_list.to!string.strip("[","]").split(",").length); -        } -        auto imagelist() { -          return image_list; -        } -        auto keys_seq() { -          return docSectKeysSeq!()(document_section_keys_sequenced); -        } -        string[] segnames_lv4() { -          return segnames_4; -        } -        string[] segnames_lv_0_to_4() { -          return segnames_0_to_4; -        } -        string[string][string] tag_associations() { -          return tag_assoc; -        } +    struct DocHas_ { +      uint inline_links() { +        return dochas["inline_links"]; +      } +      uint inline_notes_reg() { +        return dochas["inline_notes"]; +      } +      uint inline_notes_star() { +        return dochas["inline_notes_star"];        } +      uint codeblocks() { +        return dochas["codeblock"]; +      } +      uint tables() { +        return dochas["table"]; +      } +      uint blocks() { +        return dochas["block"]; +      } +      uint groups() { +        return dochas["group"]; +      } +      uint poems() { +        return dochas["poem"]; +      } +      uint quotes() { +        return dochas["quote"]; +      } +      ulong images() { // TODO not ideal rethink +        return (image_list.to!string.strip("[","]").split(",").length); +      } +      auto imagelist() { +        return image_list; +      } +      auto keys_seq() { +        return docSectKeysSeq!()(document_section_keys_sequenced); +      } +      string[] segnames_lv4() { +        return segnames_4; +      } +      string[] segnames_lv_0_to_4() { +        return segnames_0_to_4; +      } +      string[string][string] tag_associations() { +        return tag_assoc; +      } +    } +    @safe auto doc_has() {        return DocHas_();      } -    auto t = tuple( -      document_the, -      doc_has, -    ); -    return t; -                                                                                /+ post loop markup document/text ↑ +/ +    struct retStruct { +      ObjGenericComposite[][string] document_the; +      DocHas_                       doc_has; +    } +    retStruct ret; +    { +      ret.document_the = document_the; +      ret.doc_has      = doc_has; +    } +    return ret;    }                                                                             /+ ← closed: abstract doc source +/ -                                                                                /+ ↓ abstraction functions +/ -  @safe static string[string] object_reset()(string[string] an_object) { -    an_object.remove("body_nugget"); -    an_object.remove("substantive"); -    an_object.remove("is"); -    an_object.remove("attrib"); -    an_object.remove("bookindex_nugget"); -    return an_object; -  } -  @system void flow_common_reset_()( -    return ref int[string]     line_occur, -    return ref string[string]  an_object, -    return ref uint[string]    pith, +  @system auto txt_by_line_common_reset_()( +    int[string]     line_occur, +    string[string]  an_object, +    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; +    struct retStruct { +      int[string]     line_occur; +      string[string]  this_object; +      uint[string]    pith; +    } +    retStruct ret; +    { +      ret.line_occur  = line_occur; +      ret.this_object = an_object; +      ret.pith        = pith; +    } +    return ret;    } -  @safe static uint[string] _check_ocn_status_()( -    char[]       line, -    uint[string] pith, -  ) { -    static auto rgx = RgxI(); -    if (!(line.empty)) { -      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.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.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.bi.off) { -            pith["dummy_heading_status"]                = eN.bi.off; -            if (pith["dummy_heading_multiple_objects"]) { -              pith["dummy_heading_status"]              = eN.bi.on; -            } -            if (line.matchFirst(rgx.object_number_off)) { -              pith["ocn"]                               = eN.ocn.off; -            } else if (line.matchFirst(rgx.object_number_off_dummy_heading)) { -              pith["ocn"]                               = eN.ocn.off; -              pith["dummy_heading_status"]              = eN.bi.on; -            } else { -              pith["ocn"]                               = eN.ocn.on; -              pith["dummy_heading_status"]              = eN.bi.off; -            } -          } else { -            pith["ocn"] = pith["no_ocn_multiple_objects"]; -          } -      } 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.bi.off; -          pith["ocn"]                                   = eN.ocn.on; -          pith["dummy_heading_status"]                  = eN.bi.off; -          debug(ocnoff) { -            writeln(line); -          } -        } -      } -    } -    return pith; -  } -  @safe char[] _doc_header_and_make_substitutions_(CMM)( -    char[]  line, -    CMM     conf_make_meta, -  ) { -    enum Substitute { match, markup, } -    if (conf_make_meta.make.substitute) { -      foreach(substitution_pair; conf_make_meta.make.substitute) { -        line = line.replaceAll( -          regex("\b" ~ substitution_pair[Substitute.match]), -          substitution_pair[Substitute.markup] -        ); -      } -    } -    return line; -  } -  @safe char[] _doc_header_and_make_substitutions_fontface_(CMM)( -    char[]  line, -    CMM     conf_make_meta, -  ) { -    enum Substitute { match, markup, } -    if ( conf_make_meta.make.bold) { -      line = line.replaceAll( -        regex("\b" ~ conf_make_meta.make.bold[Substitute.match]), -        conf_make_meta.make.bold[Substitute.markup] -      ); -    } -    if (conf_make_meta.make.emphasis) { -      line = line.replaceAll( -        regex("\b" ~ conf_make_meta.make.emphasis[Substitute.match]), -        conf_make_meta.make.emphasis[Substitute.markup] -      ); -    } -    if (conf_make_meta.make.italics) { -      line = line.replaceAll( -        regex("\b" ~ conf_make_meta.make.italics[Substitute.match]), -        conf_make_meta.make.italics[Substitute.markup] -      ); -    } -    return line; -  } -  @safe void flow_txt_block_start()( -               char[]         line, -    return ref uint[string]   pith, -    return ref uint[string]   dochas, -    return ref string[string] object_number_poem +  @safe auto txt_by_line_block_start()( +    char[]         line, +    uint[string]   pith, +    uint[string]   dochas, +    string[string] object_number_poem    ) {      static auto rgx = RgxI();      if (auto m = line.matchFirst(rgx.block_curly_code_open)) { @@ -2868,11 +2962,23 @@ template docAbstraction() {        pith["block_state"]             = eN.blk_state.on;        pith["block_delim"]             = eN.blk_delim.tic;      } +    struct retStruct { +      uint[string]    pith; +      uint[string]    dochas; +      string[string]  object_number_poem; +    } +    retStruct ret; +    { +      ret.pith               = pith; +      ret.dochas             = dochas; +      ret.object_number_poem = object_number_poem; +    } +    return ret;    } -  @safe string[string] flow_txt_block_quote()( -               char[]          line, -               string[string]  an_object, -    return ref uint[string]    pith, +  @safe auto txt_by_line_block_quote()( +    char[]          line, +    string[string]  an_object, +    uint[string]    pith,    ) {      static auto rgx = RgxI();      if (pith["block_is"] == eN.blk_is.quote){ @@ -2908,12 +3014,21 @@ template docAbstraction() {          }        }      } -    return an_object; +    struct retStruct { +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.pith        = pith; +      ret.this_object = an_object; +    } +    return ret;    } -  @safe string[string] flow_txt_block_group()( -               char[]          line, -               string[string]  an_object, -    return ref uint[string]    pith, +  @safe auto txt_by_line_block_group()( +    char[]          line, +    string[string]  an_object, +    uint[string]    pith,    ) {      static auto rgx = RgxI();      if (pith["block_is"] == eN.blk_is.group) { @@ -2949,12 +3064,21 @@ template docAbstraction() {          }        }      } -    return an_object; +    struct retStruct { +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.pith        = pith; +      ret.this_object = an_object; +    } +    return ret;    } -  @safe string[string] flow_txt_block_block()( -               char[]          line, -               string[string]  an_object, -    return ref uint[string]    pith, +  @safe auto txt_by_line_block_block()( +    char[]          line, +    string[string]  an_object, +    uint[string]    pith,    ) {      static auto rgx = RgxI();      if (pith["block_is"] == eN.blk_is.block) { @@ -2990,16 +3114,25 @@ template docAbstraction() {          }        }      } -    return an_object; +    struct retStruct { +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.pith        = pith; +      ret.this_object = an_object; +    } +    return ret;    } -  @safe string[string]  flow_txt_block_poem(CMM)( -               char[]          line, -               string[string]  an_object, -    return ref uint[string]    pith, -    return ref int             cntr, -               string[string]  object_number_poem, -               CMM             conf_make_meta, -               string[string]  tag_in_seg, +  @safe auto txt_by_line_block_poem(CMM)( +    char[]          line, +    string[string]  an_object, +    uint[string]    pith, +    int             cntr, +    string[string]  object_number_poem, +    CMM             conf_make_meta, +    string[string]  tag_in_seg,    ) {      static auto rgx = RgxI();      if (pith["block_is"] == eN.blk_is.poem) { @@ -3234,12 +3367,23 @@ template docAbstraction() {          }        }      } -    return an_object; +    struct retStruct { +      int             cntr; +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.cntr        = cntr; +      ret.pith        = pith; +      ret.this_object = an_object; +    } +    return ret;    } -  @safe void flow_txt_block_code()( -               char[]          line, -    return ref string[string]  an_object, -    return ref uint[string]    pith, +  @safe auto txt_by_line_block_code()( +    char[]          line, +    string[string]  an_object, +    uint[string]    pith,    ) {      static auto rgx = RgxI();      if ( pith["block_is"] == eN.blk_is.code) { @@ -3279,12 +3423,22 @@ template docAbstraction() {          }        }      } +    struct retStruct { +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.pith        = pith; +      ret.this_object = an_object; +    } +    return ret;    } -  @system string[string] flow_txt_block_table(CMM)( -               char[]          line, -               string[string]  an_object, -    return ref uint[string]    pith, -    return ref CMM             conf_make_meta, +  @system auto txt_by_line_block_table(CMM)( +    char[]          line, +    string[string]  an_object, +    uint[string]    pith, +    CMM             conf_make_meta,    ) {      static auto rgx = RgxI();      if (pith["block_is"] == eN.blk_is.table) { @@ -3307,15 +3461,25 @@ template docAbstraction() {            pith["block_is"]            = eN.blk_is.table;            pith["block_state"]         = eN.blk_state.off;            pith["block_delim"]         = eN.blk_delim.off; -          line.flow_table_closed_make_special_notation_table_( -            an_object, -            the_document_body_section, -            obj_cite_digits, -            comp_obj_heading, -            cntr, -            pith, -            conf_make_meta, -          ); +          { +            auto _get = line.flow_table_closed_make_special_notation_table_( +              an_object, +              the_document_body_section, +              obj_cite_digits, +              comp_obj_heading, +              cntr, +              pith, +              conf_make_meta, +            ); +            { +              an_object                 = _get.this_object; +              the_document_body_section = _get.the_document_body_section; +              obj_cite_digits           = _get.obj_cite_digits; +              comp_obj_heading          = _get._comp_obj_heading; +              cntr                      = _get.cntr; +              pith                      = _get.pith; +            } +          }          } else {            debug(table) {              writeln(line); @@ -3338,37 +3502,48 @@ template docAbstraction() {          }        }      } -    return an_object; -  } -  @safe final string biblio_tag_map()(string abr) { -    auto btm = [ -      "au"        : "author_raw", -      "ed"        : "editor_raw", -      "ti"        : "fulltitle", -      "lng"       : "language", -      "jo"        : "journal", -      "vol"       : "volume", -      "edn"       : "edition", -      "yr"        : "year", -      "pl"        : "place", -      "pb"        : "publisher", -      "pub"       : "publisher", -      "pg"        : "pages", -      "pgs"       : "pages", -      "sn"        : "short_name" -    ]; -    return btm[abr]; +    struct retStruct { +      CMM             conf_make_meta; +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.conf_make_meta = conf_make_meta, +      ret.pith           = pith; +      ret.this_object    = an_object; +    } +    return ret;    } -  @system void flow_txt_block_biblio( +  @system auto txt_by_line_block_biblio(      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, +    uint[string] pith, +    int          bib_entry, +    string       biblio_entry_str_json, +    string[]     biblio_arr_json,    ) {      mixin spineBiblio;      auto jsn = BibJsnStr();      static auto rgx = RgxI(); +    string biblio_tag_map()(string abr) { +      auto btm = [ +        "au"        : "author_raw", +        "ed"        : "editor_raw", +        "ti"        : "fulltitle", +        "lng"       : "language", +        "jo"        : "journal", +        "vol"       : "volume", +        "edn"       : "edition", +        "yr"        : "year", +        "pl"        : "place", +        "pb"        : "publisher", +        "pub"       : "publisher", +        "pg"        : "pages", +        "pgs"       : "pages", +        "sn"        : "short_name" +      ]; +      return btm[abr]; +    }      if (line.matchFirst(rgx.heading_biblio)) {        pith["section"] = eN.sect.bibliography;      } @@ -3478,21 +3653,137 @@ template docAbstraction() {        }        header_tag_value        = "";      } +    struct retStruct { +      uint[string]    pith; +      int             bib_entry; +      string          biblio_entry_str_json; +      string[]        biblio_arr_json; +    } +    retStruct ret; +    { +      ret.pith                  = pith; +      ret.bib_entry             = bib_entry; +      ret.biblio_entry_str_json = biblio_entry_str_json; +      ret.biblio_arr_json       = biblio_arr_json; +    } +    return ret;    } -  @system void flow_table_closed_make_special_notation_table_(N,CMM)( -               char[]                line, -    return ref string[string]        an_object, -    return ref ObjGenericComposite[] the_document_body_section, -    return ref N                     obj_cite_digits, -    return ref ObjGenericComposite   _comp_obj_heading, -    return ref int                   cntr, -    return ref uint[string]          pith, -    CMM                              conf_make_meta +                                                                                /+ ↓ abstraction functions +/ +  @safe static string[string] object_reset()(string[string] an_object) { +    an_object.remove("body_nugget"); +    an_object.remove("substantive"); +    an_object.remove("is"); +    an_object.remove("attrib"); +    an_object.remove("bookindex_nugget"); +    return an_object; +  } +  @safe static uint[string] _check_ocn_status_()( +    char[]       line, +    uint[string] pith, +  ) { +    static auto rgx = RgxI(); +    if (!(line.empty)) { +      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.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.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.bi.off) { +            pith["dummy_heading_status"]                = eN.bi.off; +            if (pith["dummy_heading_multiple_objects"]) { +              pith["dummy_heading_status"]              = eN.bi.on; +            } +            if (line.matchFirst(rgx.object_number_off)) { +              pith["ocn"]                               = eN.ocn.off; +            } else if (line.matchFirst(rgx.object_number_off_dummy_heading)) { +              pith["ocn"]                               = eN.ocn.off; +              pith["dummy_heading_status"]              = eN.bi.on; +            } else { +              pith["ocn"]                               = eN.ocn.on; +              pith["dummy_heading_status"]              = eN.bi.off; +            } +          } else { +            pith["ocn"] = pith["no_ocn_multiple_objects"]; +          } +      } 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.bi.off; +          pith["ocn"]                                   = eN.ocn.on; +          pith["dummy_heading_status"]                  = eN.bi.off; +          debug(ocnoff) { +            writeln(line); +          } +        } +      } +    } +    return pith; +  } +  @safe char[] _doc_header_and_make_substitutions_(CMM)( +    char[]  line, +    CMM     conf_make_meta, +  ) { +    enum Substitute { match, markup, } +    if (conf_make_meta.make.substitute) { +      foreach(substitution_pair; conf_make_meta.make.substitute) { +        line = line.replaceAll( +          regex("\b" ~ substitution_pair[Substitute.match]), +          substitution_pair[Substitute.markup] +        ); +      } +    } +    return line; +  } +  @safe char[] _doc_header_and_make_substitutions_fontface_(CMM)( +    char[]  line, +    CMM     conf_make_meta, +  ) { +    enum Substitute { match, markup, } +    if ( conf_make_meta.make.bold) { +      line = line.replaceAll( +        regex("\b" ~ conf_make_meta.make.bold[Substitute.match]), +        conf_make_meta.make.bold[Substitute.markup] +      ); +    } +    if (conf_make_meta.make.emphasis) { +      line = line.replaceAll( +        regex("\b" ~ conf_make_meta.make.emphasis[Substitute.match]), +        conf_make_meta.make.emphasis[Substitute.markup] +      ); +    } +    if (conf_make_meta.make.italics) { +      line = line.replaceAll( +        regex("\b" ~ conf_make_meta.make.italics[Substitute.match]), +        conf_make_meta.make.italics[Substitute.markup] +      ); +    } +    return line; +  } +  @system auto flow_table_closed_make_special_notation_table_(CMM)( +    char[]                line, +    string[string]        an_object, +    ObjGenericComposite[] the_document_body_section, +    OCNset                obj_cite_digits, +    ObjGenericComposite   _comp_obj_heading, +    int                   cntr, +    uint[string]          pith, +    CMM                   conf_make_meta    ) {      comp_obj_block = comp_obj_block.init;      obj_cite_digits = ocn_emit(pith["ocn"]); -    auto comp_obj_location -      = node_construct.node_location_emitter( +    auto comp_obj_location = node_construct.node_location_emitter(          content_non_header,          tag_in_seg,          lev_anchor_tag, @@ -3514,25 +3805,49 @@ template docAbstraction() {      comp_obj_block.metainfo.o_n_book_index                      = obj_cite_digits.bkidx;      comp_obj_block.metainfo.object_number_type                  = obj_cite_digits.type;      comp_obj_block                                              = comp_obj_block.flow_table_instructions(an_object["table_head"]); -    comp_obj_block                                              = comp_obj_block.flow_table_substantive_munge_special(an_object["substantive"]); +    { +      auto _get = comp_obj_block.flow_table_substantive_munge_special(an_object["substantive"]); +      { +        comp_obj_block           = _get.table_object; +        an_object["substantive"] = _get.table_substantive; +      } +    }      the_document_body_section                                   ~= comp_obj_block;      object_reset(an_object);      processing.remove("verse");      ++cntr; +    struct retStruct { +      string[string]        this_object; +      ObjGenericComposite[] the_document_body_section; +      OCNset                obj_cite_digits; +      ObjGenericComposite   _comp_obj_heading; +      int                   cntr; +      uint[string]          pith; +    } +    retStruct ret; +    { +      ret.this_object               = an_object; +      ret.the_document_body_section = the_document_body_section; +      ret.obj_cite_digits           = obj_cite_digits; +      ret._comp_obj_heading         = _comp_obj_heading; +      ret.cntr                      = cntr; +      ret.pith                      = pith; +    } +    return ret;    } -  @system string[string] flow_block_flag_line_empty_(B,N,CMM,Ts)( -               char[]                   line, -               string[string]           an_object, -               B                        bookindex_extract_hash, -    return ref ObjGenericComposite[]    the_document_body_section, -    return ref string[][string][string] bookindex_unordered_hashes, -    return ref N                        obj_cite_digits, -    return ref ObjGenericComposite      _comp_obj_heading, -    return ref int                      cntr, -    return ref uint[string]             pith, -    string[string]                      object_number_poem, -    CMM                                 conf_make_meta, -    Ts                                  tag_in_seg, +  @system auto flow_block_flag_line_empty_(B,CMM,Ts)( +    char[]                   line, +    string[string]           an_object, +    B                        bookindex_extract_hash, +    ObjGenericComposite[]    the_document_body_section, +    string[][string][string] bookindex_unordered_hashes, +    OCNset                   obj_cite_digits, +    ObjGenericComposite      _comp_obj_heading, +    int                      cntr, +    uint[string]             pith, +    string[string]           object_number_poem, +    CMM                      conf_make_meta, +    Ts                       tag_in_seg,    ) {      assert(        line.empty, @@ -3825,7 +4140,13 @@ template docAbstraction() {          comp_obj_block.metainfo.o_n_book_index                  = obj_cite_digits.bkidx;          comp_obj_block.metainfo.object_number_type              = obj_cite_digits.type;          comp_obj_block                                          = comp_obj_block.flow_table_instructions(an_object["table_head"]); -        comp_obj_block                                          = comp_obj_block.flow_table_substantive_munge(an_object["substantive"]); +        { +          auto _get = comp_obj_block.flow_table_substantive_munge(an_object["substantive"]); +          { +            comp_obj_block           = _get.table_object; +            an_object["substantive"] = _get.table_substantive; +          } +        }          the_document_body_section                               ~= comp_obj_block;          pith["block_is"]                                        = eN.blk_is.table;          pith["block_state"]                                     = eN.blk_state.off; @@ -3835,14 +4156,33 @@ template docAbstraction() {          ++cntr;        }      } -    return an_object; +    struct retStruct { +      string[string]           this_object; +      ObjGenericComposite[]    the_document_body_section; +      string[][string][string] bookindex_unordered_hashes; +      OCNset                   obj_cite_digits; +      ObjGenericComposite      comp_obj_heading; +      int                      cntr; +      uint[string]             pith; +    } +    retStruct ret; +    { +      ret.this_object                = an_object; +      ret.the_document_body_section  = the_document_body_section; +      ret.bookindex_unordered_hashes = bookindex_unordered_hashes; +      ret.obj_cite_digits            = obj_cite_digits; +      ret.comp_obj_heading           = _comp_obj_heading; // +      ret.cntr                       = cntr; +      ret.pith                       = pith; +    } +    return ret;    } -  @system string[string] flow_book_index_(B)( -               char[]          line, -               string[string]  an_object, -    return ref string          book_idx_tmp, -    return ref uint[string]    pith, -               B               opt_action, +  @system auto flow_book_index_(B)( +    char[]          line, +    string[string]  an_object, +    string          book_idx_tmp, +    uint[string]    pith, +    B               opt_action,    ) {      static auto rgx = RgxI();      if (auto m = line.match(rgx.book_index_item)) {                                   /+ match book_index +/ @@ -3885,14 +4225,25 @@ template docAbstraction() {          }        }      } -    return an_object; +    struct retStruct { +      string[string]  this_object; +      uint[string]    pith; +      string          book_idx_tmp; +    } +    retStruct ret; +    { +      ret.this_object    = an_object; +      ret.pith           = pith; +      ret.book_idx_tmp   = book_idx_tmp; +    } +    return ret;    } -  @safe string[string] flow_heading_found_()( -               char[]                line, -               string[string]        heading_match_str, -               string[]              _make_unmarked_headings, -    return ref Regex!(char)[string]  heading_match_rgx, -    return ref uint[string]          pith, +  @safe auto flow_heading_found_()( +    char[]                line, +    string[string]        heading_match_str, +    string[]              _make_unmarked_headings, +    Regex!(char)[string]  heading_match_rgx, +    uint[string]          pith,    ) {      static auto rgx = RgxI();      if ((_make_unmarked_headings.length > 2) @@ -3966,9 +4317,20 @@ template docAbstraction() {        }        pith["make_headings"] = eN.bi.on;      } -    return heading_match_str; +    struct retStruct { +      string[string]       heading_match_str; +      Regex!(char)[string] heading_match_rgx; +      uint[string]         pith; +    } +    retStruct ret; +    { +      ret.heading_match_str = heading_match_str; +      ret.heading_match_rgx = heading_match_rgx; +      ret.pith              = pith; +    } +    return ret;    } -  @safe char[] flow_heading_make_set_()( +  @safe auto flow_heading_make_set_()(                 char[]                line,                 int[string]           line_occur,      return ref Regex!(char)[string]  heading_match_rgx, @@ -4022,17 +4384,28 @@ template docAbstraction() {          }        }      } -    return line; +    struct retStruct { +      char[]          line; +      uint[string]    pith; +      string[string]  this_object; +    } +    retStruct ret; +    { +      ret.line           = line; +      ret.pith           = pith; +      ret.this_object    = an_object; +    } +    return ret;    } -  @safe string[string] flow_heading_matched_(CMM)( -               char[]          line, -               string[string]  an_object, -    return ref int[string]     line_occur, -    return ref string          an_object_key, -    return ref int[string]     lv, -    return ref int[string]     collapsed_lev, -    return ref uint[string]    pith, -    return ref CMM             conf_make_meta, +  @safe auto flow_heading_matched_(CMM)( +    char[]          line, +    string[string]  an_object, +    int[string]     line_occur, +    string          an_object_key, +    int[string]     lv, +    int[string]     collapsed_lev, +    uint[string]    pith, +    CMM             conf_make_meta,    ) {      static auto rgx = RgxI();      static auto mkup = InlineMarkup(); @@ -4194,16 +4567,35 @@ template docAbstraction() {          writeln(line.strip);        }      } -    return an_object; +    struct retStruct { +      string[string]  this_object; +      int[string]     line_occur; +      string          an_object_key; +      int[string]     lv; +      int[string]     collapsed_lev; +      uint[string]    pith; +      CMM             conf_make_meta; +    } +    retStruct ret; +    { +      ret.this_object    = an_object; +      ret.line_occur     = line_occur; +      ret.an_object_key  = an_object_key; +      ret.lv             = lv; +      ret.collapsed_lev  = collapsed_lev; +      ret.pith           = pith; +      ret.conf_make_meta = conf_make_meta; +    } +    return ret;    } -  @safe string[string] flow_para_match_()( -               char[]         line, -               string[string]  an_object, -    return ref string          an_object_key, -    return ref int[string]     indent, -    return ref bool            bullet, -    return ref uint[string]    pith, -    return ref int[string]     line_occur, +  @safe auto flow_para_match_()( +    char[]         line, +    string[string]  an_object, +    string          an_object_key, +    int[string]     indent, +    bool            bullet, +    uint[string]    pith, +    int[string]     line_occur,    ) {      static auto rgx = RgxI();      if (line_occur["para"] == eN.bi.off) { @@ -4247,7 +4639,24 @@ template docAbstraction() {        }        ++line_occur["para"];      } -    return an_object; +    struct retStruct { +      uint[string]    pith; +      string[string]  this_object; +      string          this_object_key; +      int[string]     indent; +      bool            bullet; +      int[string]     line_occur; +    } +    retStruct ret; +    { +      ret.pith            = pith; +      ret.this_object     = an_object; +      ret.this_object_key = an_object_key; +      ret.indent          = indent; +      ret.bullet          = bullet; +      ret.line_occur      = line_occur; +    } +    return ret;    }    @safe char[] font_faces_line()(      char[]  textline, @@ -4272,8 +4681,8 @@ template docAbstraction() {      return textline;    }    @safe ObjGenericComposite flow_table_instructions(H)( -    return ref ObjGenericComposite  table_object, -               H                    table_head, +    ObjGenericComposite  table_object, +    H                    table_head,    ) {      static auto rgx = RgxI();      table_object.metainfo.is_of_part        = "body"; @@ -4296,9 +4705,9 @@ template docAbstraction() {      }      return table_object;    } -  @safe ObjGenericComposite flow_table_array_munge(T)( -    return ref ObjGenericComposite  table_object, -    return ref T                    table_array, +  @safe auto flow_table_array_munge()( +    ObjGenericComposite  table_object, +    string[][]           table_array,    ) {      static auto rgx = RgxI();      static auto mng = InlineMarkup(); @@ -4333,26 +4742,24 @@ template docAbstraction() {          }          col_num_ = idx_c;          _table_substantive ~= col ~ mng.tc_s; -        if (idx_r == 0 && comp_obj_block.table.heading) { +        if (idx_r == 0 && table_object.table.heading) {          } else if (col.match(rgx.numeric_col) && idx_r == 1) { // conditions reversed to avoid: gdc compiled program run segfault -          if ((comp_obj_block.table.column_aligns.length > idx_c) -          && (comp_obj_block.table.column_aligns[idx_c].matchFirst(rgx.table_col_align_match))) { -            comp_obj_block.table.column_aligns[idx_c] -              = comp_obj_block.table.column_aligns[idx_c]; -          } else if (comp_obj_block.table.column_aligns.length > idx_c) { -            comp_obj_block.table.column_aligns[idx_c] = "r"; +          if ((table_object.table.column_aligns.length > idx_c) +          && (table_object.table.column_aligns[idx_c].matchFirst(rgx.table_col_align_match))) { +            table_object.table.column_aligns[idx_c] = table_object.table.column_aligns[idx_c]; +          } else if (table_object.table.column_aligns.length > idx_c) { +            table_object.table.column_aligns[idx_c] = "r";            } else { -            comp_obj_block.table.column_aligns ~= "r"; +            table_object.table.column_aligns ~= "r";            }          } else if (idx_r == 1) { -          if ((comp_obj_block.table.column_aligns.length > idx_c) -          && (comp_obj_block.table.column_aligns[idx_c].matchFirst(rgx.table_col_align_match))) { -            comp_obj_block.table.column_aligns[idx_c] -              = comp_obj_block.table.column_aligns[idx_c]; -          } else if (comp_obj_block.table.column_aligns.length > idx_c) { -            comp_obj_block.table.column_aligns[idx_c] = "l"; +          if ((table_object.table.column_aligns.length > idx_c) +          && (table_object.table.column_aligns[idx_c].matchFirst(rgx.table_col_align_match))) { +            table_object.table.column_aligns[idx_c] = table_object.table.column_aligns[idx_c]; +          } else if (table_object.table.column_aligns.length > idx_c) { +            table_object.table.column_aligns[idx_c] = "l";            } else { -            comp_obj_block.table.column_aligns ~= "l"; +            table_object.table.column_aligns ~= "l";            }          }        } @@ -4366,12 +4773,12 @@ template docAbstraction() {        }        _table_substantive = _table_substantive.replaceFirst(rgx.table_col_separator_nl, "\n");      } -    if (comp_obj_block.table.number_of_columns != col_num) { -      if (comp_obj_block.table.number_of_columns == 0) { -        comp_obj_block.table.number_of_columns = (col_num).to!int; +    if (table_object.table.number_of_columns != col_num) { +      if (table_object.table.number_of_columns == 0) { +        table_object.table.number_of_columns = (col_num).to!int;        } else {          debug(table_dev) { -          writeln(comp_obj_block.table.number_of_columns, " != ", col_num); +          writeln(table_object.table.number_of_columns, " != ", col_num);          }        }      } @@ -4411,46 +4818,85 @@ template docAbstraction() {        writeln(_table_substantive);      }      debug(table_res) { -      writeln("aligns: ", comp_obj_block.table.column_aligns, "\n", -        "no. of columns: ", comp_obj_block.table.number_of_columns, "\n", -        "col widths: ", comp_obj_block.table.column_widths, -          " sum: ", comp_obj_block.table.column_widths.sum, "\n", +      writeln("aligns: ", table_object.table.column_aligns, "\n", +        "no. of columns: ", table_object.table.number_of_columns, "\n", +        "col widths: ", table_object.table.column_widths, +          " sum: ", table_object.table.column_widths.sum, "\n",          _table_substantive);      } -    comp_obj_block.text = _table_substantive; -    return table_object; +    table_object.text = _table_substantive; +    struct retStruct { +      ObjGenericComposite table_object; +      string[][]          table_array; +    } +    retStruct ret; +    { +      ret.table_object      = table_object; +      ret.table_array       = table_array; +    } +    return ret;    } -  @system ObjGenericComposite flow_table_substantive_munge(T)( -    return ref ObjGenericComposite  table_object, -    return ref T                    table_substantive, +  @system auto flow_table_substantive_munge()( +    ObjGenericComposite  table_object, +    string               table_substantive,    ) {      static auto rgx = RgxI();      static auto munge = ObjInlineMarkupMunge();      string[] _table_rows = (table_substantive).split(rgx.table_row_delimiter);      string[] _table_cols; -    string[][] _table; +    string[][] _table_array;      foreach(col; _table_rows) {        _table_cols = col.split(rgx.table_col_delimiter); -      _table ~= _table_cols; +      _table_array ~= _table_cols;      } -    table_object = table_object.flow_table_array_munge(_table); -    return table_object; +    { +      auto _get = table_object.flow_table_array_munge(_table_array); +      { +        table_object = _get.table_object; +        _table_array = _get.table_array; // what do you do with this? how is this passed down? +      } +    } +    struct retStruct { +      ObjGenericComposite  table_object; +      string               table_substantive; +    } +    retStruct ret; +    { +      ret.table_object      = table_object; +      ret.table_substantive = table_substantive; // has anything been changed here? +    } +    return ret;    } -  @system ObjGenericComposite flow_table_substantive_munge_special(T)( -    return ref ObjGenericComposite  table_object, -    return ref T                    table_substantive, +  @system auto flow_table_substantive_munge_special()( +    ObjGenericComposite  table_object, +    string               table_substantive,    ) {      static auto rgx = RgxI();      static auto munge = ObjInlineMarkupMunge();      string[] _table_rows = (table_substantive).split(rgx.table_row_delimiter_special);      string[] _table_cols; -    string[][] _table; +    string[][] _table_array;      foreach(col; _table_rows) {        _table_cols = col.split(rgx.table_col_delimiter_special); -      _table ~= _table_cols; +      _table_array ~= _table_cols;      } -    table_object = table_object.flow_table_array_munge(_table); -    return table_object; +    { +      auto _get = table_object.flow_table_array_munge(_table_array); +      { +        table_object = _get.table_object; +        _table_array = _get.table_array; +      } +    } +    struct retStruct { +      ObjGenericComposite  table_object; +      string               table_substantive; +    } +    retStruct ret; +    { +      ret.table_object      = table_object; +      ret.table_substantive = table_substantive; +    } +    return ret;    }                                                                                  /+ abstraction functions ↑ +/                                                                                  /+ ↓ abstraction function emitters +/ @@ -4865,13 +5311,13 @@ template docAbstraction() {       heading_toc_ = (m.post).replaceAll(rgx.inline_notes_curly_gen, "");       return heading_toc_;      }; -    @safe ObjGenericComposite[] flow_table_of_contents_gather_headings(CMM)( -                 string[string]         obj_, -                 CMM                    conf_make_meta, -                 string[string]         tag_in_seg, -                 string                 _anchor_tag, -      return ref string[][string]       lev4_subtoc, -                 ObjGenericComposite[]  the_document_toc_section, +    @safe auto flow_table_of_contents_gather_headings(CMM)( // +      string[string]         obj_, +      CMM                    conf_make_meta, +      string[string]         tag_in_seg, +      string                 _anchor_tag, +      string[][string]       lev4_subtoc, +      ObjGenericComposite[]  the_document_toc_section,      ) {        ObjGenericComposite comp_obj_toc;        mixin InternalMarkup; @@ -4948,7 +5394,16 @@ template docAbstraction() {        default:          break;        } -      return the_document_toc_section; +      struct retStruct { +        ObjGenericComposite[] the_document_toc_section; +        string[][string]      lev4_subtoc; +      } +      retStruct ret; +      { +        ret.the_document_toc_section = the_document_toc_section; +        ret.lev4_subtoc              = lev4_subtoc; +      } +      return ret;      }      invariant() {      } @@ -5326,9 +5781,9 @@ template docAbstraction() {      string[] object_numbers;      string[][string][string] bi_hash_nugget;      string[] bi_main_terms_split_arr; -    @safe string[][string][string] bookindex_nugget_hash(N,S)( +    @safe string[][string][string] bookindex_nugget_hash(S)(        string bookindex_section, -      N      obj_cite_digits, +      OCNset obj_cite_digits,        S      tag_in_seg,      ) {        debug(asserts) { @@ -5453,9 +5908,9 @@ template docAbstraction() {          ++mkn;        }      } -    @system auto bookindex_build_abstraction_section(N,B)( +    @system auto bookindex_build_abstraction_section(B)(        string[][string][string] bookindex_unordered_hashes, -      N                        obj_cite_digits, +      OCNset                   obj_cite_digits,        B                        opt_action,      ) {        debug(asserts) { @@ -5708,8 +6163,8 @@ template docAbstraction() {        }        return endnotes_;      } -    @safe private auto endnote_objects(N,O)( -      N              obj_cite_digits, +    @safe private auto endnote_objects(O)( +      OCNset         obj_cite_digits,        O              opt_action,      ) {        mixin spineNode; @@ -5821,9 +6276,9 @@ template docAbstraction() {    }                                                                                  /+ +/    struct Bibliography { -    @system public JSONValue[] flow_bibliography_()( -      return ref string[]    biblio_unsorted_incomplete, -      return ref JSONValue[] bib_arr_json +    @system public auto flow_bibliography_()( +      string[]    biblio_unsorted_incomplete, +      JSONValue[] bib_arr_json      ) {        JSONValue[] biblio_unsorted          = biblio_make_unsorted_array_of_json_objects(biblio_unsorted_incomplete, bib_arr_json); // TODO lookat returns @@ -5844,7 +6299,18 @@ template docAbstraction() {            cntr++;          }        } -      return biblio_sorted__; +      struct retStruct { +        JSONValue[] biblio_sorted; +        JSONValue[] bib_arr_json; +        string[]    biblio_unsorted_incomplete; +      } +      retStruct ret; +      { +        ret.biblio_sorted  = biblio_sorted__; +        ret.bib_arr_json  = bib_arr_json; +        ret.biblio_unsorted_incomplete  = biblio_unsorted_incomplete; +      } +      return ret;      }      @system final private JSONValue[] biblio_make_unsorted_array_of_json_objects()(        string[]      biblio_unordered, @@ -5905,12 +6371,12 @@ template docAbstraction() {      int obj_cite_digit;      int[string] p_; // p_ parent_      static auto rgx = RgxI(); -    @safe ObjGenericComposite node_location_emitter(La,Ta,N)( +    @safe ObjGenericComposite node_location_emitter(La,Ta)(        string         lev_markup_number,        string[string] tag_in_seg,        La             lev_anchor_tag,        Ta             tag_assoc, -      N              obj_cite_digits, +      OCNset         obj_cite_digits,        int            cntr_,        int            ptr_,        string         is_ @@ -5959,7 +6425,7 @@ template docAbstraction() {      }      invariant() {      } -    @safe ObjGenericComposite node_emitter_heading(Hd,TaL,TA,N,fNr,fNs,fL)( +    @safe ObjGenericComposite node_emitter_heading(Hd,TaL,TA,fNr,fNs,fL)(        string         _text,        string         lev_markup_number,        string         lev_collapsed_number, @@ -5967,7 +6433,7 @@ template docAbstraction() {        string[string] tag_in_seg,        TaL            lev_anchor_tag,        TA             tag_assoc, -      N              obj_cite_digits, +      OCNset         obj_cite_digits,        int            cntr_,        int            ptr_,        string[]       lv_ancestors_txt, | 
