diff options
| author | Ralph Amissah <ralph@amissah.com> | 2016-04-24 22:35:39 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2016-04-24 22:35:39 -0400 | 
| commit | 9c14b019a6f695b54a035605e3bb3fc76bf20aa6 (patch) | |
| tree | 517169ec313d81aca54da3ddcb1f329b7caba695 /org | |
| parent | step1 (diff) | |
step2doc-reform_v0.0.2
Diffstat (limited to 'org')
| -rw-r--r-- | org/ao_abstract_doc_source.org | 5542 | ||||
| -rw-r--r-- | org/ao_assertions.org | 252 | ||||
| -rw-r--r-- | org/ao_defaults.org | 444 | ||||
| -rw-r--r-- | org/ao_object_setter.org | 244 | ||||
| -rw-r--r-- | org/ao_output_debugs.org | 140 | ||||
| -rw-r--r-- | org/ao_read_markup_source.org | 98 | ||||
| -rw-r--r-- | org/ao_read_source_files.org | 390 | ||||
| -rw-r--r-- | org/ao_rgx.org | 251 | ||||
| -rw-r--r-- | org/ao_scan_inserts.org | 259 | ||||
| -rw-r--r-- | org/ao_structs.org | 71 | ||||
| -rw-r--r-- | org/ao_utils.org | 114 | ||||
| -rw-r--r-- | org/compile_time_info.org | 4 | ||||
| -rw-r--r-- | org/sdp.org | 416 | 
13 files changed, 5086 insertions, 3139 deletions
diff --git a/org/ao_abstract_doc_source.org b/org/ao_abstract_doc_source.org index a89b14c..cf0efd2 100644 --- a/org/ao_abstract_doc_source.org +++ b/org/ao_abstract_doc_source.org @@ -12,127 +12,159 @@  #+FILETAGS: :sdp:rel:ao:  #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) -* document abstraction                                             :abstract:  [[./sdp.org][sdp]]  [[./][org/]] + +* document abstraction                                     :abstract:process:  Process markup document, create document abstraction. -** initialize                                                    :initialize: -#+name: abs_init + +** pre loop processing                                                  :pre: +*** imports                                                         :imports: +[[./ao_defaults.org][ao_defaults]] + +#+name: abs_imports +#+BEGIN_SRC d +import +  lib.sdp.ao_defaults,                  // sdp/ao_defaults.d +  lib.sdp.ao_object_setter,             // sdp/ao_object_setter.d +  lib.sdp.ao_rgx,                       // sdp/ao_rgx.d +  lib.sdp.ao_ansi_colors;               // sdp/ao_ansi_colors.d +#+END_SRC + +*** mixins                                                           :mixins: + +#+name: abs_mixins +#+BEGIN_SRC d +mixin ObjectSetter; +mixin InternalMarkup; +// // mixin SiSUrgxInitFlags; +// // mixin AssertionsOnBlocks; +// mixin SiSUbiblio; // issue +// mixin SiSUheader; +#+END_SRC + +*** initialize                                                   :initialize: + +#+name: abs_init_struct  #+BEGIN_SRC d  /+ initialize +/ -mixin ObjectSetters; -mixin AssertionsOnMarkupDocumentStructure; -mixin AssertionsOnBlocks; -mixin ScreenTxtColors; +  auto rgx = Rgx(); -auto set_oa = ObjectAbstractSet(); +string[string][] contents_the_objects; +string[string] an_object, processing; +auto set_abstract_object = ObjectAbstractSet();  auto set_header = HeaderDocMetadataMakeJson(); -auto notesection = NotesSection(); -string[string][] contents; -mixin Structs; -string notes_str; -string[string] object, processing, head; -string biblio_tag_name, biblio_tag_entry, book_idx_tmp, st; +auto note_section = NotesSection(); + +/+ enum +/ +enum State { off, on } +enum TriState { off, on, closing } // make aware, possibility of third state +enum DocStructMarkupHeading { +  h_sect_A, +  h_sect_B, +  h_sect_C, +  h_sect_D, +  h_text_1, +  h_text_2, +  h_text_3, +  h_text_4, +  h_text_5, // extra level, drop +  content_non_header +} // header section A-D; header text 1-4 +enum DocStructCollapsedHeading { lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7 } // not yet used + +/+ biblio variables +/ +string biblio_tag_name, biblio_tag_entry, st;  string[] biblio_arr_json;  JSONValue[] bib_arr_json; -uint[string] line_occur; -uint counter, ocn, ocn_, verse_line, bib_entry, heading_pointer, notepoint, count_biblio_entry; -ulong previous_count; -string indent_first, indent_second; -string[][string][string] bookindex_unordered_hashes; +int bib_entry; + +/+ counters +/ +long counter, previous_count; +int[string] line_occur; +int verse_line, heading_pointer; + +/+ paragraph attributes +/ +string[string] indent;  bool bullet = true; -uint[string] lv = [ -  "lv" : 0, -  "h0" : 0, -  "h1" : 0, -  "h2" : 0, -  "h3" : 0, -  "h4" : 0, -  "h5" : 0, -  "h6" : 0, -  "h7" : 0, -  "lcn" : 0, -]; -int[string] collapsed_lev = [ -  "h0" : 0, -  "h1" : 0, -  "h2" : 0, -  "h3" : 0, -  "h4" : 0, -  "h5" : 0, -  "h6" : 0, -  "h7" : 0 -]; -auto rgx_h_A = regex(r"^(none)"); -auto rgx_h_B = regex(r"^(none)"); -auto rgx_h_C = regex(r"^(none)"); -auto rgx_h_D = regex(r"^(none)"); -auto rgx_h_1 = regex(r"^(none)"); -auto rgx_h_2 = regex(r"^(none)"); -auto rgx_h_3 = regex(r"^(none)"); -auto rgx_h_4 = regex(r"^(none)"); -auto str_h_A = "^(none)"; -auto str_h_B = "^(none)"; -auto str_h_C = "^(none)"; -auto str_h_D = "^(none)"; -auto str_h_1 = "^(none)"; -auto str_h_2 = "^(none)"; -auto str_h_3 = "^(none)"; -auto str_h_4 = "^(none)";  string content_non_header = "8"; -string node; +  auto obj_im = ObjInlineMarkup();  auto obj_att = ObjAttrib(); + +/+ ocn +/ +int obj_cite_number, obj_cite_number_;  auto object_citation_number = OCNemitter(); -auto ft = flag_type.dup; -int ocn_emit(int ocn_status_flag) { -  return object_citation_number.ocn_emitter(ocn_status_flag); +int obj_cite_number_emit(int obj_cite_number_status_flag) { +  return object_citation_number.obj_cite_number_emitter(obj_cite_number_status_flag);  } + +/+ book index variables +/ +string book_idx_tmp; +string[][string][string] bookindex_unordered_hashes;  auto bookindex_extract_hash = BookIndexNuggetHash(); -string[][string][string] bkidx_hash(string bookindex, int ocn) { -  return bookindex_extract_hash.bookindex_nugget_hash(bookindex, ocn); +string[][string][string] bkidx_hash(string bookindex_section, int obj_cite_number) { +  return bookindex_extract_hash.bookindex_nugget_hash(bookindex_section, obj_cite_number);  } + +/+ node +/ +string node;  auto node_construct = NodeStructureMetadata();  string node_jstr( -  string lvn, -  int ocn_, -  int counter, +  string lev_markup_number, +  int obj_cite_number_, +  long counter,    int heading_pointer,    string is_  ) {    return node_construct.node_emitter( -    lvn, -    ocn_, +    lev_markup_number, +    obj_cite_number_,      counter,      heading_pointer,      is_    );  }  string node_jstr_heading( -  string lvn, -  string lcn, -  int ocn_, -  int counter, +  string lev_markup_number, +  string lev_collapsed_number, +  int obj_cite_number_, +  long counter,    int heading_pointer,    string is_  ) {    return node_construct.node_emitter_heading( -    lvn, -    lcn, -    ocn_, +    lev_markup_number, +    lev_collapsed_number, +    obj_cite_number_,      counter,      heading_pointer,      is_    );  } -string[string] ocn_poem = [ -  "start" : "", -  "end"   : "" -]; -int tell_lo(string color, int ocn, in char[] line) { +// mixin SiSUdocAbstractionFunctions; +#+END_SRC + +#+name: abs_init_rest +#+BEGIN_SRC d +scope(success) { +} +scope(failure) { +} +scope(exit) { +  destroy(contents_the_objects); +  destroy(an_object); +  destroy(processing); +  destroy(biblio_arr_json); +} +auto type = flags_type_init; +auto dochead_make = parseJSON(header_make_jsonstr).object; +auto dochead_metadata = parseJSON(header_metadata_jsonstr).object; +mixin ScreenTxtColors; +int tell_lo(string color, int obj_cite_number, in char[] line) {    writefln(      "%s%s %s",      scr_txt_marker[color], -    to!string(ocn), +    to!string(obj_cite_number),      to!string(line)    );    return 0; @@ -145,32 +177,66 @@ int tell_l(string color, in char[] line) {    );    return 0;  } -scope(success) { -} -scope(failure) { -} -scope(exit) { -  destroy(contents); -  destroy(object); -  destroy(processing); -  destroy(biblio_arr_json); -} -auto dochead_make = parseJSON(header_make_jsonstr).object; -auto dochead_metadata = parseJSON(header_metadata_jsonstr).object; +string[string] obj_cite_number_poem = [ +  "start" : "", +  "end"   : "" +]; +int[string] lv = [ +  "lv" : State.off, +  "h0" : State.off, +  "h1" : State.off, +  "h2" : State.off, +  "h3" : State.off, +  "h4" : State.off, +  "h5" : State.off, +  "h6" : State.off, +  "h7" : State.off, +  "lev_collapsed_number" : 0, +]; +int[string] collapsed_lev = [ +  "h0" : State.off, +  "h1" : State.off, +  "h2" : State.off, +  "h3" : State.off, +  "h4" : State.off, +  "h5" : State.off, +  "h6" : State.off, +  "h7" : State.off +]; +string[string] heading_match_str = [ +  "h_A": "^(none)", +  "h_B": "^(none)", +  "h_C": "^(none)", +  "h_D": "^(none)", +  "h_1": "^(none)", +  "h_2": "^(none)", +  "h_3": "^(none)", +  "h_4": "^(none)" +]; +auto heading_match_rgx = [ +  "h_A": regex(r"^(none)"), +  "h_B": regex(r"^(none)"), +  "h_C": regex(r"^(none)"), +  "h_D": regex(r"^(none)"), +  "h_1": regex(r"^(none)"), +  "h_2": regex(r"^(none)"), +  "h_3": regex(r"^(none)"), +  "h_4": regex(r"^(none)") +];  #+END_SRC -** loop: process document body [+7] -*** scope                                                             :scope: -#+name: abs_loop_body_00 +** loop: process document body [+6]                                    :loop: +*** loop scope                                                        :scope: + +#+name: abs_in_loop_body_00  #+BEGIN_SRC d  /+ scope +/  scope(exit) {  }  scope(failure) { -  writefln( -    "%s:%s failed here: \n  line: %s", -    __FILE__, -    __LINE__, +  stderr.writefln( +    "%s:%s failed here:\n  line: %s", +    __FILE__, __LINE__,      line,    );  } @@ -191,107 +257,1105 @@ debug(srclines) {    }  }  #+END_SRC -*** check whether ocn is on or turned off                               :ocn: -#+name: abs_loop_body_00 + +*** check whether obj_cite_number is on or turned off                   :ocn: + +#+name: abs_in_loop_body_00  #+BEGIN_SRC d -if ((!line.empty) && (ft["ocn_status_multi_obj"] == 0)) { -/+ not multi-line object, check whether ocn is on or turned off +/ -  if (match(line, rgx.ocn_block_marks)) { -  /+ switch off ocn +/ -    if (match(line, rgx.ocn_off_block)) { -      ft["ocn_status_multi_obj"] = 1; -      debug(ocnoff) { -        tell_l("fuchsia", line); +if (!line.empty) { +  check_obj_cite_number_status(line, type); +} +#+END_SRC + +*** [#A] separate regular markup text from code blocks [+5] + +**** code blocks                                                 :block:code: +#+name: abs_in_loop_body_00 +#+BEGIN_SRC d +if (type["code"] == TriState.on) { +  /+ block object: code +/ +  code_block(line, an_object, type); +  continue; +#+END_SRC +**** non code objects (other blocks or regular text) [+4]          :non_code: + +#+name: abs_in_loop_body_00 +#+BEGIN_SRC d +} else if (!match(line, rgx.regular_parse_skip)) { +  /+ object other than code block object (includes regular text paragraph) +/ +#+END_SRC + +***** within block group [+1]                                  :block:active: +****** within block group: biblio                                    :biblio: + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +if (((match(line, rgx.heading_biblio) +|| (type["heading_biblio"] == State.on))) +&& (!match(line, rgx.heading)) +&& (!match(line, rgx.comment))) { +  /+ within block object: biblio +/ +  biblio_block(line, type, bib_entry, biblio_arr_json); +  continue; +#+END_SRC + +****** within block group: poem                                        :poem: + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +} else if (type["poem"] == TriState.on) { +  /+ within block object: poem +/ +  poem_block(line, an_object, type, counter, obj_cite_number_poem); +  continue; +#+END_SRC + +****** within block group: group                                      :group: + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +/+ within block object: group +/ +} else if (type["group"] == TriState.on) { +  /+ within block object: group +/ +  group_block(line, an_object, type); +  continue; +#+END_SRC + +****** within block group: block                                      :block: + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +} else if (type["block"] == TriState.on) { +  /+ within block object: block +/ +  block_block(line, an_object, type); +  continue; +#+END_SRC + +****** within block group: quote                                      :quote: + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +} else if (type["quote"] == TriState.on) { +  /+ within block object: quote +/ +  quote_block(line, an_object, type); +  continue; +#+END_SRC + +****** within block group: table                                      :table: + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +} else if (type["table"] == TriState.on) { +  /+ within block object: table +/ +  table_block(line, an_object, type); +  continue; +#+END_SRC + +***** not (yet) identified as being within block group [+3] + +#+name: abs_in_loop_body_non_code_obj +#+BEGIN_SRC d +} else { +/+ not within a block group +/ +#+END_SRC + +****** assert + +#+name: abs_in_loop_body_open_block_obj +#+BEGIN_SRC d +assert( +  (type["blocks"] == TriState.off) +  || (type["blocks"] == TriState.closing), +  "block status: none or closed" +); +assertions_flag_types_block_status_none_or_closed(type); +#+END_SRC + +****** block open + +#+name: abs_in_loop_body_open_block_obj +#+BEGIN_SRC d +if (match(line, rgx.block_open)) { +  if (match(line, (rgx.block_poem_open))) { +    /+ poem to verse exceptions! +/ +    object_reset(an_object); +    processing.remove("verse"); +    obj_cite_number_poem["start"] = to!string(obj_cite_number); +  } +  start_block(line, type, obj_cite_number_poem); +  continue; +#+END_SRC + +****** line not empty [+2] + +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +} else if (!line.empty) { +  /+ line not empty +/ +  /+ non blocks (headers, paragraphs) & closed blocks +/ +#+END_SRC + +******* asserts                                                      :assert: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +  assert( +    !line.empty, +    "line tested, line not empty surely" +  ); +  assert( +    (type["blocks"] == TriState.off) +    || (type["blocks"] == TriState.closing), +    "code block status: none or closed" +  ); +  if (type["blocks"] == TriState.closing) { +    // blocks closed, unless followed by book index +    debug(check) {                           // block +      writeln(__LINE__); +      tell_l("red", line); +    } +    assert( +      match(line, rgx.book_index) +      || match(line, rgx.book_index_open) +      || type["book_index"] == State.on +    ); +  } +#+END_SRC +******* book index                                                :bookindex: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +  if ((match(line, rgx.book_index)) +  || (match(line, rgx.book_index_open)) +  || (type["book_index"] == State.on ))  { +    /+ book_index +/ +    book_index(line, book_idx_tmp, an_object, type); +#+END_SRC + +******* not book index [+1] +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +  } else { +    /+ not book_index +/ +#+END_SRC +******** matched: comment                                     :comment:match: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    if (auto m = match(line, rgx.comment)) { +      /+ matched comment +/ +      debug(comment) { +        tell_l("blue", line);        } +      an_object["obj"] ~= line ~= "\n"; +      contents_the_objects ~= +        set_abstract_object.contents_comment(strip(an_object["obj"])); +      header_set_common(line_occur, an_object, type); +      processing.remove("verse"); +      type["header_make"] = State.off; +      type["header_metadata"] = State.off; +      ++counter; +#+END_SRC +******** matched: header make                                        :header: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    } else if ((match(line, rgx.header_make)) +      || (match(line, rgx.header_metadata)) +      || (type["header_make"] == State.on +      && (line_occur["header_make"] > State.off)) +      || (type["header_metadata"] == State.on +      && (line_occur["header_metadata"] > State.off))) { +        header_extract(line, line_occur, an_object, type); +#+END_SRC + +******** flag not set & line not exist: heading or para   :heading:paragraph: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    } else if (((line_occur["para"] == State.off) +    && (line_occur["heading"] == State.off)) +    && ((type["para"] == State.off) +    && (type["heading"] == State.off))) { +      /+ heading or para but neither flag nor line exists +/ +      if ((to!string(dochead_make["make"]["headings"]).length > 2) +      && (type["make_headings"] == State.off)) { +        /+ heading found +/ +        auto dochead_make_headings = +          to!string(dochead_make["make"]["headings"]); +        heading_found(line, dochead_make_headings, heading_match_str, heading_match_rgx, type); +      } +      if ((type["make_headings"] == State.on) +      && ((line_occur["para"] == State.off) +      && (line_occur["heading"] == State.off)) +      && ((type["para"] == State.off) +      && (type["heading"] == State.off))) { +        /+ heading make set +/ +        heading_make_set(line, line_occur, heading_match_rgx, type); +      } +      if (auto m = match(line, rgx.heading)) { +        /+ heading match +/ +        heading_match(line, line_occur, an_object, lv, collapsed_lev, type); +      } else if (line_occur["para"] == State.off) { +        /+ para match +/ +        para_match(line, an_object, indent, bullet, type); +      } +#+END_SRC +******** line exist: header make                                :header:make: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    } else if (line_occur["header_make"] > State.off) { +      /+ header_make +/ +      // should be caught by sub-header +      debug(header) { +        tell_l("red", line); +      } +      an_object["obj"] ~= line ~= "\n"; +      ++line_occur["header_make"]; +#+END_SRC +******** line exist: header metadata                        :header:metadata: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    } else if (line_occur["header_metadata"] > State.off) { +      /+ header_metadata +/ +      // should be caught by sub-header +      debug(header) {                          // para +        tell_l("red", line); +      } +      an_object["obj"] ~= line ~= "\n"; +      ++line_occur["header_metadata"]; +#+END_SRC +******** line exist: heading                                        :heading: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    } else if (line_occur["heading"] > State.off) { +      /+ heading +/ +      debug(heading) {                         // heading +        tell_l("blue", line); +      } +      an_object["obj"] ~= line ~= "\n"; +      ++line_occur["heading"]; +#+END_SRC +******** line exist: para                                              :para: +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +    } else if (line_occur["para"] > State.off) { +      /+ paragraph +/ +      debug(para) { +        tell_l("blue", line); +      } +      an_object["obj"] ~= line; +      ++line_occur["para"];      } -    if (match(line, rgx.ocn_off_block_dh)) { -      ft["ocn_status_multi_obj"] = 2; -      debug(ocnoff) { -        tell_l("fuchsia", line); +  } +#+END_SRC +****** line empty, with block flag + +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +} else if (type["blocks"] == TriState.closing) { +  /+ line empty, with blocks flag +/ +  block_flag_line_empty(line, an_object, contents_the_objects, bookindex_unordered_hashes, obj_cite_number, node, counter, type, obj_cite_number_poem); // watch +#+END_SRC + +****** line empty [+1] + +#+name: abs_in_loop_body_not_block_obj +#+BEGIN_SRC d +} else { +/+ line empty +/ +#+END_SRC + +******* assert line empty                                            :assert: + +#+name: abs_in_loop_body_not_block_obj_line_empty +#+BEGIN_SRC d +/+ line.empty, post contents, empty variables: +/ +assert( +  line.empty, +  "line should be empty" +); +assert( +  (type["blocks"] == State.off), +  "code block status: none" +); +#+END_SRC + +******* header_make instructions                   :header:make:instructions: + +#+name: abs_in_loop_body_not_block_obj_line_empty +#+BEGIN_SRC d +if ((type["header_make"] == State.on) +&& (line_occur["header_make"] > State.off)) { +  /+ header_make instructions (current line empty) +/ +  auto dochead_metadata_and_make = +    set_header.header_metadata_and_make_jsonstr(strip(an_object["obj"]), dochead_metadata, dochead_make); +  static assert(!isTypeTuple!(dochead_metadata_and_make)); +  dochead_metadata = dochead_metadata_and_make[0]; +  dochead_make = dochead_metadata_and_make[1]; +  header_set_common(line_occur, an_object, type); +  processing.remove("verse"); +#+END_SRC + +******* header_metadata                                     :header:metadata: + +#+name: abs_in_loop_body_not_block_obj_line_empty +#+BEGIN_SRC d +} else if ((type["header_metadata"] == State.on) +&& (line_occur["header_metadata"] > State.off)) { +  /+ header_metadata (current line empty) +/ +  auto dochead_metadata_and_make = +    set_header.header_metadata_and_make_jsonstr(strip(an_object["obj"]), dochead_metadata, dochead_make); +  static assert(!isTypeTuple!(dochead_metadata_and_make)); +  dochead_metadata = dochead_metadata_and_make[0]; +  dochead_make = dochead_metadata_and_make[1]; +  header_set_common(line_occur, an_object, type); +  type["header_make"] = State.off; +  type["header_metadata"] = State.off; +  processing.remove("verse"); +#+END_SRC + +******* heading object                                       :heading:object: + +#+name: abs_in_loop_body_not_block_obj_line_empty +#+BEGIN_SRC d +} else if ((type["heading"] == State.on) +&& (line_occur["heading"] > State.off)) { +  /+ heading object (current line empty) +/ +  obj_cite_number = obj_cite_number_emit(type["obj_cite_number_status"]); +  an_object["bookindex"] = +    ("bookindex" in an_object) ? an_object["bookindex"] : ""; +  bookindex_unordered_hashes = +    bkidx_hash(an_object["bookindex"], obj_cite_number); +  an_object["is"] = "heading"; +  node = +    node_jstr_heading( +      an_object["lev_markup_number"], +      an_object["lev_collapsed_number"], +      obj_cite_number, +      counter, +      heading_pointer, +      an_object["is"] +    ); // heading +  an_object["substantive"] = +    obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +  an_object["attrib"] = +    obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +  ++heading_pointer; +  contents_the_objects ~= +    set_abstract_object.contents_heading( +      type["obj_cite_number_status"], +      an_object["substantive"], +      an_object["attrib"], +      obj_cite_number, an_object["lev"], +      an_object["lev_markup_number"], +      an_object["lev_collapsed_number"] +    ); +  // track previous heading and make assertions +  debug(objectrelated1) { // check +    tell_l("blue", line); +    // writeln(an_object["obj"]); +    // writeln(contents_am[counter]["obj_cite_number"], " ", contents_am[counter]["obj"]); +    // writeln(m.hit, "\n"); +  } +  header_set_common(line_occur, an_object, type); +  type["header_make"] = State.off; +  type["header_metadata"] = State.off; +  an_object.remove("lev"); +  an_object.remove("lev_markup_number"); +  // an_object["lev_markup_number"]="9"; +  processing.remove("verse"); +  ++counter; +#+END_SRC + +******* paragraph object                                   :paragraph:object: + +#+name: abs_in_loop_body_not_block_obj_line_empty +#+BEGIN_SRC d +} else if ((type["para"] == State.on) && (line_occur["para"] > State.off)) { +  /+ paragraph object (current line empty) +/ +  obj_cite_number = obj_cite_number_emit(type["obj_cite_number_status"]); +  an_object["bookindex"] = +    ("bookindex" in an_object) ? an_object["bookindex"] : ""; +  bookindex_unordered_hashes = +    bkidx_hash(an_object["bookindex"], obj_cite_number); +  an_object["is"] = "para"; +  node = +    node_jstr( +      content_non_header, +      obj_cite_number, +      counter, +      heading_pointer-1, +      an_object["is"] +    ); +  an_object["substantive"] = +    obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +  an_object["attrib"] = +    obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +  contents_the_objects ~= +    set_abstract_object.contents_para( +      an_object["is"], +      an_object["substantive"], +      an_object["attrib"], +      obj_cite_number, +      indent, +      bullet +    ); +  // contents_the_objects ~= +  //   set_abstract_object.contents_para( +  //     an_object, +  //     obj_cite_number, +  //     indent, +  //     bullet +  //   ); +  header_set_common(line_occur, an_object, type); +  type["header_make"] = State.off; +  type["header_metadata"] = State.off; +  indent["first"] = "0"; +  indent["second"] = "0"; +  bullet = false; +  processing.remove("verse"); +  ++counter; +} else { +  assert( +    line == null, +    "line variable should be empty, should not occur" +  ); +  // check what happens when paragraph separated by 2 newlines +} +#+END_SRC + +*** close non code objects (regular text) + +#+name: abs_in_loop_body_00_closed +#+BEGIN_SRC d +    } // close else for line empty +  } // close else for not the above +} // close after non code, other blocks or regular text +#+END_SRC + +*** regular text objects                                     :text:paragraph: + +#+name: abs_in_loop_body_01 +#+BEGIN_SRC d +if (((contents_the_objects[$-1]["is"] == "para") +|| (contents_the_objects[$-1]["is"] == "heading")) +&& (counter-1 > previous_count)) { +  if (match(contents_the_objects[$-1]["obj"], +  rgx.inline_notes_delimiter_al_regular_number_note)) { +    // endnotes/ footnotes for +    // doc objects other than paragraphs & headings +    // various forms of grouped text +    previous_count=contents_the_objects.length -1; +    note_section.gather_notes_for_endnote_section( +      contents_the_objects, +      contents_the_objects.length -1 +    ); +    // notes[notepoint]=note_section.notes_section(contents_the_objects, counter-1); +    // notepoint +=1; +  } +} +#+END_SRC + +** post loop processing                                                :post: + +*** misc + +#+name: abs_post +#+BEGIN_SRC d +debug(objectrelated2) { // check +    tell_l("blue", line); +  // writeln(__FILE__, ":", __LINE__); +  // writeln(counter); +  // // contents_am[0..counter] +  // writeln(contents_am.length); +} +/+ +  Backmatter: +  * endnotes +  * glossary +  * references / bibliography +  * book index ++/ +obj_im.obj_inline_markup("doc_end_reset", ""); +#+END_SRC + +*** [#B] endnotes                                                  :endnotes: + +#+name: abs_post +#+BEGIN_SRC d +auto en_tuple = +  note_section.endnote_objects(obj_cite_number); +static assert(!isTypeTuple!(en_tuple)); +auto endnotes_section = en_tuple[0]; +obj_cite_number = en_tuple[1]; +debug(endnotes) { +  writefln( +    "%s %s", +    __LINE__, +    endnotes_section.length +  ); +  foreach (n; endnotes_section) { +    writeln(n); +  } +} +#+END_SRC + +*** [#B] bibliography                                          :bibliography: + +#+name: abs_post +#+BEGIN_SRC d +auto biblio_unsorted_incomplete = biblio_arr_json.dup; +// destroy(biblio_arr_json); +auto biblio = Bibliography(); +auto biblio_ordered = +  biblio.bibliography(biblio_unsorted_incomplete, bib_arr_json); +#+END_SRC + +*** [#B] bookindex                                               :book:index: + +#+name: abs_post +#+BEGIN_SRC d +auto bi = BookIndexReportSection(); +auto bi_tuple = +  bi.bookindex_build_section(bookindex_unordered_hashes, obj_cite_number); +static assert(!isTypeTuple!(bi_tuple)); +auto bookindex_section = bi_tuple[0]; +obj_cite_number = bi_tuple[1]; +debug(bookindex) {                         // bookindex +  foreach (bi_entry; bookindex_section) { +    writeln(bi_entry["obj"]); +  } +} +#+END_SRC + +*** [#B] document                                                  :document: + +#+name: abs_post +#+BEGIN_SRC d +auto document_the = +  contents_the_objects ~ endnotes_section ~ bookindex_section; +#+END_SRC + +*** misc heading + +#+name: abs_post +#+BEGIN_SRC d +debug(heading) {                         // heading +  string spc; +  foreach (o; document_the) { +    if (o["is"] == "heading") { +      switch (o["lev_markup_number"]) { +      case "0": +      // case to!string(DocStructMarkupHeading.h_sect_A): +        spc=""; +        break; +      case "1": +      // case to!string(DocStructMarkupHeading.h_sect_B): +        spc="  "; +        break; +      case "2": +      // case to!string(DocStructMarkupHeading.h_sect_C): +        spc="    "; +        break; +      case "3": +      // case to!string(DocStructMarkupHeading.h_sect_D): +        spc="      "; +        break; +      case "4": +      // case to!string(DocStructMarkupHeading.h_text_1): +        spc="        "; +        break; +      case "5": +      // case to!string(DocStructMarkupHeading.h_text_2): +        spc="          "; +        break; +      case "6": +      // case to!string(DocStructMarkupHeading.h_text_3): +        spc="            "; +        break; +      case "7": +      // case to!string(DocStructMarkupHeading.h_text_4): +        spc="              "; +        break; +      case "8": +      // case to!string(DocStructMarkupHeading.h_text_5): +        spc="                "; +        break; +      default: +        spc=""; +        break;        } +      // writeln( +      //   spc, "* ", " ", +      //   o +      // ); +      writefln( +        "%s*  $s\n            %s", +        spc, +        strip(o["obj"]), +        o["attrib"] +      ); +      // writeln(spc, "* ", to!string(o["lev_collapsed_number"]), " ", strip(o["obj"])); +      // tell_l("yellow", spc, strip(o["obj"]));      } -  } else { -    if (ft["ocn_status_multi_obj"] == 0) { -      if (match(line, rgx.ocn_off)) { -        ft["ocn_status"] = 1; -      } else if (match(line, rgx.ocn_off_dh)) { -        ft["ocn_status"] = 2; -      } else { -        ft["ocn_status"] = 2; -        ft["ocn_status"] = 0; +  } +} +destroy(contents_the_objects); +destroy(endnotes_section); +destroy(bookindex_section); +// struct Document { +//   char content; +//   char head_make; +//   char head_metadata; +//   char bookindex_section; +//   char biblio; +// } +// struct Document { +//   char content; +//   char head_make; +//   char head_metadata; +//   char bookindex_section; +//   char biblio; +// } +#+END_SRC + +*** [#A] return document tuple                                 :return:tuple: + +#+name: abs_post +#+BEGIN_SRC d +auto t = +  tuple( +    document_the, +    dochead_make, +    dochead_metadata, +    bookindex_unordered_hashes, +    biblio_ordered +  ); +return t; +#+END_SRC + +* functions                                               :abstract:function: +functions used in document abstraction + +** set & resets                                                       :reset: +*** object reset: remove (clean)                              :object:remove: + +#+name: abs_functions +#+BEGIN_SRC d +auto object_reset(ref string[string] an_object) { +  an_object.remove("obj"); +  an_object.remove("substantive"); +  an_object.remove("is"); +  an_object.remove("attrib"); +  an_object.remove("bookindex"); +} +#+END_SRC + +*** set, initialize or re-initialize                                    :set: + +#+name: abs_functions +#+BEGIN_SRC d +auto header_set_common( +  ref int[string] line_occur, +  ref string[string] an_object, +  ref int[string] type +) { +  // line_occur["header"] = State.off; +  line_occur["header_make"] = State.off; +  line_occur["header_metadata"] = State.off; +  line_occur["heading"] = State.off; +  line_occur["para"]= State.off; +  type["header"] = State.off; +  // type["header_make"] = State.off; +  // type["header_metadata"] = State.off; +  type["heading"] = State.off; +  type["para"] = State.off; +  object_reset(an_object); +} +#+END_SRC + +** check obj_cite_number status in document                             :ocn: + +#+name: abs_functions +#+BEGIN_SRC d +auto check_obj_cite_number_status(char[] line, ref int[string] type) { +  if ((!line.empty) && (type["obj_cite_number_status_multi_obj"] == TriState.off)) { +    /+ not multi-line object, check whether obj_cite_number is on or turned off +/ +    if (match(line, rgx.obj_cite_number_block_marks)) { +      /+ switch off obj_cite_number +/ +      if (match(line, rgx.obj_cite_number_off_block)) { +        type["obj_cite_number_status_multi_obj"] = TriState.on; +        debug(ocnoff) { +          tell_l("fuchsia", line); +        } +      } +      if (match(line, rgx.obj_cite_number_off_block_dh)) { +        type["obj_cite_number_status_multi_obj"] = TriState.closing; +        debug(ocnoff) { +          tell_l("fuchsia", line); +        }        }      } else { -      ft["ocn_status"] = ft["ocn_status_multi_obj"]; +      if (type["obj_cite_number_status_multi_obj"] == TriState.off) { +        if (match(line, rgx.obj_cite_number_off)) { +          type["obj_cite_number_status"] = TriState.on; +        } else if (match(line, rgx.obj_cite_number_off_dh)) { +          type["obj_cite_number_status"] = TriState.closing; +        } else { +          // type["obj_cite_number_status"] = TriState.closing; +          type["obj_cite_number_status"] = TriState.off; +        } +      } else { +        type["obj_cite_number_status"] = +          type["obj_cite_number_status_multi_obj"]; +      } +    } +  } else if ((!line.empty) && (type["obj_cite_number_status_multi_obj"] > TriState.off)) { +    if (auto m = match(line, rgx.obj_cite_number_off_block_close)) { +      type["obj_cite_number_status_multi_obj"] = TriState.off; +      type["obj_cite_number_status"] = TriState.off; +      debug(ocnoff) { +        tell_l("green", line); +      }      }    } -} else if ((!line.empty) && (ft["ocn_status_multi_obj"] > 0)) { -  if (auto m = match(line, rgx.ocn_off_block_close)) { -    ft["ocn_status_multi_obj"] = 0; -    ft["ocn_status"] = 0; -    debug(ocnoff) { -      tell_l("green", line); +  return 0; +} +#+END_SRC + +** block                                                              :block: +*** block start (open) block                                          :start: +**** function open for block starts + +#+name: abs_functions +#+BEGIN_SRC d +auto start_block( +  char[] line, +  ref int[string] type, +  string[string] obj_cite_number_poem +) { +#+END_SRC + +**** block curly open                                                 :curly: + +#+name: abs_functions +#+BEGIN_SRC d +  if (match(line, rgx.block_curly_code_open)) { +    /+ curly code open +/ +    debug(code) {                              // code (curly) open +      writefln( +        "%s* [code curly] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["code"] = TriState.on; +    type["curly_code"] = TriState.on; +  } else if (match(line, rgx.block_curly_poem_open)) { +    /+ curly poem open +/ +    debug(poem) {                              // poem (curly) open +      writefln( +        "%s* [poem curly] %s%s", +        scr_txt_color["red"], +        scr_txt_color["off"], +        line +      ); +    } +    obj_cite_number_poem["start"] = +      to!string(obj_cite_number); +    type["blocks"] = TriState.on; +    type["verse_new"] = State.on; +    type["poem"] = TriState.on; +    type["curly_poem"] = TriState.on; +  } else if (match(line, rgx.block_curly_group_open)) { +    /+ curly group open +/ +    debug(group) {                             // group (curly) open +      writefln( +        "%s* [group curly] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["group"] = TriState.on; +    type["curly_group"] = TriState.on; +  } else if (match(line, rgx.block_curly_block_open)) { +    /+ curly block open +/ +    debug(block) {                             // block (curly) open +      writefln( +        "%s* [block curly] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["block"] = TriState.on; +    type["curly_block"] = TriState.on; +  } else if (match(line, rgx.block_curly_quote_open)) { +    /+ curly quote open +/ +    debug(quote) {                             // quote (curly) open +      writefln( +        "%s* [quote curly] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["quote"] = TriState.on; +    type["curly_quote"] = TriState.on; +  } else if (match(line, rgx.block_curly_table_open)) { +    /+ curly table open +/ +    debug(table) {                             // table (curly) open +      writefln( +        "%s* [table curly] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["table"] = TriState.on; +    type["curly_table"] = TriState.on; +#+END_SRC + +**** block tic open                                                     :tic: + +#+name: abs_functions +#+BEGIN_SRC d +  } else if (match(line, rgx.block_tic_code_open)) { +    /+ tic code open +/ +    debug(code) {                              // code (tic) open +      writefln( +        "%s* [code tic] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      );      } +    type["blocks"] = TriState.on; +    type["code"] = TriState.on; +    type["tic_code"] = TriState.on; +  } else if (match(line, rgx.block_tic_poem_open)) { +    /+ tic poem open +/ +    debug(poem) {                              // poem (tic) open +      writefln( +        "%s* [poem tic] %s%s", +        scr_txt_color["red"], +        scr_txt_color["off"], +        line +      ); +    } +    obj_cite_number_poem["start"] = to!string(obj_cite_number); +    type["blocks"] = TriState.on; +    type["verse_new"] = State.on; +    type["poem"] = TriState.on; +    type["tic_poem"] = TriState.on; +  } else if (match(line, rgx.block_tic_group_open)) { +    /+ tic group open +/ +    debug(group) {                             // group (tic) open +      writefln( +        "%s* [group tic] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["group"] = TriState.on; +    type["tic_group"] = TriState.on; +  } else if (match(line, rgx.block_tic_block_open)) { +    /+ tic block open +/ +    debug(block) {                             // block (tic) open +      writefln( +        "%s* [block tic] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["block"] = TriState.on; +    type["tic_block"] = TriState.on; +  } else if (match(line, rgx.block_tic_quote_open)) { +    /+ tic quote open +/ +    debug(quote) {                             // quote (tic) open +      writefln( +        "%s* [quote tic] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["quote"] = TriState.on; +    type["tic_quote"] = TriState.on; +  } else if (match(line, rgx.block_tic_table_open)) { +    /+ tic table open +/ +    debug(table) {                             // table (tic) open +      writefln( +        "%s* [table tic] %s%s", +        scr_txt_color["blue"], +        scr_txt_color["off"], +        line +      ); +    } +    type["blocks"] = TriState.on; +    type["table"] = TriState.on; +    type["tic_table"] = TriState.on;    } +#+END_SRC + +**** function close for block starts + +#+name: abs_functions +#+BEGIN_SRC d +  return 0;  }  #+END_SRC -*** separate regular markup text from code blocks [+6] -**** code blocks                                                 :block:code: -#+name: abs_loop_body_00 + +*** block continue (an open block)                                 :continue: +**** code block (special status, deal with first)                      :code: + +#+name: abs_functions  #+BEGIN_SRC d -if (ft["code"] == 1) { -/+ block object: code +/ -  if (ft["curly_code"] == 1) { +auto code_block( +  char[] line, +  ref string[string] an_object, +  ref int[string] type +) { +  if (type["curly_code"] == TriState.on) {      if (auto m = match(line, rgx.block_curly_code_close)) {        debug(code) {                              // code (curly) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["code"] = 2; -      ft["curly_code"] = 0; +      type["blocks"] = TriState.closing; +      type["code"] = TriState.closing; +      type["curly_code"] = TriState.off;      } else {        debug(code) {                              // code (curly) line          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";             // code (curly) line +      an_object["obj"] ~= line ~= "\n";                       // code (curly) line      } -  } else if (ft["tic_code"] == 1) { +  } else if (type["tic_code"] == TriState.on) {      if (auto m = match(line, rgx.block_tic_close)) {        debug(code) {                              // code (tic) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["code"] = 2; -      ft["tic_code"] = 0; +      type["blocks"] = TriState.closing; +      type["code"] = TriState.closing; +      type["tic_code"] = TriState.off;      } else {        debug(code) {                              // code (tic) line          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";             // code (tic) line +      an_object["obj"] ~= line ~= "\n";                       // code (tic) line      }    } +  return 0; +}  #+END_SRC -**** non code objects (other blocks or regular text) [+5]          :non_code: -#+name: abs_loop_body_00 + +**** biblio block                                                    :biblio: + +***** biblio tag map + +#+name: abs_functions  #+BEGIN_SRC d -} else if (!match(line, rgx.regular_parse_skip)) { -/+ object other than code block object (includes regular text paragraph) +/ +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]; +}  #+END_SRC -***** within block group [+1]                                  :block:active: -****** within block group: biblio                                    :biblio: -#+name: abs_loop_body_non_code_obj + +****** +consider+ + +#+name: none  #+BEGIN_SRC d -if (((match(line, rgx.heading_biblio) -|| (ft["heading_biblio"] == 1))) -&& (!match(line, rgx.heading)) -&& (!match(line, rgx.comment))) { -/+ within block object: biblio +/ +final string biblio_tag_map_(string abr) { +  string name; +  switch (abr) { +  case "au": +    name="author_raw"; +    break; +  case "ed": +    name="editor_raw"; +    break; +  case "ti": +    name="fulltitle"; +    break; +  case "lng": +    name="language"; +    break; +  case "jo": +    name="journal"; +    break; +  case "vol": +    name="volume"; +    break; +  case "edn": +    name="edition"; +    break; +  case "yr": +    name="year"; +    break; +  case "pl": +    name="place"; +    break; +  case "pb": +    name="publisher"; +    break; +  case "pub": +    name="publisher"; +    break; +  case "pg": +    name="pages"; +    break; +  case "pgs": +    name="pages"; +    break; +  case "sn": +    name="short_name"; +    break; +  default: +    name=abr; +    break; +  } +  return name; +} +#+END_SRC + +***** biblio block + +#+name: abs_functions +#+BEGIN_SRC d +auto biblio_block( +  char[] line, +  ref int[string] type, +  ref int bib_entry, +  ref string[] biblio_arr_json +) {    if (match(line, rgx.heading_biblio)) { -    ft["heading_biblio"] = 1; +    type["heading_biblio"] = TriState.on;    } -  if (empty(line) && (bib_entry == 0)) { -    ++count_biblio_entry; +  if (empty(line) && (bib_entry == TriState.off)) {      biblio_arr_json ~= biblio_entry_tags_jsonstr; -    bib_entry = 1; +    bib_entry = TriState.on;    }    debug(biblio) {      writefln( @@ -306,18 +1370,18 @@ if (((match(line, rgx.heading_biblio)      bib_entry = 0;      st=to!string(bt.captures[1]);      biblio_tag_entry=to!string(bt.captures[2]); -    JSONValue j = parseJSON(biblio_arr_json[count_biblio_entry-1]); // core.exception.RangeError@lib/sdp/ao_abstract_doc_source.d(288): Range violation (LDC) [: same for 343], fix to subtract 1 done! -    if (match(st, rgx.biblio_abbreviations)) { -      biblio_tag_name=biblio_tag_map[st]; -    } else { -      biblio_tag_name=st; -    } +    JSONValue j = parseJSON(biblio_arr_json[$-1]); +    biblio_tag_name = (match(st, rgx.biblio_abbreviations)) +      ? (biblio_tag_map(st)) +      : st;      j.object[biblio_tag_name] = biblio_tag_entry;      auto header_tag_value=to!string(bt.captures[2]);      switch (biblio_tag_name) {      case "author_raw": // author_arr author (fn sn) -      j["author_arr"]=split(header_tag_value, rgx.arr_delimiter); +      j["author_arr"] = +        split(header_tag_value, rgx.arr_delimiter);        string tmp; +      biblioAuthorLoop:        foreach (au; j["author_arr"].array) {          if (auto x = match(au.str, rgx.name_delimiter)) {            tmp ~= x.captures[2] ~ " " ~ x.captures[1] ~ ", "; @@ -326,11 +1390,14 @@ if (((match(line, rgx.heading_biblio)          }        }        tmp = replace(tmp, rgx.trailing_comma, ""); +      // tmp = replace(tmp, regex(r"(,[ ]*)$","g"), "");        j["author"].str = tmp;        break;      case "editor_raw": // editor_arr editor (fn sn) -      j["editor_arr"]=split(header_tag_value, rgx.arr_delimiter); +      j["editor_arr"] = +        split(header_tag_value, rgx.arr_delimiter);        string tmp; +      biblioEditorLoop:        foreach (ed; j["editor_arr"].array) {          if (auto x = match(ed.str, rgx.name_delimiter)) {            tmp ~= x.captures[2] ~ " " ~ x.captures[1] ~ ", "; @@ -339,6 +1406,7 @@ if (((match(line, rgx.heading_biblio)          }        }        tmp = replace(tmp, rgx.trailing_comma, ""); +      // tmp = replace(tmp, regex(r"(,[ ]*)$","g"), "");        j["editor"].str = tmp;        break;      case "fulltitle": // title & subtitle @@ -346,6 +1414,7 @@ if (((match(line, rgx.heading_biblio)      default:        break;      } +    // header_tag_value="";      auto s = to!string(j);      s = j.toString();      debug(biblio) { @@ -357,20 +1426,29 @@ if (((match(line, rgx.heading_biblio)          biblio_tag_entry,          j[biblio_tag_name]        ); -      writeln(j[biblio_tag_name], ":", j[biblio_tag_name]);      } -    biblio_arr_json[count_biblio_entry-1] = s; +    biblio_arr_json ~= s;      biblio_tag_entry="";    } +  return 0; +}  #+END_SRC -****** within block group: poem                                        :poem: -#+name: abs_loop_body_non_code_obj + +**** TODO poem block, verse objects                              :poem:verse: +why extra object stuff only in poem/verse? + +#+name: abs_functions  #+BEGIN_SRC d -} else if (ft["poem"] == 1) { -/+ within block object: poem +/ -  if (ft["curly_poem"] == 1) { +auto poem_block( +  char[] line, +  ref string[string] an_object, +  ref int[string] type, +  ref long counter, +  string[string] obj_cite_number_poem +) { +  if (type["curly_poem"] == TriState.on) {      if (auto m = match(line, rgx.block_curly_poem_close)) { -      object["obj"]="verse"; // check that this is as you please +      an_object["obj"]="verse"; // check that this is as you please        debug(poem) {                            // poem (curly) close          writefln(            "%s* [poem curly] %s%s", @@ -380,101 +1458,97 @@ if (((match(line, rgx.heading_biblio)          );        }        if (processing.length > 0) { -        object["obj"] = processing["verse"]; +        an_object["obj"] = processing["verse"];        }        debug(poem) {                            // poem (curly) close          writeln(__LINE__);          writefln(            "%s%s %s",            scr_txt_marker["fuchsia"], -          ocn, +          obj_cite_number,            line          ); +        // writeln(an_object.keys); +        // writeln(an_object.length);        } -      if (object.length > 0) { +      if (an_object.length > 0) {          debug(poem) {                            // poem (curly) close -          writeln(__LINE__);            tell_lo(              "fuchsia", -            ocn, -            object["obj"] +            obj_cite_number, +            an_object["obj"]            ); -          writeln(__LINE__);          } -        object["is"] = "verse"; -        object["markup"] = -          obj_im.obj_inline_markup(object["is"], object["obj"]); -        object["attrib"] = -          obj_att.obj_attributes(object["is"], object["obj"], node); -        contents ~= -          set_oa.contents_block( -            object["is"], -            object["markup"], -            object["attrib"], -            ocn +        an_object["is"] = "verse"; +        an_object["substantive"] = +          obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +        an_object["attrib"] = +          obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +        contents_the_objects ~= +          set_abstract_object.contents_block( +            an_object["is"], +            an_object["substantive"], +            an_object["attrib"], +            obj_cite_number            ); -        object.remove("obj"); -        object.remove("markup"); -        object.remove("is"); -        object.remove("attrib"); -        object.remove("bookindex"); +        object_reset(an_object);          processing.remove("verse"); -        counter++; +        ++counter;        } -      ocn_poem["end"] = to!string(ocn); -      ft["blocks"] = 2; -      ft["poem"] = 2; -      ft["curly_poem"] = 0; +      obj_cite_number_poem["end"] = +        to!string(obj_cite_number); +      type["blocks"] = TriState.closing; +      type["poem"] = TriState.closing; +      type["curly_poem"] = TriState.off;      } else {        processing["verse"] ~= line ~= "\n"; -      if (ft["verse_new"] == 1) { -        ocn = ocn_emit(ft["ocn_status"]); -        ft["verse_new"] = 0; +      if (type["verse_new"] == State.on) { +        obj_cite_number = +          obj_cite_number_emit(type["obj_cite_number_status"]); +        type["verse_new"] = State.off;        } else if (match(line, rgx.line_delimiter_only)) { -        verse_line = 0; -        ft["verse_new"] = 1; +        verse_line = TriState.off; +        type["verse_new"] = State.on;        } -      if (ft["verse_new"] == 1) { +      if (type["verse_new"] == State.on) {          verse_line=1; -        object["obj"] = processing["verse"]; +        an_object["obj"] = processing["verse"];          debug(poem) {                          // poem verse            writefln(              "%s%s curly\n%s",              scr_txt_marker["green"], -            ocn, -            object["obj"] +            obj_cite_number, +            an_object["obj"]            );          }          processing.remove("verse"); -        object["is"] = "verse"; +        an_object["is"] = "verse";          node = node_jstr(            content_non_header, -          ocn, +          obj_cite_number,            counter,            heading_pointer-1, -          object["is"] +          an_object["is"]          ); -        object["markup"] = obj_im.obj_inline_markup(object["is"], object["obj"]); -        object["attrib"] = obj_att.obj_attributes(object["is"], object["obj"], node); -        contents ~= -          set_oa.contents_block( -            object["is"], -            object["markup"], -            object["attrib"], -            ocn +        an_object["substantive"] = +          obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +        an_object["attrib"] = +          obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +        contents_the_objects ~= +          set_abstract_object.contents_block( +            an_object["is"], +            an_object["substantive"], +            an_object["attrib"], +            obj_cite_number            ); -        object.remove("obj"); -        object.remove("markup"); -        object.remove("is"); -        object.remove("attrib"); -        object.remove("bookindex"); +        object_reset(an_object);          processing.remove("verse"); -        counter++; +        ++counter;        }      } -  } else if (ft["tic_poem"] == 1) { +  } else if (type["tic_poem"] == TriState.on) {      if (auto m = match(line, rgx.block_tic_close)) { // tic_poem_close -      object["obj"]="verse"; // check that this is as you please +      an_object["obj"]="verse"; // check that this is as you please        debug(poem) {                            // poem (curly) close          writefln(            "%s* [poem tic] %s%s", @@ -484,505 +1558,475 @@ if (((match(line, rgx.heading_biblio)          );        }        if (processing.length > 0) {       // needs looking at -        object["obj"] = processing["verse"]; +        an_object["obj"] = processing["verse"];        } -      if (object.length > 0) { +      if (an_object.length > 0) {          debug(poem) {                            // poem (tic) close            writeln(__LINE__); -          tell_lo("fuchsia", ocn, line); +          tell_lo("fuchsia", obj_cite_number, line);          }          processing.remove("verse"); -        object["is"] = "verse"; -        object["markup"] = -          obj_im.obj_inline_markup(object["is"], object["obj"]); -        object["attrib"] = -          obj_att.obj_attributes(object["is"], object["obj"], node); -        contents ~= -          set_oa.contents_block( -            object["is"], -            object["markup"], -            object["attrib"], -            ocn +        an_object["is"] = "verse"; +        an_object["substantive"] = +          obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +        an_object["attrib"] = +          obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +        contents_the_objects ~= +          set_abstract_object.contents_block( +            an_object["is"], +            an_object["substantive"], +            an_object["attrib"], +            obj_cite_number            ); -        ocn_poem["end"] = to!string(ocn); -        object.remove("obj"); -        object.remove("markup"); -        object.remove("is"); -        object.remove("attrib"); -        object.remove("bookindex"); +        obj_cite_number_poem["end"] = to!string(obj_cite_number); +        object_reset(an_object);          processing.remove("verse"); -        counter++; +        ++counter;        } -      ft["blocks"] = 2; -      ft["poem"] = 2; -      ft["tic_poem"] = 0; +      type["blocks"] = TriState.closing; +      type["poem"] = TriState.closing; +      type["tic_poem"] = TriState.off;      } else {        processing["verse"] ~= line ~= "\n"; -      if (ft["verse_new"] == 1) { -        ocn = ocn_emit(ft["ocn_status"]); -        ft["verse_new"] = 0; +      if (type["verse_new"] == State.on) { +        obj_cite_number = +          obj_cite_number_emit(type["obj_cite_number_status"]); +        type["verse_new"] = State.off;        } else if (match(line, rgx.line_delimiter_only)) { -        ft["verse_new"] = 1; -        verse_line = 0; +        type["verse_new"] = State.on; +        verse_line = TriState.off;        } -      if (ft["verse_new"] == 1) { +      if (type["verse_new"] == State.on) {          verse_line=1; -        object["obj"] = processing["verse"]; +        an_object["obj"] = processing["verse"];          debug(poem) {                            // poem (tic) close            writefln(              "%s%s tic\n%s",              scr_txt_marker["green"], -            ocn, -            object["obj"] +            obj_cite_number, +            an_object["obj"]            );          }          processing.remove("verse"); -        object["is"] = "verse"; +        an_object["is"] = "verse";          node =            node_jstr(              content_non_header, -            ocn, +            obj_cite_number,              counter,              heading_pointer-1, -            object["is"] +            an_object["is"]            ); -        object["markup"] = -          obj_im.obj_inline_markup(object["is"], object["obj"]); -        object["attrib"] = -          obj_att.obj_attributes(object["is"], object["obj"], node); -        contents ~= -          set_oa.contents_block( -            object["is"], -            object["markup"], -            object["attrib"], -            ocn +        an_object["substantive"] = +          obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +        an_object["attrib"] = +          obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +        contents_the_objects ~= +          set_abstract_object.contents_block( +            an_object["is"], +            an_object["substantive"], +            an_object["attrib"], +            obj_cite_number            ); -        object.remove("obj"); -        object.remove("markup"); -        object.remove("is"); -        object.remove("attrib"); -        object.remove("bookindex"); +        object_reset(an_object);          processing.remove("verse"); -        counter++; +        ++counter;        }      }    } +  return 0; +}  #+END_SRC -****** within block group: group                                      :group: -#+name: abs_loop_body_non_code_obj + +**** group block                                                      :group: + +#+name: abs_functions  #+BEGIN_SRC d -/+ within block object: group +/ -} else if (ft["group"] == 1) { -  if (ft["curly_group"] == 1) { -    if (auto m = match(line, rgx.block_curly_group_close)) { +auto group_block( +  char[] line, +  ref string[string] an_object, +  ref int[string] type +) { +  if (type["curly_group"] == State.on) { +    if (match(line, rgx.block_curly_group_close)) {        debug(group) {                           // group (curly) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["group"] = 2; -      ft["curly_group"] = 0; +      type["blocks"] = TriState.closing; +      type["group"] = TriState.closing; +      type["curly_group"] = TriState.off;      } else {        debug(group) {                           // group          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build group array (or string) +      an_object["obj"] ~= line ~= "\n";           // build group array (or string)      } -  } else if (ft["tic_group"] == 1) { -    if (auto m = match(line, rgx.block_tic_close)) { +  } else if (type["tic_group"] == TriState.on) { +    if (match(line, rgx.block_tic_close)) {        debug(group) {                           // group (tic) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["group"] = 2; -      ft["tic_group"] = 0; +      type["blocks"] = TriState.closing; +      type["group"] = TriState.closing; +      type["tic_group"] = TriState.off;      } else {        debug(group) {                           // group          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build group array (or string) +      an_object["obj"] ~= line ~= "\n";           // build group array (or string)      }    } +  return 0; +}  #+END_SRC -****** within block group: block                                      :block: -#+name: abs_loop_body_non_code_obj + +**** block block                                                      :block: + +#+name: abs_functions  #+BEGIN_SRC d -} else if (ft["block"] == 1) { -/+ within block object: block +/ -  if (ft["curly_block"] == 1) { -    if (auto m = match(line, rgx.block_curly_block_close)) { +auto block_block( +  char[] line, +  ref string[string] an_object, +  ref int[string] type +) { +  if (type["curly_block"] == TriState.on) { +    if (match(line, rgx.block_curly_block_close)) {        debug(block) {                           // block (curly) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["block"] = 2; -      ft["curly_block"] = 0; +      type["blocks"] = TriState.closing; +      type["block"] = TriState.closing; +      type["curly_block"] = TriState.off;      } else {        debug(block) {                           // block          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build block array (or string) +      an_object["obj"] ~= line ~= "\n";           // build block array (or string)      } -  } else if (ft["tic_block"] == 1) { -    if (auto m = match(line, rgx.block_tic_close)) { +  } else if (type["tic_block"] == TriState.on) { +    if (match(line, rgx.block_tic_close)) {        debug(block) {                           // block (tic) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["block"] = 2; -      ft["tic_block"] = 0; +      type["blocks"] = TriState.closing; +      type["block"] = TriState.closing; +      type["tic_block"] = TriState.off;      } else {        debug(block) {                           // block          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build block array (or string) +      an_object["obj"] ~= line ~= "\n";           // build block array (or string)      }    } +  return 0; +}  #+END_SRC -****** within block group: quote                                      :quote: -#+name: abs_loop_body_non_code_obj + +**** quote block                                                      :quote: + +#+name: abs_functions  #+BEGIN_SRC d -} else if (ft["quote"] == 1) { -/+ within block object: quote +/ -  if (ft["curly_quote"] == 1) { -    if (auto m = match(line, rgx.block_curly_quote_close)) { +auto quote_block(char[] line, ref string[string] an_object, ref int[string] type) { +  if (type["curly_quote"] == TriState.on) { +    if (match(line, rgx.block_curly_quote_close)) {        debug(quote) {                           // quote (curly) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["quote"] = 2; -      ft["curly_quote"] = 0; +      type["blocks"] = TriState.closing; +      type["quote"] = TriState.closing; +      type["curly_quote"] = TriState.off;      } else {        debug(quote) {                           // quote          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build quote array (or string) +      an_object["obj"] ~= line ~= "\n";           // build quote array (or string)      } -  } else if (ft["tic_quote"] == 1) { -    if (auto m = match(line, rgx.block_tic_close)) { +  } else if (type["tic_quote"] == TriState.on) { +    if (match(line, rgx.block_tic_close)) {        debug(quote) {                           // quote (tic) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["quote"] = 2; -      ft["tic_quote"] = 0; +      type["blocks"] = TriState.closing; +      type["quote"] = TriState.closing; +      type["tic_quote"] = TriState.off;      } else {        debug(quote) {                           // quote          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build quote array (or string) +      an_object["obj"] ~= line ~= "\n";           // build quote array (or string)      }    } +  return 0; +}  #+END_SRC -****** within block group: table                                      :table: -#+name: abs_loop_body_non_code_obj + +**** table block                                                      :table: + +#+name: abs_functions  #+BEGIN_SRC d -} else if (ft["table"] == 1) { -/+ within block object: table +/ -  if (ft["curly_table"] == 1) { -    if (auto m = match(line, rgx.block_curly_table_close)) { +auto table_block(char[] line, ref string[string] an_object, ref int[string] type) { +  if (type["curly_table"] == TriState.on) { +    if (match(line, rgx.block_curly_table_close)) {        debug(table) {                           // table (curly) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["table"] = 2; -      ft["curly_table"] = 0; +      type["blocks"] = TriState.closing; +      type["table"] = TriState.closing; +      type["curly_table"] = TriState.off;      } else {        debug(table) {                           // table          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build table array (or string) +      an_object["obj"] ~= line ~= "\n";           // build table array (or string)      } -  } else if (ft["tic_table"] == 1) { -    if (auto m = match(line, rgx.block_tic_close)) { +  } else if (type["tic_table"] == TriState.on) { +    if (match(line, rgx.block_tic_close)) {        debug(table) {                           // table (tic) close          tell_l("blue", line);        } -      ft["blocks"] = 2; -      ft["table"] = 2; -      ft["tic_table"] = 0; +      type["blocks"] = TriState.closing; +      type["table"] = TriState.closing; +      type["tic_table"] = TriState.off;      } else {        debug(table) {                           // table          tell_l("blue", line);        } -      object["obj"] ~= line ~= "\n";           // build table array (or string) +      an_object["obj"] ~= line ~= "\n";           // build table array (or string)      }    } +  return 0; +}  #+END_SRC -***** not identified as being within block group [+4] -#+name: abs_loop_body_non_code_obj -#+BEGIN_SRC d -} else { -/+ not within a block group +/ -#+END_SRC -****** assert -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -assert( -  (ft["blocks"] == 0) -  || (ft["blocks"] == 2), -  "block status: none or closed" -); -assertions_flag_types_block_status_none_or_closed(ft); -#+END_SRC -****** open curly block group [+1]                         :block:curly:open: -******* open block group: code                                         :code: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -if (auto m = match(line, rgx.block_curly_code_open)) { -/+ curly code open +/ -  debug(code) {                              // code (curly) open -    writefln( -      "%s* [code curly] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["code"] = 1; -  ft["curly_code"] = 1; -#+END_SRC -******* open block group: poem                                         :poem: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_curly_poem_open)) { -/+ curly poem open +/ -  object.remove("obj"); -  object.remove("markup"); -  object.remove("is"); -  object.remove("attrib"); -  object.remove("bookindex"); -  processing.remove("verse"); -  debug(poem) {                              // poem (curly) open -    writefln( -      "%s* [poem curly] %s%s", -      scr_txt_color["red"], -      scr_txt_color["off"], -      line -    ); -  } -  ocn_poem["start"] = to!string(ocn); -  ft["blocks"] = 1; -  ft["verse_new"] = 1; -  ft["poem"] = 1; -  ft["curly_poem"] = 1; -#+END_SRC -******* open block group: group                                       :group: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_curly_group_open)) { -/+ curly group open +/ -  debug(group) {                             // group (curly) open -    writefln( -      "%s* [group curly] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["group"] = 1; -  ft["curly_group"] = 1; -#+END_SRC -******* open block group: block                                       :block: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_curly_block_open)) { -/+ curly block open +/ -  debug(block) {                             // block (curly) open -    writefln( -      "%s* [block curly] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["block"] = 1; -  ft["curly_block"] = 1; -#+END_SRC -******* open block group: quote                                       :quote: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_curly_quote_open)) { -/+ curly quote open +/ -  debug(quote) {                             // quote (curly) open -    writefln( -      "%s* [quote curly] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["quote"] = 1; -  ft["curly_quote"] = 1; -#+END_SRC -******* open block group: table                                       :table: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_curly_table_open)) { -/+ curly table open +/ -  debug(table) {                             // table (curly) open -    writefln( -      "%s* [table curly] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["table"] = 1; -  ft["curly_table"] = 1; -#+END_SRC -****** open tic block group [+1]                             :block:tic:open: -******* open block group: code                                         :code: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_tic_code_open)) { -/+ tic code open +/ -  debug(code) {                              // code (tic) open -    writefln( -      "%s* [code tic] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["code"] = 1; -  ft["tic_code"] = 1; -#+END_SRC -******* open block group: poem                                         :poem: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_tic_poem_open)) { -/+ tic poem open +/ -  object.remove("obj"); -  object.remove("markup"); -  object.remove("is"); -  object.remove("attrib"); -  object.remove("bookindex"); -  processing.remove("verse"); -  debug(poem) {                              // poem (tic) open -    writefln( -      "%s* [poem tic] %s%s", -      scr_txt_color["red"], -      scr_txt_color["off"], -      line -    ); -  } -  ocn_poem["start"] = to!string(ocn); -  ft["blocks"] = 1; -  ft["verse_new"] = 1; -  ft["poem"] = 1; -  ft["tic_poem"] = 1; -#+END_SRC -******* open block group: group                                       :group: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_tic_group_open)) { -/+ tic group open +/ -  debug(group) {                             // group (tic) open -    writefln( -      "%s* [group tic] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["group"] = 1; -  ft["tic_group"] = 1; -#+END_SRC -******* open block group: block                                       :block: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_tic_block_open)) { -/+ tic block open +/ -  debug(block) {                             // block (tic) open -    writefln( -      "%s* [block tic] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["block"] = 1; -  ft["tic_block"] = 1; -#+END_SRC -******* open block group: quote                                       :quote: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_tic_quote_open)) { -/+ tic quote open +/ -  debug(quote) {                             // quote (tic) open -    writefln( -      "%s* [quote tic] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["quote"] = 1; -  ft["tic_quote"] = 1; -#+END_SRC -******* open block group: table                                       :table: -#+name: abs_loop_body_open_block_obj -#+BEGIN_SRC d -} else if (auto m = match(line, rgx.block_tic_table_open)) { -/+ tic table open +/ -  debug(table) {                             // table (tic) open -    writefln( -      "%s* [table tic] %s%s", -      scr_txt_color["blue"], -      scr_txt_color["off"], -      line -    ); -  } -  ft["blocks"] = 1; -  ft["table"] = 1; -  ft["tic_table"] = 1; -#+END_SRC -****** line not empty [+3] -#+name: abs_loop_body_not_block_obj -#+BEGIN_SRC d -} else if (!line.empty) { -/+ line not empty +/ -/+ non blocks (headers, paragraphs) & closed blocks +/ -#+END_SRC -******* asserts                                                      :assert: -#+name: abs_loop_body_not_block_obj + +*** block end (close an open block): line empty, block flag           :close: + +#+name: abs_functions  #+BEGIN_SRC d +auto block_flag_line_empty( +  char[] line, +  ref string[string] an_object, +  ref string[string][] contents_the_objects, +  ref string[][string][string] bookindex_unordered_hashes, +  ref int obj_cite_number, +  ref string node, +  ref long counter, +  ref int[string] type, +  string[string] obj_cite_number_poem +) { +  // line.empty, post contents, empty variables ---------------    assert( -    !line.empty, -    "line tested, line not empty surely" +    line.empty, +    "line should be empty"    );    assert( -    (ft["blocks"] == 0) -    || (ft["blocks"] == 2), -    "code block status: none or closed" +    (type["blocks"] == TriState.closing), +    "code block status: closed"    ); -  if (ft["blocks"] == 2) { -  // blocks closed, unless followed by book index -    debug(check) {                           // block -      writeln(__LINE__); -      tell_l("red", line); -    } -    assert( -      match(line, rgx.book_index) -      || match(line, rgx.book_index_open) -      || ft["book_index"] == 1 -    ); +  assertions_flag_types_block_status_none_or_closed(type); +  if (type["code"] == TriState.closing) { +    obj_cite_number = +      obj_cite_number_emit(type["obj_cite_number_status"]); +    an_object["bookindex"] = +      ("bookindex" in an_object) ? an_object["bookindex"] : ""; +    bookindex_unordered_hashes = +      bkidx_hash(an_object["bookindex"], obj_cite_number); +    an_object["is"] = "code"; +    node = +      node_jstr( +        content_non_header, +        obj_cite_number, +        counter, +        heading_pointer-1, +        an_object["is"] +      ); +    an_object["substantive"] = +      obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +    an_object["attrib"] = +      obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +    contents_the_objects ~= +      set_abstract_object.contents_block( +        an_object["is"], +        an_object["substantive"], +        an_object["attrib"], +        obj_cite_number +      ); +    object_reset(an_object); +    processing.remove("verse"); +    ++counter; +    type["blocks"] = TriState.off; +    type["code"] = TriState.off; +  } else if (type["poem"] == TriState.closing) { +    an_object["bookindex"] = +      ("bookindex" in an_object) ? an_object["bookindex"] : ""; +    bookindex_unordered_hashes = +      bkidx_hash(an_object["bookindex"], obj_cite_number); +    // obj_cite_number = obj_cite_number_emit(type["obj_cite_number_status"]); +    an_object["is"] = "verse"; // check also +    node = +      node_jstr( +        content_non_header, +        obj_cite_number, +        counter, +        heading_pointer-1, +        an_object["is"] +        // "verse" +      ); +    contents_the_objects ~= +      set_abstract_object.contents_block_obj_cite_number_string( +        "poem", +        "", +        (obj_cite_number_poem["start"], obj_cite_number_poem["end"]), +        node +      ); // bookindex +    object_reset(an_object); +    processing.remove("verse"); +    // ++obj_cite_number; +    type["blocks"] = TriState.off; +    type["poem"] = TriState.off; +  } else if (type["table"] == TriState.closing) { +    obj_cite_number = +      obj_cite_number_emit(type["obj_cite_number_status"]); +    an_object["bookindex"] = +      ("bookindex" in an_object) ? an_object["bookindex"] : ""; +    bookindex_unordered_hashes = +      bkidx_hash(an_object["bookindex"], obj_cite_number); +    an_object["is"] = "table"; +    node = +      node_jstr( +        content_non_header, +        obj_cite_number, +        counter, +        heading_pointer-1, +        an_object["is"] +      ); +    an_object["substantive"] = +      obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +    an_object["attrib"] = +      obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +    contents_the_objects ~= +      set_abstract_object.contents_block( +        an_object["is"], +        an_object["substantive"], +        an_object["attrib"], +        obj_cite_number +      ); +    object_reset(an_object); +    processing.remove("verse"); +    ++counter; +    type["blocks"] = TriState.off; +    type["table"] = TriState.off; +  } else if (type["group"] == TriState.closing) { +    obj_cite_number = +      obj_cite_number_emit(type["obj_cite_number_status"]); +    an_object["bookindex"] = +      ("bookindex" in an_object) ? an_object["bookindex"] : ""; +    bookindex_unordered_hashes = +      bkidx_hash(an_object["bookindex"], obj_cite_number); +    an_object["is"] = "group"; +    node = +      node_jstr( +        content_non_header, +        obj_cite_number, +        counter, +        heading_pointer-1, +        an_object["is"] +      ); +    an_object["substantive"] = +      obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +    an_object["attrib"] = +      obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +    contents_the_objects ~= +      set_abstract_object.contents_block( +        an_object["is"], +        an_object["substantive"], +        an_object["attrib"], +        obj_cite_number +      ); +    object_reset(an_object); +    processing.remove("verse"); +    ++counter; +    type["blocks"] = TriState.off; +    type["group"] = TriState.off; +  } else if (type["block"] == TriState.closing) { +    obj_cite_number = obj_cite_number_emit(type["obj_cite_number_status"]); +    an_object["bookindex"] = +      ("bookindex" in an_object) ? an_object["bookindex"] : ""; +    bookindex_unordered_hashes = +      bkidx_hash(an_object["bookindex"], obj_cite_number); +    an_object["is"] = "block"; +    node = +      node_jstr( +        content_non_header, +        obj_cite_number, +        counter, +        heading_pointer-1, +        an_object["is"] +       ); +    an_object["substantive"] = +      obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +    an_object["attrib"] = +      obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +    contents_the_objects ~= +      set_abstract_object.contents_block( +        an_object["is"], +        an_object["substantive"], +        an_object["attrib"], +        obj_cite_number +      ); +    object_reset(an_object); +    processing.remove("verse"); +    ++counter; +    type["blocks"] = TriState.off; +    type["block"] = TriState.off; +  } else if (type["quote"] == TriState.closing) { +    obj_cite_number = +      obj_cite_number_emit(type["obj_cite_number_status"]); +    an_object["bookindex"] = +      ("bookindex" in an_object) ? an_object["bookindex"] : ""; +    bookindex_unordered_hashes = +      bkidx_hash(an_object["bookindex"], obj_cite_number); +    an_object["is"] = "quote"; +    node = +      node_jstr( +        content_non_header, +        obj_cite_number, +        counter, +        heading_pointer-1, +        an_object["is"] +      ); +    an_object["substantive"] = +      obj_im.obj_inline_markup(an_object["is"], an_object["obj"]); +    an_object["attrib"] = +      obj_att.obj_attributes(an_object["is"], an_object["obj"], node); +    contents_the_objects ~= +      set_abstract_object.contents_block( +        an_object["is"], +        an_object["substantive"], +        an_object["attrib"], +        obj_cite_number +      ); +    object_reset(an_object); +    processing.remove("verse"); +    ++counter; +    type["blocks"] = TriState.off; +    type["quote"] = TriState.off;    } +  return 0; +}  #+END_SRC -******* book index                                                :bookindex: -#+name: abs_loop_body_not_block_obj + +** book index                                                     :bookindex: + +#+name: abs_functions  #+BEGIN_SRC d +auto book_index( +  char[] line, +  ref string book_idx_tmp, +  ref string[string] an_object, +  ref int[string] type +) {    if (auto m = match(line, rgx.book_index)) { -  /+ match book_index +/ +    /+ match book_index +/      debug(bookindexmatch) {                       // book index        writefln(          "%s* [bookindex] %s%s\n", @@ -992,10 +2036,10 @@ if (auto m = match(line, rgx.block_curly_code_open)) {        );        // writeln(scr_txt_marker["blue"], to!string(m.captures[1]), "\n");      } -    object["bookindex"] = to!string(m.captures[1]); +    an_object["bookindex"] = to!string(m.captures[1]);    } else if (auto m = match(line, rgx.book_index_open))  { -  /* match open book_index */ -    ft["book_index"] = 1; +    /+ match open book_index +/ +    type["book_index"] = State.on;      book_idx_tmp = to!string(m.captures[1]);      debug(bookindexmatch) {                       // book index        writefln( @@ -1004,12 +2048,13 @@ if (auto m = match(line, rgx.block_curly_code_open)) {          scr_txt_color["off"],          book_idx_tmp,        ); +      // writeln(scr_txt_marker["blue"], book_idx_tmp, "\n");      } -  } else if (ft["book_index"] == 1 )  { -  /+ book_index flag set +/ +  } else if (type["book_index"] == State.on )  { +    /+ book_index flag set +/      if (auto m = match(line, rgx.book_index_close))  { -      ft["book_index"] = 0; -      object["bookindex"] = book_idx_tmp ~ to!string(m.captures[1]); +      type["book_index"] = State.off; +      an_object["bookindex"] = book_idx_tmp ~ to!string(m.captures[1]);        debug(bookindexmatch) {                     // book index          writefln(            "%s* [bookindex] %s%s\n", @@ -1017,1028 +2062,2429 @@ if (auto m = match(line, rgx.block_curly_code_open)) {            scr_txt_color["off"],            book_idx_tmp,          ); +        // writeln(scr_txt_marker["blue"], book_idx_tmp, "\n");        }        book_idx_tmp = "";      } else {        book_idx_tmp ~= line;      } +  } +}  #+END_SRC -******* not book index [+2] -#+name: abs_loop_body_not_block_obj + +** header extract                                                    :header: + +#+name: abs_functions  #+BEGIN_SRC d -  } else { -  /+ not book_index +/ +auto header_extract( +  char[] line, +  ref int[string] line_occur, +  ref string[string] an_object, +  ref int[string] type +) { +  if (auto m = match(line, rgx.header_make)) { +    /+ matched header_make +/ +    debug(header1) {                          // header +      tell_l("yellow", line); +    } +    type["header"] = State.on; +    type["header_make"] = State.on; +    type["header_metadata"] = State.off; +    type["heading"] = State.off; +    type["para"] = State.off; +    ++line_occur["header_make"]; +    an_object["obj"] ~= line ~= "\n"; +  } else if (auto m = match(line, rgx.header_metadata)) { +    /+ matched header_metadata +/ +    debug(header1) {                          // header +      tell_l("yellow", line); +    } +    type["header"] = State.on; +    type["header_make"] = State.off; +    type["header_metadata"] = State.on; +    type["heading"] = State.off; +    type["para"] = State.off; +    ++line_occur["header_metadata"]; +    an_object["obj"] ~= line ~= "\n"; +  } else if (type["header_make"] == State.on +  && (line_occur["header_make"] > State.off)) { +    /+ header_make flag set +/ +    if (auto m = match(line, rgx.header_sub)) { +      /+ sub-header +/ +      debug(header1) { +        tell_l("yellow", line); +      } +      // type["header"] = State.on; +      ++line_occur["header_make"]; +      an_object["obj"] ~= line ~= "\n"; +    } +  } else if (type["header_metadata"] == State.on +  && (line_occur["header_metadata"] > State.off)) { +    /+ header_metadata flag set +/ +    if (auto m = match(line, rgx.header_sub)) { +      /+ sub-header +/ +      debug(header1) { +        tell_l("yellow", line); +      } +      ++line_occur["header_metadata"]; +      an_object["obj"] ~= line ~= "\n"; +    } +  } +  return 0; +}  #+END_SRC -******** matched: comment                                     :comment:match: -#+name: abs_loop_body_not_block_obj + +** heading or paragraph                                   :heading:paragraph: +*** heading found                                                   :heading: + +#+name: abs_functions  #+BEGIN_SRC d -    if (auto m = match(line, rgx.comment)) { -    /+ matched comment +/ -      debug(comment) { -        tell_l("blue", line); +auto heading_found( +  char[] line, +  string dochead_make_headings, +  ref string[string] heading_match_str, +  ref Regex!(char)[string] heading_match_rgx, +  ref int[string] type +) { +  if ((to!string(dochead_make_headings).length > 2) +  && (type["make_headings"] == State.off)) { +    /+ headings found +/ +    debug(headingsfound) { +      writeln(dochead_make_headings); +    } +    auto make_headings_txt = +      match( +        to!string(dochead_make_headings), +        rgx.within_quotes); +    char[][] make_headings_spl = +      split( +        cast(char[]) make_headings_txt.captures[1], +        rgx.make_heading_delimiter); +    debug(headingsfound) { +      writeln(make_headings_spl.length); +      writeln(make_headings_spl); +    } +    switch (make_headings_spl.length) { +    case 7 : +      if (!empty(make_headings_spl[6])) { +        heading_match_str["h_4"] = +          "^(" ~ to!string(make_headings_spl[6]) ~ ")"; +        heading_match_rgx["h_4"] = +          regex(heading_match_str["h_4"]);        } -      object["obj"] ~= line ~= "\n"; -      contents ~= -        set_oa.contents_comment(strip(object["obj"])); -      object.remove("obj"); -      object.remove("markup"); -      object.remove("is"); -      object.remove("attrib"); -      object.remove("bookindex"); -      processing.remove("verse"); -      line_occur["header_metadata"] = 0; -      line_occur["header_make"] = 0; -      line_occur["heading"] = 0; -      line_occur["para"] = 0; -      ft["header"] = 0; -      ft["header_make"] = 0; -      ft["header_metadata"] = 0; -      ft["heading"] = 0; -      ft["para"] = 0; -      counter++; -#+END_SRC -******** matched: header make                             :header:make:match: -#+name: abs_loop_body_not_block_obj -#+BEGIN_SRC d -    } else if (auto m = match(line, rgx.header_make)) { -    /+ matched header_make +/ -      debug(header1) {                          // header -        tell_l("yellow", line); +      goto case; +    case 6 : +      if (!empty(make_headings_spl[5])) { +        heading_match_str["h_3"] = +          "^(" ~ to!string(make_headings_spl[5]) ~ ")"; +        heading_match_rgx["h_3"] = +          regex(heading_match_str["h_3"]); +      } +      goto case; +    case 5 : +      if (!empty(make_headings_spl[4])) { +        heading_match_str["h_2"] = +          "^(" ~ to!string(make_headings_spl[4]) ~ ")"; +        heading_match_rgx["h_2"] = +          regex(heading_match_str["h_2"]);        } -      ft["header"] = 1; -      ft["header_make"] = 1; -      ft["header_metadata"] = 0; -      ft["heading"] = 0; -      ft["para"] = 0; -      line_occur["header_make"]++; -      object["obj"] ~= line ~= "\n"; +      goto case; +    case 4 : +      if (!empty(make_headings_spl[3])) { +        heading_match_str["h_1"] = +          "^(" ~ to!string(make_headings_spl[3]) ~ ")"; +        heading_match_rgx["h_1"] = +          regex(heading_match_str["h_1"]); +      } +      goto case; +    case 3 : +      if (!empty(make_headings_spl[2])) { +        heading_match_str["h_D"] = +          "^(" ~ to!string(make_headings_spl[2]) ~ ")"; +        heading_match_rgx["h_D"] = +          regex(heading_match_str["h_D"]); +      } +      goto case; +    case 2 : +      if (!empty(make_headings_spl[1])) { +        heading_match_str["h_C"] = +          "^(" ~ to!string(make_headings_spl[1]) ~ ")"; +        heading_match_rgx["h_C"] = +          regex(heading_match_str["h_C"]); +      } +      goto case; +    case 1 : +      if (!empty(make_headings_spl[0])) { +        heading_match_str["h_B"] = +          "^(" ~ to!string(make_headings_spl[0]) ~ ")"; +        heading_match_rgx["h_B"] = +          regex(heading_match_str["h_B"]); +      } +      break; +    default: +      break; +    } +    type["make_headings"] = State.on; +  } +}  #+END_SRC -******** matched: header metadata                     :header:metadata:match: -#+name: abs_loop_body_not_block_obj + +*** TODO heading make set                                           :heading: + +#+name: abs_functions  #+BEGIN_SRC d -    } else if (auto m = match(line, rgx.header_metadata)) { -    /+ matched header_metadata +/ -      debug(header1) {                          // header -        tell_l("yellow", line); +auto heading_make_set( +  ref char[] line, +  ref int[string] line_occur, +  ref Regex!(char)[string] heading_match_rgx, +  ref int[string] type +) { +  if ((type["make_headings"] == State.on) +  && ((line_occur["para"] == State.off) +  && (line_occur["heading"] == State.off)) +  && ((type["para"] == State.off) +  && (type["heading"] == State.off))) { +    /+ heading make set +/ +    if (match(line, heading_match_rgx["h_B"])) { +      line = "B~ " ~ line; +      debug(headingsfound) { +        writeln(line); +      } +    } +    if (match(line, heading_match_rgx["h_C"])) { +      line = "C~ " ~ line; +      debug(headingsfound) { +        writeln(line); +      } +    } +    if (match(line, heading_match_rgx["h_D"])) { +      line = "D~ " ~ line; +      debug(headingsfound) { +        writeln(line); +      } +    } +    if (match(line, heading_match_rgx["h_1"])) { +      line = "1~ " ~ line; +      debug(headingsfound) { +        writeln(line); +      } +    } +    if (match(line, heading_match_rgx["h_2"])) { +      line = "2~ " ~ line; +      debug(headingsfound) { +        writeln(line);        } -      ft["header"] = 1; -      ft["header_make"] = 0; -      ft["header_metadata"] = 1; -      ft["heading"] = 0; -      ft["para"] = 0; -      line_occur["header_metadata"]++; -      object["obj"] ~= line ~= "\n"; +    } +    if (match(line, heading_match_rgx["h_3"])) { +      line = "3~ " ~ line; +      debug(headingsfound) { +        writeln(line); +      } +    } +    if (match(line, heading_match_rgx["h_4"])) { +      line = "4~ " ~ line; +      debug(headingsfound) { +        writeln(line); +      } +    } +  } +}  #+END_SRC -******** flag set: header make                             :header:make:flag: -#+name: abs_loop_body_not_block_obj + +*** heading match                                                   :heading: + +#+name: abs_functions  #+BEGIN_SRC d -    } else if (ft["header_make"] == 1 -    && (line_occur["header_make"] > 0)) { -    /+ header_make flag set +/ -      if (auto m = match(line, rgx.header_sub)) { -      /+ sub-header +/ -        debug(header1) { -          tell_l("yellow", line); -        } -        line_occur["header_make"]++; -        object["obj"] ~= line ~= "\n"; +auto heading_match( +  char[] line, +  ref int[string] line_occur, +  ref string[string] an_object, +  ref int[string] lv, +  ref int[string] collapsed_lev, +  ref int[string] type +) { +  if (auto m = match(line, rgx.heading)) { +    /+ heading match +/ +    type["heading"] = State.on; +    type["header"] = State.off; +    type["header_make"] = State.off; +    type["header_metadata"] = State.off; +    type["heading_biblio"] = State.off; +    type["para"] = State.off; +    ++line_occur["heading"]; +    an_object["obj"] ~= line ~= "\n"; +    an_object["lev"] ~= m.captures[1]; +    assertions_doc_structure(an_object, lv); // includes most of the logic for collapsed levels +    switch (an_object["lev"]) { +    case "A": +      collapsed_lev["h0"] = 1; +      an_object["lev_collapsed_number"] = +        to!string(collapsed_lev["h0"]); +      lv["lv"] = DocStructMarkupHeading.h_sect_A; +      ++lv["h0"]; +      lv["h1"] = State.off; +      lv["h2"] = State.off; +      lv["h3"] = State.off; +      lv["h4"] = State.off; +      lv["h5"] = State.off; +      lv["h6"] = State.off; +      lv["h7"] = State.off; +      goto default; +    case "B": +      collapsed_lev["h1"] = collapsed_lev["h0"] + 1; +      an_object["lev_collapsed_number"] = +        to!string(collapsed_lev["h1"]); +      lv["lv"] = DocStructMarkupHeading.h_sect_B; +      ++lv["h1"]; +      lv["h2"] = State.off; +      lv["h3"] = State.off; +      lv["h4"] = State.off; +      lv["h5"] = State.off; +      lv["h6"] = State.off; +      lv["h7"] = State.off; +      goto default; +    case "C": +      collapsed_lev["h2"] = collapsed_lev["h1"] + 1; +      an_object["lev_collapsed_number"] = +        to!string(collapsed_lev["h2"]); +      lv["lv"] = DocStructMarkupHeading.h_sect_C; +      ++lv["h2"]; +      lv["h3"] = State.off; +      lv["h4"] = State.off; +      lv["h5"] = State.off; +      lv["h6"] = State.off; +      lv["h7"] = State.off; +      goto default; +    case "D": +      collapsed_lev["h3"] = collapsed_lev["h2"] + 1; +      an_object["lev_collapsed_number"] = +        to!string(collapsed_lev["h3"]); +      lv["lv"] = DocStructMarkupHeading.h_sect_D; +      ++lv["h3"]; +      lv["h4"] = State.off; +      lv["h5"] = State.off; +      lv["h6"] = State.off; +      lv["h7"] = State.off; +      goto default; +    case "1": +      if (lv["h3"] > State.off) { +        collapsed_lev["h4"] = collapsed_lev["h3"] + 1; +      } else if (lv["h2"] > State.off) { +        collapsed_lev["h4"] = collapsed_lev["h2"] + 1; +      } else if (lv["h1"] > State.off) { +        collapsed_lev["h4"] = collapsed_lev["h1"] + 1; +      } else if (lv["h0"] > State.off) { +        collapsed_lev["h4"] = collapsed_lev["h0"] + 1; +      } +      an_object["lev_collapsed_number"] = +        to!string(collapsed_lev["h4"]); +      lv["lv"] = DocStructMarkupHeading.h_text_1; +      ++lv["h4"]; +      lv["h5"] = State.off; +      lv["h6"] = State.off; +      lv["h7"] = State.off; +      goto default; +    case "2": +      if (lv["h5"] > State.off) { +        an_object["lev_collapsed_number"] = +          to!string(collapsed_lev["h5"]); +      } else if (lv["h4"] > State.off) { +        collapsed_lev["h5"] = collapsed_lev["h4"] + 1; +        an_object["lev_collapsed_number"] = +          to!string(collapsed_lev["h5"]);        } +      lv["lv"] = DocStructMarkupHeading.h_text_2; +      ++lv["h5"]; +      lv["h6"] = State.off; +      lv["h7"] = State.off; +      goto default; +    case "3": +      if (lv["h6"] > State.off) { +        an_object["lev_collapsed_number"] = +          to!string(collapsed_lev["h6"]); +      } else if (lv["h5"] > State.off) { +        collapsed_lev["h6"] = collapsed_lev["h5"] + 1; +        an_object["lev_collapsed_number"] = +          to!string(collapsed_lev["h6"]); +      } +      lv["lv"] = DocStructMarkupHeading.h_text_3; +      ++lv["h6"]; +      lv["h7"] = State.off; +      goto default; +    case "4": +      if (lv["h7"] > State.off) { +        an_object["lev_collapsed_number"] = +          to!string(collapsed_lev["h7"]); +      } else if (lv["h6"] > State.off) { +        collapsed_lev["h7"] = collapsed_lev["h6"] + 1; +        an_object["lev_collapsed_number"] = +          to!string(collapsed_lev["h7"]); +      } +      lv["lv"] = DocStructMarkupHeading.h_text_4; +      ++lv["h7"]; +      goto default; +    default: +      an_object["lev_markup_number"] = to!string(lv["lv"]); +    } +    debug(heading) {                         // heading +      // writeln(m.captures[1], " ", m.captures[2], "\n");      // figure inclusion of post capture text +      // writeln(m.hit, "\n"); +      tell_l("yellow", strip(line)); +    } +  } +}  #+END_SRC -******** flag set: header metadata                     :header:metadata:flag: -#+name: abs_loop_body_not_block_obj + +*** para match                                                         :para: + +#+name: abs_functions  #+BEGIN_SRC d -    } else if (ft["header_metadata"] == 1 -    && (line_occur["header_metadata"] > 0)) { -    /+ header_metadata flag set +/ -      if (auto m = match(line, rgx.header_sub)) { -      /+ sub-header +/ -        debug(header1) { -          tell_l("yellow", line); -        } -        line_occur["header_metadata"]++; -        object["obj"] ~= line ~= "\n"; +auto para_match( +  char[] line, +  ref string[string] an_object, +  ref string[string] indent, +  ref bool bullet, +  ref int[string] type +) { +  if (line_occur["para"] == State.off) { +    /+ para matches +/ +      // paragraphs +      // (fl  ag_type["heading"] = true) && +    if (auto m = match(line, rgx.para_indent)) { +      debug(paraindent) {                    // para indent +        tell_l("blue", line); +      } +      type["para"] = State.on; +      an_object["obj"] ~= line ~= "\n"; +      indent["first"] = to!string(m.captures[1]); +      indent["second"] = "0"; +      bullet = false; +    } else if (auto m = match(line, rgx.para_bullet)) { +      debug(parabullet) {                    // para bullet +        tell_l("blue", line); +      } +      type["para"] = State.on; +      an_object["obj"] ~= line; +      indent["first"] = "0"; +      indent["second"] = "0"; +      bullet = true; +    } else if (auto m = match(line, rgx.para_indent_hang)) { +      debug(paraindenthang) {                // para indent hang +        tell_l("blue", line); +      } +      type["para"] = State.on; +      an_object["obj"] ~= line; +      indent["first"] = to!string(m.captures[1]); +      indent["second"] = to!string(m.captures[2]); +      bullet = false; +    } else if (auto m = match(line, rgx.para_bullet_indent)) { +      debug(parabulletindent) {              // para bullet indent +        tell_l("blue", line);        } +      type["para"] = State.on; +      an_object["obj"] ~= line; +      indent["first"] = to!string(m.captures[1]); +      indent["second"] = "0"; +      bullet = true; +    } else { +      // !line.empty +      type["para"] = State.on; +      an_object["obj"] ~= line; +      indent["first"] = "0"; +      indent["second"] = "0"; +      bullet = false; +    } +    ++line_occur["para"]; +  } +}  #+END_SRC -******** flag not set & line not exist: heading or para [+1] -#+name: abs_loop_body_not_block_obj + +** function emitters                                               :emitters: +*** object                                                           :object: +**** ocn                                                                :ocn: + +#+name: ao_emitters  #+BEGIN_SRC d -    } else if (((line_occur["para"] == 0) -    && (line_occur["heading"] == 0)) -    && ((ft["para"] == 0) -    && (ft["heading"] == 0))) { -    /+ heading or para but neither flag nor line exists +/ +struct OCNemitter { +// class OCNemitter : AssertOCN { +  int obj_cite_number, obj_cite_number_; +  int obj_cite_number_emitter(int obj_cite_number_status_flag) +  in { assert(obj_cite_number_status_flag <= 2); } +  body { +    if (obj_cite_number_status_flag == 0) { +      obj_cite_number=++obj_cite_number_; +    } else { +      obj_cite_number=0; +    } +    assert(obj_cite_number >= 0); +    return obj_cite_number; +  } +  invariant() { +  } +}  #+END_SRC -********* headings found                                            :heading: -#+name: abs_loop_body_not_block_obj + +**** object attributes                                           :attributes: + +#+name: ao_emitters  #+BEGIN_SRC d -      if ((to!string(dochead_make["make"]["headings"]).length > 2) -      && (ft["make_headings"] == 0)) { -      /+ headings found +/ -        debug(headingsfound) { -          writeln(dochead_make["make"]["headings"]); -        } -        auto make_headings_txt = -          match( -            to!string(dochead_make["make"]["headings"]), -            rgx.within_quotes); -        char[][] make_headings_spl = -          split( -            cast(char[]) make_headings_txt.captures[1], -            rgx.make_heading_delimiter); -        debug(headingsfound) { -          writeln(make_headings_spl.length); -          writeln(make_headings_spl); -        } -        switch (make_headings_spl.length) { -        case 7 : -          if (!empty(make_headings_spl[6])) { -            str_h_4 = "^(" ~ to!string(make_headings_spl[6]) ~ ")"; -            rgx_h_4 = regex(str_h_4); -          } -          goto case; -        case 6 : -          if (!empty(make_headings_spl[5])) { -            str_h_3 = "^(" ~ to!string(make_headings_spl[5]) ~ ")"; -            rgx_h_3 = regex(str_h_3); -          } -          goto case; -        case 5 : -          if (!empty(make_headings_spl[4])) { -            str_h_2 = "^(" ~ to!string(make_headings_spl[4]) ~ ")"; -            rgx_h_2 = regex(str_h_2); -          } -          goto case; -        case 4 : -          if (!empty(make_headings_spl[3])) { -            str_h_1 = "^(" ~ to!string(make_headings_spl[3]) ~ ")"; -            rgx_h_1 = regex(str_h_1); -          } -          goto case; -        case 3 : -          if (!empty(make_headings_spl[2])) { -            str_h_D = "^(" ~ to!string(make_headings_spl[2]) ~ ")"; -            rgx_h_D = regex(str_h_D); -          } -          goto case; -        case 2 : -          if (!empty(make_headings_spl[1])) { -            str_h_C = "^(" ~ to!string(make_headings_spl[1]) ~ ")"; -            rgx_h_C = regex(str_h_C); -          } -          goto case; -        case 1 : -          if (!empty(make_headings_spl[0])) { -            str_h_B = "^(" ~ to!string(make_headings_spl[0]) ~ ")"; -            rgx_h_B = regex(str_h_B); -          } -          break; -        default: -          break; -        } -        ft["make_headings"] = 1; -      } -#+END_SRC -********* headings make set                                         :heading: -#+name: abs_loop_body_not_block_obj -#+BEGIN_SRC d -      if ((ft["make_headings"] == 1) -      && ((line_occur["para"] == 0) -      && (line_occur["heading"] == 0)) -      && ((ft["para"] == 0) -      && (ft["heading"] == 0))) { -      /+ heading make set +/ -        if (match(line, rgx_h_B)) { -          line = "B~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } -        } -        if (match(line, rgx_h_C)) { -          line = "C~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } -        } -        if (match(line, rgx_h_D)) { -          line = "D~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } -        } -        if (match(line, rgx_h_1)) { -          line = "1~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } -        } -        if (match(line, rgx_h_2)) { -          line = "2~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } -        } -        if (match(line, rgx_h_3)) { -          line = "3~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } -        } -        if (match(line, rgx_h_4)) { -          line = "4~ " ~ line; -          debug(headingsfound) { -            writeln(line); -          } +struct ObjAttributes { +// class ObjAttributes : AssertObjAttributes { +  string[string] obj_txt; +  string para_and_blocks(string obj_txt_in) +  in { } +  body { +    auto rgx = Rgx(); +    obj_txt["munge"]=obj_txt_in; +    if (match(obj_txt_in, rgx.para_bullet)) { +      obj_txt["attrib"] =" \"bullet\": \"true\"," +      ~ " \"indent_first\": 0," +      ~ " \"indent_rest\": 0,"; +    } else if (auto m = match(obj_txt_in, rgx.para_bullet_indent)) { +      obj_txt["attrib"] =" \"bullet\": \"true\"," +      ~ " \"indent_first\": " ~ to!string(m.captures[1]) ~ "," +      ~ " \"indent_rest\": " ~ to!string(m.captures[1]) ~ ","; +    } else if (auto m = match(obj_txt_in, rgx.para_indent_hang)) { +      obj_txt["attrib"] =" \"bullet\": \"false\"," +      ~ " \"indent_first\": " ~ to!string(m.captures[1]) ~ "," +      ~ " \"indent_rest\": " ~  to!string(m.captures[2]) ~ ","; +    } else if (auto m = match(obj_txt_in, rgx.para_indent)) { +      obj_txt["attrib"] =" \"bullet\": \"false\"," +      ~ " \"indent_first\": " ~ to!string(m.captures[1]) ~ "," +      ~ " \"indent_rest\": " ~ to!string(m.captures[1]) ~ ","; +    } else { +      obj_txt["attrib"] =" \"bullet\": \"false\"," +      ~ " \"indent_first\": 0," +      ~ " \"indent_rest\": 0,"; +    } +    return obj_txt["attrib"]; +  } +  string para(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"para\"," +    ~ " \"is\": \"para\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string heading(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"para\"," +    ~ " \"is\": \"heading\""; +    // obj_txt["struct"]=; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string header_make(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"head\"," +    ~ " \"of\": \"header\"," +    ~ " \"is\": \"header_make\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string header_metadata(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"head\"," +    ~ " \"of\": \"header\"," +    ~ " \"is\": \"header_metadata\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string code(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"block\"," +    ~ " \"is\": \"code\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string group(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"block\"," +    ~ " \"is\": \"group\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string block(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"block\"," +    ~ " \"is\": \"block\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string verse(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"block\"," +    ~ " \"is\": \"verse\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string quote(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"block\"," +    ~ " \"is\": \"quote\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string table(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"content\"," +    ~ " \"of\": \"block\"," +    ~ " \"is\": \"table\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +  string comment(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["attrib"] = " \"use\": \"comment\"," +    ~ " \"of\": \"comment\"," +    ~ " \"is\": \"comment\""; +    return obj_txt["attrib"]; +  } +  invariant() { +  } +} +#+END_SRC + +**** object inline markup munge                               :markup:inline: + +#+name: ao_emitters +#+BEGIN_SRC d +struct ObjInlineMarkupMunge { +// struct ObjInlineMarkupMunge : AssertObjInlineMarkup { +  string[string] obj_txt; +  int n_foot, n_foot_reg, n_foot_sp_asterisk, n_foot_sp_plus; +  string obj_txt_out, tail, note; +  private auto initialize_note_numbers() { +    n_foot = 0; +    n_foot_reg = 0; +    n_foot_sp_asterisk = 0; +    n_foot_sp_plus = 0; +  } +  private auto object_notes_(string obj_txt_in) +  in { } +  body { +    auto rgx = Rgx(); +    auto mkup = InlineMarkup(); +    obj_txt_out = ""; +    tail = ""; +    obj_txt_in = replaceAll( +      obj_txt_in, +      rgx.inline_notes_curly_sp_asterisk, +      (mkup.en_a_o ~ "*" ~ " $1" ~ mkup.en_a_c) +    ); +    obj_txt_in = +      replaceAll( +        obj_txt_in, +        rgx.inline_notes_curly_sp_plus, +        (mkup.en_a_o ~ "+" ~ " $1" ~ mkup.en_a_c) +      ); +    obj_txt_in = +      replaceAll( +        obj_txt_in, +        rgx.inline_notes_curly, +        (mkup.en_a_o ~ " $1" ~ mkup.en_a_c) +      ); +    if (match(obj_txt_in, rgx.inline_notes_al_gen)) { +      foreach(m; matchAll(obj_txt_in, rgx.inline_text_and_note_al)) { +        if (match(obj_txt_in, rgx.inline_al_delimiter_open_asterisk)) { +          ++n_foot_sp_asterisk; +          n_foot=n_foot_sp_asterisk; +        } else if (match(obj_txt_in, rgx.inline_al_delimiter_open_plus)) { +          ++n_foot_sp_plus; +          n_foot=n_foot_sp_plus; +        } else { +          ++n_foot_reg; +          n_foot=n_foot_reg;          } +        obj_txt_out ~= replaceFirst( +          m.hit, +          rgx.inline_al_delimiter_open_regular, +          (mkup.en_a_o ~ to!string(n_foot)) +        ); +        tail = m.post; +        // if (!empty(m.post)) { +        //   tail = m.post; +        // } else { +        //   tail = ""; +        // } +      } +    } else { +      obj_txt_out = obj_txt_in; +    } +    debug(footnotes) { +      writeln(obj_txt_out, tail); +    } +    obj_txt_out = obj_txt_out ~ tail; +    debug(footnotesdone) { +      foreach(m; matchAll(obj_txt_out, +      (mkup.en_a_o ~ `\s*(.+?)` ~ mkup.en_a_c))) { +        writeln(m.captures[1]); +        writeln(m.hit);        } +    } +    return obj_txt_out; +  } +  string para(string obj_txt_in) +  in { } +  body { +    auto rgx = Rgx(); +    obj_txt["munge"]=obj_txt_in; +    obj_txt["munge"]=replaceFirst(obj_txt["munge"], rgx.para_attribs, ""); +    obj_txt["munge"]=replaceFirst(obj_txt["munge"], rgx.obj_cite_number_off_all, ""); +    obj_txt["munge"]=object_notes_(obj_txt["munge"]); +    debug(munge) { +      writeln(__LINE__); +      writeln(obj_txt_in); +      writeln(__LINE__); +      writeln(to!string(obj_txt["munge"])); +    } +    return obj_txt["munge"]; +  } +  string heading(string obj_txt_in) +  in { } +  body { +    auto rgx = Rgx(); +    obj_txt["munge"]=obj_txt_in; +    obj_txt["munge"]=replaceFirst(obj_txt["munge"], rgx.heading, ""); +    obj_txt["munge"]=replaceFirst(obj_txt["munge"], rgx.obj_cite_number_off_all, ""); +    obj_txt["munge"]=object_notes_(obj_txt["munge"]); +    debug(munge) { +      writeln(__LINE__); +      writeln(obj_txt_in); +      writeln(__LINE__); +      writeln(to!string(obj_txt["munge"])); +    } +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string header_make(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string header_metadata(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string code(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string group(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["munge"]=object_notes_(obj_txt["munge"]); +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string block(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["munge"]=object_notes_(obj_txt["munge"]); +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string verse(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    obj_txt["munge"]=object_notes_(obj_txt["munge"]); +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string quote(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string table(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    return obj_txt["munge"]; +  } +  invariant() { +  } +  string comment(string obj_txt_in) +  in { } +  body { +    obj_txt["munge"]=obj_txt_in; +    return obj_txt["munge"]; +  } +  invariant() { +  } +}  #+END_SRC -********* headings match                                            :heading: -#+name: abs_loop_body_not_block_obj + +**** object inline markup                                     :markup:inline: + +#+name: ao_emitters  #+BEGIN_SRC d -      if (auto m = match(line, rgx.heading)) { -      /+ heading match +/ -        ft["heading"] = 1; -        ft["header"] = 0; -        ft["header_make"] = 0; -        ft["header_metadata"] = 0; -        ft["heading_biblio"] = 0; -        ft["para"] = 0; -        line_occur["heading"]++; -        object["obj"] ~= line ~= "\n"; -        object["lev"] ~= m.captures[1]; -        assertions_doc_structure(object, lv); // includes most of the logic for collapsed levels -        switch (to!string(object["lev"])) { -        case "A": -          object["lvn"]="0"; -          lv["lv"] = 0; -          lv["h0"]++; -          lv["h1"] = 0; -          lv["h2"] = 0; -          lv["h3"] = 0; -          lv["h4"] = 0; -          lv["h5"] = 0; -          lv["h6"] = 0; -          lv["h7"] = 0; -          collapsed_lev["h0"] = 1; -          object["lcn"] = to!string(collapsed_lev["h0"]); -          break; -        case "B": -          collapsed_lev["h1"] = collapsed_lev["h0"] + 1; -          object["lcn"] = to!string(collapsed_lev["h1"]); -          object["lvn"]="1"; -          lv["lv"] = 1; -          lv["h1"]++; -          lv["h2"] = 0; -          lv["h3"] = 0; -          lv["h4"] = 0; -          lv["h5"] = 0; -          lv["h6"] = 0; -          lv["h7"] = 0; -          break; -        case "C": -          collapsed_lev["h2"] = collapsed_lev["h1"] + 1; -          object["lcn"] = to!string(collapsed_lev["h2"]); -          object["lvn"]="2"; -          lv["lv"] = 2; -          lv["h2"]++; -          lv["h3"] = 0; -          lv["h4"] = 0; -          lv["h5"] = 0; -          lv["h6"] = 0; -          lv["h7"] = 0; -          break; -        case "D": -          collapsed_lev["h3"] = collapsed_lev["h2"] + 1; -          object["lcn"] = to!string(collapsed_lev["h3"]); -          object["lvn"]="3"; -          lv["lv"] = 3; -          lv["h3"]++; -          lv["h4"] = 0; -          lv["h5"] = 0; -          lv["h6"] = 0; -          lv["h7"] = 0; -          break; -        case "1": -          if (lv["h3"] > 0) { -            collapsed_lev["h4"] = collapsed_lev["h3"] + 1; -          } else if (lv["h2"] > 0) { -            collapsed_lev["h4"] = collapsed_lev["h2"] + 1; -          } else if (lv["h1"] > 0) { -            collapsed_lev["h4"] = collapsed_lev["h1"] + 1; -          } else if (lv["h0"] > 0) { -            collapsed_lev["h4"] = collapsed_lev["h0"] + 1; -          } -          object["lcn"] = to!string(collapsed_lev["h4"]); -          object["lvn"]="4"; -          lv["lv"] = 4; -          lv["h4"]++; -          lv["h5"] = 0; -          lv["h6"] = 0; -          lv["h7"] = 0; -          break; -        case "2": -          if (lv["h5"] > 0) { -            object["lcn"] = to!string(collapsed_lev["h5"]); -          } else if (lv["h4"] > 0) { -            collapsed_lev["h5"] = collapsed_lev["h4"] + 1; -            object["lcn"] = to!string(collapsed_lev["h5"]); -          } -          object["lvn"]="5"; -          lv["lv"] = 5; -          lv["h5"]++; -          lv["h6"] = 0; -          lv["h7"] = 0; -          break; -        case "3": -          if (lv["h6"] > 0) { -            object["lcn"] = to!string(collapsed_lev["h6"]); -          } else if (lv["h5"] > 0) { -            collapsed_lev["h6"] = collapsed_lev["h5"] + 1; -            object["lcn"] = to!string(collapsed_lev["h6"]); -          } -          object["lvn"]="6"; -          lv["lv"] = 6; -          lv["h6"]++; -          lv["h7"] = 0; -          break; -        case "4": -          if (lv["h7"] > 0) { -            object["lcn"] = to!string(collapsed_lev["h7"]); -          } else if (lv["h6"] > 0) { -            collapsed_lev["h7"] = collapsed_lev["h6"] + 1; -            object["lcn"] = to!string(collapsed_lev["h7"]); +struct ObjInlineMarkup { +// struct ObjInlineMarkup : AssertObjInlineMarkup { +  auto munge = ObjInlineMarkupMunge(); +  string[string] obj_txt; +  string obj_inline_markup(string obj_is_, string obj_raw) +  in { } +  body { +    obj_txt["munge"]=obj_raw.dup; +    obj_txt["munge"]=(match(obj_is_, ctRegex!(`verse|code`))) +      ? obj_txt["munge"] +      : strip(obj_txt["munge"]); +    switch (obj_is_) { +    case "header_make": +      obj_txt["munge"]=munge.header_make(obj_txt["munge"]); +      break; +    case "header_metadata": +      obj_txt["munge"]=munge.header_metadata(obj_txt["munge"]); +      break; +    case "heading": +      obj_txt["munge"]=munge.heading(obj_txt["munge"]); +      break; +    case "para": +      obj_txt["munge"]=munge.para(obj_txt["munge"]); +      break; +    case "code": +      obj_txt["munge"]=munge.code(obj_txt["munge"]); +      break; +    case "group": +      obj_txt["munge"]=munge.group(obj_txt["munge"]); +      break; +    case "block": +      obj_txt["munge"]=munge.block(obj_txt["munge"]); +      break; +    case "verse": +      obj_txt["munge"]=munge.verse(obj_txt["munge"]); +      break; +    case "quote": +      obj_txt["munge"]=munge.quote(obj_txt["munge"]); +      break; +    case "table": +      obj_txt["munge"]=munge.table(obj_txt["munge"]); +      break; +    case "comment": +      obj_txt["munge"]=munge.comment(obj_txt["munge"]); +      break; +    case "doc_end_reset": +      munge.initialize_note_numbers(); +      break; +    default: +      break; +    } +    return obj_txt["munge"]; +  } +  invariant() { +  } +} +#+END_SRC + +**** object attrib                                               :attributes: + +#+name: ao_emitters +#+BEGIN_SRC d +struct ObjAttrib { +// struct ObjAttrib : AssertObjAttrib { +// auto sink = appender!(char[])(); +  auto attrib = ObjAttributes(); +  string[string] obj_attrib; +  string obj_attributes(string obj_is_, string obj_raw, string node) +  in { } +  body { +    // string s = "{ \"language\": \"D\", \"rating\": 3.14, \"code\": \"42\" }"; +    scope(exit) { +      // destroy(obj_is_); +      destroy(obj_raw); +      destroy(node); +    } +    JSONValue node_j = parseJSON(node); +    obj_attrib.remove("json"); +    obj_attrib["json"] ="{"; +    switch (obj_is_) { +    case "header_make": +      obj_attrib["json"] ~= attrib.header_make(obj_raw); +      break; +    case "header_metadata": +      obj_attrib["json"] ~= attrib.header_metadata(obj_raw); +      break; +    case "heading": +      obj_attrib["json"] ~= attrib.heading(obj_raw); // +      break; +    case "para": +      obj_attrib["json"] ~= attrib.para_and_blocks(obj_raw) +      ~ attrib.para(obj_raw); +      break; +    case "code": +      obj_attrib["json"] ~= attrib.code(obj_raw); +      break; +    case "group": +      obj_attrib["json"] ~= attrib.para_and_blocks(obj_raw) +      ~ attrib.group(obj_raw); +      break; +    case "block": +      obj_attrib["json"] ~= attrib.para_and_blocks(obj_raw) +      ~ attrib.block(obj_raw); +      break; +    case "verse": +      obj_attrib["json"] ~= attrib.verse(obj_raw); +      break; +    case "quote": +      obj_attrib["json"] ~= attrib.quote(obj_raw); +      break; +    case "table": +      obj_attrib["json"] ~= attrib.table(obj_raw); +      break; +    case "comment": +      obj_attrib["json"] ~= attrib.comment(obj_raw); +      break; +    default: +      obj_attrib["json"] ~= attrib.para(obj_raw); +      break; +    } +    obj_attrib["json"] ~=" }"; +    JSONValue oa_j = parseJSON(obj_attrib["json"]); +    assert( +      (oa_j.type == JSON_TYPE.OBJECT) && +      (node_j.type == JSON_TYPE.OBJECT) +    ); +    if (obj_is_ == "heading") { +      oa_j.object["obj_cite_number"] = node_j["obj_cite_number"]; +      oa_j.object["lev_markup_number"] = node_j["lev_markup_number"]; +      oa_j.object["lev_collapsed_number"] = node_j["lev_collapsed_number"]; +      oa_j.object["heading_pointer"] = +        node_j["heading_pointer"]; // check +      oa_j.object["doc_object_pointer"] = +        node_j["doc_object_pointer"]; // check +    } +    oa_j.object["parent_obj_cite_number"] = node_j["parent_obj_cite_number"]; +    oa_j.object["parent_lev_markup_number"] = node_j["parent_lev_markup_number"]; +    obj_attrib["json"] = oa_j.toString(); +    debug(structattrib) { +      if (oa_j["is"].str() == "heading") { +        // writeln(__LINE__); +        writeln(obj_attrib["json"]); +        // writeln(node); +        writeln( +          "is: ", oa_j["is"].str(), +          "; obj_cite_number: ", oa_j["obj_cite_number"].integer() +        ); +      } +    } +    // obj_attrib["json"]="{}"; +    return obj_attrib["json"]; +  } +  invariant() { +  } +} +#+END_SRC + +*** header document metadata                              :document:metadata: +**** header document metadata in json                                  :json: + +#+name: ao_emitters +#+BEGIN_SRC d +struct HeaderDocMetadataMakeJson { +// class HeaderMetadataMakeHash : AssertHeaderMetadataMakeJson { +  auto rgx = Rgx(); +  string hm, hs; +  auto header_metadata_and_make_jsonstr( +    string header, +    JSONValue[string] dochead_metadata, +    JSONValue[string] dochead_make +  ) +  in { } +  body { +    scope(exit) { +      destroy(header); +      destroy(dochead_metadata); +      destroy(dochead_make); +    } +    if (auto t = match(header, rgx.head_main)) { +      char[][] obj_spl = split( +        cast(char[]) header, +        rgx.line_delimiter_ws_strip +      ); +      auto hm = to!string(t.captures[1]); +      if (match(hm, rgx.main_headers)) { +        foreach (line; obj_spl) { +          if (auto m = match(line, rgx.head_main)) { +            if (!empty(m.captures[2])) { +              if (hm == "creator") { +                dochead_metadata[hm]["author"].str = +                  to!string(m.captures[2]); +              } else if (hm == "title") { +                dochead_metadata[hm]["main"].str = +                  to!string(m.captures[2]); +              } else if (hm == "publisher") { +                dochead_metadata[hm]["name"].str = +                  to!string(m.captures[2]); +              } +            } +          } else if (auto s = match(line, rgx.head_sub)) { +            if (!empty(s.captures[2])) { +              auto hs = to!string(s.captures[1]); +              if ((hm == "make" ) +              && (dochead_make[hm].type() == JSON_TYPE.OBJECT)) { +                switch (hm) { +                case "make": +                  if (match(hs, rgx.subhead_make)) { +                    if (dochead_make[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_make[hm][hs].str = to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                default: +                  break; +                } +              } else if (dochead_metadata[hm].type() == JSON_TYPE.OBJECT) { +                switch (hm) { +                case "creator": +                  if (match(hs, rgx.subhead_creator)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "title": +                  if (match(hs, rgx.subhead_title)) { +                    if ((hs == "subtitle") +                    && (dochead_metadata[hm]["sub"].type() == JSON_TYPE.STRING)) { +                      dochead_metadata[hm]["sub"].str = +                        to!string(s.captures[2]); +                    } else if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "rights": +                  if (match(hs, rgx.subhead_rights)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "date": +                  if (match(hs, rgx.subhead_date)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "original": +                  if (match(hs, rgx.subhead_original)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "classify": +                  if (match(hs, rgx.subhead_classify)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "identifier": +                  if (match(hs, rgx.subhead_identifier)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "notes": +                  if (match(hs, rgx.subhead_notes)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "publisher": +                  if (match(hs, rgx.subhead_publisher)) { +                    if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                      dochead_metadata[hm][hs].str = +                        to!string(s.captures[2]); +                    } +                  } else { +                    writeln("not a valid header type:", hm, ":", hs); +                    destroy(hm); +                    destroy(hs); +                  } +                  break; +                case "links": +                  destroy(hm); +                  destroy(hs); +                  // if (match(hs, rgx.subhead_links)) { +                  //   if (dochead_metadata[hm][hs].type() == JSON_TYPE.STRING) { +                  //     dochead_metadata[hm][hs].str = to!string(s.captures[2]); +                  //   } +                  // } else { +                  //   writeln("not a valid header type:", hm, ":", hs); +                  //   destroy(hm); +                  //   destroy(hs); +                  // } +                  break; +                default: +                  break; +                } +              } +            }            } -          object["lvn"]="7"; -          lv["lv"] = 7; -          lv["h7"]++; -          break; -        default: -          break; -        } -        debug(heading) {                         // heading -          tell_l("yellow", strip(line));          } +      } else { +        writeln("not a valid header type:", hm); +      } +    } +    auto t = tuple(dochead_metadata, dochead_make); +    static assert(!isTypeTuple!(t)); +    return t; +  } +  // invariant() { +  // } +}  #+END_SRC -********* para matches                                                 :para: -#+name: abs_loop_body_not_block_obj + +**** header document metadata as hash                                  :hash: + +#+name: ao_emitters  #+BEGIN_SRC d -      } else if (line_occur["para"] == 0) { -      /+ para matches +/ -        if (auto m = match(line, rgx.para_indent)) { -          debug(paraindent) {                    // para indent -            tell_l("blue", line); -          } -          ft["para"] = 1; -          object["obj"] ~= line ~= "\n"; -          indent_first = to!string(m.captures[1]); -          indent_second = "0"; -          bullet = false; -        } else if (auto m = match(line, rgx.para_bullet)) { -          debug(parabullet) {                    // para bullet -            tell_l("blue", line); -          } -          ft["para"] = 1; -          object["obj"] ~= line; -          indent_first = "0"; -          indent_second = "0"; -          bullet = true; -        } else if (auto m = match(line, rgx.para_indent_hang)) { -          debug(paraindenthang) {                // para indent hang -            tell_l("blue", line); +class HeaderMetadataMakeHash { +// class HeaderMetadataMakeHash : AssertHeaderMetadataMakeHash { +  auto rgx = Rgx(); +  string header_main; +  string[string] head; +  string[string] header_topic_hash(string header) +  in { } +  body { +    if (auto t = match(header, rgx.head_main)) { +      char[][] obj_spl = split( +        cast(char[]) header, +        rgx.line_delimiter_ws_strip +      ); +      auto header_main = to!string(t.captures[1]); +      head[header_main] = "{"; +      foreach (line; obj_spl) { +        if (auto m = match(line, rgx.head_main)) { +          if (!empty(m.captures[2])) { +            head[header_main] ~= +              "\"" ~ header_main ~ +              "\": \"" ~ +              to!string(m.captures[2]) ~ +              "\",";            } -          ft["para"] = 1; -          object["obj"] ~= line; -          indent_first = to!string(m.captures[1]); -          indent_second = to!string(m.captures[2]); -          bullet = false; -        } else if (auto m = match(line, rgx.para_bullet_indent)) { -          debug(parabulletindent) {              // para bullet indent -            tell_l("blue", line); +        } else if (auto s = match(line, rgx.head_sub)) { +          head[header_main] ~= "\"" ~ s.captures[1] ~ "\":"; +          if (!empty(s.captures[2])) { +            head[header_main] ~= "\"" ~ s.captures[2] ~ "\",";            } -          ft["para"] = 1; -          object["obj"] ~= line; -          indent_first = to!string(m.captures[1]); -          indent_second = "0"; -          bullet = true; -        } else { -          ft["para"] = 1; -          object["obj"] ~= line; -          indent_first = "0"; -          indent_second = "0"; -          bullet = false;          } -        line_occur["para"]++;        } -#+END_SRC -******** line exist: header make                                :header:make: -#+name: abs_loop_body_not_block_obj -#+BEGIN_SRC d -    } else if (line_occur["header_make"] > 0) { -    /+ header_make +/ -    // should be caught by sub-header -      debug(header) { -        tell_l("red", line); +      head[header_main] = replaceFirst( +        head[header_main], +        rgx.tailing_comma, +        "" +      ); +      head[header_main] ~= "}"; +      debug(headerjson) { +        JSONValue j = parseJSON(head[header_main]); +        assert( +          (j.type == JSON_TYPE.OBJECT) +        );        } -      object["obj"] ~= line ~= "\n"; -      line_occur["header_make"]++; +    } +    return head; +  } +  invariant() { +  } +}  #+END_SRC -******** line exist: header metadata                        :header:metadata: -#+name: abs_loop_body_not_block_obj + +*** book index                                                   :book:index: +**** book index nugget hash                                     :hash:nugget: + +#+name: ao_emitters  #+BEGIN_SRC d -    } else if (line_occur["header_metadata"] > 0) { -    /+ header_metadata +/ -    // should be caught by sub-header -      debug(header) {                          // para -        tell_l("red", line); +struct BookIndexNuggetHash { +// class BookIndexNuggetHash : AssertBookIndexNuggetHash { +  string main_term, sub_term, sub_term_bits; +  int obj_cite_number_offset, obj_cite_number_endpoint; +  string[] obj_cite_numbers; +  string[][string][string] bi; +  string[][string][string] hash_nugget; +  string[] bi_main_terms_split_arr; +  string[][string][string] bookindex_nugget_hash(string bookindex_section, int obj_cite_number) +  in { +    debug(bookindexraw) { +      mixin ScreenTxtColors; +      if (!bookindex_section.empty) { +        writeln( +          scr_txt_color["blue"], "* [bookindex] ", scr_txt_color["off"], +          "[", to!string(obj_cite_number), "] ", bookindex_section +        );        } -      object["obj"] ~= line ~= "\n"; -      line_occur["header_metadata"]++; +    } +  } +  body { +    auto rgx = Rgx(); +    if (!bookindex_section.empty) { +      auto bi_main_terms_split_arr = +        split(bookindex_section, rgx.bi_main_terms_split); +      foreach (bi_main_terms_content; bi_main_terms_split_arr) { +        auto bi_main_term_and_rest = +          split(bi_main_terms_content, rgx.bi_main_term_plus_rest_split); +        if (auto m = match( +          bi_main_term_and_rest[0], +          rgx.bi_term_and_obj_cite_numbers_match) +        ) { +          main_term = strip(m.captures[1]); +          obj_cite_number_offset = to!int(m.captures[2]); +          obj_cite_number_endpoint=(obj_cite_number + obj_cite_number_offset); +          obj_cite_numbers ~= (to!string(obj_cite_number) ~ "-" ~ to!string(obj_cite_number_endpoint)); +        } else { +          main_term = strip(bi_main_term_and_rest[0]); +          obj_cite_numbers ~= to!string(obj_cite_number); +        } +        bi[main_term]["_a"] ~= obj_cite_numbers; +        obj_cite_numbers=null; +        if (bi_main_term_and_rest.length > 1) { +          auto bi_sub_terms_split_arr = +            split( +              bi_main_term_and_rest[1], +              rgx.bi_sub_terms_plus_obj_cite_number_offset_split +            ); +          foreach (sub_terms_bits; bi_sub_terms_split_arr) { +            if (auto m = match(sub_terms_bits, rgx.bi_term_and_obj_cite_numbers_match)) { +              sub_term = strip(m.captures[1]); +              obj_cite_number_offset = to!int(m.captures[2]); +              obj_cite_number_endpoint=(obj_cite_number + obj_cite_number_offset); +              obj_cite_numbers ~= (to!string(obj_cite_number) ~ " - " ~ to!string(obj_cite_number_endpoint)); +            } else { +              sub_term = strip(sub_terms_bits); +              obj_cite_numbers ~= to!string(obj_cite_number); +            } +            if (!empty(sub_term)) { +              bi[main_term][sub_term] ~= obj_cite_numbers; +            } +            obj_cite_numbers=null; +          } +        } +      } +    } +    hash_nugget = bi; +    return hash_nugget; +  } +  invariant() { +  } +}  #+END_SRC -******** line exist: heading                                        :heading: -#+name: abs_loop_body_not_block_obj + +**** book index report                                               :report: + +#+name: ao_emitters  #+BEGIN_SRC d -    } else if (line_occur["heading"] > 0) { -    /+ heading +/ -      debug(heading) {                         // heading -        tell_l("blue", line); +struct BookIndexReport { +// class BookIndexReport : AssertBookIndexReport { +  int mkn, skn; +  auto bookindex_report_sorted( +    string[][string][string] bookindex_unordered_hashes +  ) { +    auto mainkeys=bookindex_unordered_hashes.byKey.array. +      sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release; +    foreach (mainkey; mainkeys) { +      auto subkeys=bookindex_unordered_hashes[mainkey].byKey.array. +        sort!("toLower(a) < toLower(b)", SwapStrategy.stable).release; +      foreach (subkey; subkeys) { +        debug(bookindex) { +          writeln( +            mainkey, ": ", +            subkey, ": ", +            to!string(bookindex_unordered_hashes[mainkey][subkey]) +          ); +        } +        ++skn;        } -      object["obj"] ~= line ~= "\n"; -      line_occur["heading"]++; +      ++mkn; +    } +    // return bookindex_the; +  } +}  #+END_SRC -******** line exist: para                                              :para: -#+name: abs_loop_body_not_block_obj + +**** book index report indented                             :report:indented: + +#+name: ao_emitters  #+BEGIN_SRC d -    } else if (line_occur["para"] > 0) { -    /+ paragraph +/ -      debug(para) { -        tell_l("blue", line); +struct BookIndexReportIndent { +  int mkn, skn; +  auto bookindex_report_indented( +    string[][string][string] bookindex_unordered_hashes +  ) { +    auto mainkeys= +      bookindex_unordered_hashes.byKey.array.sort().release; +    foreach (mainkey; mainkeys) { +      debug(bookindex) { +        writeln(mainkey); +      } +      auto subkeys= +        bookindex_unordered_hashes[mainkey].byKey.array.sort().release; +      foreach (subkey; subkeys) { +        debug(bookindex) { +          writeln("  ", subkey); +          writeln("    ", to!string( +            bookindex_unordered_hashes[mainkey][subkey] +          )); +        } +        // bookindex_the[mkn][mainkey][skn][subkey] ~= (bookindex_unordered_hashes[mainkey][subkey]); +        ++skn;        } -      object["obj"] ~= line; -      line_occur["para"]++; +      ++mkn;      }    } +}  #+END_SRC -****** line empty, with block flag -#+name: abs_loop_body_not_block_obj + +**** book index report section                               :report:section: + +#+name: ao_emitters  #+BEGIN_SRC d -} else if (ft["blocks"] == 2) { -/+ line empty, with blocks flag +/ -  assert( -    line.empty, -    "line should be empty" -  ); -  assert( -    (ft["blocks"] == 2), -    "code block status: closed" -  ); -  assertions_flag_types_block_status_none_or_closed(ft); -  if (ft["code"] == 2) { -    ocn = ocn_emit(ft["ocn_status"]); -    object["bookindex"] = -      ("bookindex" in object) ? object["bookindex"] : ""; -    bookindex_unordered_hashes = -      bkidx_hash(object["bookindex"], ocn); -    object["is"] = "code"; -    node = -      node_jstr( -        content_non_header, -        ocn, -        counter, -        heading_pointer-1, -        object["is"] -      ); -    object["markup"] = -      obj_im.obj_inline_markup(object["is"], object["obj"]); -    object["attrib"] = -      obj_att.obj_attributes(object["is"], object["obj"], node); -    contents ~= -      set_oa.contents_block( -        object["is"], -        object["markup"], -        object["attrib"], -        ocn -      ); -    object.remove("obj"); -    object.remove("markup"); -    object.remove("is"); -    object.remove("attrib"); -    object.remove("bookindex"); -    processing.remove("verse"); -    counter++; -    ft["blocks"] = 0; -    ft["code"] = 0; -  } else if (ft["poem"] == 2) { -    object["bookindex"] = -      ("bookindex" in object) ? object["bookindex"] : ""; -    bookindex_unordered_hashes = -      bkidx_hash(object["bookindex"], ocn); -    object["is"] = "verse"; // check also -    node = -      node_jstr( -        content_non_header, -        ocn, -        counter, -        heading_pointer-1, -        object["is"] -      ); -    contents ~= -      set_oa.contents_block_ocn_string( -        "poem", -        "", -        (ocn_poem["start"], ocn_poem["end"]), -        node -      ); // bookindex -    object.remove("obj"); -    object.remove("markup"); -    object.remove("is"); -    object.remove("attrib"); -    object.remove("bookindex"); -    processing.remove("verse"); -    ft["blocks"] = 0; -    ft["poem"] = 0; -  } else if (ft["table"] == 2) { -    ocn = ocn_emit(ft["ocn_status"]); -    object["bookindex"] = -      ("bookindex" in object) ? object["bookindex"] : ""; -    bookindex_unordered_hashes = -      bkidx_hash(object["bookindex"], ocn); -    object["is"] = "table"; -    node = -      node_jstr( -        content_non_header, -        ocn, -        counter, -        heading_pointer-1, -        object["is"] -      ); -    object["markup"] = -      obj_im.obj_inline_markup(object["is"], object["obj"]); -    object["attrib"] = -      obj_att.obj_attributes(object["is"], object["obj"], node); -    contents ~= -      set_oa.contents_block( -        object["is"], -        object["markup"], -        object["attrib"], -        ocn -      ); -    object.remove("obj"); -    object.remove("markup"); -    object.remove("is"); -    object.remove("attrib"); -    object.remove("bookindex"); -    processing.remove("verse"); -    counter++; -    ft["blocks"] = 0; -    ft["table"] = 0; -  } else if (ft["group"] == 2) { -    ocn = ocn_emit(ft["ocn_status"]); -    object["bookindex"] = ("bookindex" in object) ? object["bookindex"] : ""; -    bookindex_unordered_hashes = bkidx_hash(object["bookindex"], ocn); -    object["is"] = "group"; -    node = -      node_jstr( -        content_non_header, -        ocn, -        counter, -        heading_pointer-1, -        object["is"] -      ); -    object["markup"] = -      obj_im.obj_inline_markup(object["is"], object["obj"]); -    object["attrib"] = -      obj_att.obj_attributes(object["is"], object["obj"], node); -    contents ~= -      set_oa.contents_block( -        object["is"], -        object["markup"], -        object["attrib"], -        ocn +struct BookIndexReportSection { +  mixin ObjectSetter; +  int mkn, skn; +  auto rgx = Rgx(); +  auto bookindex_write_section( +    string[][string][string] bookindex_unordered_hashes +  ) { +    auto mainkeys=bookindex_unordered_hashes.byKey.array.sort().release; +    foreach (mainkey; mainkeys) { +      write("_0_1 !{", mainkey, "}! "); +      foreach (ref_; bookindex_unordered_hashes[mainkey]["_a"]) { +        auto go = replaceAll(ref_, rgx.book_index_go, "$1"); +        write(" {", ref_, "}#", go, ", "); +      } +      writeln(" \\\\"); +      bookindex_unordered_hashes[mainkey].remove("_a"); +      auto subkeys= +        bookindex_unordered_hashes[mainkey].byKey.array.sort().release; +      foreach (subkey; subkeys) { +        write("  ", subkey, ", "); +        foreach (ref_; bookindex_unordered_hashes[mainkey][subkey]) { +          auto go = replaceAll(ref_, rgx.book_index_go, "$1"); +          write(" {", ref_, "}#", go, ", "); +        } +        writeln(" \\\\"); +        ++skn; +      } +      ++mkn; +    } +  } +  auto bookindex_build_section( +    string[][string][string] bookindex_unordered_hashes, +    int obj_cite_number +  ) { +    string type; +    int type_heading; +    string lev, lev_markup_number, lev_collapsed_number; +    string attrib; +    string[string] indent; +    auto set_abstract_object = ObjectAbstractSet(); +    auto mainkeys = +      bookindex_unordered_hashes.byKey.array.sort().release; +    string bi_tmp; +    string[string][] bookindex_section; +    // writeln(mainkeys.length); +    // B~ Book Index +    type_heading=1; +    bi_tmp = "Book Index"; +    attrib=""; +    lev="B"; +    lev_markup_number="1"; +    lev_collapsed_number="1"; +    bookindex_section ~= +      set_abstract_object.contents_heading( +        type_heading, +        bi_tmp, +        attrib, +        obj_cite_number, +        lev, +        lev_markup_number, +        lev_collapsed_number        ); -    object.remove("obj"); -    object.remove("markup"); -    object.remove("is"); -    object.remove("attrib"); -    object.remove("bookindex"); -    processing.remove("verse"); -    counter++; -    ft["blocks"] = 0; -    ft["group"] = 0; -  } else if (ft["block"] == 2) { -    ocn = ocn_emit(ft["ocn_status"]); -    object["bookindex"] = ("bookindex" in object) ? object["bookindex"] : ""; -    bookindex_unordered_hashes = bkidx_hash(object["bookindex"], ocn); -    object["is"] = "block"; -    node = -      node_jstr( -        content_non_header, -        ocn, -        counter, -        heading_pointer-1, -        object["is"] -       ); -    object["markup"] = -      obj_im.obj_inline_markup(object["is"], object["obj"]); -    object["attrib"] = -      obj_att.obj_attributes(object["is"], object["obj"], node); -    contents ~= -      set_oa.contents_block( -        object["is"], -        object["markup"], -        object["attrib"], -        ocn +    ++obj_cite_number; +    ++mkn; +    // 1~ Index +    type_heading=1; +    bi_tmp = "Index"; +    attrib=""; +    lev="1"; +    lev_markup_number="4"; +    lev_collapsed_number="2"; +    bookindex_section ~= +      set_abstract_object.contents_heading( +        type_heading, +        bi_tmp, +        attrib, +        obj_cite_number, +        lev, +        lev_markup_number, +        lev_collapsed_number        ); -    object.remove("obj"); -    object.remove("markup"); -    object.remove("is"); -    object.remove("attrib"); -    object.remove("bookindex"); -    processing.remove("verse"); -    counter++; -    ft["blocks"] = 0; -    ft["block"] = 0; -  } else if (ft["quote"] == 2) { -    ocn = ocn_emit(ft["ocn_status"]); -    object["bookindex"] = ("bookindex" in object) ? object["bookindex"] : ""; -    bookindex_unordered_hashes = -      bkidx_hash(object["bookindex"], ocn); -    object["is"] = "quote"; -    node = -      node_jstr( -        content_non_header, -        ocn, -        counter, -        heading_pointer-1, -        object["is"] +    ++obj_cite_number; +    ++mkn; +    foreach (mainkey; mainkeys) { +      bi_tmp = "!{" ~ mainkey ~ "}! "; +      // bi_tmp = "_0_1 !{" ~ mainkey ~ "}! "; +      foreach (ref_; bookindex_unordered_hashes[mainkey]["_a"]) { +        auto go = replaceAll(ref_, rgx.book_index_go, "$1"); +        bi_tmp ~= " {" ~ ref_ ~ "}#" ~ go ~ ", "; +      } +      bi_tmp ~= " \\\\\n    "; +      bookindex_unordered_hashes[mainkey].remove("_a"); +      auto subkeys = +        bookindex_unordered_hashes[mainkey].byKey.array.sort().release; +      foreach (subkey; subkeys) { +        bi_tmp ~= subkey ~ ", "; +        foreach (ref_; bookindex_unordered_hashes[mainkey][subkey]) { +          auto go = replaceAll(ref_, rgx.book_index_go, "$1"); +          bi_tmp ~= " {" ~ ref_ ~ "}#" ~ go ~ ", "; +        } +        bi_tmp ~= " \\\\\n    "; +        ++skn; +      } +      bi_tmp = replaceFirst(bi_tmp, rgx.trailing_linebreak, ""); +      type="para"; +      attrib=""; +      indent["first"] = "0"; +      indent["second"] = "1"; +      attrib=""; +      // bookindex_section ~= +      //   set_abstract_object.contents_para( +      //     obj, +      //     obj_cite_number, +      //     indent, +      //     false +      //   ); +      bookindex_section ~= +        set_abstract_object.contents_para( +          type, +          bi_tmp, +          attrib, +          obj_cite_number, +          indent, +          false +        ); +      ++obj_cite_number; +      ++mkn; +    } +    auto t = tuple(bookindex_section, obj_cite_number); +    return t; +  } +  auto bookindex_build_section_( +    string[][string][string] bookindex_unordered_hashes +  ) { +    auto mainkeys = +      bookindex_unordered_hashes.byKey.array.sort().release; +    string bi_tmp; +    string[] bookindex_section; +    // int bi_num; +    // writeln(mainkeys.length); +    foreach (mainkey; mainkeys) { +      bi_tmp = "_0_1 !{" ~ mainkey ~ "}! "; +      foreach (ref_; bookindex_unordered_hashes[mainkey]["_a"]) { +        auto go = replaceAll(ref_, rgx.book_index_go, "$1"); +        bi_tmp ~= " {" ~ ref_ ~ "}#" ~ go ~ ", "; +      } +      bi_tmp ~= " \\\\\n    "; +      bookindex_unordered_hashes[mainkey].remove("_a"); +      auto subkeys = +        bookindex_unordered_hashes[mainkey].byKey.array.sort().release; +      foreach (subkey; subkeys) { +        bi_tmp ~= subkey ~ ", "; +        // bi_tmp ~= "  " ~ subkey ~ ", "; +        foreach (ref_; bookindex_unordered_hashes[mainkey][subkey]) { +          auto go = replaceAll(ref_, rgx.book_index_go, "$1"); +          bi_tmp ~= " {" ~ ref_ ~ "}#" ~ go ~ ", "; +        } +        bi_tmp ~= " \\\\\n    "; +        ++skn; +      } +      bi_tmp = replaceFirst(bi_tmp, rgx.trailing_linebreak, ""); +      bookindex_section ~= bi_tmp; +      ++mkn; +    } +    return bookindex_section; +  } +} +#+END_SRC + +*** (end)notes section                                     :endnotes:section: + +#+name: ao_emitters +#+BEGIN_SRC d +struct NotesSection { +  mixin ObjectSetter; +  string object_notes; +  long previous_count; +  int mkn; +  auto rgx = Rgx(); +  private auto gather_notes_for_endnote_section( +    string[string][] contents_am, +    long counter +  ) +  in { +    // endnotes/ footnotes for +    // doc objects other than paragraphs & headings +    // various forms of grouped text +    assert((contents_am[counter]["is"] == "para") +    || (contents_am[counter]["is"] == "heading")); +    assert(counter > previous_count); +    previous_count=counter; +    assert( +      match(contents_am[counter]["obj"], +      rgx.inline_notes_delimiter_al_regular_number_note) +    ); +  } +  body { +    foreach(m; +    matchAll(contents_am[counter]["obj"], +    rgx.inline_notes_delimiter_al_regular_number_note)) { +      debug(endnotes_build) { +        writeln( +          "{^{", m.captures[1], ".}^}#noteref_", m.captures[1], " ", +          m.captures[2]); // sometimes need segment name (segmented html & epub) +        // writeln("{^{", m.captures[1], ".}^}#", contents_am[counter]["obj_cite_number"], " ", m.captures[2]); +      } +      object_notes ~= +        "{^{" ~ m.captures[1] ~ ".}^}#noteref_" ~ +        m.captures[1] ~ " " ~ m.captures[2] ~ "』"; +    } +    return object_notes; +  } +  private auto gathered_notes() +  in { +  } +  body { +    string[] endnotes_; +    if (object_notes.length > 1) { +      endnotes_ = (split(object_notes, rgx.break_string))[0..$-1]; +    } +    return endnotes_; +  } +  private auto endnote_objects(int obj_cite_number) +  in { +  } +  body { +    auto set_abstract_object = ObjectAbstractSet(); +    string[string][] endnotes_section; +    auto endnotes_ = gathered_notes(); +    // auto endnotes_ = (split(object_notes, rgx.break_string))[0..$-1]; +    string type; +    int type_heading; +    string lev, lev_markup_number, lev_collapsed_number; +    string attrib; +    string[string] indent; +    // B~ Endnotes +    type_heading=1; +    attrib=""; +    lev="B"; +    lev_markup_number="1"; +    lev_collapsed_number="1"; +    endnotes_section ~= +      set_abstract_object.contents_heading( +        type_heading, +        "Endnotes", +        attrib, +        obj_cite_number, +        lev, +        lev_markup_number, +        lev_collapsed_number        ); -    object["markup"] = -      obj_im.obj_inline_markup(object["is"], object["obj"]); -    object["attrib"] = -      obj_att.obj_attributes(object["is"], object["obj"], node); -    contents ~= -      set_oa.contents_block( -        object["is"], -        object["markup"], -        object["attrib"], -        ocn +    ++obj_cite_number; +    ++mkn; +    // 1~ Endnotes +    type_heading=1; +    attrib=""; +    lev="1"; +    lev_markup_number="4"; +    lev_collapsed_number="2"; +    endnotes_section ~= +      set_abstract_object.contents_heading( +        type_heading, +        "Endnotes", +        attrib, +        obj_cite_number, +        lev, +        lev_markup_number, +        lev_collapsed_number        ); -    object.remove("obj"); -    object.remove("markup"); -    object.remove("is"); -    object.remove("attrib"); -    object.remove("bookindex"); -    processing.remove("verse"); -    counter++; -    ft["blocks"] = 0; -    ft["quote"] = 0; +    ++obj_cite_number; +    ++mkn; +    foreach (endnote; endnotes_) { +      type="para"; +      attrib=""; +      indent["first"] = "0"; +      indent["second"] = "0"; +      attrib=""; +      // endnotes ~= +      //   set_abstract_object.contents_para( +      //     obj, +      //     obj_cite_number, +      //     indent, +      //     false +      //   ); +      endnotes_section ~= +        set_abstract_object.contents_para( +          type, +          endnote, +          attrib, +          obj_cite_number, +          indent, +          false +        ); +      ++obj_cite_number; +      ++mkn; +    } +    auto t = tuple(endnotes_section, obj_cite_number); +    return t;    } +}  #+END_SRC -****** line empty [+1] -#+name: abs_loop_body_not_block_obj + +*** bibliography                                               :bibliography: + +#+name: ao_emitters  #+BEGIN_SRC d -} else { -/+ line empty +/ +struct Bibliography { +  public JSONValue[] bibliography(ref string[] biblio_unsorted_incomplete, ref JSONValue[] bib_arr_json) +  in { } +  body { +    JSONValue[] biblio_unsorted = +      biblio_unsorted_complete(biblio_unsorted_incomplete, bib_arr_json); +    JSONValue[] biblio_sorted = biblio_sort(biblio_unsorted); +    biblio_debug(biblio_sorted); +    return biblio_sorted; +  } +  final private JSONValue[] biblio_unsorted_complete( +    string[] biblio_unordered, +    ref JSONValue[] bib_arr_json +  ) { +    foreach (bibent; biblio_unordered) { +      // update bib to include deemed_author, needed for: +      // sort_bibliography_array_by_deemed_author_year_title +      // either: sort on multiple fields, or; create such sort field +      JSONValue j = parseJSON(bibent); +      if (!empty(j["fulltitle"].str)) { +        if (!empty(j["author_raw"].str)) { +          j["deemed_author"]=j["author_arr"][0]; +        } else if (!empty(j["editor_raw"].str)) { +          j["deemed_author"]=j["editor_arr"][0]; +        } +        j["sortby_deemed_author_year_title"] = ( +          j["deemed_author"].str ~ +           "; " ~ +           j["year"].str ~ +           "; "  ~ +           j["fulltitle"].str +        ); +      } +      bib_arr_json ~= j; +    } +    JSONValue[] biblio_unsorted_array_of_json_objects = +      bib_arr_json.dup; +    return biblio_unsorted_array_of_json_objects; +  } +  final private JSONValue[] biblio_sort(JSONValue[] biblio_unordered) { +    JSONValue[] biblio_sorted; +    biblio_sorted = +      sort!((a, b){ +        return ((a["sortby_deemed_author_year_title"].str) < (b["sortby_deemed_author_year_title"].str)); +      })(biblio_unordered).array; +    debug(bibliosorted) { +      foreach (j; biblio_sorted) { +        if (!empty(j["fulltitle"].str)) { +          writeln(j["sortby_deemed_author_year_title"]); +          // writeln(j["deemed_author"], " (", j["author"], ") ",  j["fulltitle"]); +        } +      } +    } +    return biblio_sorted; +  } +  auto biblio_debug(JSONValue[] biblio_sorted) { +    debug(biblio) { +      foreach (j; biblio_sorted) { +        if (!empty(j["fulltitle"].str)) { +          writeln(j["sortby_deemed_author_year_title"]); +        } +      } +    } +  } +}  #+END_SRC -******* assert line empty                                            :assert: -#+name: abs_loop_body_not_block_obj_line_empty + +*** node structure metadata                         :structure:metadata:node: +**** metadata (check) + +#+name: ao_emitters  #+BEGIN_SRC d -/+ line.empty, post contents, empty variables: +/ -assert( -  line.empty, -  "line should be empty" -); -assert( -  (ft["blocks"] == 0), -  "code block status: none" -); +struct NodeStructureMetadata { +// class NodeStructureMetadata : AssertNodeJSON { +  int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7; +  int obj_cite_number; +  int[string] p_; // p_ parent_ +  string node; +  string node_emitter( +    string lev_markup_number, +    int obj_cite_number_, +    long counter_, +    int pointer_, +    string is_ +  ) +  in { +    auto rgx = Rgx(); +    assert(is_ != "heading"); +    assert(to!int(obj_cite_number_) >= 0); +  } +  body { +    // scope(failure) { +    //   writeln(__FILE__, ":", __LINE__, " failed here:"); +    //   writeln("  is  : ", is_); +    //   writeln("  node: ", node); +    // } +    assert(is_ != "heading"); // should not be necessary +    assert(to!int(obj_cite_number_) >= 0); // should not be necessary +    int obj_cite_number=to!int(obj_cite_number_); +    if (lv7 > State.off) { +      p_["lev_markup_number"] = DocStructMarkupHeading.h_text_4; +      p_["obj_cite_number"] = lv7; +    } else if (lv6 > State.off) { +      p_["lev_markup_number"] = DocStructMarkupHeading.h_text_3; +      p_["obj_cite_number"] = lv6; +    } else if (lv5 > State.off) { +      p_["lev_markup_number"] = DocStructMarkupHeading.h_text_2; +      p_["obj_cite_number"] = lv5; +    } else { +      p_["lev_markup_number"] = DocStructMarkupHeading.h_text_1; +      p_["obj_cite_number"] = lv4; +    } +    node=("{ " ~ +      "\"is\": \"" ~ is_ ~ "\"" ~ +      ", \"heading_pointer\": " ~ to!string(pointer_) ~ +      ", \"doc_object_pointer\": " ~ to!string(counter_) ~ +      ", \"obj_cite_number\": " ~ to!string(obj_cite_number_) ~ +      ", \"parent_obj_cite_number\": " ~ to!string(p_["obj_cite_number"]) ~ +      ", \"parent_lev_markup_number\": " ~ to!string(p_["lev_markup_number"]) ~ +      " }" +    ); +    debug(node) { +      mixin ScreenTxtColors; +      if (match(lev_markup_number, rgx.levels_numbered_headings)) { +        writeln(scr_txt_marker["yellow"], to!string(node)); +      } else { +        writeln(scr_txt_marker["white"], to!string(node)); +      } +    } +    JSONValue j = parseJSON(node); +    assert(j["parent_lev_markup_number"].integer >= 4); +    assert(j["parent_lev_markup_number"].integer <= 7); +    assert(j["parent_obj_cite_number"].integer >= 0); +    return node; +  } +  invariant() { +  }  #+END_SRC -******* header_make instructions                   :header:make:instructions: -#+name: abs_loop_body_not_block_obj_line_empty + +**** metadata (check) +#+name: ao_emitters  #+BEGIN_SRC d -if ((ft["header_make"] == 1) -&& (line_occur["header_make"] > 0)) { -/+ header_make instructions (current line empty) +/ -  auto dochead_metadata_and_make = -    set_header.header_metadata_and_make_jsonstr(strip(object["obj"]), dochead_metadata, dochead_make); -  static assert(!isTypeTuple!(dochead_metadata_and_make)); -  dochead_metadata = dochead_metadata_and_make[0]; -  dochead_make = dochead_metadata_and_make[1]; -  line_occur["header_make"] = 0; -  line_occur["header_metadata"] = 0; -  line_occur["heading"] = 0; -  line_occur["para"]= 0; -  ft["header"] = 0; -  ft["heading"] = 0; -  ft["para"] = 0; -  object.remove("obj"); -  object.remove("markup"); -  object.remove("is"); -  object.remove("attrib"); -  object.remove("bookindex"); -  processing.remove("verse"); +  string node_emitter_heading( +    string lev_markup_number, +    string lev_collapsed_number, +    int obj_cite_number_, +    long counter_, +    int pointer_, +    string is_ +  ) +  in { +    auto rgx = Rgx(); +    assert(is_ == "heading"); +    assert(to!int(obj_cite_number_) >= 0); +    assert( +      match(lev_markup_number, rgx.levels_numbered), +      ("not a valid heading level: " ~ lev_markup_number ~ " at " ~ to!string(obj_cite_number_)) +    ); +    // assert(to!int(obj_cite_number_) >= 0); +    if (match(lev_markup_number, rgx.levels_numbered)) { +      if (to!int(lev_markup_number) == 0) { +        assert(to!int(obj_cite_number_) == 1); +        // writeln(lev_markup_number); +      } +    } +  } +  body { +    // scope(failure) { +    //   writeln(__FILE__, ":", __LINE__, " failed here:"); +    //   writeln("  is  : ", is_); +    //   writeln("  node: ", node); +    // } +    auto rgx = Rgx(); +    int obj_cite_number = to!int(obj_cite_number_); +    switch (lev_markup_number) { // switch (to!string(lv)) { +    case "0": +      lv = DocStructMarkupHeading.h_sect_A; +      lv0 = obj_cite_number; +      lv1=0; lv2=0; lv3=0; lv4=0; lv5=0; lv6=0; lv7=0; +      p_["lev_markup_number"] = 0; +      p_["obj_cite_number"] = 0; +      break; +    case "1": +      lv = DocStructMarkupHeading.h_sect_B; +      lv1 = obj_cite_number; +      lv2=0; lv3=0; lv4=0; lv5=0; lv6=0; lv7=0; +      p_["lev_markup_number"] = +        DocStructMarkupHeading.h_sect_A; +      p_["obj_cite_number"] = lv0; +      break; +    case "2": +      lv = DocStructMarkupHeading.h_sect_C; +      lv2 = obj_cite_number; +      lv3=0; lv4=0; lv5=0; lv6=0; lv7=0; +      p_["lev_markup_number"] = +        DocStructMarkupHeading.h_sect_B; +      p_["obj_cite_number"] = lv1; +      break; +    case "3": +      lv = DocStructMarkupHeading.h_sect_D; +      lv3=obj_cite_number; +      lv4=0; lv5=0; lv6=0; lv7=0; +      p_["lev_markup_number"] = +        DocStructMarkupHeading.h_sect_C; +      p_["obj_cite_number"] = lv2; +      break; +    case "4": +      lv = DocStructMarkupHeading.h_text_1; +      lv4 = obj_cite_number; +      lv5=0; lv6=0; lv7=0; +      if (lv3 > State.off) { +        p_["lev_markup_number"] = +          DocStructMarkupHeading.h_sect_D; +        p_["obj_cite_number"] = lv3; +      } else if (lv2 > State.off) { +        p_["lev_markup_number"] = +          DocStructMarkupHeading.h_sect_C; +        p_["obj_cite_number"] = lv2; +      } else if (lv1 > State.off) { +        p_["lev_markup_number"] = +          DocStructMarkupHeading.h_sect_B; +        p_["obj_cite_number"] = lv1; +      } else { +        p_["lev_markup_number"] = +          DocStructMarkupHeading.h_sect_A; +        p_["obj_cite_number"] = lv0; +      } +      break; +    case "5": +      lv = DocStructMarkupHeading.h_text_2; +      lv5 = obj_cite_number; +      lv6=0; lv7=0; +      p_["lev_markup_number"] = +        DocStructMarkupHeading.h_text_1; +      p_["obj_cite_number"] = lv4; +      break; +    case "6": +      lv = DocStructMarkupHeading.h_text_3; +      lv6 = obj_cite_number; +      lv7=0; +      p_["lev_markup_number"] = +        DocStructMarkupHeading.h_text_2; +      p_["obj_cite_number"] = lv5; +      break; +    case "7": +      lv = DocStructMarkupHeading.h_text_4; +      lv7 = obj_cite_number; +      p_["lev_markup_number"] = +        DocStructMarkupHeading.h_text_3; +      p_["obj_cite_number"] = lv6; +      break; +    default: +      // if (lv7 > State.off) { +      //   p_["lev_markup_number"] = 7; p_["obj_cite_number"] = lv7; +      // } else if (lv6 > State.off) { +      //   p_["lev_markup_number"] = 6; p_["obj_cite_number"] = lv6; +      // } else if (lv5 > State.off) { +      //   p_["lev_markup_number"] = 5; p_["obj_cite_number"] = lv5; +      // } else { +      //   p_["lev_markup_number"] = 4; p_["obj_cite_number"] = lv4; +      // } +      break; +    } +    node=("{ " ~ +      "\"is\": \"" ~ is_ ~ "\"" ~ +      ", \"heading_pointer\": " ~ to!string(pointer_) ~ +      ", \"doc_object_pointer\": " ~ to!string(counter_) ~ +      ", \"obj_cite_number\": " ~ to!string(obj_cite_number_) ~ +      ",  \"lev_markup_number\": " ~ to!string(lev_markup_number) ~ +      ",  \"lev_collapsed_number\": " ~ to!string(lev_collapsed_number) ~ +      ", \"parent_obj_cite_number\": " ~ to!string(p_["obj_cite_number"]) ~ +      ", \"parent_lev_markup_number\": " ~ to!string(p_["lev_markup_number"]) ~ +      " }" +    ); +    debug(heading) { +      mixin ScreenTxtColors; +      if (match(lev_markup_number, rgx.levels_numbered_headings)) { +        writeln(scr_txt_marker["yellow"], to!string(node)); +      } +    } +    debug(node) { +      mixin ScreenTxtColors; +      if (match(lev_markup_number, rgx.levels_numbered_headings)) { +        writeln(scr_txt_marker["yellow"], to!string(node)); +      } else { +        writeln(scr_txt_marker["white"], to!string(node)); +      } +    } +    JSONValue j = parseJSON(node); +    assert(j["parent_lev_markup_number"].integer <= 7); +    assert(j["parent_obj_cite_number"].integer >= 0); +    if (match(lev_markup_number, rgx.levels_numbered_headings)) { +      assert(j["lev_markup_number"].integer <= 7); +      assert(j["obj_cite_number"].integer >= 0); +      if (j["parent_lev_markup_number"].integer > 0) { +        assert(j["parent_lev_markup_number"].integer < j["lev_markup_number"].integer); +        if (j["obj_cite_number"].integer != 0) { +          assert(j["parent_obj_cite_number"].integer < j["obj_cite_number"].integer); +        } +      } +      if (j["lev_markup_number"].integer == 0) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_sect_A); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_sect_B) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_sect_A); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_sect_C) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_sect_B); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_sect_D) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_sect_C); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_text_1) { +        assert(j["parent_lev_markup_number"].integer <= DocStructMarkupHeading.h_sect_D); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_text_2) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_text_1); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_text_3) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_text_2); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_text_4) { +        assert(j["parent_lev_markup_number"].integer == DocStructMarkupHeading.h_text_3); +      } else if  (j["lev_markup_number"].integer == DocStructMarkupHeading.h_text_5) { +        // writeln(j["parent_lev_markup_number"].integer); +        // assert(j["parent_lev_markup_number"].integer >= 4); +        // assert(j["parent_lev_markup_number"].integer <= 7); +      } +    } +    return node; +  } +  invariant() { +  } +}  #+END_SRC -******* header_metadata                                     :header:metadata: -#+name: abs_loop_body_not_block_obj_line_empty + +** function assertions                                           :assertions: +*** mixin template: assertions on markup document structure   :doc_structure: + +#+name: abs_functions_assertions  #+BEGIN_SRC d -} else if ((ft["header_metadata"] == 1) -&& (line_occur["header_metadata"] > 0)) { -/+ header_metadata (current line empty) +/ -  auto dochead_metadata_and_make = -    set_header.header_metadata_and_make_jsonstr(strip(object["obj"]), dochead_metadata, dochead_make); -  static assert(!isTypeTuple!(dochead_metadata_and_make)); -  dochead_metadata = dochead_metadata_and_make[0]; -  dochead_make = dochead_metadata_and_make[1]; -  line_occur["header_make"] = 0; -  line_occur["header_metadata"] = 0; -  line_occur["heading"] = 0; -  line_occur["para"]= 0; -  ft["header"] = 0; -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  ft["heading"] = 0; -  ft["para"] = 0; -  object.remove("obj"); -  object.remove("markup"); -  object.remove("is"); -  object.remove("attrib"); -  object.remove("bookindex"); -  processing.remove("verse"); -#+END_SRC -******* heading object                                       :heading:object: -#+name: abs_loop_body_not_block_obj_line_empty -#+BEGIN_SRC d -} else if ((ft["heading"] == 1) -&& (line_occur["heading"] > 0)) { -/+ heading object (current line empty) +/ -  ocn = ocn_emit(ft["ocn_status"]); -  object["bookindex"] = -    ("bookindex" in object) ? object["bookindex"] : ""; -  bookindex_unordered_hashes = -    bkidx_hash(object["bookindex"], ocn); -  object["is"] = "heading"; -  node = -    node_jstr_heading( -      object["lvn"], -      object["lcn"], -      ocn, -      counter, -      heading_pointer, -      object["is"] -    ); // heading -  object["markup"] = -    obj_im.obj_inline_markup(object["is"], object["obj"]); -  object["attrib"] = -    obj_att.obj_attributes(object["is"], object["obj"], node); -  heading_pointer++; -  contents ~= -    set_oa.contents_heading( -      ft["ocn_status"], -      object["markup"], -      object["attrib"], -      ocn, object["lev"], -      object["lvn"], -      object["lcn"] -    ); -  // track previous heading and make assertions -  debug(objectrelated1) { // check -    tell_l("blue", line); +auto assertions_doc_structure(string[string] an_object, int[string] lv) { +  if (lv["h3"] > State.off) { +    assert(lv["h0"] > State.off); +    assert(lv["h1"] > State.off); +    assert(lv["h2"] > State.off); +  } else if (lv["h2"] > State.off) { +    assert(lv["h0"] > State.off); +    assert(lv["h1"] > State.off); +    assert(lv["h3"] == State.off); +  } else if (lv["h1"] > State.off) { +    assert(lv["h0"] > State.off); +    assert(lv["h2"] == State.off); +    assert(lv["h3"] == State.off); +  } else if (lv["h0"] > State.off) { +    assert(lv["h1"] == State.off); +    assert(lv["h2"] == State.off); +    assert(lv["h3"] == State.off); +  } else { +    assert(lv["h0"] == State.off); +    assert(lv["h1"] == State.off); +    assert(lv["h2"] == State.off); +    assert(lv["h3"] == State.off);    } -  line_occur["header_make"] = 0; -  line_occur["header_metadata"] = 0; -  line_occur["heading"] = 0; -  line_occur["para"] = 0; -  ft["header"] = 0; -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  ft["heading"] = 0; -  ft["para"] = 0; -  object.remove("obj"); -  object.remove("markup"); -  object.remove("is"); -  object.remove("attrib"); -  object.remove("lev"); -  object.remove("lvn"); -  object.remove("bookindex"); -  processing.remove("verse"); -  counter++; +  if (lv["h7"] > State.off) { +    assert(lv["h4"] > State.off); +    assert(lv["h5"] > State.off); +    assert(lv["h6"] > State.off); +  } else if (lv["h6"] > State.off) { +    assert(lv["h4"] > State.off); +    assert(lv["h5"] > State.off); +    assert(lv["h7"] == State.off); +  } else if (lv["h5"] > State.off) { +    assert(lv["h4"] > State.off); +    assert(lv["h6"] == State.off); +    assert(lv["h7"] == State.off); +  } else if (lv["h4"] > State.off) { +    assert(lv["h5"] == State.off); +    assert(lv["h6"] == State.off); +    assert(lv["h7"] == State.off); +  } else { +    assert(lv["h4"] == State.off); +    assert(lv["h5"] == State.off); +    assert(lv["h6"] == State.off); +    assert(lv["h7"] == State.off); +  } +  if (lv["h0"] == State.off) { +    assert(lv["h1"] == State.off); +    assert(lv["h2"] == State.off); +    assert(lv["h3"] == State.off); +    assert(lv["h4"] == State.off); +    assert(lv["h5"] == State.off); +    assert(lv["h6"] == State.off); +    assert(lv["h7"] == State.off); +  } +  if (lv["h1"] == State.off) { +    assert(lv["h2"] == State.off); +    assert(lv["h3"] == State.off); +  } +  if (lv["h2"] == State.off) { +    assert(lv["h3"] == State.off); +  } +  if (lv["h3"] == State.off) { +  } +  if (lv["h4"] == State.off) { +    assert(lv["h5"] == State.off); +    assert(lv["h6"] == State.off); +    assert(lv["h7"] == State.off); +  } +  if (lv["h5"] == State.off) { +    assert(lv["h6"] == State.off); +    assert(lv["h7"] == State.off); +  } +  if (lv["h6"] == State.off) { +    assert(lv["h7"] == State.off); +  } +  if (lv["h7"] == State.off) { +  } +  switch (to!string(an_object["lev"])) { +  case "A": +    if (lv["h0"] == State.off) { +      assert(lv["h1"] == State.off); +      assert(lv["h2"] == State.off); +      assert(lv["h3"] == State.off); +      assert(lv["h4"] == State.off); +      assert(lv["h5"] == State.off); +      assert(lv["h6"] == State.off); +      assert(lv["h7"] == State.off); +    } else {  // (lv["h0"] > State.off) +      assert(lv["h0"] == State.off,"error should not enter level A a second time"); +    } +    break; +  case "B": +    if (lv["h1"] == State.off) { +      assert(lv["h0"] > State.off); +      assert(lv["h2"] == State.off); +      assert(lv["h3"] == State.off); +    } else {                 // (lv["h1"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h1"] > State.off);  // +    } +    break; +  case "C": +    if (lv["h2"] == State.off) { +      assert(lv["h0"] > State.off); +      assert(lv["h1"] > State.off); +      assert(lv["h3"] == State.off); +    } else {                 // (lv["h2"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h1"] > State.off); +      assert(lv["h2"] > State.off);  // +    } +    break; +  case "D": +    if (lv["h3"] == State.off) { +      assert(lv["h0"] > State.off); +      assert(lv["h1"] > State.off); +      assert(lv["h2"] > State.off); +    } else {                 // (lv["h3"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h1"] > State.off); +      assert(lv["h2"] > State.off); +      assert(lv["h3"] > State.off); +    } +    break; +  case "1": +    if (lv["h4"] == State.off) { +      assert(lv["h0"] > State.off); +    } else {                 // (lv["h4"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off);  // +    } +    break; +  case "2": +    if (lv["h5"] == State.off) { +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off); +    } else {                 // (lv["h5"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off); +      assert(lv["h5"] > State.off);  // +    } +    break; +  case "3": +    if (lv["h6"] == State.off) { +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off); +      assert(lv["h5"] > State.off); +    } else {                 // (lv["h6"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off); +      assert(lv["h5"] > State.off); +      assert(lv["h6"] > State.off);  // +    } +    break; +  case "4": +    if (lv["h7"] == State.off) { +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off); +      assert(lv["h5"] > State.off); +      assert(lv["h6"] > State.off); +    } else {                 // (lv["h7"] > State.off) +      assert(lv["h0"] > State.off); +      assert(lv["h4"] > State.off); +      assert(lv["h5"] > State.off); +      assert(lv["h6"] > State.off); +      assert(lv["h7"] > State.off);  // +    } +    break; +  default: +    break; +  } +}  #+END_SRC -******* paragraph object                                   :paragraph:object: -#+name: abs_loop_body_not_block_obj_line_empty + +*** mixin template: assertions on blocks                             :blocks: + +#+name: abs_functions_assertions  #+BEGIN_SRC d -} else if ((ft["para"] == 1) && (line_occur["para"] > 0)) { -/+ paragraph object (current line empty) +/ -  ocn = ocn_emit(ft["ocn_status"]); -  object["bookindex"] = -    ("bookindex" in object) ? object["bookindex"] : ""; -  bookindex_unordered_hashes = -    bkidx_hash(object["bookindex"], ocn); -  object["is"] = "para"; -  node = -    node_jstr( -      content_non_header, -      ocn, -      counter, -      heading_pointer-1, -      object["is"] -    ); -  object["markup"] = -    obj_im.obj_inline_markup(object["is"], object["obj"]); -  object["attrib"] = -    obj_att.obj_attributes(object["is"], object["obj"], node); -  contents ~= -    set_oa.contents_para( -      object["is"], -      object["markup"], -      object["attrib"], -      ocn, -      indent_first, -      indent_second, -      bullet -    ); -  line_occur["header_make"] = 0; -  line_occur["header_metadata"] = 0; -  line_occur["heading"] = 0; -  line_occur["para"] = 0; -  ft["header"] = 0; -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  ft["heading"] = 0; -  ft["para"] = 0; -  indent_first = "0"; -  indent_second = "0"; -  bullet = false; -  object.remove("obj"); -  object.remove("markup"); -  object.remove("is"); -  object.remove("attrib"); -  object.remove("bookindex"); -  processing.remove("verse"); -  counter++; -} else { +auto assertions_flag_types_block_status_none_or_closed(int[string] type) {    assert( -    line == null, -    "line variable should be empty, should not occur" -  ); -  // check what happens when paragraph separated by 2 newlines +    (type["code"] == TriState.off) +    || (type["code"] == TriState.closing), +    "code block status: off or closing"); +  assert( +    (type["poem"] == TriState.off) +    || (type["poem"] == TriState.closing), +    "poem status: off or closing"); +  assert( +    (type["table"] == TriState.off) +    || (type["table"] == TriState.closing), +    "table status: off or closing"); +  assert( +    (type["group"] == TriState.off) +    || (type["group"] == TriState.closing), +    "group block status: off or closing"); +  assert( +    (type["block"] == TriState.off) +    || (type["block"] == TriState.closing), +    "block status: off or closing");  }  #+END_SRC -*** close non code objects (regular text) -#+name: abs_loop_body_00_closed + +* object setter                                             :abstract:object: +set abstracted objects for downstream processing + +** object setter                                                        :set: + +*** comment                                                         :comment: + +#+name: ao_object_setter  #+BEGIN_SRC d -    } // close else for line empty -  } // close else for not the above -} // close after non code, other blocks or regular text +string[string] contents_comment(in string object) { +  string[string] object_set; +  object_set["use"]           = "comment"; +  object_set["of"]            = "comment"; +  object_set["is"]            = "comment"; +  object_set["obj"]           = object; +  // object_set["attrib"]     = attrib; +  return object_set; +}  #+END_SRC -*** regular text objects -#+name: abs_loop_body_01 + +*** heading                                                         :heading: + +#+name: ao_object_setter  #+BEGIN_SRC d -if (((contents[$-1]["is"] == "para") -|| (contents[$-1]["is"] == "heading")) -&& (counter-1 > previous_count)) { -  if (match(contents[$-1]["obj"], -  rgx.inline_notes_delimiter_al_regular_number_note)) { -    // endnotes/ footnotes for -    // doc objects other than paragraphs & headings -    // various forms of grouped text -    previous_count=contents.length -1; -    notesection.gather_notes_for_endnote_section( -      contents, -      contents.length -1 -    ); -  } +string[string] contents_heading( +  in int type, +  in string object, +  in string attrib, +  in int obj_cite_number, +  in string lev, +  in string lev_markup_number, +  in string lev_collapsed_number, +) { +  string[string] object_set; +  object_set["use"]                  = "content"; +  object_set["of"]                   = "para"; +  object_set["is"]                   = "heading"; +  object_set["type"]                 = to!string(type); +  // object_set["is"]                = type; // "heading" "heading_dummy" +  object_set["obj"]                  = object; +  object_set["obj_cite_number"]      = (obj_cite_number==0) ? "" : to!string(obj_cite_number); +  object_set["lev"]                  = to!string(lev); +  object_set["lev_markup_number"]    = to!string(lev_markup_number); +  object_set["lev_collapsed_number"] = to!string(lev_collapsed_number); +  object_set["attrib"]               = attrib; +  // object_set["children"]          = children; +  return object_set;  }  #+END_SRC -** post loop processing -#+name: abs_post +*** para                                                               :para: + +#+name: ao_object_setter  #+BEGIN_SRC d -debug(objectrelated2) { // check -    tell_l("blue", line); -} -/+ -  Backmatter: -  * endnotes -  * glossary -  * references / bibliography -  * book index -+/ -obj_im.obj_inline_markup("doc_end_reset", ""); -auto en_tuple = notesection.endnote_objects(ocn); -static assert(!isTypeTuple!(en_tuple)); -auto endnotes = en_tuple[0]; -ocn = en_tuple[1]; -debug(endnotes) { -  writefln( -    "%s %s", -    __LINE__, -    endnotes.length -  ); -  foreach (n; endnotes) { -    writeln(n); -  } +string[string] contents_para( +  in string is_a, +  in string object, +  in string attrib, +  in int obj_cite_number, +  in string[string] indent, +  in bool bullet +) { +  string[string] object_set; +  object_set["use"]              = "content"; +  object_set["of"]               = "para"; +  object_set["is"]               = is_a; +  // object_set["status"]        = status; +  object_set["obj"]              = object; +  object_set["obj_cite_number"]  = (obj_cite_number==0) ? "" : to!string(obj_cite_number); +  object_set["indent_first"]     = indent["first"]; +  object_set["indent_second"]    = indent["second"]; +  object_set["bullet"]           = to!string(bullet); +  object_set["attrib"]           = attrib; +  return object_set;  } -auto biblio_unsorted_incomplete = biblio_arr_json.dup; -auto biblio = Bibliography(); -auto biblio_ordered = biblio.bibliography(biblio_unsorted_incomplete, bib_arr_json); -auto bi = BookIndexReportSection(); -auto bi_tuple = -  bi.bookindex_build_section(bookindex_unordered_hashes, ocn); -static assert(!isTypeTuple!(bi_tuple)); -auto bookindex = bi_tuple[0]; -auto document = contents ~ endnotes ~ bookindex; -ocn = bi_tuple[1]; -debug(bookindex) {                         // bookindex -  foreach (bi_entry; bookindex) { -    writeln(bi_entry["obj"]); -  } +#+END_SRC + +*** block                                                             :block: + +#+name: ao_object_setter +#+BEGIN_SRC d +string[string] contents_block( +  in string type, +  in string object, +  in string attrib, +  in int obj_cite_number +) { +  string[string] object_set; +  object_set["use"]             = "content"; +  object_set["of"]              = "block"; +  object_set["is"]              = type; +  object_set["obj"]             = object; +  object_set["obj_cite_number"] = (obj_cite_number==0) ? "" : to!string(obj_cite_number); +  object_set["attrib"]          = attrib; +  return object_set;  } -debug(heading) {                         // heading -  string spc; -  foreach (o; document) { -    if (o["is"] == "heading") { -      switch (o["lvn"]) { -      case "0": -        spc=""; -        break; -      case "1": -        spc="  "; -        break; -      case "2": -        spc="    "; -        break; -      case "3": -        spc="      "; -        break; -      case "4": -        spc="        "; -        break; -      case "5": -        spc="          "; -        break; -      case "6": -        spc="            "; -        break; -      case "7": -        spc="              "; -        break; -      case "8": -        spc="                "; -        break; -      default: -        spc=""; -        break; -      } -      writefln( -        "%s*  $s\n            %s", -        spc, -        strip(o["obj"]), -        o["attrib"] -      ); -      // tell_l("yellow", spc, strip(o["obj"])); -    } -  } +#+END_SRC + +*** block obj_cite_number string                                      :block: + +#+name: ao_object_setter +#+BEGIN_SRC d +string[string] contents_block_obj_cite_number_string( +  in string type, +  in string object, +  in string obj_cite_number, +  in string node +) { +  string[string] object_set; +  object_set["use"]             = "content"; +  object_set["of"]              = "block"; +  object_set["is"]              = type; +  object_set["obj"]             = object; +  object_set["obj_cite_number"] = obj_cite_number; +  object_set["node"]            = node; +  // object_set["attrib"]       = ""; +  return object_set;  } -destroy(contents); -destroy(endnotes); -destroy(bookindex); -auto t = -  tuple( -    document, -    dochead_make, -    dochead_metadata, -    bookindex_unordered_hashes, -    biblio_ordered -  ); -return t;  #+END_SRC -* tangles                                                            :tangle: -** code structure:                                :ao_abstract_doc_source.d: -#+name: tangle_ao_abstract_doc_source +* tangles (code structure)                                   :tangle:io:file: +** abstract doc source:                            :ao_abstract_doc_source.d: +  #+BEGIN_SRC d :tangle ../lib/sdp/ao_abstract_doc_source.d  /+    document abstraction    ao_abstract_doc_source.d  +/ -mixin template SiSUdocAbstraction() { +template SiSUdocAbstraction() {    private:    struct Abstraction { + +    /+ ↓ abstraction imports +/ +    <<abs_imports>> + +    /+ ↓ abstraction mixins +/ +    <<abs_mixins>> + +    /+ ↓ abstraction struct init +/ +    <<abs_init_struct>> +      /+ ↓ abstract marked up document +/      auto abstract_doc_source(char[][] markup_sourcefile_content) { -      <<abs_init>> + +      /+ ↓ abstraction init +/ +      <<abs_init_rest>> +      /+ abstraction init ↑ +/ +        /+ ↓ loop markup document/text line by line +/ +      srcDocLoop:        foreach (line; markup_sourcefile_content) { +          /+ ↓ markup document/text line by line +/ -        <<abs_loop_body_00>> -          <<abs_loop_body_non_code_obj>> -            <<abs_loop_body_open_block_obj>> -            <<abs_loop_body_not_block_obj>> -              <<abs_loop_body_not_block_obj_line_empty>> -        <<abs_loop_body_00_closed>> -        <<abs_loop_body_01>> +        <<abs_in_loop_body_00>> +          <<abs_in_loop_body_non_code_obj>> +            <<abs_in_loop_body_open_block_obj>> +            <<abs_in_loop_body_not_block_obj>> +              <<abs_in_loop_body_not_block_obj_line_empty>> +        <<abs_in_loop_body_00_closed>> +        <<abs_in_loop_body_01>>        } /+ ← closed: loop markup document/text line by line +/ +        /+ ↓ post loop markup document/text +/        <<abs_post>> -    } +      /+ post loop markup document/text ↑ +/ + +    } /+ ← closed: abstract doc source +/ + +    /+ ↓ abstraction functions +/ +    <<abs_functions>> +    /+ abstraction functions ↑ +/ + +    /+ ↓ abstraction function emitters +/ +    <<ao_emitters>> +    /+ abstraction functions emitters ↑ +/ + +    /+ ↓ abstraction functions assertions +/ +    <<abs_functions_assertions>> +    /+ abstraction functions assertions ↑ +/ + +  } /+ ← closed: struct Abstraction +/ + +} /+ ← closed: template SiSUdocAbstraction +/ +#+END_SRC +** ao_object_setter:                                     :ao_object_setter.d: + +#+BEGIN_SRC d :tangle ../lib/sdp/ao_object_setter.d +/+ +  object setter +  ao_object_setter.d ++/ +template ObjectSetter() { +  struct ObjectAbstractSet { +    import std.conv : to; +    <<ao_object_setter>>    }  }  #+END_SRC diff --git a/org/ao_assertions.org b/org/ao_assertions.org deleted file mode 100644 index 948bb5e..0000000 --- a/org/ao_assertions.org +++ /dev/null @@ -1,252 +0,0 @@ -#+TITLE: sdp assertions -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* assertions                                                   :mixin:assert: -[[./sdp.org][sdp]] [[./][org/]] -** mixin template: assertions on markup document structure    :doc_structure: -#+name: ao_assertions -#+BEGIN_SRC d -mixin template AssertionsOnMarkupDocumentStructure() { -  auto assertions_doc_structure(string[string] object, uint[string] lv) { -    if (lv["h3"] > 0) { -      assert(lv["h0"] > 0); -      assert(lv["h1"] > 0); -      assert(lv["h2"] > 0); -      assert(lv["h3"] > 0); -    } else if (lv["h2"] > 0) { -      assert(lv["h0"] > 0); -      assert(lv["h1"] > 0); -      assert(lv["h2"] > 0); -      assert(lv["h3"] == 0); -    } else if (lv["h1"] > 0) { -      assert(lv["h0"] > 0); -      assert(lv["h1"] > 0); -      assert(lv["h2"] == 0); -      assert(lv["h3"] == 0); -    } else if (lv["h0"] > 0) { -      assert(lv["h0"] > 0); -      assert(lv["h1"] == 0); -      assert(lv["h2"] == 0); -      assert(lv["h3"] == 0); -    } else { -      assert(lv["h0"] == 0); -      assert(lv["h1"] == 0); -      assert(lv["h2"] == 0); -      assert(lv["h3"] == 0); -    } -    if (lv["h7"] > 0) { -      assert(lv["h4"] > 0); -      assert(lv["h5"] > 0); -      assert(lv["h6"] > 0); -      assert(lv["h7"] > 0); -    } else if (lv["h6"] > 0) { -      assert(lv["h4"] > 0); -      assert(lv["h5"] > 0); -      assert(lv["h6"] > 0); -      assert(lv["h7"] == 0); -    } else if (lv["h5"] > 0) { -      assert(lv["h4"] > 0); -      assert(lv["h5"] > 0); -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } else if (lv["h4"] > 0) { -      assert(lv["h4"] > 0); -      assert(lv["h5"] == 0); -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } else { -      assert(lv["h4"] == 0); -      assert(lv["h5"] == 0); -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } -    if (lv["h0"] == 0) { -      assert(lv["h0"] == 0); -      assert(lv["h1"] == 0); -      assert(lv["h2"] == 0); -      assert(lv["h3"] == 0); -      assert(lv["h4"] == 0); -      assert(lv["h5"] == 0); -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } -    if (lv["h1"] == 0) { -      assert(lv["h1"] == 0); -      assert(lv["h2"] == 0); -      assert(lv["h3"] == 0); -    } -    if (lv["h2"] == 0) { -      assert(lv["h2"] == 0); -      assert(lv["h3"] == 0); -    } -    if (lv["h3"] == 0) { -      assert(lv["h3"] == 0); -    } -    if (lv["h4"] == 0) { -      assert(lv["h4"] == 0); -      assert(lv["h5"] == 0); -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } -    if (lv["h5"] == 0) { -      assert(lv["h5"] == 0); -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } -    if (lv["h6"] == 0) { -      assert(lv["h6"] == 0); -      assert(lv["h7"] == 0); -    } -    if (lv["h6"] == 0) { -      assert(lv["h7"] == 0); -    } -    switch (to!string(object["lev"])) { -    case "A": -      if (lv["h0"]==0) { -        assert(lv["h0"] == 0); -        assert(lv["h1"] == 0); -        assert(lv["h2"] == 0); -        assert(lv["h3"] == 0); -        assert(lv["h4"] == 0); -        assert(lv["h5"] == 0); -        assert(lv["h6"] == 0); -        assert(lv["h7"] == 0); -      } else {  // (lv["h0"] >0) -        assert(lv["h0"] == 0,"error should not enter level A a second time"); -      } -      break; -    case "B": -      if (lv["h1"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h1"] == 0); // -        assert(lv["h2"] == 0); -        assert(lv["h3"] == 0); -      } else {                 // (lv["h1"] >0) -        assert(lv["h0"] > 0); -        assert(lv["h1"] > 0);  // -      } -      break; -    case "C": -      if (lv["h2"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h1"] > 0); -        assert(lv["h2"] == 0); // -        assert(lv["h3"] == 0); -      } else {                 // (lv["h2"] > 0) -        assert(lv["h0"] > 0); -        assert(lv["h1"] > 0); -        assert(lv["h2"] > 0);  // -      } -      break; -    case "D": -      if (lv["h3"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h1"] > 0); -        assert(lv["h2"] > 0); -        assert(lv["h3"] == 0); // -      } else {                 // (lv["h3"] >0) -        assert(lv["h0"] > 0); -        assert(lv["h1"] > 0); -        assert(lv["h2"] > 0); -        assert(lv["h3"] > 0); -      } -      break; -    case "1": -      if (lv["h4"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h4"] == 0); // -      } else {                 // (lv["h4"] >0) -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0);  // -      } -      break; -    case "2": -      if (lv["h5"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0); -        assert(lv["h5"] == 0); // -      } else {                 // (lv["h5"] >0) -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0); -        assert(lv["h5"] > 0);  // -      } -      break; -    case "3": -      if (lv["h6"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0); -        assert(lv["h5"] > 0); -        assert(lv["h6"] == 0); // -      } else {                 // (lv["h6"] >0) -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0); -        assert(lv["h5"] > 0); -        assert(lv["h6"] > 0);  // -      } -      break; -    case "4": -      if (lv["h7"]==0) { -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0); -        assert(lv["h5"] > 0); -        assert(lv["h6"] > 0); -        assert(lv["h7"] == 0); // -      } else {                 // (lv["h7"] >0) -        assert(lv["h0"] > 0); -        assert(lv["h4"] > 0); -        assert(lv["h5"] > 0); -        assert(lv["h6"] > 0); -        assert(lv["h7"] > 0);  // -      } -      break; -    default: -      break; -    } -  } -} -#+END_SRC -** mixin template: assertions on blocks                              :blocks: -#+name: ao_assertions -#+BEGIN_SRC d -mixin template AssertionsOnBlocks() { -  auto assertions_flag_types_block_status_none_or_closed(int[string] flag_type) { -    assert( -      (flag_type["code"] == 0) || (flag_type["code"] == 2), -      "code block status: none or closed"); -    assert( -      (flag_type["poem"] == 0) || (flag_type["poem"] == 2), -      "poem status: none or closed"); -    assert( -      (flag_type["table"] == 0) || (flag_type["table"] == 2), -      "table status: none or closed"); -    assert( -      (flag_type["group"] == 0) || (flag_type["group"] == 2), -      "group block status: none or closed"); -    assert( -      (flag_type["block"] == 0) || (flag_type["block"] == 2), -      "block status: none or closed"); -  } -} -#+END_SRC - -* tangle                                                             :tangle: -** code structure:                                           :ao_assertions.d: -#+name: tangle_ao_assertions -#+BEGIN_SRC d :tangle ../lib/sdp/ao_assertions.d -/+ -  assertions -  ao_assertions.d -+/ -<<ao_assertions>> -#+END_SRC diff --git a/org/ao_defaults.org b/org/ao_defaults.org index fc176d0..ed01540 100644 --- a/org/ao_defaults.org +++ b/org/ao_defaults.org @@ -12,7 +12,9 @@  #+FILETAGS: :sdp:rel:ao:  #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) -* defaults                                                :template:defaults: +[[./sdp.org][sdp]]  [[./][org/]] + +* default templates                                       :template:defaults:  [[./sdp.org][sdp]] [[./][org/]]  ** template: header                                                  :header:  #+name: ao_defaults_templates @@ -186,37 +188,40 @@ template SiSUheader() {  #+BEGIN_SRC d  /+ regex flags +/  template SiSUrgxInitFlags() { -  int[string] flag_type = [ -    "make_headings"        : 0, -    "header_make"          : 0, -    "header_metadata"      : 0, -    "heading"              : 0, -    "heading_biblio"       : 0, -    "para"                 : 0, -    "blocks"               : 0, // 0..2 generic -    "code"                 : 0, // 0..2 -    "poem"                 : 0, // 0..2 -    "table"                : 0, // 0..2 -    "group"                : 0, // 0..2 -    "block"                : 0, // 0..2 -    "quote"                : 0, // 0..2 -    "verse_new"            : 0, -    "curly_code"           : 0, -    "curly_poem"           : 0, -    "curly_table"          : 0, -    "curly_group"          : 0, -    "curly_block"          : 0, -    "curly_quote"          : 0, -    "tic_code"             : 0, -    "tic_poem"             : 0, -    "tic_table"            : 0, -    "tic_group"            : 0, -    "tic_block"            : 0, -    "tic_quote"            : 0, -    "ocn_status"           : 0, // 0 ocn; 1 no ocn; 2 no ocn & dummy headings -    "ocn_status_multi_obj" : 0, // 0 ocn; 1 no ocn; 2 no ocn & dummy headings -    "book_index"           : 0, -  ]; +  int[string] flags_type_init() { +    int[string] flags_type_init = [ +      "make_headings"        : 0, +      "header_make"          : 0, +      "header_metadata"      : 0, +      "heading"              : 0, +      "heading_biblio"       : 0, +      "para"                 : 0, +      "blocks"               : 0, // 0..2 generic +      "code"                 : 0, // 0..2 +      "poem"                 : 0, // 0..2 +      "table"                : 0, // 0..2 +      "group"                : 0, // 0..2 +      "block"                : 0, // 0..2 +      "quote"                : 0, // 0..2 +      "verse_new"            : 0, +      "curly_code"           : 0, +      "curly_poem"           : 0, +      "curly_table"          : 0, +      "curly_group"          : 0, +      "curly_block"          : 0, +      "curly_quote"          : 0, +      "tic_code"             : 0, +      "tic_poem"             : 0, +      "tic_table"            : 0, +      "tic_group"            : 0, +      "tic_block"            : 0, +      "tic_quote"            : 0, +      "obj_cite_number_status"           : 0, // 0 obj_cite_number; 1 no obj_cite_number; 2 no obj_cite_number & dummy headings +      "obj_cite_number_status_multi_obj" : 0, // 0 obj_cite_number; 1 no obj_cite_number; 2 no obj_cite_number & dummy headings +      "book_index"           : 0, +    ]; +    return flags_type_init; +  }  }  #+END_SRC  ** template: bibliography                                            :biblio: @@ -252,35 +257,19 @@ template SiSUbiblio() {      "short_name"                       : "",      "id"                               : ""    }`; // is: book, article, magazine, newspaper, blog, other -  auto biblio_tag_map = [ -    "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" -  ]; // is: book, article, magazine, newspaper, blog, other  }  #+END_SRC  ** template: internal markup                                         :markup:  #+name: ao_defaults_templates  #+BEGIN_SRC d  template InternalMarkup() { -  struct InternalMarkup { +  struct InlineMarkup {      auto en_a_o = "【"; auto en_a_c = "】";      auto en_b_o = "〖"; auto en_b_c = "〗";      // auto segname_prefix_auto_num_extract = "c";      // auto segname_prefix_auto_num_provide = "s";      // auto segname_prefix_auto_num_other = "x"; -    // auto ocn_id_char = "";                                              //'o'; now as before; remove for html5 +    // auto obj_cite_number_id_char = "";                                              //'o'; now as before; remove for html5      // auto note = "note_";      // auto note_ref = "noteref_";      // auto note_astx = "note_astx_"; @@ -349,8 +338,334 @@ template InternalMarkup() {  }  #+END_SRC -* tangles                                                            :tangle: -** code structure:                                               :ao_defaults.d: +* regex ctRegex                                                       :regex: +[[./sdp.org][sdp]]  [[./][org/]] +** misc                                                                :misc: +#+name: ao_rgx +#+BEGIN_SRC d +/+ misc +/ +static flag_action               = ctRegex!(`^(--[a-z][a-z0-9-]+)$`); +static flag_action_str           = ctRegex!(` (--[a-z][a-z0-9-]+)`); +static src_pth                   = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ss[tm])$`); +static src_fn                    = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ss[tm])$`); +static src_fn_master             = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ssm)$`); +static src_fn_find_inserts       = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ss[im])$`); +// static ssm_fn                    = ctRegex!(`^[a-zA-Z0-9._-]+[.]ssm$`); +static line_delimiter            = ctRegex!("\n"); +// static arr_delimiter             = ctRegex!(`\s*[;]\s*`); +static within_quotes             = ctRegex!(`"(.+?)"`); +static make_heading_delimiter    = ctRegex!(`[;][ ]*`); +static arr_delimiter             = ctRegex!(`[ ]*[;][ ]*`); +static name_delimiter            = ctRegex!(`^([^,]+)[ ]*,[ ]+(.+?)$`); +// static name_delimiter            = ctRegex!(`^(.+?)[ ]*,[ ]*(.+?)$`); +static book_index_go             = ctRegex!("([0-9]+)(?:-[0-9]+)?"); +static trailing_comma            = ctRegex!(",[ ]*$"); +static trailing_linebreak        = ctRegex!(",[ ]{1,2}\\\\\\\\\n[ ]{4}$","m"); +static line_delimiter_ws_strip   = ctRegex!("[ ]*\n[ ]*"); +static line_delimiter_only       = ctRegex!("^\n"); +static para_delimiter            = ctRegex!("\n[ ]*\n+"); +static levels_markup             = ctRegex!(`^[A-D1-4]$`); +static levels_numbered           = ctRegex!(`^[0-9]$`); +static levels_numbered_headings  = ctRegex!(`^[0-7]$`); +#+END_SRC +** markup insert file                                           :insert:file: +#+name: ao_rgx +#+BEGIN_SRC d +/+ insert markup file +/ +// static insert_src_fn_ssi_or_sst  = ctRegex!(`^<<\s*([a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[ti])$`); +static insert_src_fn_ssi_or_sst  = ctRegex!(`^<<\s*(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[ti])$`); +// static insert_ssi_or_sst_fn      = ctRegex!(`^<<\s*[a-zA-Z0-9._-]+[.]ss[ti]`); +#+END_SRC +** comments                                                         :comment: +#+name: ao_rgx +#+BEGIN_SRC d +/+ comments +/ +static comment                   = ctRegex!(`^%+ `); +#+END_SRC +** header                                                            :header: +#+name: ao_rgx +#+BEGIN_SRC d +/+ header +/ +static header                    = ctRegex!(`^@([a-z_]+):(?:\s|$)`); +static header_make               = ctRegex!(`^@(make):(?:\s|$)`); +static header_metadata           = ctRegex!(`^@([a-z_]+):(?:\s|$)`); +static header_sub                = ctRegex!(`^[ ]+:([a-z_]+):\s`); +static head_main                 = ctRegex!(`^@([a-z_]+):\s*(.*)`, "m"); +static head_sub                  = ctRegex!(`^[ ]*:([a-z_]+):\s+(.+)`, "m"); +#+END_SRC +** header & paragraph operators                          :paragraph:operator: +#+name: ao_rgx +#+BEGIN_SRC d +/+ heading & paragraph operators +/ +static heading            = ctRegex!(`^:?([A-D1-4])[~]([a-z0-9_.-]*[?]?) `); +static heading_marker     = ctRegex!(`^:?([A-D1-4])[~]`); +static heading_title      = ctRegex!(`^:?[A-D1-4][~][a-z0-9_.-]*[?]?\s+(.+?)$`); +static heading_all        = ctRegex!(`^:?([A-D1-4])[~]([a-z0-9_.-]*[?]?)\s+(.+?)$`); // test, particularly [2] name/hashtag which may or may not be, does this affect title [3] +static heading_biblio     = ctRegex!(`^:?(1)[~][!](biblio(?:graphy)?|references?)`); +static heading_glossary   = ctRegex!(`^:?(1)[~][!](glossary)`); +static para_bullet        = ctRegex!(`^_[*] `); +static para_bullet_indent = ctRegex!(`^_([1-9])[*] `); +static para_indent        = ctRegex!(`^_([1-9]) `); +static para_indent_hang   = ctRegex!(`^_([0-9])_([0-9]) `); +static para_attribs       = ctRegex!(`^_(([0-9])(_([0-9]))?|_([1-9])?[*]) `); +#+END_SRC + +** blocked markup                                                 :block:tic: +#+name: ao_rgx +#+BEGIN_SRC d +/+ blocked markup +/ +static block_open                = ctRegex!("^((code|poem|group|block|quote|table)[{].*?$)|^`{3} (code|poem|group|block|quote|table)"); +// static block_open_less_code      = ctRegex!("^(((poem|group|block|quote|table)[{].*?$)|`{3} (poem|group|block|quote|table))"); +static block_poem_open                = ctRegex!("^((poem[{].*?$)|`{3} poem)"); +#+END_SRC +** blocked markup tics                                            :block:tic: +#+name: ao_rgx +#+BEGIN_SRC d +/+ blocked markup tics +/ +static block_tic_open            = ctRegex!("^`{3} (code|poem|group|block|quote|table)"); +// static block_tic_open_less_code  = ctRegex!("^`{3} (poem|group|block|quote|table)"); +static block_tic_code_open       = ctRegex!("^`{3} (code)"); +static block_tic_poem_open       = ctRegex!("^`{3} (poem)"); +static block_tic_group_open      = ctRegex!("^`{3} (group)"); +static block_tic_block_open      = ctRegex!("^`{3} (block)"); +static block_tic_quote_open      = ctRegex!("^`{3} (quote)"); +static block_tic_table_open      = ctRegex!("^`{3} (table)"); +static block_tic_close           = ctRegex!("^(`{3})$","m"); +#+END_SRC +** blocked markup curly                                         :block:curly: +#+name: ao_rgx +#+BEGIN_SRC d +/+ blocked markup curly +/ +static block_curly_open          = ctRegex!(`^((code|poem|group|block|quote|table)[{].*?$)`); +// static block_curly_open_less_code = ctRegex!(`^((poem|group|block|quote|table)[{].*?$)`); +static block_curly_code_open     = ctRegex!(`^(code[{].*?$)`); +static block_curly_code_close    = ctRegex!(`^([}]code)`); +static block_curly_poem_open     = ctRegex!(`^(poem[{].*?$)`); +static block_curly_poem_close    = ctRegex!(`^([}]poem)`); +static block_curly_group_open    = ctRegex!(`^(group[{].*?$)`); +static block_curly_group_close   = ctRegex!(`^([}]group)`); +static block_curly_block_open    = ctRegex!(`^(block[{].*?$)`); +static block_curly_block_close   = ctRegex!(`^([}]block)`); +static block_curly_quote_open    = ctRegex!(`^(quote[{].*?$)`); +static block_curly_quote_close   = ctRegex!(`^([}]quote)`); +static block_curly_table_open    = ctRegex!(`^(table[{].*?$)`); +static block_curly_table_close   = ctRegex!(`^([}]table)`); +#+END_SRC +** inline markup font face mod                             :inline:font:face: +#+name: ao_rgx +#+BEGIN_SRC d +/+ inline markup font face mod +/ +static inline_emphasis           = ctRegex!(`\*\{(?P<text>.+?)\}\*`); +static inline_bold               = ctRegex!(`!\{(?P<text>.+?)\}!`); +static inline_italics            = ctRegex!(`/\{(?P<text>.+?)\}/`); +static inline_superscript        = ctRegex!(`\^\{(?P<text>.+?)\}\^`); +static inline_subscript          = ctRegex!(`,\{(?P<text>.+?)\},`); +static inline_strike             = ctRegex!(`-\{(?P<text>.+?)\}-`); +static inline_insert             = ctRegex!(`\+\{(?P<text>.+?)\}\+`); +static inline_mono               = ctRegex!(`#\{(?P<text>.+?)\}#`); +#+END_SRC +** inline markup footnotes                                  :inline:footnote: +#+name: ao_rgx +#+BEGIN_SRC d +/+ inline markup footnotes +/ +static true_dollar                           = ctRegex!(`\$`, "gm"); +static inline_notes_al                       = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg"); +static inline_notes_al_gen                   = ctRegex!(`【.+?】`, "m"); +static inline_notes_curly_gen                = ctRegex!(`~\{.+?\}~`, "m"); +static inline_notes_curly                    = ctRegex!(`~\{\s*(.+?)\}~`, "mg"); +// static inline_notes_curly                    = ctRegex!(`~\{(?:[*+]\s+|\s*)(.+?)\}~`, "mg"); +static inline_al_delimiter_open_regular             = ctRegex!(`【`, "m"); +static inline_al_delimiter_close_regular            = ctRegex!(`】`, "m"); +static inline_al_delimiter_open_and_close_regular   = ctRegex!(`【|】`, "m"); +static inline_notes_delimiter_al_regular            = ctRegex!(`【(.+?)】`, "m"); +static inline_notes_delimiter_al_regular_number_note = ctRegex!(`【(\d+)\s+(.+?)】`, "m"); + +static inline_al_delimiter_open_asterisk         = ctRegex!(`【\*`, "m"); +static inline_al_delimiter_open_plus             = ctRegex!(`【\+`, "m"); + +static inline_curly_delimiter_open_regular             = ctRegex!(`~\{\s*`, "m"); +static inline_curly_delimiter_close_regular            = ctRegex!(`\s*\}~`, "m"); +static inline_curly_delimiter_open_and_close_regular   = ctRegex!(`~\{\s*|\s*\}~`, "m"); +static inline_notes_delimiter_curly_regular            = ctRegex!(`~\{[ ]*(.+?)\}~`, "m"); +// static inline_notes_curly_regular            = ctRegex!(`(?:[~][{][ ]*)(.+?)(?:[}][~])`, "m"); +// static inline_notes_curly_regular            = ctRegex!(`~\{\s*(.+?)\}~`, "m"); +// static inline_notes_curly                    = ctRegex!(`~\{(?:[*+]\s+|\s*)(.+?)\}~`, "mg"); +static inline_notes_curly_sp                 = ctRegex!(`~\{[*+]+\s+(.+?)\}~`, "m"); +static inline_notes_curly_sp_asterisk        = ctRegex!(`~\{[*]+\s+(.+?)\}~`, "m"); +static inline_notes_curly_sp_plus            = ctRegex!(`~\{[+]+\s+(.+?)\}~`, "m"); +// static inline_text_and_note_curly            = ctRegex!(`(.+?)~\{(?:[*+]\s+|\s*)(.+?)\}~`, "mg"); +static inline_text_and_note_al               = ctRegex!(`(?P<text>.+?)【(?:[*+ ]*)(?P<note>.+?)】`, "mg"); +static inline_text_and_note_curly            = ctRegex!(`(?P<text>.+?)(?:(?:[~])[{][*+ ]*)(?P<note>.+?)(?:[}][~])`, "mg"); +// static inline_text_and_note_curly            = ctRegex!(`(?P<text>.+?)~\{(?:[*+]\s+|\s*)(?P<note>.+?)\}~`, "mg"); +// static inline_text_and_note_curly_sp         = ctRegex!(`(.+?)~\{[*+]+\s+(.+?)\}~`, "mg"); +// static inline_text_and_note_curly_sp_asterisk = ctRegex!(`(.+?)~\{[*]+\s+(.+?)\}~`, "mg"); +// static inline_text_and_note_curly_sp_plus    = ctRegex!(`(.+?)~\{[+]+\s+(.+?)\}~`, "mg"); +static inline_note_curly_delimiters          = ctRegex!(`(~\{[*+]?\s*)(.+?)(\}~)`, "mg"); +static inline_notes_square                   = ctRegex!(`~\[\s*(.+?)\]~`, "mg"); +static inline_text_and_note_square_sp        = ctRegex!(`(.+?)~\[[*+]+\s+(.+?)\]~`, "mg"); +static inline_text_and_note_square           = ctRegex!(`(.+?)~\[\s*(.+?)\]~`, "mg"); +static inline_note_square_delimiters         = ctRegex!(`(~\[\s*)(.+?)(\]~)`, "mg"); +#+END_SRC +** inline markup book index                                :inline:bookindex: +#+name: ao_rgx +#+BEGIN_SRC d +/+ inline markup book index +/ +static book_index                = ctRegex!(`^=\{\s*(.+?)\}$`, "m"); +static book_index_open           = ctRegex!(`^=\{\s*([^}]+?)$`); +static book_index_close          = ctRegex!(`^(.*?)\}$`, "m"); // strip +#+END_SRC +** no obj_cite_number object                                 :ocn:off:object: +#+name: ao_rgx +#+BEGIN_SRC d +/+ no obj_cite_number object +/ +static obj_cite_number_off                   = ctRegex!(`~#$`, "m"); +static obj_cite_number_off_dh                = ctRegex!(`-#$`, "m"); +static obj_cite_number_off_all               = ctRegex!(`[~-]#$`, "m"); +#+END_SRC +** no obj_cite_number block                                   :ocn:off:block: +#+name: ao_rgx +#+BEGIN_SRC d +/+ no obj_cite_number block +/ +static obj_cite_number_off_block             = ctRegex!(`^--~#$`); +static obj_cite_number_off_block_dh          = ctRegex!(`^---#$`); +static obj_cite_number_off_block_close       = ctRegex!(`^--\+#$`); +// static auto_obj_cite_number_ignore           = ctRegex!(`^[+~*$-]{3,}$`); // reminder +static obj_cite_number_block_marks           = ctRegex!(`^--[+~-]#$`); +#+END_SRC +** ignore outside code blocks                                    :block:code: +#+name: ao_rgx +#+BEGIN_SRC d +/+ ignore outside code blocks +/ +static regular_parse_skip        = ctRegex!(`^(--[+~-]#|-[\\]{2}-|=[.\\]{2}=)$`); // not structural info +#+END_SRC +** line & page breaks                                                 :break: +#+name: ao_rgx +#+BEGIN_SRC d +/+ line & page breaks +/ +static break_line_within_object  = ctRegex!(`[\\]{2}( |$)`); +// static break_line_break_within_object  = ctRegex!(`( |^)[\\]{2}( |$)`); +static break_page                = ctRegex!(`^-[\\]{2}-$`); +static break_page_new            = ctRegex!(`^=[\\]{2}=$`); +static break_page_line_across    = ctRegex!(`^=[.]{2}=$`); +static break_string              = ctRegex!(`』`); +// ancestry, parent +static parent                    = ctRegex!(`([0-7]):([0-9]+)`); +#+END_SRC +** json                                                                :json: +#+name: ao_rgx +#+BEGIN_SRC d +/+ json +/ +static tailing_comma             = ctRegex!(`,$`, "m"); +#+END_SRC +** head                                                              :header: +#+name: ao_rgx +#+BEGIN_SRC d +/+ head +/ +static main_headers              = ctRegex!(`^(?:creator|title|rights|date|original|classify|identifier|notes|publisher|make|links)$`, "m"); +static subhead_creator           = ctRegex!(`^(?:author|translator|illustrator)$`, "m"); +static subhead_title             = ctRegex!(`^(?:main|sub(?:title)?|full|language|edition|note)$`, "m"); +static subhead_rights            = ctRegex!(`^(?:copyright|illustrations|license|cover)$`, "m"); +static subhead_date              = ctRegex!(`^(?:published|created|issued|available|valid|modified|added_to_site)$`, "m"); +static subhead_original          = ctRegex!(`^(?:title|language|source)$`, "m"); +static subhead_classify          = ctRegex!(`^(?:topic_register|subject|keywords|loc|dewey)$`, "m"); +static subhead_identifier        = ctRegex!(`^(?:oclc|pg|isbn)$`, "m"); +static subhead_notes             = ctRegex!(`^(?:abstract|description)$`, "m"); +static subhead_publisher         = ctRegex!(`^(?:name)$`, "m"); +static subhead_make              = ctRegex!(`^(?:cover_image|home_button_image|home_button_text|footer|headings|num_top|breaks|substitute|bold|italics|emphasis|texpdf_font|css)$`, "m"); +#+END_SRC +** biblio tags                                                  :biblio:tags: +#+name: ao_rgx +#+BEGIN_SRC d +/+ biblio tags +/ +static biblio_tags               = ctRegex!(`^(is|au|author_raw|author|author_arr|editor_raw|ed|editor_arr|ti|title|subtitle|fulltitle|lng|language|trans|src|jo|journal|in|vol|volume|edn|edition|yr|year|pl|place|pb|pub|publisher|url|pg|pages|note|short_name|id):\s+(.+)`); +static biblio_abbreviations      = ctRegex!(`^(au|ed|ti|lng|jo|vol|edn|yr|pl|pb|pub|pg|pgs|sn)$`); +// static biblio_tags               = ctRegex!(`^(is|author_raw|author|author_arr|editor_raw|editor_arr|title|subtitle|fulltitle|language|trans|src|journal|in|volume|edition|year|place|publisher|url|pages|note|short_name|id):\s+(.+)`); +#+END_SRC +** bookindex split                                          :bookindex:split: +#+name: ao_rgx +#+BEGIN_SRC d +/+ bookindex split +/ +static bi_main_terms_split       = ctRegex!(`\s*;\s*`); +static bi_main_term_plus_rest_split = ctRegex!(`\s*:\s*`); +static bi_sub_terms_plus_obj_cite_number_offset_split = ctRegex!(`\s*\|\s*`); +static bi_term_and_obj_cite_numbers_match    = ctRegex!(`^(.+?)\+(\d+)`); +#+END_SRC + +* set colors for terminal                                  :colors:terminal: +#+name: ao_ansi_colors +#+BEGIN_SRC d +string[string] scr_txt_color = [ +  "off"           : "\033[0m", +  "white"         : "\033[37m", +  "white_bold"    : "\033[1m", +  "marker"        : "\033[42m", +  "bold"          : "\033[1m", +  "underline"     : "\033[4m", +  "invert"        : "\033[7m", +  "darkgrey_hi"   : "\033[100m", +  "grey_hi"       : "\033[47m", +  "pink_hi"       : "\033[105m", +  "fuchsia_hi"    : "\033[45m", +  "red_hi"        : "\033[41m", +  "orange_hi"     : "\033[101m", +  "yellow_hi"     : "\033[103m", +  "brown_hi"      : "\033[43m", +  "lightgreen_hi" : "\033[102m", +  "green_hi"      : "\033[42m", +  "cyan_hi"       : "\033[106m", +  "blue_hi"       : "\033[104m", +  "navy_hi"       : "\033[44m", +  "grey"          : "\033[90m", +  "pink"          : "\033[95m", +  "fuchsia"       : "\033[35m", +  "ruby"          : "\033[31m", +  "red"           : "\033[91m", +  "orange"        : "\033[91m", +  "yellow"        : "\033[93m", +  "brown"         : "\033[33m", +  "green"         : "\033[92m", +  "darkgreen"     : "\033[32m", +  "cyan"          : "\033[36m", +  "blue"          : "\033[94m", +  "navy"          : "\033[34m", +  "black"         : "\033[30m" +]; +string[string] scr_txt_marker = [ +  "white"         : "\033[37m*\033[0m ", +  "bold"          : "\033[1m*\033[0m ", +  "invert"        : "\033[7m*\033[0m ", +  "darkgrey_hi"   : "\033[100m*\033[0m ", +  "grey_hi"       : "\033[47m*\033[0m ", +  "pink_hi"       : "\033[105m*\033[0m ", +  "fuchsia_hi"    : "\033[45m*\033[0m ", +  "red_hi"        : "\033[41m*\033[0m ", +  "orange_hi"     : "\033[101m*\033[0m ", +  "yellow_hi"     : "\033[103m*\033[0m ", +  "brown_hi"      : "\033[43m*\033[0m ", +  "lightgreen_hi" : "\033[102m*\033[0m ", +  "green_hi"      : "\033[42m*\033[0m ", +  "cyan_hi"       : "\033[106m*\033[0m ", +  "blue_hi"       : "\033[104m*\033[0m ", +  "navy_hi"       : "\033[44m*\033[0m ", +  "grey"          : "\033[90m*\033[0m ", +  "pink"          : "\033[95m*\033[0m ", +  "fuchsia"       : "\033[35m*\033[0m ", +  "ruby"          : "\033[31m*\033[0m ", +  "red"           : "\033[91m*\033[0m ", +  "orange"        : "\033[91m*\033[0m ", +  "yellow"        : "\033[93m*\033[0m ", +  "brown"         : "\033[33m*\033[0m ", +  "green"         : "\033[92m*\033[0m ", +  "darkgreen"     : "\033[32m*\033[0m ", +  "cyan"          : "\033[36m*\033[0m ", +  "blue"          : "\033[94m*\033[0m ", +  "navy"          : "\033[34m*\033[0m ", +  "black"         : "\033[30m*\033[0m " +]; +#+END_SRC + +* tangles (code structure)                                           :tangle: +** defaults:                                              :ao_defaults.d:  #+name: tangle_ao_defaults  #+BEGIN_SRC d :tangle ../lib/sdp/ao_defaults.d  /+ @@ -359,3 +674,28 @@ template InternalMarkup() {  +/  <<ao_defaults_templates>>  #+END_SRC + +** rgx:                                                        :ao_rgx.d: +#+name: tangle_ao_rgx +#+BEGIN_SRC d :tangle ../lib/sdp/ao_rgx.d +/+ +  regex +  ao_rgx.d ++/ +template RgxInit() { +  struct Rgx { +    <<ao_rgx>> +  } +} +#+END_SRC +** ansi_colors:                                        :ao_ansi_colors.d: + +#+BEGIN_SRC d :tangle ../lib/sdp/ao_ansi_colors.d +/+ +  utils +  ao_util.d ++/ +template ScreenTxtColors() { +  <<ao_ansi_colors>> +} +#+END_SRC diff --git a/org/ao_object_setter.org b/org/ao_object_setter.org deleted file mode 100644 index 2ee9423..0000000 --- a/org/ao_object_setter.org +++ /dev/null @@ -1,244 +0,0 @@ -#+TITLE: sdp object setter -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* object setter                                                  :object:set: -[[./sdp.org][sdp]]  [[./][org/]] -** struct                                                            :struct: -#+name: ao_object_setter -#+BEGIN_SRC d -mixin Structs; -#+END_SRC -** comment                                                          :comment: -#+name: ao_object_setter -#+BEGIN_SRC d -ObjComposite contents_comment_new(in string object) { -  ObjComposite object_set; -  object_set.use                  = "comment"; -  object_set.of                   = "comment"; -  object_set.is_a                 = "comment"; -  object_set.object               = object; -  // does not have .attrib; -  // does not have .ocn -  return object_set; -} -#+END_SRC - -#+name: ao_object_setter -#+BEGIN_SRC d -string[string] contents_comment(in string object) { -  string[string] object_set; -  object_set["use"]           = "comment"; -  object_set["of"]            = "comment"; -  object_set["is"]            = "comment"; -  object_set["obj"]           = object; -  return object_set; -} -#+END_SRC -** heading                                                          :heading: -#+name: ao_object_setter -#+BEGIN_SRC d -ObjComposite contents_heading_new( -  in int type, -  in string object, -  in string attrib, -  in int ocn, -  in string lev, -  in string lvn, -  in string lcn, -) { -  ObjComposite object_set; -  object_set.use                  = "content"; -  object_set.of                   = "para"; -  object_set.is_a                 = "heading"; -  object_set.object               = object; -  object_set.ocn                  = (ocn==0) ? "" : to!string(ocn); -  object_set.attrib               = attrib; -  object_set.heading.type         = to!string(type); -  object_set.heading.lev          = to!string(lev); -  object_set.heading.lvn          = to!string(lvn); -  object_set.heading.lcn          = to!string(lcn); -  return object_set; -} -#+END_SRC - -#+name: ao_object_setter -#+BEGIN_SRC d -string[string] contents_heading( -  in int type, -  in string object, -  in string attrib, -  in int ocn, -  in string lev, -  in string lvn, -  in string lcn, -) { -  string[string] object_set; -  object_set["use"]           = "content"; -  object_set["of"]            = "para"; -  object_set["is"]            = "heading"; -  object_set["type"]          = to!string(type); -  object_set["obj"]           = object; -  object_set["ocn"]           = (ocn==0) ? "" : to!string(ocn); -  object_set["lev"]           = to!string(lev); -  object_set["lvn"]           = to!string(lvn); -  object_set["lcn"]           = to!string(lcn); -  object_set["attrib"]        = attrib; -  return object_set; -} -#+END_SRC -** para                                                                :para: - -#+name: ao_object_setter -#+BEGIN_SRC d -ObjComposite contents_para_new( -  in string is_a, -  in string object, -  in string attrib, -  in int ocn, -  in string indent_first, -  in string indent_second, -  in bool bullet -) { -  ObjComposite object_set; -  object_set.use                 = "content"; -  object_set.of                  = "para"; -  object_set.is_a                = "heading"; -  object_set.object              = object; -  object_set.ocn                 = (ocn==0) ? "" : to!string(ocn); -  object_set.attrib              = attrib; -  object_set.para.indent_first        = indent_first; -  object_set.para.indent_second       = indent_second; -  object_set.para.bullet              = to!string(bullet); -  return object_set; -} -#+END_SRC - -#+name: ao_object_setter -#+BEGIN_SRC d -string[string] contents_para( -  in string is_a, -  in string object, -  in string attrib, -  in int ocn, -  in string indent_first, -  in string indent_second, -  in bool bullet -) { -  string[string] object_set; -  object_set["use"]           = "content"; -  object_set["of"]            = "para"; -  object_set["is"]            = is_a; -  object_set["obj"]           = object; -  object_set["ocn"]           = (ocn==0) ? "" : to!string(ocn); -  object_set["indent_first"]  = indent_first; -  object_set["indent_second"] = indent_second; -  object_set["bullet"]        = to!string(bullet); -  object_set["attrib"]        = attrib; -  return object_set; -} -#+END_SRC -** block                                                              :block: -#+name: ao_object_setter -#+BEGIN_SRC d -ObjComposite contents_block_new( -  in string type, -  in string object, -  in string attrib, -  in int ocn -) { -  ObjComposite object_set; -  // does not have .attrib; -  object_set.use                 = "content"; -  object_set.of                  = "block"; -  object_set.is_a                = type; -  object_set.object              = object; -  object_set.ocn                 = (ocn==0) ? "" : to!string(ocn); -  object_set.attrib              = attrib; -  return object_set; -} -#+END_SRC - -#+name: ao_object_setter -#+BEGIN_SRC d -string[string] contents_block( -  in string type, -  in string object, -  in string attrib, -  in int ocn -) { -  string[string] object_set; -  object_set["use"]           = "content"; -  object_set["of"]            = "block"; -  object_set["is"]            = type; -  object_set["obj"]           = object; -  object_set["ocn"]           = (ocn==0) ? "" : to!string(ocn); -  object_set["attrib"]        = attrib; -  return object_set; -} -#+END_SRC -** block ocn string                                                   :block: -#+name: ao_object_setter -#+BEGIN_SRC d -ObjComposite contents_block_ocn_string_new( -  in string type, -  in string object, -  in string ocn, -  in string node -) { -  ObjComposite object_set; -  object_set.use                 = "content"; -  object_set.of                  = "block"; -  object_set.is_a                = type; -  object_set.object              = object; -  object_set.ocn                 = ocn; -  object_set.block_ocn_string.node  = node; -  // object_set.attrib              = attrib; -  return object_set; -} -#+END_SRC - -#+name: ao_object_setter -#+BEGIN_SRC d -string[string] contents_block_ocn_string( -  in string type, -  in string object, -  in string ocn, -  in string node -) { -  string[string] object_set; -  object_set["use"]           = "content"; -  object_set["of"]            = "block"; -  object_set["is"]            = type; -  object_set["obj"]           = object; -  object_set["ocn"]           = ocn; -  object_set["node"]          = node; -  return object_set; -} -#+END_SRC - -* tangles                                                            :tangle: -** code structure:                                          :ao_object_setter.d: -#+name: tangle_ao_object_setter -#+BEGIN_SRC d :tangle ../lib/sdp/ao_object_setter.d -/+ -  object setter -  ao_object_setter.d -+/ -mixin template ObjectSetters() { -  struct ObjectAbstractSet { -    import std.conv : to; -    <<ao_object_setter>> -  } -} -#+END_SRC diff --git a/org/ao_output_debugs.org b/org/ao_output_debugs.org index 3f9b59f..c5f4482 100644 --- a/org/ao_output_debugs.org +++ b/org/ao_output_debugs.org @@ -29,10 +29,10 @@ debug(parent) {          writefln(            "%s%s node: %s heading: %s %s",            scr_txt_marker["cyan"], -          obj["ocn"], -          " node: ", obj["node"], -          " heading: ", obj["lvn"], -          " ", obj["obj"], +          obj["obj_cite_number"], +          obj["node"], +          obj["lev_markup_number"], +          obj["obj"],          );        } else {        } @@ -54,7 +54,7 @@ debug(dumpdoc) {      if (obj["use"] == "content") {        writefln(          "[%s][%s]\n%s", -        obj["ocn"], +        obj["obj_cite_number"],          obj["is"],          obj["obj"]        ); @@ -77,7 +77,7 @@ debug(objects) {        writefln(          "%s* [%s][%s] %s%s",          scr_txt_color["green"], -        obj["ocn"], +        obj["obj_cite_number"],          obj["is"],          scr_txt_color["off"],          obj["obj"] @@ -261,7 +261,7 @@ debug(bookindex) {  #+BEGIN_SRC d  debug(summary) {    string[string] check = [ -    "last_ocn" : "NA [debug \"checkdoc\" not run]", +    "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",    ];  #+END_SRC  *** (checkdoc)                                                     :checkdoc: @@ -270,8 +270,8 @@ debug(summary) {  debug(checkdoc) {    foreach (obj; contents) {      if (obj["use"] == "content") { -      if (!empty(obj["ocn"])) { -        check["last_ocn"] = obj["ocn"]; +      if (!empty(obj["obj_cite_number"])) { +        check["last_obj_cite_number"] = obj["obj_cite_number"];        }      }    } @@ -293,7 +293,7 @@ debug(headings) {          "%s%s~ [%s] %s",          scr_txt_marker["yellow"],          obj["lev"], -        obj["ocn"], +        obj["obj_cite_number"],          // "[", obj["is"], "] ",          obj["obj"]        ); @@ -308,132 +308,132 @@ writefln(    fn_src,    "length contents array: ",    contents.length, -  "last ocn: ", -  check["last_ocn"], +  "last obj_cite_number: ", +  check["last_obj_cite_number"],    "length bookindex: ",    bookindex_unordered_hashes.length,    __FILE__,    __LINE__,  );  #+END_SRC -*** compare number of ocn for known sisu markup output (checkdoc) +*** compare number of obj_cite_number for known sisu markup output (checkdoc)  #+name: ao_output_debugs_summary  #+BEGIN_SRC d  debug(checkdoc) {    if (auto mfn=match(fn_src, rgx.src_fn)) { -    if (actions["assert"] == "yes") { +    if (opt_action_bool["assertions"]) {        switch (mfn.captures[2]) {        case "live-manual.ssm": -        assert(check["last_ocn"] == -          "1019","last ocn should be: 1019 (check test, document is frequently updated)"); // ok +        assert(check["last_obj_cite_number"] == +          "1019","last obj_cite_number should be: 1019 (check test, document is frequently updated)"); // ok          break;        case "sisu_markup.sst": -        assert(check["last_ocn"] == -          "297","last ocn should be: 297"); // ok -        // assert(check["last_ocn"] == "297","last ocn should be: 297"); +        assert(check["last_obj_cite_number"] == +          "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]); // ok +        // assert(check["last_obj_cite_number"] == "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]);          // notes for first divergance study sisu headings 247 250 -        // sisu has issue with code that contains heading 1~ which results in no ocn! ?? -        // sisu currently has incorrect last body ocn of 294! +        // sisu has issue with code that contains heading 1~ which results in no obj_cite_number! ?? +        // sisu currently has incorrect last body obj_cite_number of 294!          // bug in sisu? attend          break;        // sisu-markup-samples:        case "accelerando.charles_stross.sst": -        assert(check["last_ocn"] == -          "2861","last ocn should be: 2861"); // ok +        assert(check["last_obj_cite_number"] == +          "2861","last obj_cite_number expected to be: 2861 rather than " ~ check["last_obj_cite_number"]); // ok          break;        case "alices_adventures_in_wonderland.lewis_carroll.sst": -        assert(check["last_ocn"] == -          "805","last ocn should be: 805"); // 808 +        assert(check["last_obj_cite_number"] == +          "805","last obj_cite_number expected to be: 805 rather than " ~ check["last_obj_cite_number"]); // 808          break;        case "autonomy_markup0.sst": -        assert(check["last_ocn"] == -          "77","last ocn should be: 77"); // ok endnotes -        // assert(check["last_ocn"] == "78","last ocn should be: 78"); +        assert(check["last_obj_cite_number"] == +          "77","last obj_cite_number expected to be: 77 rather than " ~ check["last_obj_cite_number"]); // ok endnotes +        // assert(check["last_obj_cite_number"] == "78","last obj_cite_number expected to be: 78 rather than " ~ check["last_obj_cite_number"]);          break;        case "content.cory_doctorow.sst": -        assert(check["last_ocn"] == -          "953","last ocn should be: 953"); // 1007 way off, check ocn off switches -        // assert(check["last_ocn"] == "953","last ocn should be: 953"); +        assert(check["last_obj_cite_number"] == +          "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]); // 1007 way off, check obj_cite_number off switches +        // assert(check["last_obj_cite_number"] == "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]);          break;        case "democratizing_innovation.eric_von_hippel.sst":          // fixed ERROR! range violation, broken check! endnotes, bookindex, biblio          // error in bookindex ... (ch1; ch6; ch8 ) -        assert(check["last_ocn"] == -          "905","last ocn should be: 905"); // 911 +        assert(check["last_obj_cite_number"] == +          "905","last obj_cite_number expected to be: 905 rather than " ~ check["last_obj_cite_number"]); // 911          break;        case "down_and_out_in_the_magic_kingdom.cory_doctorow.sst": -        assert(check["last_ocn"] == -          "1417","last ocn should be: 1417"); // 1455 check ocn off switches +        assert(check["last_obj_cite_number"] == +          "1417","last obj_cite_number expected to be: 1417 rather than " ~ check["last_obj_cite_number"]); // 1455 check obj_cite_number off switches          break;        case "for_the_win.cory_doctorow.sst": -        assert(check["last_ocn"] == -          "3510","last ocn should be: 3510"); // 3569 check ocn off switches +        assert(check["last_obj_cite_number"] == +          "3510","last obj_cite_number expected to be: 3510 rather than " ~ check["last_obj_cite_number"]); // 3569 check obj_cite_number off switches          break;        case "free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst": -        assert(check["last_ocn"] == -          "1082","last ocn should be: 1082"); // check 1079 too few +        assert(check["last_obj_cite_number"] == +          "1082","last obj_cite_number expected to be: 1082 rather than " ~ check["last_obj_cite_number"]); // check 1079 too few          break;        case "free_culture.lawrence_lessig.sst": -        assert(check["last_ocn"] == -          "1330","last ocn should be: 1330"); // 1312 +        assert(check["last_obj_cite_number"] == +          "1330","last obj_cite_number expected to be: 1330 rather than " ~ check["last_obj_cite_number"]); // 1312          // fixed ERROR! range violation, broken check!          // error in bookindex ... sections piracy (ch1) & property (ch10 market concentration) fixed          break;        case "free_for_all.peter_wayner.sst": // endnotes, bookindex, biblio -        assert(check["last_ocn"] == -          "1559","last ocn should be: 1559"); // 1560, check ocn off switches, has endnotes so 2 too many -        // assert(check["last_ocn"] == "1559","last ocn should be: 1559"); +        assert(check["last_obj_cite_number"] == +          "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]); // 1560, check obj_cite_number off switches, has endnotes so 2 too many +        // assert(check["last_obj_cite_number"] == "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]);          break;        case "gpl2.fsf.sst": -        assert(check["last_ocn"] == -          "65","last ocn should be: 65"); // ok endnotes? check -        // assert(check["last_ocn"] == "66","last ocn should be: 66"); +        assert(check["last_obj_cite_number"] == +          "65","last obj_cite_number expected to be: 65 rather than " ~ check["last_obj_cite_number"]); // ok endnotes? check +        // assert(check["last_obj_cite_number"] == "66","last obj_cite_number expected to be: 66 rather than " ~ check["last_obj_cite_number"]);          break;        case "gpl3.fsf.sst": -        assert(check["last_ocn"] == -          "123","last ocn should be: 123"); // ok +        assert(check["last_obj_cite_number"] == +          "123","last obj_cite_number expected to be: 123 rather than " ~ check["last_obj_cite_number"]); // ok          break;        case "gullivers_travels.jonathan_swift.sst": -        assert(check["last_ocn"] == -          "668","last ocn should be: 668"); // 674 +        assert(check["last_obj_cite_number"] == +          "668","last obj_cite_number expected to be: 668 rather than " ~ check["last_obj_cite_number"]); // 674          break;        case "little_brother.cory_doctorow.sst": -        assert(check["last_ocn"] == -          "3130","last ocn should be: 3130"); // 3204, check ocn off switches +        assert(check["last_obj_cite_number"] == +          "3130","last obj_cite_number expected to be: 3130 rather than " ~ check["last_obj_cite_number"]); // 3204, check obj_cite_number off switches          break;        case "the_cathedral_and_the_bazaar.eric_s_raymond.sst": -        assert(check["last_ocn"] == -          "258","last ocn should be: 258"); // ok +        assert(check["last_obj_cite_number"] == +          "258","last obj_cite_number expected to be: 258 rather than " ~ check["last_obj_cite_number"]); // ok          break;        case "the_public_domain.james_boyle.sst": -        assert(check["last_ocn"] == -          "970","last ocn should be: 970"); // 978 +        assert(check["last_obj_cite_number"] == +          "970","last obj_cite_number expected to be: 970 rather than " ~ check["last_obj_cite_number"]); // 978          break;        case "the_wealth_of_networks.yochai_benkler.sst": // endnotes, bookindex -        assert(check["last_ocn"] == -          "829","last ocn should be: 829"); // ok -        // assert(check["last_ocn"] == "832","last ocn should be: 832"); +        assert(check["last_obj_cite_number"] == +          "829","last obj_cite_number expected to be: 829 rather than " ~ check["last_obj_cite_number"]); // ok +        // assert(check["last_obj_cite_number"] == "832","last obj_cite_number expected to be: 832 rather than " ~ check["last_obj_cite_number"]);          // has endnotes and bookindex, issue with sisu.rb          break;        case "through_the_looking_glass.lewis_carroll.sst": -        assert(check["last_ocn"] == -          "949","last ocn should be: 949"); // 955 +        assert(check["last_obj_cite_number"] == +          "949","last obj_cite_number expected to be: 949 rather than " ~ check["last_obj_cite_number"]); // 955          break;        case "two_bits.christopher_kelty.sst": // endnotes, bookindex, biblio -        assert(check["last_ocn"] == -          "1190","last ocn should be: 1190"); // 1191 -        // assert(check["last_ocn"] == "1193","last ocn should be: 1193"); // 1191 ok? +        assert(check["last_obj_cite_number"] == +          "1190","last obj_cite_number expected to be: 1190 rather than " ~ check["last_obj_cite_number"]); // 1191 +        // assert(check["last_obj_cite_number"] == "1193","last obj_cite_number expected to be: 1193 rather than " ~ check["last_obj_cite_number"]); // 1191 ok?          // has endnotes and bookindex, issue with sisu.rb          break;          // fixed ERROR! range violation!          // error in bookindex ... (ch3 the movement)        case "un_contracts_international_sale_of_goods_convention_1980.sst": -        assert(check["last_ocn"] == -          "377","last ocn should be: 377"); // ok +        assert(check["last_obj_cite_number"] == +          "377","last obj_cite_number expected to be: 377 rather than " ~ check["last_obj_cite_number"]); // ok          break;        case "viral_spiral.david_bollier.sst": // endnotes, bookindex -        assert(check["last_ocn"] == -          "1078","last ocn should be: 1078"); // 1100 +        assert(check["last_obj_cite_number"] == +          "1078","last obj_cite_number expected to be: 1078 rather than " ~ check["last_obj_cite_number"]); // 1100          // fixed ERROR! range violation!          // error in bookindex ... (ch7 ... building the cc machine, an extra semi colon)          break; @@ -463,7 +463,7 @@ template SiSUoutputDebugs() {        string[][string][string] bookindex_unordered_hashes,        JSONValue[] biblio,        string fn_src, -      string[string] actions +      bool[string] opt_action_bool      ) {        mixin RgxInit;        mixin ScreenTxtColors; diff --git a/org/ao_read_markup_source.org b/org/ao_read_markup_source.org deleted file mode 100644 index 08f1b45..0000000 --- a/org/ao_read_markup_source.org +++ /dev/null @@ -1,98 +0,0 @@ -#+TITLE: sdp read markup source -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* read markup source                                                 :markup: -[[./sdp.org][sdp]]  [[./][org/]] - -** source string                                                     :string: -#+name: ao_read_markup_source -#+BEGIN_SRC d -final private string markupSourceString(in char[] fn_src) { -  enforce( -    exists(fn_src)!=0, -    "file not found" -  ); -  string source_txt_str; -  try { -    if (exists(fn_src)) { -      source_txt_str = readText(fn_src); // ok -    } -  } -  catch (ErrnoException ex) { -    // Handle errors -  } -  catch (UTFException ex) { -    // Handle validation errors -  } -  catch (FileException ex) { -    // Handle errors -  } -  std.utf.validate(source_txt_str); -  return source_txt_str; -} -#+END_SRC - -** source line array                                                  :array: -#+name: ao_read_markup_source -#+BEGIN_SRC d -final private char[][] markupSourceLineArray(in string src_text) { -  char[][] source_line_arr = -    split(cast(char[]) src_text, rgx.line_delimiter); -  return source_line_arr; -} -#+END_SRC - -** insert source content raw line array                               :array: -#+name: ao_read_markup_source -#+BEGIN_SRC d -final char[][] markupInsertSourceContentRawLineArray(in char[] fn_src) { -  enforce( -    match(fn_src, rgx.src_fn_find_inserts), -    "not a sisu markup filename" -  ); -  auto source_txt_str = markupSourceString(fn_src); -  auto source_line_arr = markupSourceLineArray(source_txt_str); -  return source_line_arr; -} -#+END_SRC - -** source content raw line array                                      :array: -#+name: ao_read_markup_source -#+BEGIN_SRC d -final char[][] markupSourceContentRawLineArray(in char[] fn_src) { -  enforce( -    match(fn_src, rgx.src_pth), -    "not a sisu markup filename" -  ); -  auto source_txt_str = markupSourceString(fn_src); -  auto source_line_arr = markupSourceLineArray(source_txt_str); -  return source_line_arr; -} -#+END_SRC - -* tangles                                                            :tangle: -** code structure:                                   :ao_read_markup_source.d: -#+name: tangle_ao_read_markup_source -#+BEGIN_SRC d :tangle ../lib/sdp/ao_read_markup_source.d -/+ -  read markup source -  ao_read_markup_source.d -+/ -mixin template SiSUmarkupRaw() { -  struct MarkupRaw { -    auto rgx = Rgx(); -    <<ao_read_markup_source>> -  } -} -#+END_SRC diff --git a/org/ao_read_source_files.org b/org/ao_read_source_files.org new file mode 100644 index 0000000..c03ff94 --- /dev/null +++ b/org/ao_read_source_files.org @@ -0,0 +1,390 @@ +#+TITLE: sdp markup source raw +#+AUTHOR: Ralph Amissah +#+EMAIL: ralph.amissah@gmail.com +#+STARTUP: indent +#+LANGUAGE: en +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t +#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc +#+OPTIONS: author:nil email:nil creator:nil timestamp:nil +#+PROPERTY: header-args :padline no :exports code :noweb yes +#+EXPORT_SELECT_TAGS: export +#+EXPORT_EXCLUDE_TAGS: noexport +#+FILETAGS: :sdp:niu:ao: +#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) + +* markup source raw                                                  :markup: +[[./sdp.org][sdp]]  [[./][org/]] + +** source string                                                     :string: +#+name: ao_markup_source_raw +#+BEGIN_SRC d +final private string readInMarkupSource(in string fn_src) { +  enforce( +    exists(fn_src)!=0, +    "file not found" +  ); +  string source_txt_str; +  try { +    if (exists(fn_src)) { +      source_txt_str = readText(fn_src); +    } +  } +  catch (ErrnoException ex) { +  //// Handle errors +  // switch(ex.errno) { +  // case EPERM: +  // case EACCES: +  //   // Permission denied +  //   break; +  // case ENOENT: +  //   // File does not exist +  //   break; +  // default: +  //   // Handle other errors +  //   break; +  // } +  } +  catch (UTFException ex) { +    // Handle validation errors +  } +  catch (FileException ex) { +    // Handle errors +  } +  std.utf.validate(source_txt_str); +  return source_txt_str; +} +#+END_SRC + +*** notes +source_txt_str = readText(fn_src); // ok +// source_txt_str = cast(string) read(fn_src); // ok +// immutable string source_txt_str = cast(string) read(fn_src); +// auto utf8Data = readText(fn_src); +// auto utf16Data = readText!(wstring)(fn_src); +// auto utf32Data = readText!(dstring)(fn_src); + +catch (ErrnoException ex) { +//// Handle errors +// switch(ex.errno) { +// case EPERM: +// case EACCES: +//   // Permission denied +//   break; +// case ENOENT: +//   // File does not exist +//   break; +// default: +//   // Handle other errors +//   break; +// } +} + +** source line array                                                  :array: +#+name: ao_markup_source_raw +#+BEGIN_SRC d +final private char[][] markupSourceLineArray(in string src_text) { +  char[][] source_line_arr = +    split(cast(char[]) src_text, rgx.line_delimiter); +  return source_line_arr; +} +#+END_SRC + +** source content raw line array                                      :array: +- used for regular .sst files; master .ssm files and; .ssi inserts +- regex is passed for relevant enforce match + +#+name: ao_markup_source_raw +#+BEGIN_SRC d +final char[][] markupSourceContentRawLineArray(in string fn_src, Regex!(char) rgx_file ) { +  enforce( +    match(fn_src, rgx_file), +    "not a sisu markup filename" +  ); +  auto source_txt_str = readInMarkupSource(fn_src); +  auto source_line_arr = markupSourceLineArray(source_txt_str); +  return source_line_arr; +} +#+END_SRC + +* inserts                                                           :inserts: +[[./sdp.org][sdp]]  [[./][org/]] + +** scan inserts (sub-document) source                       :scan_insert_src: +*** scan subdoc source +#+name: ao_inserts_scan +#+BEGIN_SRC d +char[][] contents_insert; +auto type1 = flags_type_init; +mixin ScreenTxtColors; +int tell_l(string color, in char[] line) { +  writeln(scr_txt_marker[color], line); +  return 0; +} +auto fn_pth_full = match(fn_src, rgx.src_pth); +auto markup_src_file_path = fn_pth_full.captures[1]; +#+END_SRC + +*** loop insert (sub-document) +#+name: ao_inserts_scan_loop +#+BEGIN_SRC d +if (type1["curly_code"] == 1) { +  type1["header_make"] = 0; +  type1["header_metadata"] = 0; +  if (auto m = match(line, rgx.block_curly_code_close)) { +    type1["curly_code"] = 0; +  } +  contents_insert ~= line; +} else if (auto m = match(line, rgx.block_curly_code_open)) { +  type1["curly_code"] = 1; +  type1["header_make"] = 0; +  type1["header_metadata"] = 0; +  contents_insert ~= line; +} else if (type1["tic_code"] == 1) { +  type1["header_make"] = 0; +  type1["header_metadata"] = 0; +  if (auto m = match(line, rgx.block_tic_close)) { +    type1["tic_code"] = 0; +  } +  contents_insert ~= line; +} else if (auto m = match(line, rgx.block_tic_code_open)) { +  type1["tic_code"] = 1; +  type1["header_make"] = 0; +  type1["header_metadata"] = 0; +  contents_insert ~= line; +} else if ( +  (type1["header_make"] == 1) +  && match(line, rgx.header_sub) +) { +    type1["header_make"] = 1; +    type1["header_metadata"] = 0; +    // cont_dynamic_array ~= "% " ~ line; +} else if ( +  (type1["header_metadata"] == 1) +  && match(line, rgx.header_sub) +) { +    type1["header_metadata"] = 1; +    type1["header_make"] = 0; +    // cont_dynamic_array ~= "% " ~ line; +} else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) { +  type1["header_make"] = 0; +  type1["header_metadata"] = 0; +  auto insert_fn = m.captures[2]; +  auto insert_sub_pth = m.captures[1]; +  auto fn_src_insert = +    to!string(markup_src_file_path ~ insert_sub_pth ~ insert_fn); +  auto raw = MarkupRawUnit(); +  auto markup_sourcesubfile_insert_content = +    raw.markupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); +  debug(insert) {                              // insert file +    tell_l("red", line); +    tell_l("red", fn_src_insert); +    tell_l("fuchsia", "ERROR"); +    writeln( +      "  length contents insert array: ", +      markup_sourcesubfile_insert_content.length +    ); +  } +  auto ins = Inserts(); +  /+ +    1. load file, +    2. read lines; +    3. scan lines, +    4. if filename insert, and insert filename +    5.   repeat 1 +    6. else +    7.   add line to new array; +  +/ +} else { +  type1["header_make"] = 0; +  type1["header_metadata"] = 0; +  contents_insert ~= line; +} +#+END_SRC + +*** post loop +#+name: ao_inserts_scan_post +#+BEGIN_SRC d +return contents_insert; +#+END_SRC + +** scan document source                                            :scan_src: +*** scan doc source +#+name: ao_master_doc_scan_for_insert_filenames +#+BEGIN_SRC d +char[][] contents; +auto type = flags_type_init; +mixin ScreenTxtColors; +int tell_l(string color, in char[] line) { +  writeln(scr_txt_marker[color], line); +  return 0; +} +auto fn_pth_full = match(fn_src, rgx.src_pth); +auto markup_src_file_path = fn_pth_full.captures[1]; +#+END_SRC +*** loop insert (document) +#+name: ao_master_doc_scan_for_insert_filenames_loop +#+BEGIN_SRC d +if (type["curly_code"] == 1) { +  type["header_make"] = 0; +  type["header_metadata"] = 0; +  if (auto m = match(line, rgx.block_curly_code_close)) { +    type["curly_code"] = 0; +  } +  contents ~= line; +} else if (auto m = match(line, rgx.block_curly_code_open)) { +  type["curly_code"] = 1; +  type["header_make"] = 0; +  type["header_metadata"] = 0; +  contents ~= line; +} else if (type["tic_code"] == 1) { +  type["header_make"] = 0; +  type["header_metadata"] = 0; +  if (auto m = match(line, rgx.block_tic_close)) { +    type["tic_code"] = 0; +  } +  contents ~= line; +} else if (auto m = match(line, rgx.block_tic_code_open)) { +  type["tic_code"] = 1; +  type["header_make"] = 0; +  type["header_metadata"] = 0; +  contents ~= line; +} else if ( +  (type["header_make"] == 1) +  && match(line, rgx.header_sub) +) { +  contents ~= line; +} else if ( +  (type["header_metadata"] == 1) +  && match(line, rgx.header_sub) +) { +  contents ~= line; +} else if (auto m = match(line, rgx.header_make)) { +  type["header_make"] = 1; +  type["header_metadata"] = 0; +  contents ~= line; +} else if (auto m = match(line, rgx.header_metadata)) { +  type["header_make"] = 0; +  type["header_metadata"] = 1; +  contents ~= line; +} else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) { +  type["header_make"] = 0; +  type["header_metadata"] = 0; +  auto insert_fn = m.captures[2]; +  auto insert_sub_pth = m.captures[1]; +  auto fn_src_insert = +    to!string(markup_src_file_path ~ insert_sub_pth ~ insert_fn); +  auto raw = MarkupRawUnit(); +  auto markup_sourcefile_insert_content = +    raw.markupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); +  debug(insert) {                              // insert file +    tell_l("red", line); +    tell_l("red", fn_src_insert); +    writeln( +      "  length contents insert array: ", +      markup_sourcefile_insert_content.length +    ); +  } +  auto ins = Inserts(); +  auto contents_insert = ins.scan_subdoc_source( +    markup_sourcefile_insert_content, +    to!string(fn_src_insert) +  ); +  contents ~= contents_insert; +  /+ +    1. load file, +    2. read lines; +    3. scan lines, +    4. if filename insert, and insert filename +    5.   repeat 1 +    6. else +    7.   add line to new array; +  +/ +} else { +  type["header_make"] = 0; +  type["header_metadata"] = 0; +  contents ~= line; +} +#+END_SRC + +*** post loop +#+name: ao_master_doc_scan_for_insert_filenames_post +#+BEGIN_SRC d +debug(insert) {                              // insert file +  writeln(__LINE__); +  writeln(contents.length); +} +return contents; +#+END_SRC + +* tangles (code structure)                                           :tangle: +** ao_markup_source_raw.d:   :ao_markup_source_raw.d: + +#+BEGIN_SRC d :tangle ../lib/sdp/ao_read_source_files.d +/+ +  ao_read_source_files.d +  - open markup files +  - if master file scan for addional files to import/insert ++/ +// module ao_read_source_files; +template SiSUmarkupRaw() { +  private import +    std.exception, +    std.regex, +    std.stdio, +    std.utf, +    std.conv : to; +  private import +    ao_rgx;       // ao_defaults.d +  mixin RgxInit; +  auto rgx = Rgx(); +  struct MarkupRaw { +    final char[][] sourceContent(in string fn_src) { +      auto raw = MarkupRawUnit(); +      auto sourcefile_content = +        raw.markupSourceContentRawLineArray(fn_src, rgx.src_pth); +      if (match(fn_src, rgx.src_fn_master)) { +        auto ins = Inserts(); +        sourcefile_content = +          ins.scan_master_doc_source_for_insert_filenames(sourcefile_content, fn_src); +        // auto ins = SiSUdocInserts.Inserts(); +      } +      return sourcefile_content; +    } +  } +  private +  struct MarkupRawUnit { +    private import std.file; +    <<ao_markup_source_raw>> +  } +  struct Inserts { +    private import ao_defaults;    // ao_defaults.d +    private import ao_ansi_colors; // ao_ansi_colors.d +    auto scan_subdoc_source( +      char[][] markup_sourcefile_insert_content, +      string fn_src +    ) { +      mixin SiSUrgxInitFlags; +      <<ao_inserts_scan>> +      foreach (line; markup_sourcefile_insert_content) { +        <<ao_inserts_scan_loop>> +      } // end src subdoc (inserts) loop +      <<ao_inserts_scan_post>> +    } +    auto scan_master_doc_source_for_insert_filenames( +      char[][] sourcefile_content, +      string fn_src +    ) { +      mixin SiSUrgxInitFlags; +      <<ao_master_doc_scan_for_insert_filenames>> +      foreach (line; sourcefile_content) { +        <<ao_master_doc_scan_for_insert_filenames_loop>> +      } // end src doc loop +      <<ao_master_doc_scan_for_insert_filenames_post>> +    } +  } +} +#+END_SRC + +INSERTS? +[[./ao_scan_inserts.org][ao_scan_inserts]] +WORK AREA diff --git a/org/ao_rgx.org b/org/ao_rgx.org deleted file mode 100644 index 7306cd3..0000000 --- a/org/ao_rgx.org +++ /dev/null @@ -1,251 +0,0 @@ -#+TITLE: sdp rgx -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* regex                                                               :regex: -[[./sdp.org][sdp]]  [[./][org/]] -** misc                                                                :misc: -#+name: ao_rgx -#+BEGIN_SRC d -/+ misc +/ -static flag_action               = ctRegex!(`^(--[a-z][a-z0-9-]+)$`); -static flag_action_str           = ctRegex!(` (--[a-z][a-z0-9-]+)`); -static src_pth                   = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ss[tm])$`); -static src_fn                    = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ss[tm])$`); -static src_fn_master             = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ssm)$`); -static src_fn_find_inserts       = ctRegex!(`^([a-zA-Z0-9._-]+/)*([a-zA-Z0-9._-]+[.]ss[im])$`); -static line_delimiter            = ctRegex!("\n"); -static within_quotes             = ctRegex!(`"(.+?)"`); -static make_heading_delimiter    = ctRegex!(`[;][ ]*`); -static arr_delimiter             = ctRegex!(`[ ]*[;][ ]*`); -static name_delimiter            = ctRegex!(`^([^,]+)[ ]*,[ ]+(.+?)$`); -static book_index_go             = ctRegex!("([0-9]+)(?:-[0-9]+)?"); -static trailing_comma            = ctRegex!(",[ ]*$"); -static trailing_linebreak        = ctRegex!(",[ ]{1,2}\\\\\\\\\n[ ]{4}$","m"); -static line_delimiter_ws_strip   = ctRegex!("[ ]*\n[ ]*"); -static line_delimiter_only       = ctRegex!("^\n"); -static para_delimiter            = ctRegex!("\n[ ]*\n+"); -static levels_markup             = ctRegex!(`^[A-D1-4]$`); -static levels_numbered           = ctRegex!(`^[0-9]$`); -static levels_numbered_headings  = ctRegex!(`^[0-7]$`); -#+END_SRC -** markup insert file                                           :insert:file: -#+name: ao_rgx -#+BEGIN_SRC d -/+ insert markup file +/ -static insert_src_fn_ssi_or_sst  = ctRegex!(`^<<\s*(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[ti])$`); -// static insert_ssi_or_sst_fn      = ctRegex!(`^<<\s*[a-zA-Z0-9._-]+[.]ss[ti]`); -#+END_SRC -** comments                                                         :comment: -#+name: ao_rgx -#+BEGIN_SRC d -/+ comments +/ -static comment                   = ctRegex!(`^%+ `); -#+END_SRC -** header                                                            :header: -#+name: ao_rgx -#+BEGIN_SRC d -/+ header +/ -static header                    = ctRegex!(`^@([a-z_]+):(?:\s|$)`); -static header_make               = ctRegex!(`^@(make):(?:\s|$)`); -static header_metadata           = ctRegex!(`^@([a-z_]+):(?:\s|$)`); -static header_sub                = ctRegex!(`^[ ]+:([a-z_]+):\s`); -static head_main                 = ctRegex!(`^@([a-z_]+):\s*(.*)`, "m"); -static head_sub                  = ctRegex!(`^[ ]*:([a-z_]+):\s+(.+)`, "m"); -#+END_SRC -** header & paragraph operators                          :paragraph:operator: -#+name: ao_rgx -#+BEGIN_SRC d -/+ heading & paragraph operators +/ -static heading            = ctRegex!(`^:?([A-D1-4])[~]([a-z0-9_.-]*[?]?) `); -static heading_marker     = ctRegex!(`^:?([A-D1-4])[~]`); -static heading_title      = ctRegex!(`^:?[A-D1-4][~][a-z0-9_.-]*[?]?\s+(.+?)$`); -static heading_all        = ctRegex!(`^:?([A-D1-4])[~]([a-z0-9_.-]*[?]?)\s+(.+?)$`); // test, particularly [2] name/hashtag which may or may not be, does this affect title [3] -static heading_biblio     = ctRegex!(`^:?(1)[~][!](biblio(?:graphy)?|references?)`); -static heading_glossary   = ctRegex!(`^:?(1)[~][!](glossary)`); -static para_bullet        = ctRegex!(`^_[*] `); -static para_bullet_indent = ctRegex!(`^_([1-9])[*] `); -static para_indent        = ctRegex!(`^_([1-9]) `); -static para_indent_hang   = ctRegex!(`^_([0-9])_([0-9]) `); -static para_attribs       = ctRegex!(`^_(([0-9])(_([0-9]))?|_([1-9])?[*]) `); -#+END_SRC -** blocked markup tics                                            :block:tic: -#+name: ao_rgx -#+BEGIN_SRC d -/+ blocked markup tics +/ -static block_tic_code_open       = ctRegex!("^`{3} (code)"); -static block_tic_poem_open       = ctRegex!("^`{3} (poem)"); -static block_tic_group_open      = ctRegex!("^`{3} (group)"); -static block_tic_block_open      = ctRegex!("^`{3} (block)"); -static block_tic_quote_open      = ctRegex!("^`{3} (quote)"); -static block_tic_table_open      = ctRegex!("^`{3} (table)"); -static block_tic_close           = ctRegex!("^(`{3})$","m"); -#+END_SRC -** blocked markup curly                                         :block:curly: -#+name: ao_rgx -#+BEGIN_SRC d -/+ blocked markup curly +/ -static block_curly_code_open     = ctRegex!(`^(code[{].*?$)`); -static block_curly_code_close    = ctRegex!(`^([}]code)`); -static block_curly_poem_open     = ctRegex!(`^(poem[{].*?$)`); -static block_curly_poem_close    = ctRegex!(`^([}]poem)`); -static block_curly_group_open    = ctRegex!(`^(group[{].*?$)`); -static block_curly_group_close   = ctRegex!(`^([}]group)`); -static block_curly_block_open    = ctRegex!(`^(block[{].*?$)`); -static block_curly_block_close   = ctRegex!(`^([}]block)`); -static block_curly_quote_open    = ctRegex!(`^(quote[{].*?$)`); -static block_curly_quote_close   = ctRegex!(`^([}]quote)`); -static block_curly_table_open    = ctRegex!(`^(table[{].*?$)`); -static block_curly_table_close   = ctRegex!(`^([}]table)`); -#+END_SRC -** inline markup font face mod                             :inline:font:face: -#+name: ao_rgx -#+BEGIN_SRC d -/+ inline markup font face mod +/ -static inline_emphasis           = ctRegex!(`\*\{(?P<text>.+?)\}\*`); -static inline_bold               = ctRegex!(`!\{(?P<text>.+?)\}!`); -static inline_italics            = ctRegex!(`/\{(?P<text>.+?)\}/`); -static inline_superscript        = ctRegex!(`\^\{(?P<text>.+?)\}\^`); -static inline_subscript          = ctRegex!(`,\{(?P<text>.+?)\},`); -static inline_strike             = ctRegex!(`-\{(?P<text>.+?)\}-`); -static inline_insert             = ctRegex!(`\+\{(?P<text>.+?)\}\+`); -static inline_mono               = ctRegex!(`#\{(?P<text>.+?)\}#`); -#+END_SRC -** inline markup footnotes                                  :inline:footnote: -#+name: ao_rgx -#+BEGIN_SRC d -/+ inline markup footnotes +/ -static true_dollar                           = ctRegex!(`\$`, "gm"); -static inline_notes_al                       = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg"); -static inline_notes_al_gen                   = ctRegex!(`【.+?】`, "m"); -static inline_notes_curly_gen                = ctRegex!(`~\{.+?\}~`, "m"); -static inline_notes_curly                    = ctRegex!(`~\{\s*(.+?)\}~`, "mg"); -static inline_al_delimiter_open_regular             = ctRegex!(`【`, "m"); -static inline_al_delimiter_close_regular            = ctRegex!(`】`, "m"); -static inline_al_delimiter_open_and_close_regular   = ctRegex!(`【|】`, "m"); -static inline_notes_delimiter_al_regular            = ctRegex!(`【(.+?)】`, "m"); -static inline_notes_delimiter_al_regular_number_note = ctRegex!(`【(\d+)\s+(.+?)】`, "m"); -static inline_al_delimiter_open_asterisk         = ctRegex!(`【\*`, "m"); -static inline_al_delimiter_open_plus             = ctRegex!(`【\+`, "m"); -static inline_curly_delimiter_open_regular             = ctRegex!(`~\{\s*`, "m"); -static inline_curly_delimiter_close_regular            = ctRegex!(`\s*\}~`, "m"); -static inline_curly_delimiter_open_and_close_regular   = ctRegex!(`~\{\s*|\s*\}~`, "m"); -static inline_notes_delimiter_curly_regular            = ctRegex!(`~\{[ ]*(.+?)\}~`, "m"); -static inline_notes_curly_sp                 = ctRegex!(`~\{[*+]+\s+(.+?)\}~`, "m"); -static inline_notes_curly_sp_asterisk        = ctRegex!(`~\{[*]+\s+(.+?)\}~`, "m"); -static inline_notes_curly_sp_plus            = ctRegex!(`~\{[+]+\s+(.+?)\}~`, "m"); -static inline_text_and_note_al               = ctRegex!(`(?P<text>.+?)【(?:[*+ ]*)(?P<note>.+?)】`, "mg"); -static inline_text_and_note_curly            = ctRegex!(`(?P<text>.+?)(?:(?:[~])[{][*+ ]*)(?P<note>.+?)(?:[}][~])`, "mg"); -static inline_note_curly_delimiters          = ctRegex!(`(~\{[*+]?\s*)(.+?)(\}~)`, "mg"); -static inline_notes_square                   = ctRegex!(`~\[\s*(.+?)\]~`, "mg"); -static inline_text_and_note_square_sp        = ctRegex!(`(.+?)~\[[*+]+\s+(.+?)\]~`, "mg"); -static inline_text_and_note_square           = ctRegex!(`(.+?)~\[\s*(.+?)\]~`, "mg"); -static inline_note_square_delimiters         = ctRegex!(`(~\[\s*)(.+?)(\]~)`, "mg"); -#+END_SRC -** inline markup book index                                :inline:bookindex: -#+name: ao_rgx -#+BEGIN_SRC d -/+ inline markup book index +/ -static book_index                = ctRegex!(`^=\{\s*(.+?)\}$`, "m"); -static book_index_open           = ctRegex!(`^=\{\s*([^}]+?)$`); -static book_index_close          = ctRegex!(`^(.*?)\}$`, "m"); // strip -#+END_SRC -** no ocn object                                              :ocn:off:object: -#+name: ao_rgx -#+BEGIN_SRC d -/+ no ocn object +/ -static ocn_off                   = ctRegex!(`~#$`, "m"); -static ocn_off_dh                = ctRegex!(`-#$`, "m"); -static ocn_off_all               = ctRegex!(`[~-]#$`, "m"); -#+END_SRC -** no ocn block                                               :ocn:off:block: -#+name: ao_rgx -#+BEGIN_SRC d -/+ no ocn block +/ -static ocn_off_block             = ctRegex!(`^--~#$`); -static ocn_off_block_dh          = ctRegex!(`^---#$`); -static ocn_off_block_close       = ctRegex!(`^--\+#$`); -// static auto_ocn_ignore           = ctRegex!(`^[+~*$-]{3,}$`); // reminder -static ocn_block_marks           = ctRegex!(`^--[+~-]#$`); -#+END_SRC -** ignore outside code blocks                                    :block:code: -#+name: ao_rgx -#+BEGIN_SRC d -/+ ignore outside code blocks +/ -static regular_parse_skip        = ctRegex!(`^(--[+~-]#|-[\\]{2}-|=[.\\]{2}=)$`); // not structural info -#+END_SRC -** line & page breaks                                                 :break: -#+name: ao_rgx -#+BEGIN_SRC d -/+ line & page breaks +/ -static break_line_within_object  = ctRegex!(`[\\]{2}( |$)`); -// static break_line_break_within_object  = ctRegex!(`( |^)[\\]{2}( |$)`); -static break_page                = ctRegex!(`^-[\\]{2}-$`); -static break_page_new            = ctRegex!(`^=[\\]{2}=$`); -static break_page_line_across    = ctRegex!(`^=[.]{2}=$`); -static break_string              = ctRegex!(`』`); -// ancestry, parent -static parent                    = ctRegex!(`([0-7]):([0-9]+)`); -#+END_SRC -** json                                                                :json: -#+name: ao_rgx -#+BEGIN_SRC d -/+ json +/ -static tailing_comma             = ctRegex!(`,$`, "m"); -#+END_SRC -** head                                                              :header: -#+name: ao_rgx -#+BEGIN_SRC d -/+ head +/ -static main_headers              = ctRegex!(`^(?:creator|title|rights|date|original|classify|identifier|notes|publisher|make|links)$`, "m"); -static subhead_creator           = ctRegex!(`^(?:author|translator|illustrator)$`, "m"); -static subhead_title             = ctRegex!(`^(?:main|sub(?:title)?|full|language|edition|note)$`, "m"); -static subhead_rights            = ctRegex!(`^(?:copyright|illustrations|license|cover)$`, "m"); -static subhead_date              = ctRegex!(`^(?:published|created|issued|available|valid|modified|added_to_site)$`, "m"); -static subhead_original          = ctRegex!(`^(?:title|language|source)$`, "m"); -static subhead_classify          = ctRegex!(`^(?:topic_register|subject|keywords|loc|dewey)$`, "m"); -static subhead_identifier        = ctRegex!(`^(?:oclc|pg|isbn)$`, "m"); -static subhead_notes             = ctRegex!(`^(?:abstract|description)$`, "m"); -static subhead_publisher         = ctRegex!(`^(?:name)$`, "m"); -static subhead_make              = ctRegex!(`^(?:cover_image|home_button_image|home_button_text|footer|headings|num_top|breaks|substitute|bold|italics|emphasis|texpdf_font|css)$`, "m"); -#+END_SRC -** biblio tags                                                  :biblio:tags: -#+name: ao_rgx -#+BEGIN_SRC d -/+ biblio tags +/ -static biblio_tags               = ctRegex!(`^(is|au|author_raw|author|author_arr|editor_raw|ed|editor_arr|ti|title|subtitle|fulltitle|lng|language|trans|src|jo|journal|in|vol|volume|edn|edition|yr|year|pl|place|pb|pub|publisher|url|pg|pages|note|short_name|id):\s+(.+)`); -static biblio_abbreviations      = ctRegex!(`^(au|ed|ti|lng|jo|vol|edn|yr|pl|pb|pub|pg|pgs|sn)$`); -#+END_SRC -** bookindex split                                          :bookindex:split: -#+name: ao_rgx -#+BEGIN_SRC d -/+ bookindex split +/ -static bi_main_terms_split       = ctRegex!(`\s*;\s*`); -static bi_main_term_plus_rest_split = ctRegex!(`\s*:\s*`); -static bi_sub_terms_plus_ocn_offset_split = ctRegex!(`\s*\|\s*`); -static bi_term_and_ocns_match    = ctRegex!(`^(.+?)\+(\d+)`); -#+END_SRC -* tangles                                                            :tangle: -** code structure:                                                   :ao_rgx.d: -#+name: tangle_ao_rgx -#+BEGIN_SRC d :tangle ../lib/sdp/ao_rgx.d -/+ -  regex -  ao_rgx.d -+/ -mixin template RgxInit() { -  struct Rgx { -    <<ao_rgx>> -  } -} -#+END_SRC diff --git a/org/ao_scan_inserts.org b/org/ao_scan_inserts.org deleted file mode 100644 index 2b76960..0000000 --- a/org/ao_scan_inserts.org +++ /dev/null @@ -1,259 +0,0 @@ -#+TITLE: sdp scan inserts -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* inserts                                                           :inserts: -[[./sdp.org][sdp]]  [[./][org/]] - -** scan inserts (sub-document) source                       :scan_insert_src: -*** scan subdoc source -#+name: ao_inserts_scan -#+BEGIN_SRC d -char[][] contents_insert; -auto ft1 = flag_type.dup; -mixin ScreenTxtColors; -auto rgx = Rgx(); -int tell_l(string color, in char[] line) { -  writeln(scr_txt_marker[color], line); -  return 0; -} -auto fn_pth_full = match(fn_src, rgx.src_pth); -auto markup_src_file_path = fn_pth_full.captures[1]; -#+END_SRC - -*** loop insert (sub-document) -#+name: ao_inserts_scan_loop -#+BEGIN_SRC d -if (ft1["curly_code"] == 1) { -  ft1["header_make"] = 0; -  ft1["header_metadata"] = 0; -  if (auto m = match(line, rgx.block_curly_code_close)) { -    ft1["curly_code"] = 0; -  } -  contents_insert ~= line; -} else if (auto m = match(line, rgx.block_curly_code_open)) { -  ft1["curly_code"] = 1; -  ft1["header_make"] = 0; -  ft1["header_metadata"] = 0; -  contents_insert ~= line; -} else if (ft1["tic_code"] == 1) { -  ft1["header_make"] = 0; -  ft1["header_metadata"] = 0; -  if (auto m = match(line, rgx.block_tic_close)) { -    ft1["tic_code"] = 0; -  } -  contents_insert ~= line; -} else if (auto m = match(line, rgx.block_tic_code_open)) { -  ft1["tic_code"] = 1; -  ft1["header_make"] = 0; -  ft1["header_metadata"] = 0; -  contents_insert ~= line; -} else if ( -  (ft1["header_make"] == 1) -  && match(line, rgx.header_sub) -) { -    ft1["header_make"] = 1; -    ft1["header_metadata"] = 0; -} else if ( -  (ft1["header_metadata"] == 1) -  && match(line, rgx.header_sub) -) { -    ft1["header_metadata"] = 1; -    ft1["header_make"] = 0; -} else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) { -  ft1["header_make"] = 0; -  ft1["header_metadata"] = 0; -  auto insert_fn = m.captures[2]; -  auto insert_sub_pth = m.captures[1]; -  auto fn_src_insert = -    (markup_src_file_path ~ insert_sub_pth ~ insert_fn); -  auto raw = MarkupRaw(); -  auto markup_sourcesubfile_insert_content = -    raw.markupInsertSourceContentRawLineArray(fn_src_insert); -  debug(insert) {                              // insert file -    tell_l("red", line); -    tell_l("red", fn_src_insert); -    tell_l("fuchsia", "ERROR"); -    writeln( -      "  length contents insert array: ", -      markup_sourcesubfile_insert_content.length -    ); -  } -  auto ins = Inserts(); -  /+ -    1. load file, -    2. read lines; -    3. scan lines, -    4. if filename insert, and insert filename -    5.   repeat 1 -    6. else -    7.   add line to new array; -  +/ -} else { -  ft1["header_make"] = 0; -  ft1["header_metadata"] = 0; -  contents_insert ~= line; -} -#+END_SRC - -*** post loop -#+name: ao_inserts_scan_post -#+BEGIN_SRC d -return contents_insert; -#+END_SRC - -** scan document source                                            :scan_src: -*** scan doc source -#+name: ao_doc_scan -#+BEGIN_SRC d -char[][] contents; -auto ft = flag_type.dup; -mixin ScreenTxtColors; -auto rgx = Rgx(); -int tell_l(string color, in char[] line) { -  writeln(scr_txt_marker[color], line); -  return 0; -} -auto fn_pth_full = match(fn_src, rgx.src_pth); -auto markup_src_file_path = fn_pth_full.captures[1]; -#+END_SRC - -*** loop insert (document) -#+name: ao_doc_scan_loop -#+BEGIN_SRC d -if (ft["curly_code"] == 1) { -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  if (auto m = match(line, rgx.block_curly_code_close)) { -    ft["curly_code"] = 0; -  } -  contents ~= line; -} else if (auto m = match(line, rgx.block_curly_code_open)) { -  ft["curly_code"] = 1; -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  contents ~= line; -} else if (ft["tic_code"] == 1) { -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  if (auto m = match(line, rgx.block_tic_close)) { -    ft["tic_code"] = 0; -  } -  contents ~= line; -} else if (auto m = match(line, rgx.block_tic_code_open)) { -  ft["tic_code"] = 1; -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  contents ~= line; -} else if ( -  (ft["header_make"] == 1) -  && match(line, rgx.header_sub) -) { -  contents ~= line; -} else if ( -  (ft["header_metadata"] == 1) -  && match(line, rgx.header_sub) -) { -  contents ~= line; -} else if (auto m = match(line, rgx.header_make)) { -  ft["header_make"] = 1; -  ft["header_metadata"] = 0; -  contents ~= line; -} else if (auto m = match(line, rgx.header_metadata)) { -  ft["header_make"] = 0; -  ft["header_metadata"] = 1; -  contents ~= line; -} else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) { -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  auto insert_fn = m.captures[2]; -  auto insert_sub_pth = m.captures[1]; -  auto fn_src_insert = -    (markup_src_file_path ~ insert_sub_pth ~ insert_fn); -  auto raw = MarkupRaw(); -  auto markup_sourcefile_insert_content = -    raw.markupInsertSourceContentRawLineArray(fn_src_insert); -  debug(insert) {                              // insert file -    tell_l("red", line); -    tell_l("red", fn_src_insert); -    writeln( -      "  length contents insert array: ", -      markup_sourcefile_insert_content.length -    ); -  } -  auto ins = Inserts(); -  auto contents_insert = ins.scan_subdoc_source( -    markup_sourcefile_insert_content, -    to!string(fn_src_insert) -  ); -  contents ~= contents_insert; -  /+ -    1. load file, -    2. read lines; -    3. scan lines, -    4. if filename insert, and insert filename -    5.   repeat 1 -    6. else -    7.   add line to new array; -  +/ -} else { -  ft["header_make"] = 0; -  ft["header_metadata"] = 0; -  contents ~= line; -} -#+END_SRC - -*** post loop -#+name: ao_doc_scan_post -#+BEGIN_SRC d -debug(insert) {                              // insert file -  writeln(__LINE__); -  writeln(contents.length); -} -return contents; -#+END_SRC - -* tangles                                                            :tangle: -** code structure:                                                 :ao_inserts.d: -#+name: tangle_ao_inserts -#+BEGIN_SRC d :tangle ../lib/sdp/ao_scan_inserts.d -/+ -  inserts -  ao_inserts.d -+/ -mixin template SiSUdocInserts() { -  private: -  struct Inserts { -    auto scan_subdoc_source( -      char[][] markup_sourcefile_insert_content, -      string fn_src -    ) { -      <<ao_inserts_scan>> -      foreach (line; markup_sourcefile_insert_content) { -        <<ao_inserts_scan_loop>> -      } // end src subdoc (inserts) loop -      <<ao_inserts_scan_post>> -    } -    auto scan_doc_source( -      char[][] markup_sourcefile_content, -      string fn_src -    ) { -      <<ao_doc_scan>> -      foreach (line; markup_sourcefile_content) { -        <<ao_doc_scan_loop>> -      } // end src doc loop -      <<ao_doc_scan_post>> -    } -  } -} -#+END_SRC diff --git a/org/ao_structs.org b/org/ao_structs.org deleted file mode 100644 index 9350eb5..0000000 --- a/org/ao_structs.org +++ /dev/null @@ -1,71 +0,0 @@ -#+TITLE: sdp structs -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:dev:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* structs                                                            :struct: -[[./sdp.org][sdp]] - -** initialize -#+name: structs -#+BEGIN_SRC d -/+ structs +/ - -mixin template Structs() { -  struct ObjHeading { -    string type; -    string lev; -    string lvn; -    string lcn; -  } -  struct ObjPara { -    string indent_first; -    string indent_second; -    string bullet; -  } -  struct ObjComment { -    // does not have .attrib; -    // does not have .ocn -  } -  struct ObjBlock { -  } -  struct ObjBlockOcnString { -    // does not have .attrib; -    string node; -  } -  struct ObjComposite { -    // size_t id; -    string use; -    string of; -    string is_a; -    string object; -    string ocn; -    string attrib; -    // int ocn; -    ObjHeading heading; -    ObjPara para; -    ObjBlock block; -    ObjBlockOcnString block_ocn_string; -  } -} -#+END_SRC - -* tangles                                                            :tangle: -** code structure:                                :ao_structs.d: -#+name: tangle_ao_structs -#+BEGIN_SRC d :tangle ../lib/sdp/ao_structs.d -/+ -  structs -  ao_structs.d -+/ -<<structs>> -#+END_SRC diff --git a/org/ao_utils.org b/org/ao_utils.org deleted file mode 100644 index 3e1e42d..0000000 --- a/org/ao_utils.org +++ /dev/null @@ -1,114 +0,0 @@ -#+TITLE: sdp utils -#+AUTHOR: Ralph Amissah -#+EMAIL: ralph.amissah@gmail.com -#+STARTUP: indent -#+LANGUAGE: en -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:ao: -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -* utils                                                               :utils: -[[./sdp.org][sdp]]  [[./][org/]] -** set colors for terminal                                  :colors:terminal: -#+name: ao_utils -#+BEGIN_SRC d -string[string] scr_txt_color = [ -  "off"           : "\033[0m", -  "white"         : "\033[37m", -  "white_bold"    : "\033[1m", -  "marker"        : "\033[42m", -  "bold"          : "\033[1m", -  "underline"     : "\033[4m", -  "invert"        : "\033[7m", -  "darkgrey_hi"   : "\033[100m", -  "grey_hi"       : "\033[47m", -  "pink_hi"       : "\033[105m", -  "fuchsia_hi"    : "\033[45m", -  "red_hi"        : "\033[41m", -  "orange_hi"     : "\033[101m", -  "yellow_hi"     : "\033[103m", -  "brown_hi"      : "\033[43m", -  "lightgreen_hi" : "\033[102m", -  "green_hi"      : "\033[42m", -  "cyan_hi"       : "\033[106m", -  "blue_hi"       : "\033[104m", -  "navy_hi"       : "\033[44m", -  "grey"          : "\033[90m", -  "pink"          : "\033[95m", -  "fuchsia"       : "\033[35m", -  "ruby"          : "\033[31m", -  "red"           : "\033[91m", -  "orange"        : "\033[91m", -  "yellow"        : "\033[93m", -  "brown"         : "\033[33m", -  "green"         : "\033[92m", -  "darkgreen"     : "\033[32m", -  "cyan"          : "\033[36m", -  "blue"          : "\033[94m", -  "navy"          : "\033[34m", -  "black"         : "\033[30m" -]; -string[string] scr_txt_marker = [ -  "white"         : "\033[37m*\033[0m ", -  "bold"          : "\033[1m*\033[0m ", -  "invert"        : "\033[7m*\033[0m ", -  "darkgrey_hi"   : "\033[100m*\033[0m ", -  "grey_hi"       : "\033[47m*\033[0m ", -  "pink_hi"       : "\033[105m*\033[0m ", -  "fuchsia_hi"    : "\033[45m*\033[0m ", -  "red_hi"        : "\033[41m*\033[0m ", -  "orange_hi"     : "\033[101m*\033[0m ", -  "yellow_hi"     : "\033[103m*\033[0m ", -  "brown_hi"      : "\033[43m*\033[0m ", -  "lightgreen_hi" : "\033[102m*\033[0m ", -  "green_hi"      : "\033[42m*\033[0m ", -  "cyan_hi"       : "\033[106m*\033[0m ", -  "blue_hi"       : "\033[104m*\033[0m ", -  "navy_hi"       : "\033[44m*\033[0m ", -  "grey"          : "\033[90m*\033[0m ", -  "pink"          : "\033[95m*\033[0m ", -  "fuchsia"       : "\033[35m*\033[0m ", -  "ruby"          : "\033[31m*\033[0m ", -  "red"           : "\033[91m*\033[0m ", -  "orange"        : "\033[91m*\033[0m ", -  "yellow"        : "\033[93m*\033[0m ", -  "brown"         : "\033[33m*\033[0m ", -  "green"         : "\033[92m*\033[0m ", -  "darkgreen"     : "\033[32m*\033[0m ", -  "cyan"          : "\033[36m*\033[0m ", -  "blue"          : "\033[94m*\033[0m ", -  "navy"          : "\033[34m*\033[0m ", -  "black"         : "\033[30m*\033[0m " -]; -#+END_SRC - -* code snippets, use as needed                           :code:snippet:debug: -** called from -#+BEGIN_SRC d  :tangle no -string functionName = __FUNCTION__, -string file = __FILE__, -size_t line = __LINE__) { -writefln("Called from function %s at file %s, line %s", -  functionName, file, line); -#+END_SRC      :tangle no -#+BEGIN_SRC d -writefln("Inside function %s at file %s, line %s", -  __FUNCTION__, __FILE__, __LINE__); -#+END_SRC -* tangles                                                            :tangle: -** code structure:                                                   :ao_util.d: -#+name: tangle_ao_utils -#+BEGIN_SRC d :tangle ../lib/sdp/ao_utils.d -/+ -  utils -  ao_util.d -+/ -mixin template ScreenTxtColors() { -  <<ao_utils>> -} -#+END_SRC diff --git a/org/compile_time_info.org b/org/compile_time_info.org index d733d0b..cc1ac62 100644 --- a/org/compile_time_info.org +++ b/org/compile_time_info.org @@ -89,13 +89,13 @@ version(D_LP64) {  #+END_SRC  * tangles                                                            :tangle: -** code structure                                                    :sdp.d: +** compile_time_info:                                                      :compile_time_info.d:  #+begin_src d  :tangle ../lib/sdp/compile_time_info.d  /+    compile_time_info    compile_time_info.d  +/ -mixin template CompileTimeInfo() { +template CompileTimeInfo() {    <<sdp_compile_time_info>>  }  #+end_src diff --git a/org/sdp.org b/org/sdp.org index e8e100a..e218b5c 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -12,12 +12,13 @@  #+FILETAGS: :sdp:rel:hub:  #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) -* sdp.d   sisu document parser  [[../maker.org][maker.org makefile]]  [[./][org/]] + +* sdp.d   sisu document parser                                       :sdp.d:  Deal with imports.  Take command line instructions and process files as instructed. -** TODO version, (version.txt) set version (with structure)         :version: +** TODO version.txt: set version                                    :version:  #+NAME: version_txt  #+BEGIN_SRC d @@ -29,36 +30,32 @@ struct Version {  enum ver = Version(1, 0, 0);  #+END_SRC -** imports                                                           :import: +** pre loop init +*** imports                                                          :import:  [[./compile_time_info.org][compile time info]]  [[./ao_abstract_doc_source.org][ao_abstract_doc_source]] -[[./ao_assertions.org][ao_assertions]] +[[./ao_ansi_colors.org][ao_ansi_colors]]  [[./ao_defaults.org][ao_defaults]] -[[./ao_emitter.org][ao_emitter]] -[[./ao_read_markup_source.org][ao_read_markup_source]] -[[./ao_object_setter.org][ao_object_setter]]  [[./ao_output_debugs.org][ao_output_debugs]] -[[./ao_rgx.org][ao_rgx]] -[[./ao_scan_inserts.org][ao_scan_inserts]] -[[./ao_structs.org][ao_structs]] -[[./ao_utils.org][ao_utils]] +[[./ao_read_source_files.org][ao_read_source_files]] -*** std                                                          :import:std: +**** std                                                      :import:std:  #+NAME: sdp_imports  #+BEGIN_SRC d  /+ sdp  sisu document parser +/ -import +private import +  std.getopt, +  std.process, +  std.stdio,    std.algorithm,    std.array,    std.container, -  std.file,    std.exception,    std.json,    // std.path, -  std.process,    std.range,    std.regex, -  std.stdio, +  // std.stdio,    std.string,    std.traits,    std.typecons, @@ -67,277 +64,255 @@ import    std.conv : to;  #+END_SRC -*** sdp                                                          :import:sdp: -**** TODO lib/sdp.d +**** sdp                                                      :import:sdp: +***** TODO lib/sdp.d + +├── lib_ +│   ├── sdp.d +    ├── version.txt +    └── sdp +        ├── ao_abstract_doc_source.d +        ├── ... +        └── compile_time_info.d +  #+NAME: sdp_imports_use  #+BEGIN_SRC d  /+ sdp  sisu document parser +/  import    lib.sdp.compile_time_info,            // sdp/compile_time_info.d    lib.sdp.ao_abstract_doc_source,       // sdp/ao_abstract_doc_source.d -  lib.sdp.ao_assertions,                // sdp/ao_assertions.d    lib.sdp.ao_defaults,                  // sdp/ao_defaults.d -  lib.sdp.ao_emitter,                   // sdp/ao_emitter.d -  lib.sdp.ao_read_markup_source,        // sdp/ao_read_markup_source.d -  lib.sdp.ao_object_setter,             // sdp/ao_object_setter.d +  lib.sdp.ao_read_source_files,         // sdp/ao_read_source_files.d    lib.sdp.ao_output_debugs,             // sdp/ao_output_debugs.d    lib.sdp.ao_rgx,                       // sdp/ao_rgx.d -  lib.sdp.ao_scan_inserts,              // sdp/ao_scan_inserts.d -  lib.sdp.ao_structs,                   // sdp/ao_structs.d -  lib.sdp.ao_utils;                     // sdp/ao_utils.d +  lib.sdp.ao_ansi_colors;               // sdp/ao_ansi_colors.d    // std.conv;  #+END_SRC -**** TODO lib/sdp/std.d (rdmd)                                         :rdmd: +***** TODO lib/sdp/std.d (rdmd)                                    :rdmd: + +├── lib_ +│   └── sdp +        ├── ao_abstract_doc_source.d +        ├── ... +        ├── compile_time_info.d +        ├── sdp.d +        └── version.txt +  #+NAME: sdp_imports_rdmd  #+BEGIN_SRC d  /+ sdp  sisu document parser +/  import    compile_time_info,            // compile_time_info.d    ao_abstract_doc_source,       // ao_abstract_doc_source.d -  ao_assertions,                // ao_assertions.d    ao_defaults,                  // ao_defaults.d -  ao_emitter,                   // ao_emitter.d -  ao_read_markup_source,        // sdp/ao_read_markup_source.d -  ao_object_setter,             // ao_object_setter.d +  ao_read_source_files,         // ao_read_source_files.d    ao_output_debugs,             // ao_output_debugs.d    ao_rgx,                       // ao_rgx.d -  ao_scan_inserts,              // ao_scan_inserts.d -  ao_structs,                   // ao_structs.d -  ao_utils;                     // ao_utils.d +  ao_ansi_colors;               // ao_ansi_colors.d    // std.conv;  #+END_SRC -*** version.txt                                                     :version: +**** version.txt                                                 :version: +  #+NAME: sdp_version_mixin  #+BEGIN_SRC d -// import std.stdio;  mixin(import("version.txt"));  #+END_SRC -** argv [+3]                                                           :argv: -*** argv mixins & init -#+NAME: sdp_argv +*** mixin                                                             :mixin: + +#+NAME: sdp_args  #+BEGIN_SRC d  mixin SiSUheader;  mixin SiSUbiblio;  mixin SiSUrgxInitFlags;  mixin SiSUmarkupRaw; -mixin SiSUdocInserts;  mixin SiSUdocAbstraction;  mixin SiSUoutputDebugs;  mixin ScreenTxtColors; -auto cli = CLI(); +#+END_SRC + +*** init                                                               :init: + +#+NAME: sdp_args +#+BEGIN_SRC d  auto raw = MarkupRaw();  auto abs = Abstraction();  auto dbg = SDPoutputDebugs(); -// struct DocumentParts { -//   string[string][] contents; -//   JSONValue[string] metadata_json; -//   JSONValue[string] make_json; -//   string[][string][string] bookindex_unordered_hashes; -//   JSONValue[] biblio; -// } +/+ +struct DocumentParts { +  string[string][] contents; +  JSONValue[string] metadata_json; +  JSONValue[string] make_json; +  string[][string][string] bookindex_unordered_hashes; +  JSONValue[] biblio; +} ++/  string[] fns_src;  string flag_action; -string[string] actions; -actions = [ -  "assert"  : "yes", -]; +string arg_unrecognized;  auto rgx = Rgx(); +#+END_SRC + +*** scope                                                             :scope: + +#+NAME: sdp_args +#+BEGIN_SRC d  scope(success) {    debug(checkdoc) {      writefln(        "%s~ run complete, ok ~ %s (sdp-%s.%s.%s, %s v%s, %s %s)", -      scr_txt_color["cyan"], -      scr_txt_color["off"], -      ver.major, -      ver.minor, -      ver.patch, -      __VENDOR__, -      __VERSION__, -      bits, -      os, +      scr_txt_color["cyan"], scr_txt_color["off"], +      ver.major, ver.minor, ver.patch, +      __VENDOR__, __VERSION__, +      bits, os,      );    }    // stderr.writeln("0");  }  scope(failure) { - debug(checkdoc) { -   writefln( -     "%s~ run failure ~%s", -      scr_txt_color["fuchsia"], -      scr_txt_color["off"], -   ); - } -  // stderr.writeln("1"); -} -scope(exit) {    debug(checkdoc) { -    writefln( -      "(%s  v%s)", -      __VENDOR__, -      __VERSION__, +    stderr.writefln( +      "%s~ run failure ~%s", +       scr_txt_color["fuchsia"], scr_txt_color["off"],      );    }  }  #+END_SRC -*** argv loop -#+NAME: sdp_argv +*** getopt args for loop                                        :args:getopt: + +look into using getopt +[[http://dlang.org/phobos/std_getopt.html][getopt]] +[[http://dlang.org/library/std/getopt.html][getopt]] + +#+NAME: sdp_args  #+BEGIN_SRC d -foreach(cmdlnins; argv) { -  if (match(cmdlnins, rgx.flag_action)) { -    flag_action ~= " " ~ cmdlnins; -    actions = cli.extract_actions(cmdlnins, actions); -  } else if (match(cmdlnins, rgx.src_pth)) { -    fns_src ~= cmdlnins; + +bool[string] opt_action_bool = [ +  "assertions"          : false, +  "html"                : false, +  "no_obj_cite_number"  : false, +  "verbose"             : false, +]; +auto helpInfo = getopt(args, +  std.getopt.config.passThrough, +  "assert",    "--assert set optional assertions on",          &opt_action_bool["assertions"], +  "html",      "--html process html output",                   &opt_action_bool["html"], +  "no-ocn",    "--no-ocn suppress object cite number output",  &opt_action_bool["no_obj_cite_number"], +  "verbose|v", "--verbose output to terminal",                 &opt_action_bool["verbose"], +); +if (helpInfo.helpWanted) { +  defaultGetoptPrinter("Some information about the program.", helpInfo.options); +} +foreach(arg; args) { +  if (match(arg, rgx.flag_action)) { +    flag_action ~= " " ~ arg;   // flags not taken by getopt +  } else if (match(arg, rgx.src_pth)) { +    fns_src ~= arg;             // gather input markup source file names for processing +  } else {                      // anything remaining, unused +    arg_unrecognized ~= " " ~ arg;    }  }  #+END_SRC -*** each file [+2]                                                     :file: -**** filename provided [+1] -***** scope                                                           :scope: +** loop each file [+2]                                           :loop:files: +*** filename provided [+1]                                     :file:process: +**** loop scope                                                       :scope:  #+NAME: sdp_each_file_do  #+BEGIN_SRC d  scope(success) {    debug(checkdoc) {      writefln( -      "%s~ document complete, ok ~%s %s", -      scr_txt_color["green"], -      scr_txt_color["off"], -      fn_src +      "%s~ document complete, ok ~%s", +      scr_txt_color["green"], scr_txt_color["off"],      );    }    // stderr.writeln("0");  }  scope(failure) {    debug(checkdoc) { -    writefln( +    stderr.writefln(        "%s~ document run failure ~%s (%s  v%s)\n\t%s", -      scr_txt_color["red"], -      scr_txt_color["off"], -      __VENDOR__, -      __VERSION__, +      scr_txt_color["red"], scr_txt_color["off"], +      __VENDOR__, __VERSION__,        fn_src      );    }    // stderr.writeln("1");  } -scope(exit) { -  debug(checkdoc) { -    writeln( -      fn_src -    ); -  } -}  enforce(    match(fn_src, rgx.src_pth),    "not a sisu markup filename"  );  #+END_SRC -***** read file                                                   :file:read: +**** [#A] read file                                               :file:read:  [[./ao_markup_source_raw.org][ao_markup_source_raw]]  #+NAME: sdp_each_file_do  #+BEGIN_SRC d -auto markup_sourcefile_content = -  raw.markupSourceContentRawLineArray(fn_src); // alternative call -  // raw.markupSourceLineArray(raw.markupSourceString(fn_src)); // alternative calls (milliseconds faster?) -debug(insert) { -  string[string] sysenv; -  sysenv["pwd"] = shell("pwd"); -  writeln(sysenv["pwd"]); -  auto m = match(fn_src, rgx.src_pth); -  // auto m = match(fn_src, rgx.src_pth); -  auto markup_src_file_path = m.captures[1]; -  writefln( -    "markup source file path: %s", -    markup_src_file_path -  ); // writeln(m.captures[1]); -  writeln(m.captures[2]); -} +/+ ↓ read file +/ +auto sourcefile_content = +  raw.sourceContent(fn_src);  #+END_SRC -****** incorporate any inserts -[[./ao_scan_inserts.org][ao_scan_inserts]] - +**** [#A] processing: document abstraction, tuple                :processing:  #+NAME: sdp_each_file_do  #+BEGIN_SRC d -if (match(fn_src, rgx.src_fn_master)) { -/+ if master file .ssm -  scan document source for document imports -  (inserted sub-documents) -+/ -  auto ins = Inserts(); -  markup_sourcefile_content = -    ins.scan_doc_source(markup_sourcefile_content, fn_src); -} else if (!match(fn_src, rgx.src_fn)) { -  writeln("not a recognized filename"); -} -debug(raw) { -  foreach (line; markup_sourcefile_content) { -    writeln(line); -  } -} -#+END_SRC - -***** send for processing                                        :processing: -#+NAME: sdp_each_file_do -#+BEGIN_SRC d -/+ process document ao_abstract_doc_source -  SiSUdocAbstraction::Abstraction -  return abstraction as tuple -+/ +/+ ↓ porcess document, return abstraction as tuple +/  auto t = -  abs.abstract_doc_source(markup_sourcefile_content); +  abs.abstract_doc_source(sourcefile_content);  static assert(!isTypeTuple!(t)); -auto contents = t[0]; -// static assert(!isIterable!(contents)); -auto metadata_json = t[1]; -auto make_json = t[2]; -auto bookindex_unordered_hashes = t[3]; -auto biblio = t[4]; +auto doc_ao_contents = t[0]; // contents ~ endnotes ~ bookindex; +// static assert(!isIterable!(doc_ao_contents)); +auto doc_ao_metadata_json = t[1]; +auto doc_ao_make_json = t[2]; +auto doc_ao_bookindex_unordered_hashes = t[3]; +auto doc_ao_biblio = t[4];  // destroy(t);  #+END_SRC -***** debug document parts (checkdoc) +**** debug document parts (checkdoc)                                  :debug:  #+NAME: sdp_each_file_do  #+BEGIN_SRC d -// DocumentParts -debug(checkdoc) { +/+ ↓ document parts +/ +debug(checkdoc) { // checkbook & dumpdoc    dbg.abstract_doc_source_debugs( -    contents, -    make_json, -    metadata_json, -    bookindex_unordered_hashes, -    biblio, +    doc_ao_contents, +    doc_ao_make_json, +    doc_ao_metadata_json, +    doc_ao_bookindex_unordered_hashes, +    doc_ao_biblio,      fn_src, -    actions +    opt_action_bool    );  } -// compose abstract document markup state -// append book index  #+END_SRC -***** on exit +**** on exit                                                     :scope:exit:  #+NAME: sdp_each_file_do  #+BEGIN_SRC d  scope(exit) { -  destroy(markup_sourcefile_content); +  debug(checkdoc) { +    writefln( +      "processed file: %s", +      fn_src +    ); +  } +  destroy(sourcefile_content);    destroy(t); -  destroy(contents); -  destroy(make_json); -  destroy(metadata_json); -  destroy(bookindex_unordered_hashes); +  destroy(doc_ao_contents); +  destroy(doc_ao_make_json); +  destroy(doc_ao_metadata_json); +  destroy(doc_ao_bookindex_unordered_hashes); +  destroy(doc_ao_biblio);    destroy(fn_src); -  destroy(biblio);  }  #+END_SRC -**** no filename provided +*** no filename provided  #+NAME: sdp_no_filename_provided  #+BEGIN_SRC d  /+ no recognized filename provided +/ @@ -346,9 +321,26 @@ break;  // terminate, stop  #+END_SRC -* tangles                                                            :tangle: -** sdp code structure                                                    :sdp.d: +* tangles (code structure)                                           :tangle: +** sdp                                                              :sdp.d:  *** TODO lib/sdp.d + +├── lib_ +│   ├── sdp.d +    ├── version.txt +    └── sdp +        ├── ao_abstract_doc_source.d +        ├── ... +        └── compile_time_info.d + +├── lib_ +│   ├── sdp +    │   ├── ao_abstract_doc_source.d +    │   ├── ... +    │   └── compile_time_info.d +    ├── sdp.d +    └── version.txt +  #+BEGIN_SRC d  :tangle ../lib/sdp.d :shebang #!/usr/bin/env rdmd  /+    sdp @@ -358,10 +350,48 @@ break;  <<sdp_imports_use>>  <<sdp_version_mixin>>  mixin CompileTimeInfo; -mixin RgxInit; mixin Emitters; -void main(string[] argv) { +mixin RgxInit; +void main(string[] args) { +  <<sdp_compilation>> +  <<sdp_args>> +  foreach(fn_src; fns_src) { +  // foreach(fn_src; fns_src) { +    if (!empty(fn_src)) { +      <<sdp_each_file_do>> +    } else { +      <<sdp_no_filename_provided>> +    } +  } +} +#+END_SRC + +*** TODO lib/sdp/sdp.d                                                 :rdmd: + +├── lib_ +│   └── sdp +        ├── ao_abstract_doc_source.d +        ├── ... +        ├── compile_time_info.d +        ├── sdp.d +        └── version.txt + +rdmd needs different paths (simple structure) to build, this solution could be +used by both but so far I prefer the other for dmd & ldc + +#+BEGIN_SRC d  :tangle ../lib/sdp/sdp.d :shebang #!/usr/bin/env rdmd +// [used by rdmd] +/+ +  sdp +  sdp.d ++/ +<<sdp_imports>> +<<sdp_imports_rdmd>> +<<sdp_version_mixin>> +mixin CompileTimeInfo; +mixin RgxInit; +void main(string[] args) {    <<sdp_compilation>> -  <<sdp_argv>> +  <<sdp_args>>    foreach(fn_src; fns_src) {      if (!empty(fn_src)) {        <<sdp_each_file_do>> @@ -370,7 +400,7 @@ void main(string[] argv) {      }    }  } -#+end_src +#+END_SRC  ** version.txt                                                      :version: @@ -386,3 +416,33 @@ void main(string[] argv) {  // [used by rdmd]  <<version_txt>>  #+END_SRC +* TODO work on +- figure out best program dir structure, issue with rdmd + +|---------------------+------------------------------------------+------------------------+--------| +| header              | sisu /header markup/                       | markup                 |        | +| - metadata          |                                          |                        |        | +| - make instructions |                                          |                        |        | +|---------------------+------------------------------------------+------------------------+--------| +| table of contents   | markup of headings                       |                        | output | +|---------------------+------------------------------------------+------------------------+--------| +| substantive content | sisu /content markup/                      | markup                 | output | +|                     | headings (providing document structure), | (regular content)      |        | +|                     | paragraphs, blocks                       |                        |        | +|                     | blocks (code, poem, group, table)        |                        |        | +|---------------------+------------------------------------------+------------------------+--------| +| endnotes            | markup within substantive content        | markup                 | output | +|                     | (extracted from sisu /content markup/)     | (from regular content) |        | +|---------------------+------------------------------------------+------------------------+--------| +| glossary            | identify special section                 | markup                 | output | +|                     | regular /content markup/                   |                        |        | +|---------------------+------------------------------------------+------------------------+--------| +| bibliography        | identify section,                        | markup (special)       | output | +|                     | special /bibliography markup/              |                        |        | +|---------------------+------------------------------------------+------------------------+--------| +| book index          | extracted from markup attached to        | markup                 | output | +|                     | related substantive content objects      |                        |        | +|                     | (special tags in sisu /content markup/)    | (from regular content) |        | +|---------------------+------------------------------------------+------------------------+--------| +| metadata            |                                          | (from regular header)  | output | +|---------------------+------------------------------------------+------------------------+--------|  | 
