diff options
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 | +|---------------------+------------------------------------------+------------------------+--------| |