diff options
Diffstat (limited to 'src/doc_reform/meta/metadoc_from_src.d')
-rw-r--r-- | src/doc_reform/meta/metadoc_from_src.d | 761 |
1 files changed, 264 insertions, 497 deletions
diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d index 99e834d..6b6714d 100644 --- a/src/doc_reform/meta/metadoc_from_src.d +++ b/src/doc_reform/meta/metadoc_from_src.d @@ -5,7 +5,7 @@ +/ module doc_reform.meta.metadoc_from_src; template DocReformDocAbstraction() { - /+ ↓ abstraction imports +/ + /+ ↓ abstraction imports +/ import doc_reform.meta; import std.algorithm, @@ -17,11 +17,11 @@ template DocReformDocAbstraction() { doc_reform.meta.defaults, doc_reform.meta.object_setter, doc_reform.meta.rgx; - /+ ↓ abstraction mixins +/ + /+ ↓ abstraction mixins +/ mixin ObjectSetter; mixin InternalMarkup; mixin DocReformRgxInit; - /+ ↓ abstraction struct init +/ + /+ ↓ abstraction struct init +/ /+ initialize +/ ObjGenericComposite[] the_table_of_contents_section; ObjGenericComposite[] the_document_head_section, the_document_body_section, the_bibliography_section, the_glossary_section, the_blurb_section; @@ -90,9 +90,9 @@ template DocReformDocAbstraction() { int[] dom_structure_collapsed_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; int[] dom_structure_collapsed_tags_status_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; enum DomTags { none, open, close, close_and_open, open_still, } - pure auto obj_heading_ancestors(O)( - O obj, - string[] lv_ancestors_txt, + pure ObjGenericComposite obj_heading_ancestors()( + ObjGenericComposite obj, + string[] lv_ancestors_txt, ) { switch (obj.metainfo.heading_lev_markup) { case 0: @@ -143,10 +143,10 @@ template DocReformDocAbstraction() { } return obj; } - pure auto obj_dom_structure_set_markup_tags(O)( - O obj, - int[] dom, - int lev + pure ObjGenericComposite obj_dom_structure_set_markup_tags()( + ObjGenericComposite obj, + int[] dom, + int lev ) { foreach (i; 0 .. 8) { if (i < lev) { @@ -187,10 +187,10 @@ template DocReformDocAbstraction() { obj.metainfo.dom_structure_markedup_tags_status = dom.dup; return obj; } - pure auto obj_dom_set_collapsed_tags(O)( - O obj, - int[] dom, - int lev + pure ObjGenericComposite obj_dom_set_collapsed_tags()( + ObjGenericComposite obj, + int[] dom, + int lev ) { foreach (i; 0 .. 8) { if (i < lev) { @@ -245,7 +245,7 @@ template DocReformDocAbstraction() { } return line; } - static auto links_and_images(L)(L obj_txt) { + static string links_and_images()(string obj_txt) { static auto rgx = Rgx(); static auto mkup = InlineMarkup(); if (obj_txt.match(rgx.smid_inline_url_generic)) { @@ -292,10 +292,10 @@ template DocReformDocAbstraction() { ObjGenericComposite comp_obj_heading, comp_obj_location, comp_obj_block, comp_obj_code, comp_obj_poem_ocn, comp_obj_comment; auto node_construct = NodeStructureMetadata(); enum sObj { content, anchor_tag, notes_reg, notes_star, links, image_no_dimensions } - auto inline_para_link_anchor(O,St,TA)( - O an_object, - St tag_in_seg, - TA tag_assoc + string[string][string] inline_para_link_anchor()( + string[string] an_object, + string[string] tag_in_seg, + string[string][string] tag_assoc ) { static auto rgx = Rgx(); if (auto m = an_object["substantive"].match(rgx.inline_link_anchor)) { @@ -308,19 +308,16 @@ template DocReformDocAbstraction() { } return tag_assoc; } - /+ ↓ abstract marked up document +/ - auto DocReformDocAbstraction(Src,CMM,Opt,Mfst)( - Src markup_sourcefile_content, - CMM conf_make_meta, - Opt opt_action, - Mfst manifest_matter, - bool _new_doc + /+ ↓ abstract marked up document +/ + auto DocReformDocAbstraction(CMM,Opt,Mf)( + char[][] markup_sourcefile_content, + CMM conf_make_meta, + Opt opt_action, + Mf manifest_matter, + bool _new_doc ) { static auto rgx = Rgx(); - debug(asserts) { - static assert(is(typeof(markup_sourcefile_content) == char[][])); - } - /+ ↓ abstraction init +/ + /+ ↓ abstraction init +/ scope(success) { } scope(failure) { @@ -397,7 +394,7 @@ template DocReformDocAbstraction() { "h_3": "^(none)", "h_4": "^(none)" ]; - auto heading_match_rgx = [ + Regex!char[string] heading_match_rgx = [ "h_A": regex(r"^(none)"), "h_B": regex(r"^(none)"), "h_C": regex(r"^(none)"), @@ -445,7 +442,7 @@ template DocReformDocAbstraction() { string[][string] lev4_subtoc; string[][string] segnames = ["html": ["toc"], "epub": ["toc"]]; int cnt1 = 1; int cnt2 = 1; int cnt3 = 1; - /+ abstraction init ↑ +/ + /+ abstraction init ↑ +/ enum Substitute { match, markup, } debug (substitutions) { writeln(__LINE__, ":", __FILE__, ": DEBUG substitutions:"); @@ -471,10 +468,10 @@ template DocReformDocAbstraction() { writeln("substitution to make: ", conf_make_meta.make.italics[Substitute.markup]); } } - /+ ↓ ↻ loop markup document/text line by line +/ + /+ ↓ ↻ loop markup document/text line by line +/ srcDocLoop: - foreach (line; markup_sourcefile_content) { /+ ↓ markup document/text line by line +/ - // "line" variable can be empty but should never be null + foreach (line; markup_sourcefile_content) { /+ ↓ markup document/text line by line +/ + // "line" variable can be empty but should never be null /+ scope +/ scope(exit) { } @@ -504,9 +501,9 @@ template DocReformDocAbstraction() { /+ block object: code +/ line.flow_txt_block_code(an_object, obj_type_status); continue; - } else if (!matchFirst(line, rgx.skip_from_regular_parse)) { /+ object other than "code block" object +/ - /+ (includes regular text paragraph, headings & blocks other than code) +/ - /+ heading, glossary, blurb, poem, group, block, quote, table +/ + } else if (!matchFirst(line, rgx.skip_from_regular_parse)) { /+ object other than "code block" object +/ + /+ (includes regular text paragraph, headings & blocks other than code) +/ + /+ heading, glossary, blurb, poem, group, block, quote, table +/ line = line.inline_markup_faces; // by text line (rather than by text object), linebreaks in para problematic if ((line.matchFirst(rgx.heading_biblio) && obj_type_status["para"] != State.on @@ -806,7 +803,7 @@ template DocReformDocAbstraction() { } else if (obj_type_status["table"] == TriState.on) { /+ within block object: table +/ an_object = line.flow_txt_block_table(an_object, obj_type_status, conf_make_meta); continue; - } else { /+ not within a block group +/ + } else { /+ not within a block group +/ assert( (obj_type_status["blocks"] == TriState.off) || (obj_type_status["blocks"] == TriState.closing), @@ -821,8 +818,8 @@ template DocReformDocAbstraction() { } line.flow_txt_block_start(obj_type_status, dochas, object_number_poem); continue; - } else if (!line.empty) { /+ line not empty +/ - /+ non blocks (headings, paragraphs) & closed blocks +/ + } else if (!line.empty) { /+ line not empty +/ + /+ non blocks (headings, paragraphs) & closed blocks +/ assert( !line.empty, "line tested, line not empty surely:\n \"" ~ line ~ "\"" @@ -914,7 +911,7 @@ template DocReformDocAbstraction() { ++line_occur["para"]; } } - } else if (obj_type_status["blocks"] == TriState.closing) { /+ line empty, with blocks flag +/ + } else if (obj_type_status["blocks"] == TriState.closing) { /+ line empty, with blocks flag +/ an_object = line.flow_block_flag_line_empty_( an_object, bookindex_extract_hash, @@ -928,7 +925,7 @@ template DocReformDocAbstraction() { conf_make_meta, tag_in_seg, ); - } else { /+ line.empty, post contents, empty variables: +/ + } else { /+ line.empty, post contents, empty variables: +/ assert( line.empty, "\nline should be empty:\n \"" @@ -1127,9 +1124,9 @@ template DocReformDocAbstraction() { } else { // could be useful to test line variable should be empty and never null } - } // close else for line empty - } // close else for not the above - } // close after non code, other blocks or regular text + } // close else for line empty + } // close else for not the above + } // close after non code, other blocks or regular text /+ unless (the_document_body_section.length == 0) ? +/ if (the_document_body_section.length > 0) { if (((the_document_body_section[$-1].metainfo.is_a == "para") @@ -1175,8 +1172,8 @@ template DocReformDocAbstraction() { previous_length = the_document_body_section.length.to!int; } } - } /+ ← srcDocLoop closed: loop markup document/text line by line +/ - /+ ↓ post loop markup document/text +/ + } /+ ← srcDocLoop closed: loop markup document/text line by line +/ + /+ ↓ post loop markup document/text +/ auto en_tuple = note_section.endnote_objects(obj_cite_digits, opt_action); static assert(!isTypeTuple!(en_tuple)); @@ -1709,7 +1706,7 @@ template DocReformDocAbstraction() { } html_segnames_ptr_cntr++; } - auto get_decendants(S)(S document_sections) { + auto get_decendants()(ObjGenericComposite[] document_sections) { int[string] _heading_ocn_decendants; string[] _ocn_open_key = ["","","","","","","",""]; auto _doc_sect_length = document_sections.length - 1; @@ -1757,7 +1754,7 @@ template DocReformDocAbstraction() { return pairs.sort; } string[] _images; - auto extract_images(S)(S content_block) { + string[] extract_images()(string content_block) { string[] images_; if (auto m = content_block.matchAll(rgx.image)) { images_ ~= m.captures[1]; @@ -2267,7 +2264,7 @@ template DocReformDocAbstraction() { comp_obj_heading_ = comp_obj_heading_.obj_dom_set_collapsed_tags(dom_structure_collapsed_tags_status, 0); comp_obj_heading_ = comp_obj_heading_.obj_heading_ancestors(lv_ancestors_txt); // the_dom_tail_section ~= comp_obj_heading_; // remove tail for now, decide on later - auto document_the = [ + ObjGenericComposite[][string] document_the = [ "head": the_document_head_section, "toc": the_table_of_contents_section, /+ substantive/body: +/ @@ -2317,8 +2314,8 @@ template DocReformDocAbstraction() { document_section_keys_sequenced["scroll"] ~= "tail"; document_section_keys_sequenced["seg"] ~= "tail"; } - auto segnames_4 = segnames["html"].dup; - auto segnames_lv1_to_4 = segnames["epub"].dup; + string[] segnames_4 = segnames["html"].dup; + string[] segnames_lv1_to_4 = segnames["epub"].dup; debug(segnames) { writeln("segnames_lv4: ", segnames_4); writeln("segnames_lv1_to_4: ", segnames_lv1_to_4); @@ -2400,13 +2397,10 @@ template DocReformDocAbstraction() { doc_has, ); return t; - /+ post loop markup document/text ↑ +/ - } /+ ← closed: abstract doc source +/ - /+ ↓ abstraction functions +/ - static auto object_reset(O)(O an_object) { - debug(asserts) { - static assert(is(typeof(an_object) == string[string])); - } + /+ post loop markup document/text ↑ +/ + } /+ ← closed: abstract doc source +/ + /+ ↓ abstraction functions +/ + static string[string] object_reset()(string[string] an_object) { an_object.remove("body_nugget"); an_object.remove("substantive"); an_object.remove("is"); @@ -2414,30 +2408,21 @@ template DocReformDocAbstraction() { an_object.remove("bookindex_nugget"); return an_object; } - auto flow_common_reset_(L,O,T)( - return ref L line_occur, - return ref O an_object, - return ref T obj_type_status + void flow_common_reset_()( + return ref int[string] line_occur, + return ref string[string] an_object, + return ref int[string] obj_type_status, ) { - debug(asserts) { - static assert(is(typeof(line_occur) == int[string])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } line_occur["heading"] = State.off; line_occur["para"] = State.off; obj_type_status["heading"] = State.off; obj_type_status["para"] = State.off; an_object = an_object.object_reset; } - static auto _check_ocn_status_(L,T)( - L line, - T obj_type_status + static int[string] _check_ocn_status_()( + char[] line, + int[string] obj_type_status, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (!(line.empty) && (obj_type_status["ocn_status_off_for_multiple_objects"] == OCN_off_block_status.off) @@ -2493,13 +2478,10 @@ template DocReformDocAbstraction() { } return obj_type_status; } - auto _doc_header_and_make_substitutions_(L,CMM)( - L line, - CMM conf_make_meta, + char[] _doc_header_and_make_substitutions_(CMM)( + char[] line, + CMM conf_make_meta, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - } enum Substitute { match, markup, } if (conf_make_meta.make.substitute) { foreach(substitution_pair; conf_make_meta.make.substitute) { @@ -2511,13 +2493,10 @@ template DocReformDocAbstraction() { } return line; } - auto _doc_header_and_make_substitutions_fontface_(L,CMM)( - L line, - CMM conf_make_meta, + char[] _doc_header_and_make_substitutions_fontface_(CMM)( + char[] line, + CMM conf_make_meta, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - } enum Substitute { match, markup, } if ( conf_make_meta.make.bold) { line = line.replaceAll( @@ -2539,17 +2518,12 @@ template DocReformDocAbstraction() { } return line; } - void flow_txt_block_start(L,T,N)( - L line, - return ref T obj_type_status, + void flow_txt_block_start()( + char[] line, + return ref int[string] obj_type_status, return ref uint[string] dochas, - return ref N object_number_poem + return ref string[string] object_number_poem ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(obj_type_status) == int[string])); - static assert(is(typeof(object_number_poem) == string[string])); - } static auto rgx = Rgx(); if (auto m = line.matchFirst(rgx.block_curly_code_open)) { dochas["codeblock"]++; @@ -2730,16 +2704,11 @@ template DocReformDocAbstraction() { obj_type_status["tic_table"] = TriState.on; } } - auto flow_txt_block_quote(L,O,T)( - L line, - O an_object, - return ref T obj_type_status + string[string] flow_txt_block_quote()( + char[] line, + string[string] an_object, + return ref int[string] obj_type_status ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (obj_type_status["curly_quote"] == TriState.on) { if (line.matchFirst(rgx.block_curly_quote_close)) { @@ -2774,16 +2743,11 @@ template DocReformDocAbstraction() { } return an_object; } - auto flow_txt_block_group(L,O,T)( - L line, - O an_object, - return ref T obj_type_status + string[string] flow_txt_block_group()( + char[] line, + string[string] an_object, + return ref int[string] obj_type_status ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (obj_type_status["curly_group"] == State.on) { if (line.matchFirst(rgx.block_curly_group_close)) { @@ -2818,16 +2782,11 @@ template DocReformDocAbstraction() { } return an_object; } - auto flow_txt_block_block(L,O,T)( - L line, - O an_object, - return ref T obj_type_status + string[string] flow_txt_block_block()( + char[] line, + string[string] an_object, + return ref int[string] obj_type_status ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (obj_type_status["curly_block"] == TriState.on) { if (line.matchFirst(rgx.block_curly_block_close)) { @@ -2862,22 +2821,15 @@ template DocReformDocAbstraction() { } return an_object; } - auto flow_txt_block_poem(L,O,T,C,N,CMM,Ts)( - L line, - O an_object, - return ref T obj_type_status, - return ref C cntr, - N object_number_poem, - CMM conf_make_meta, - Ts tag_in_seg, + string[string] flow_txt_block_poem(CMM)( + char[] line, + string[string] an_object, + return ref int[string] obj_type_status, + return ref int cntr, + string[string] object_number_poem, + CMM conf_make_meta, + string[string] tag_in_seg, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - static assert(is(typeof(cntr) == int)); - static assert(is(typeof(object_number_poem) == string[string])); - } static auto rgx = Rgx(); if (obj_type_status["curly_poem"] == TriState.on) { if (line.matchFirst(rgx.block_curly_poem_close)) { @@ -3111,16 +3063,11 @@ template DocReformDocAbstraction() { } return an_object; } - void flow_txt_block_code(L,O,T)( - L line, - return ref O an_object, - return ref T obj_type_status + void flow_txt_block_code()( + char[] line, + return ref string[string] an_object, + return ref int[string] obj_type_status ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (obj_type_status["curly_code"] == TriState.on) { if (line.matchFirst(rgx.block_curly_code_close)) { @@ -3158,17 +3105,12 @@ template DocReformDocAbstraction() { } } } - auto flow_txt_block_table(L,O,T,CMM)( - L line, - O an_object, - return ref T obj_type_status, - return ref CMM conf_make_meta, + string[string] flow_txt_block_table(CMM)( + char[] line, + string[string] an_object, + return ref int[string] obj_type_status, + return ref CMM conf_make_meta, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (obj_type_status["curly_table"] == TriState.on) { if (line.matchFirst(rgx.block_curly_table_close)) { @@ -3221,10 +3163,7 @@ template DocReformDocAbstraction() { } return an_object; } - final string biblio_tag_map(A)(A abr) { - debug(asserts) { - static assert(is(typeof(abr) == string)); - } + final string biblio_tag_map()(string abr) { auto btm = [ "au" : "author_raw", "ed" : "editor_raw", @@ -3413,7 +3352,7 @@ template DocReformDocAbstraction() { processing.remove("verse"); ++cntr; } - auto flow_block_flag_line_empty_(B,N,CMM,Ts)( + string[string] flow_block_flag_line_empty_(B,N,CMM,Ts)( char[] line, string[string] an_object, B bookindex_extract_hash, @@ -3721,19 +3660,13 @@ template DocReformDocAbstraction() { } return an_object; } - auto flow_book_index_(L,I,O,T,B)( - L line, - O an_object, - I book_idx_tmp, - return ref T obj_type_status, - B opt_action, + string[string] flow_book_index_(B)( + char[] line, + string[string] an_object, + return ref string book_idx_tmp, + return ref int[string] obj_type_status, + B opt_action, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(book_idx_tmp) == string)); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (auto m = line.match(rgx.book_index)) { /+ match book_index +/ debug(bookindexmatch) { @@ -3777,20 +3710,13 @@ template DocReformDocAbstraction() { } return an_object; } - auto flow_heading_found_(L,H,X,R,T)( - L line, - H heading_match_str, - X _make_unmarked_headings, - return ref R heading_match_rgx, - return ref T obj_type_status + string[string] flow_heading_found_()( + char[] line, + string[string] heading_match_str, + string[] _make_unmarked_headings, + return ref Regex!(char)[string] heading_match_rgx, + return ref int[string] obj_type_status ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(_make_unmarked_headings) == string[])); - static assert(is(typeof(heading_match_str) == string[string])); - static assert(is(typeof(heading_match_rgx) == Regex!(char)[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if ((_make_unmarked_headings.length > 2) && (obj_type_status["make_headings"] == State.off)) { /+ headings found +/ @@ -3865,18 +3791,12 @@ template DocReformDocAbstraction() { } return heading_match_str; } - auto flow_heading_make_set_(L,C,R,T)( - L line, - C line_occur, - return ref R heading_match_rgx, - return ref T obj_type_status + char[] flow_heading_make_set_()( + char[] line, + int[string] line_occur, + return ref Regex!(char)[string] heading_match_rgx, + return ref int[string] obj_type_status ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(line_occur) == int[string])); - static assert(is(typeof(heading_match_rgx) == Regex!(char)[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } if ((obj_type_status["make_headings"] == State.on) && ((line_occur["para"] == State.off) && (line_occur["heading"] == State.off)) @@ -3927,25 +3847,16 @@ template DocReformDocAbstraction() { } return line; } - auto flow_heading_matched_(L,C,O,K,Lv,Lc,T,CMM)( - L line, - O an_object, - return ref C line_occur, - return ref K an_object_key, - return ref Lv lv, - return ref Lc collapsed_lev, - return ref T obj_type_status, - return ref CMM conf_make_meta, + string[string] flow_heading_matched_(CMM)( + char[] line, + string[string] an_object, + return ref int[string] line_occur, + return ref string an_object_key, + return ref int[string] lv, + return ref int[string] collapsed_lev, + return ref int[string] obj_type_status, + return ref CMM conf_make_meta, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(line_occur) == int[string])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(an_object_key) == string)); - static assert(is(typeof(lv) == int[string])); - static assert(is(typeof(collapsed_lev) == int[string])); - static assert(is(typeof(obj_type_status) == int[string])); - } static auto rgx = Rgx(); if (auto m = line.match(rgx.heading)) { /+ heading match +/ ++line_occur["heading"]; @@ -4082,24 +3993,15 @@ template DocReformDocAbstraction() { } return an_object; } - auto flow_para_match_(L,O,K,I,B,T,C)( - L line, - O an_object, - return ref K an_object_key, - return ref I indent, - return ref B bullet, - return ref T obj_type_status, - return ref C line_occur, + string[string] flow_para_match_()( + char[] line, + string[string] an_object, + return ref string an_object_key, + return ref int[string] indent, + return ref bool bullet, + return ref int[string] obj_type_status, + return ref int[string] line_occur, ) { - debug(asserts) { - static assert(is(typeof(line) == char[])); - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(an_object_key) == string)); - static assert(is(typeof(indent) == int[string])); - static assert(is(typeof(bullet) == bool)); - static assert(is(typeof(obj_type_status) == int[string])); - static assert(is(typeof(line_occur) == int[string])); - } static auto rgx = Rgx(); if (line_occur["para"] == State.off) { line = font_faces_line(line); @@ -4144,8 +4046,8 @@ template DocReformDocAbstraction() { } return an_object; } - auto font_faces_line(T)( - T textline, + char[] font_faces_line()( + char[] textline, ) { static auto rgx = Rgx(); static auto mkup = InlineMarkup(); @@ -4158,9 +4060,9 @@ template DocReformDocAbstraction() { } return textline; } - auto flow_table_instructions(O,H)( - return ref O table_object, - return ref H table_head, + ObjGenericComposite flow_table_instructions(H)( + return ref ObjGenericComposite table_object, + H table_head, ) { static auto rgx = Rgx(); table_object.metainfo.is_of_part = "body"; @@ -4183,9 +4085,9 @@ template DocReformDocAbstraction() { } return table_object; } - auto flow_table_array_munge(O,T)( - return ref O table_object, - return ref T table_array, + ObjGenericComposite flow_table_array_munge(T)( + return ref ObjGenericComposite table_object, + return ref T table_array, ) { static auto rgx = Rgx(); static auto mng = InlineMarkup(); @@ -4307,9 +4209,9 @@ template DocReformDocAbstraction() { comp_obj_block.text = _table_substantive; return table_object; } - auto flow_table_substantive_munge(O,T)( - return ref O table_object, - return ref T table_substantive, + ObjGenericComposite flow_table_substantive_munge(T)( + return ref ObjGenericComposite table_object, + return ref T table_substantive, ) { static auto rgx = Rgx(); static auto munge = ObjInlineMarkupMunge(); @@ -4323,9 +4225,9 @@ template DocReformDocAbstraction() { table_object = table_object.flow_table_array_munge(_table); return table_object; } - auto flow_table_substantive_munge_special(O,T)( - return ref O table_object, - return ref T table_substantive, + ObjGenericComposite flow_table_substantive_munge_special(T)( + return ref ObjGenericComposite table_object, + return ref T table_substantive, ) { static auto rgx = Rgx(); static auto munge = ObjInlineMarkupMunge(); @@ -4339,8 +4241,8 @@ template DocReformDocAbstraction() { table_object = table_object.flow_table_array_munge(_table); return table_object; } - /+ abstraction functions ↑ +/ - /+ ↓ abstraction function emitters +/ + /+ abstraction functions ↑ +/ + /+ ↓ abstraction function emitters +/ pure struct OCNemitter { int ocn_digit, ocn_object_number, ocn_on_, ocn_off_, ocn_bkidx, ocn_bkidx_; string object_identifier; @@ -4389,7 +4291,7 @@ template DocReformDocAbstraction() { invariant() { } } - /+ +/ + /+ +/ static struct ObjInlineMarkupMunge { string[string] obj_txt; int n_foot, n_foot_reg, n_foot_sp_asterisk, n_foot_sp_plus; @@ -4404,10 +4306,7 @@ template DocReformDocAbstraction() { n_foot_sp_asterisk = 0; n_foot_sp_plus = 0; } - static auto images(Ot)(Ot obj_txt_in) { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } + static auto images()(string obj_txt_in) { static auto mng = InlineMarkup(); /+ url matched +/ obj_txt_in = obj_txt_in.replaceAll(rgx.inline_notes_al_special, ""); // TODO reinstate when special footnotes are implemented @@ -4437,10 +4336,7 @@ template DocReformDocAbstraction() { } return obj_txt_in; } - auto footnotes_endnotes_markup_and_number_or_stars(Ot)(Ot obj_txt_in, bool reset_note_numbers) { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } + auto footnotes_endnotes_markup_and_number_or_stars()(string obj_txt_in, bool reset_note_numbers) { /+ endnotes (regular) +/ bool flg_notes_reg = false; bool flg_notes_star = false; @@ -4504,11 +4400,8 @@ template DocReformDocAbstraction() { ); return t; } - private auto object_notes_and_links_(Ot)(Ot obj_txt_in, bool reset_note_numbers=false) + private auto object_notes_and_links_()(string obj_txt_in, bool reset_note_numbers=false) in { - debug(asserts) { - assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt_out = ""; @@ -4572,11 +4465,8 @@ template DocReformDocAbstraction() { } invariant() { } - auto munge_heading(Ot)(Ot obj_txt_in, bool reset_note_numbers=false) + auto munge_heading()(string obj_txt_in, bool reset_note_numbers=false) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"] = obj_txt_in @@ -4594,11 +4484,8 @@ template DocReformDocAbstraction() { } invariant() { } - auto munge_para(Ot)(Ot obj_txt_in) + auto munge_para()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"]=(obj_txt_in) @@ -4613,11 +4500,8 @@ template DocReformDocAbstraction() { } return t; } - string munge_quote(Ot)(Ot obj_txt_in) + string munge_quote()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"]=obj_txt_in; @@ -4634,11 +4518,8 @@ template DocReformDocAbstraction() { } invariant() { } - auto munge_block(Ot)(Ot obj_txt_in) + auto munge_block()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"]=obj_txt_in; @@ -4647,11 +4528,8 @@ template DocReformDocAbstraction() { } invariant() { } - auto munge_verse(Ot)(Ot obj_txt_in) + auto munge_verse()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"]=obj_txt_in; @@ -4660,11 +4538,8 @@ template DocReformDocAbstraction() { } invariant() { } - string munge_code(Ot)(Ot obj_txt_in) + string munge_code()(string obj_txt_in) in { - debug(asserts) { - assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt_in = obj_txt_in.replaceAll(rgx.space, mkup.nbsp); @@ -4673,11 +4548,8 @@ template DocReformDocAbstraction() { } invariant() { } - string munge_table(Ot)(Ot obj_txt_in) + string munge_table()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"]=obj_txt_in; @@ -4685,11 +4557,8 @@ template DocReformDocAbstraction() { } invariant() { } - string munge_comment(Ot)(Ot obj_txt_in) + string munge_comment()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { obj_txt["munge"]=obj_txt_in; @@ -4703,17 +4572,13 @@ template DocReformDocAbstraction() { static auto munge = ObjInlineMarkupMunge(); string[string] obj_txt; static string anchor_tag = ""; - auto obj_inline_markup_and_anchor_tags_and_misc(O,K,CMM)( - O obj_, - K obj_key_, - CMM conf_make_meta, - Flag!"_new_doc" _new_doc + auto obj_inline_markup_and_anchor_tags_and_misc(CMM)( + string[string] obj_, + string obj_key_, + CMM conf_make_meta, + Flag!"_new_doc" _new_doc ) in { - debug(asserts) { - static assert(is(typeof(obj_) == string[string])); - static assert(is(typeof(obj_key_) == string)); - } } body { obj_txt["munge"] = obj_[obj_key_].dup; @@ -4803,34 +4668,24 @@ template DocReformDocAbstraction() { } invariant() { } - auto _clean_heading_toc_(Toc)( - Toc heading_toc_, + auto _clean_heading_toc_()( + char[] heading_toc_, ) { - debug(asserts) { - static assert(is(typeof(heading_toc_) == char[])); - } auto m = (cast(char[]) heading_toc_).matchFirst(rgx.heading); heading_toc_ = (m.post).replaceAll( rgx.inline_notes_curly_gen, ""); return heading_toc_; }; - auto flow_table_of_contents_gather_headings(O,CMM,Ts,Ta,X,Toc)( - O obj_, - CMM conf_make_meta, - Ts tag_in_seg, - Ta _anchor_tag, - return ref X lev4_subtoc, - Toc the_table_of_contents_section, + ObjGenericComposite[] flow_table_of_contents_gather_headings(CMM)( + string[string] obj_, + CMM conf_make_meta, + string[string] tag_in_seg, + string _anchor_tag, + return ref string[][string] lev4_subtoc, + ObjGenericComposite[] the_table_of_contents_section, ) in { - debug(asserts) { - static assert(is(typeof(obj_) == string[string])); - static assert(is(typeof(tag_in_seg) == string[string])); - static assert(is(typeof(_anchor_tag) == string)); - static assert(is(typeof(lev4_subtoc) == string[][string])); - static assert(is(typeof(the_table_of_contents_section) == ObjGenericComposite[])); - } } body { ObjGenericComposite comp_obj_toc; @@ -4910,16 +4765,12 @@ template DocReformDocAbstraction() { static string heading_number_auto_composite = ""; static string heading_number_auto_composite_segname = ""; static bool[] auto_heading_numbering = [ true, true, true, true]; - static string _configured_auto_heading_numbering_and_segment_anchor_tags(M,O,CMM)( - M munge_, - O obj_, - CMM conf_make_meta, - bool _new_doc, + static string _configured_auto_heading_numbering_and_segment_anchor_tags(CMM)( + string munge_, + string[string] obj_, + CMM conf_make_meta, + bool _new_doc, ) { - debug(asserts) { - static assert(is(typeof(munge_) == string)); - static assert(is(typeof(obj_) == string[string])); - } if (_new_doc) { heading_num = [ 0, 0, 0, 0 ]; heading_number_auto_composite = ""; @@ -5058,15 +4909,11 @@ template DocReformDocAbstraction() { return munge_; } static int heading_num_lev1 = 0; - static string _make_segment_anchor_tags_if_none_provided(M,Lv)( - M munge_, - Lv lev_, - bool _new_doc + static string _make_segment_anchor_tags_if_none_provided()( + string munge_, + string lev_, + bool _new_doc ) { - debug(asserts) { - static assert(is(typeof(munge_) == string)); - static assert(is(typeof(lev_) == string)); - } if (!(munge_.match(rgx.heading_anchor_tag))) { if (munge_.match(rgx.heading_identify_anchor_tag)) { if (auto m = munge_.match(rgx.heading_extract_named_anchor_tag)) { @@ -5096,20 +4943,15 @@ template DocReformDocAbstraction() { return munge_; } } - /+ +/ + /+ +/ struct ObjAttributes { string[string] _obj_attrib; - string obj_attributes(Oi,OR,OH)( - Oi obj_is_, - OR obj_raw, - OH _comp_obj_heading, + string obj_attributes()( + string obj_is_, + string obj_raw, + ObjGenericComposite _comp_obj_heading, ) in { - debug(asserts) { - static assert(is(typeof(obj_is_) == string)); - static assert(is(typeof(obj_raw) == string)); - static assert(is(typeof(_comp_obj_heading) == ObjGenericComposite)); - } } body { scope(exit) { @@ -5170,11 +5012,8 @@ template DocReformDocAbstraction() { } private: string _obj_attributes; - string txt_para_and_blocks(Ot)(Ot obj_txt_in) + string txt_para_and_blocks()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { if (obj_txt_in.matchFirst(rgx.para_bullet)) { @@ -5200,11 +5039,8 @@ template DocReformDocAbstraction() { } return _obj_attributes; } - string txt_heading(Ot)(Ot obj_txt_in) + string txt_heading()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5214,11 +5050,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_para(Ot)(Ot obj_txt_in) + string txt_para()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5228,11 +5061,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_quote(Ot)(Ot obj_txt_in) + string txt_quote()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5242,11 +5072,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_group(Ot)(Ot obj_txt_in) + string txt_group()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5256,11 +5083,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_block(Ot)(Ot obj_txt_in) + string txt_block()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5270,11 +5094,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_verse(Ot)(Ot obj_txt_in) + string txt_verse()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5284,11 +5105,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_code(Ot)(Ot obj_txt_in) + string txt_code()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5298,11 +5116,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_table(Ot)(Ot obj_txt_in) + string txt_table()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"content\"," @@ -5312,11 +5127,8 @@ template DocReformDocAbstraction() { } invariant() { } - string txt_comment(Ot)(Ot obj_txt_in) + string txt_comment()(string obj_txt_in) in { - debug(asserts) { - static assert(is(typeof(obj_txt_in) == string)); - } } body { _obj_attributes = " \"use\": \"comment\"," @@ -5326,16 +5138,11 @@ template DocReformDocAbstraction() { } invariant() { } - string _set_additional_values_parse_as_json(OA,Oi,OH)( - OA _obj_attrib, - Oi obj_is_, - OH _comp_obj_heading, + string _set_additional_values_parse_as_json()( + string _obj_attrib, + string obj_is_, + ObjGenericComposite _comp_obj_heading, ) { - debug(asserts) { - static assert(is(typeof(_obj_attrib) == string)); - static assert(is(typeof(obj_is_) == string)); - static assert(is(typeof(_comp_obj_heading) == ObjGenericComposite)); - } JSONValue oa_j = parseJSON(_obj_attrib); assert( (oa_j.type == JSON_TYPE.OBJECT) @@ -5355,7 +5162,7 @@ template DocReformDocAbstraction() { return _obj_attrib; } } - /+ +/ + /+ +/ struct BookIndexNuggetHash { string main_term, sub_term, sub_term_bits; int object_number_offset, object_number_endpoint; @@ -5363,14 +5170,13 @@ template DocReformDocAbstraction() { string[][string][string] bi; string[][string][string] hash_nugget; string[] bi_main_terms_split_arr; - string[][string][string] bookindex_nugget_hash(BI,N,S)( - BI bookindex_section, - N obj_cite_digits, - S tag_in_seg, + string[][string][string] bookindex_nugget_hash(N,S)( + string bookindex_section, + N obj_cite_digits, + S tag_in_seg, ) in { debug(asserts) { - static assert(is(typeof(bookindex_section) == string)); static assert(is(typeof(obj_cite_digits.object_number) == int)); } debug(bookindexraw) { @@ -5438,12 +5244,9 @@ template DocReformDocAbstraction() { } struct BookIndexReportIndent { int mkn, skn; - void bookindex_report_indented(BI)( - BI bookindex_unordered_hashes + void bookindex_report_indented()( + string[][string][string] bookindex_unordered_hashes ) { - debug(asserts) { - static assert(is(typeof(bookindex_unordered_hashes) == string[][string][string])); - } auto mainkeys = bookindex_unordered_hashes.byKey.array.sort().release; foreach (mainkey; mainkeys) { @@ -5469,8 +5272,8 @@ template DocReformDocAbstraction() { int mkn, skn; static auto rgx = Rgx(); static auto munge = ObjInlineMarkupMunge(); - void bookindex_write_section(BI)( - BI bookindex_unordered_hashes + void bookindex_write_section()( + string[][string][string] bookindex_unordered_hashes ) { auto mainkeys = bookindex_unordered_hashes.byKey.array @@ -5498,13 +5301,12 @@ template DocReformDocAbstraction() { ++mkn; } } - auto bookindex_build_abstraction_section(BI,N,B)( - BI bookindex_unordered_hashes, - N obj_cite_digits, - B opt_action, + auto bookindex_build_abstraction_section(N,B)( + string[][string][string] bookindex_unordered_hashes, + N obj_cite_digits, + B opt_action, ) { debug(asserts) { - static assert(is(typeof(bookindex_unordered_hashes) == string[][string][string])); static assert(is(typeof(obj_cite_digits.object_number) == int)); } mixin DocReformNode; @@ -5652,7 +5454,7 @@ template DocReformDocAbstraction() { return t; } } - /+ +/ + /+ +/ struct NotesSection { string[string] object_notes; int previous_count; @@ -5835,17 +5637,13 @@ template DocReformDocAbstraction() { return t; } } - /+ +/ + /+ +/ struct Bibliography { - public JSONValue[] flow_bibliography_(Bi,BJ)( - return ref Bi biblio_unsorted_incomplete, - return ref BJ bib_arr_json + public JSONValue[] flow_bibliography_()( + return ref string[] biblio_unsorted_incomplete, + return ref JSONValue[] bib_arr_json ) in { - debug(asserts) { - static assert(is(typeof(biblio_unsorted_incomplete) == string[])); - static assert(is(typeof(bib_arr_json) == JSONValue[])); - } } body { JSONValue[] biblio_unsorted @@ -5869,14 +5667,10 @@ template DocReformDocAbstraction() { } return biblio_sorted__; } - final private JSONValue[] biblio_make_unsorted_array_of_json_objects(Bi,BJ)( - Bi biblio_unordered, - BJ bib_arr_json + final private JSONValue[] biblio_make_unsorted_array_of_json_objects()( + string[] biblio_unordered, + JSONValue[] bib_arr_json ) { - debug(asserts) { - static assert(is(typeof(biblio_unordered) == string[])); - static assert(is(typeof(bib_arr_json) == JSONValue[])); - } foreach (bibent; biblio_unordered) { /+ update bib to include deemed_author, needed for: sort_bibliography_array_by_deemed_author_year_title @@ -5901,10 +5695,7 @@ template DocReformDocAbstraction() { } return bib_arr_json.dup; } - final private JSONValue[] biblio_sort(BJ)(BJ biblio_unordered) { - debug(asserts) { - static assert(is(typeof(biblio_unordered) == JSONValue[])); - } + final private JSONValue[] biblio_sort()(JSONValue[] biblio_unordered) { JSONValue[] biblio_sorted_; biblio_sorted_ = sort!((a, b){ @@ -5919,10 +5710,7 @@ template DocReformDocAbstraction() { } return biblio_sorted_; } - void biblio_debug(BJ)(BJ biblio_sorted) { - debug(asserts) { - static assert(is(typeof(biblio_sorted) == JSONValue[])); - } + void biblio_debug()(JSONValue[] biblio_sorted) { debug(biblio0) { foreach (j; biblio_sorted) { if (!empty(j["fulltitle"].str)) { @@ -5932,30 +5720,25 @@ template DocReformDocAbstraction() { } } } - /+ +/ + /+ +/ struct NodeStructureMetadata { int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7; int obj_cite_digit; int[string] p_; // p_ parent_ static auto rgx = Rgx(); - ObjGenericComposite node_location_emitter(Lv,Tg,La,Ta,N,C,P,I)( - Lv lev_markup_number, - Tg tag_in_seg, - La lev_anchor_tag, - Ta tag_assoc, - N obj_cite_digits, - C cntr_, - P ptr_, - I is_ + ObjGenericComposite node_location_emitter(La,Ta,N)( + string lev_markup_number, + string[string] tag_in_seg, + La lev_anchor_tag, + Ta tag_assoc, + N obj_cite_digits, + int cntr_, + int ptr_, + string is_ ) in { debug(asserts) { - static assert(is(typeof(lev_markup_number) == string)); - static assert(is(typeof(tag_in_seg) == string[string])); static assert(is(typeof(obj_cite_digits.object_number) == int)); - static assert(is(typeof(cntr_) == int)); - static assert(is(typeof(ptr_) == int)); - static assert(is(typeof(is_) == string)); } assert(is_ != "heading"); assert(obj_cite_digits.object_number.to!int >= 0); @@ -6000,37 +5783,28 @@ template DocReformDocAbstraction() { } invariant() { } - ObjGenericComposite node_emitter_heading(T,Lm,Lc,Hd,TaB,TaL,TA,N,C,P,LA,I,PSn,fNr,fNs,fL)( - T _text, - Lm lev_markup_number, - Lc lev_collapsed_number, - Hd dummy_heading_status, - TaB tag_in_seg, - TaL lev_anchor_tag, - TA tag_assoc, - N obj_cite_digits, - C cntr_, - P ptr_, - LA lv_ancestors_txt, - I is_, - PSn html_segnames_ptr, - fNr flag_notes_reg, - fNs flag_notes_star, - fL flag_links, + ObjGenericComposite node_emitter_heading(Hd,TaL,TA,N,fNr,fNs,fL)( + string _text, + string lev_markup_number, + string lev_collapsed_number, + Hd dummy_heading_status, + string[string] tag_in_seg, + TaL lev_anchor_tag, + TA tag_assoc, + N obj_cite_digits, + int cntr_, + int ptr_, + string[] lv_ancestors_txt, + string is_, + int html_segnames_ptr, + fNr flag_notes_reg, + fNs flag_notes_star, + fL flag_links, ) in { debug(asserts) { - static assert(is(typeof(_text) == string)); static assert(is(typeof(lev) == string)); - static assert(is(typeof(lev_markup_number) == string)); - static assert(is(typeof(lev_collapsed_number) == string)); - static assert(is(typeof(tag_in_seg) == string[string])); static assert(is(typeof(obj_cite_digits.object_number) == int)); - static assert(is(typeof(cntr_) == int)); - static assert(is(typeof(ptr_) == int)); - static assert(is(typeof(lv_ancestors_txt) == string[])); - static assert(is(typeof(is_) == string)); - static assert(is(typeof(html_segnames_ptr) == int)); } assert(is_ == "heading"); assert((obj_cite_digits.object_number).to!int >= 0); @@ -6209,16 +5983,12 @@ template DocReformDocAbstraction() { invariant() { } } - /+ abstraction functions emitters ↑ +/ - /+ ↓ abstraction functions assertions +/ - pure void assertions_doc_structure(O,Lv)( - O an_object, - Lv lv + /+ abstraction functions emitters ↑ +/ + /+ ↓ abstraction functions assertions +/ + pure void assertions_doc_structure()( + string[string] an_object, + int[string] lv ) { - debug(asserts) { - static assert(is(typeof(an_object) == string[string])); - static assert(is(typeof(lv) == int[string])); - } if (lv["h3"] > State.off) { assert(lv["h0"] > State.off); assert(lv["h1"] > State.off); @@ -6390,10 +6160,7 @@ template DocReformDocAbstraction() { break; } } - pure void assertions_flag_types_block_status_none_or_closed(T)(T obj_type_status) { - debug(asserts) { - static assert(is(typeof(obj_type_status) == int[string])); - } + pure void assertions_flag_types_block_status_none_or_closed()(int[string] obj_type_status) { assert( (obj_type_status["code"] == TriState.off) || (obj_type_status["code"] == TriState.closing), @@ -6415,8 +6182,8 @@ template DocReformDocAbstraction() { || (obj_type_status["block"] == TriState.closing), "block status: off or closing"); } - /+ abstraction functions assertions ↑ +/ -} /+ ← closed: template DocReformDocAbstraction +/ + /+ abstraction functions assertions ↑ +/ +} /+ ← closed: template DocReformDocAbstraction +/ template docSectKeysSeq() { auto docSectKeysSeq(string[][string] document_section_keys_sequenced) { struct doc_sect_keys_seq { |