From 2660db249780e6ec90bf63c43bc1e85785a88cf3 Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Tue, 30 Apr 2019 19:22:32 -0400 Subject: regex, meta_abstraction, naming of some regex submatches --- org/default_regex.org | 54 ++++++++--------- org/meta_abstraction.org | 106 ++++++++++++++++----------------- org/output_xmls.org | 2 +- src/doc_reform/meta/metadoc_from_src.d | 106 ++++++++++++++++----------------- src/doc_reform/meta/rgx.d | 54 ++++++++--------- src/doc_reform/output/rgx.d | 22 +++---- src/doc_reform/output/xmls.d | 2 +- 7 files changed, 173 insertions(+), 173 deletions(-) diff --git a/org/default_regex.org b/org/default_regex.org index f316600..911832b 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -162,7 +162,7 @@ static heading_biblio_glossary = ctRegex!(`^:?(?:(1)[~][! static heading_biblio_blurb = ctRegex!(`^:?(?:(1)[~][!](?:(?:biblio(?:graphy)?|references?)|blurb)|[A-D1][~])`); static heading_blurb_glossary = ctRegex!(`^:?(?:(1)[~][!](?:blurb|glossary)|[A-D1][~])`); static para_bullet = ctRegex!(`^_[*] `); -static para_bullet_indent = ctRegex!(`^_([1-9])[*] `); +static para_bullet_indent = ctRegex!(`^_(?P[1-9])[*] `); static para_indent = ctRegex!(`^_(?P[1-9])[ ]`); static para_indent_hang = ctRegex!(`^_(?P[0-9])_(?P[0-9])[ ]`); static para_attribs = ctRegex!(`^_(?:(?:[0-9])(?:_([0-9]))?|(?:[1-9])?[*]) `); @@ -175,7 +175,7 @@ static para_inline_link_anchor = ctRegex!(`\*[~](?P(?:[ ,]+[0-9]+)+)[)][}]"); +static block_open = ctRegex!("^((code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)|^`{3} (code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?|^[{]table[(](?:h;)?(?P(?:[ ,]+[0-9]+)+)[)][}]"); static block_poem_open = ctRegex!("^((poem(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)|`{3} poem(?:[(][ a-zA-Z0-9;:,]*[)])?)"); #+END_SRC @@ -184,12 +184,12 @@ static block_poem_open = ctRegex!("^((poem(?:[(][ #+name: meta_rgx #+BEGIN_SRC d /+ blocked markup tics +/ -static block_tic_open = ctRegex!("^`{3} (code(?:[.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)"); -static block_tic_code_open = ctRegex!("^`{3} (?:code)(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); -static block_tic_poem_open = ctRegex!("^`{3} (poem)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); -static block_tic_group_open = ctRegex!("^`{3} (group)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); -static block_tic_block_open = ctRegex!("^`{3} (block)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); -static block_tic_quote_open = ctRegex!("^`{3} (quote)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); +static block_tic_open = ctRegex!("^`{3} (code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)"); +static block_tic_code_open = ctRegex!("^`{3} code(?:[.](?P[a-z][0-9a-z#+_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); +static block_tic_poem_open = ctRegex!("^`{3} poem(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); +static block_tic_group_open = ctRegex!("^`{3} group(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); +static block_tic_block_open = ctRegex!("^`{3} block(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); +static block_tic_quote_open = ctRegex!("^`{3} quote(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); static block_tic_table_open = ctRegex!("^`{3} table(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); // ctRegex!("^`{3} table(?:\(.*?\))?"); static block_tic_close = ctRegex!("^(`{3})$","m"); #+END_SRC @@ -199,18 +199,18 @@ static block_tic_close = ctRegex!("^(`{3})$","m") #+name: meta_rgx #+BEGIN_SRC d /+ blocked markup curly +/ -static block_curly_open = ctRegex!(`^((?:code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)`); +static block_curly_open = ctRegex!(`^((?:code([.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)`); static block_curly_code_open = ctRegex!(`^(?:code(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); static block_curly_code_close = ctRegex!(`^([}]code)`); -static block_curly_poem_open = ctRegex!(`^(poem(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); +static block_curly_poem_open = ctRegex!(`^(poem(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); static block_curly_poem_close = ctRegex!(`^([}]poem)`); -static block_curly_group_open = ctRegex!(`^(group(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); +static block_curly_group_open = ctRegex!(`^(group(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); static block_curly_group_close = ctRegex!(`^([}]group)`); -static block_curly_block_open = ctRegex!(`^(block(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); +static block_curly_block_open = ctRegex!(`^(block(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); static block_curly_block_close = ctRegex!(`^([}]block)`); -static block_curly_quote_open = ctRegex!(`^(quote(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); +static block_curly_quote_open = ctRegex!(`^(quote(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`); static block_curly_quote_close = ctRegex!(`^([}]quote)`); -static block_curly_table_open = ctRegex!(`^table(?:[(]([?P a-zA-Z0-9;:,]*)[)])?[{][ ]*$`); +static block_curly_table_open = ctRegex!(`^table(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$`); static block_curly_table_close = ctRegex!(`^([}]table)`); static block_curly_table_special_markup = ctRegex!(`^[{]table[(](?P(?:(h);)?(?P(?:[, ]+[0-9]+)+))[)][}]`, "mg"); #+END_SRC @@ -260,7 +260,7 @@ static inline_curly_delimiter_open_symbol_plus = ctRegex!(`~\{[+]\s`, "m" static inline_curly_delimiter_open_star_or_plus = ctRegex!(`~\{[+*]`, "m"); static inline_curly_delimiter_close_regular = ctRegex!(`\s*\}~`, "m"); static inline_text_and_note_curly = ctRegex!(`(?P.+?)(?:(?:[~])[{][*+ ]*)(?P.+?)(?:[}][~])`, "mg"); -static note_ref = ctRegex!(`^\S+?noteref_([0-9]+)`, "mg"); // {^{73.}^}#noteref_73 +static note_ref = ctRegex!(`^\S+?noteref_(?P[0-9]+)`, "mg"); // {^{73.}^}#noteref_73 #+END_SRC *** links/ urls :inline:footnote: @@ -301,7 +301,7 @@ static smid_image_delimit = ctRegex!(`(?P
^|[ ]
 #+name: meta_rgx
 #+BEGIN_SRC d
 /+ inline markup book index +/
-static book_index                                     = ctRegex!(`^=\{\s*(.+?)\}$`, "m");
+static book_index                                     = ctRegex!(`^=\{\s*(?P.+?)\}$`, "m");
 static book_index_open                                = ctRegex!(`^=\{\s*([^}]*?)$`);
 static book_index_close                               = ctRegex!(`^(.*?)\}$`, "m");
 #+END_SRC
@@ -539,7 +539,7 @@ static inline_image_without_dimensions                = ctRegex!(`(?P
┥)
 static inline_image_info                              = ctRegex!(`☼?(?P[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+)`, "mg");
 static inline_link_anchor                             = ctRegex!(`┃(?P\S+?)┃`, "mg"); // TODO *~text_link_anchor
 static inline_link_                                   = ctRegex!(`┥(?P.+?)┝┤(?P.+?)├`, "mg");
-static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P\S+?)├`, "mg");
+static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P#?(\S+?))├`, "mg");
 static inline_link_empty                              = ctRegex!(`┥(?P.+?)┝┤├`, "mg");
 static inline_link_number                             = ctRegex!(`┥(?P.+?)┝┤(?P[0-9]+)├`, "mg"); // not used
 static inline_link_number_only                        = ctRegex!(`(┥.+?┝)┤(?P[0-9]+)├`, "mg");
@@ -565,16 +565,16 @@ static quotation_mark_various                         = ctRegex!(q"┃['‘’
 /+ inline markup font face mod +/
 static inline_mark_faces                            = ctRegex!(`(?P(?P[*!/_^,+#"-])\{(?P.+?)\}[*!/_^,+#"-])`, "mg");
 static inline_mark_faces_to_mod                     = ctRegex!(`(?P[*!/_^,+#"-])\{(?P.+?)\}([*!/_^,+#"-])`, "mg");
-static inline_mark_emphasis                         = ctRegex!(`([*])\{(?P.+?)\}[*]`, "mg");
-static inline_mark_bold                             = ctRegex!(`([!])\{(?P.+?)\}[!]`, "mg");
-static inline_mark_underscore                       = ctRegex!(`([_])\{(?P.+?)\}[_]`, "mg");
-static inline_mark_italics                          = ctRegex!(`([/])\{(?P.+?)\}[/]`, "mg");
-static inline_mark_superscript                      = ctRegex!(`(\^)\{(?P.+?)\}\^`, "mg");
-static inline_mark_subscript                        = ctRegex!(`([,])\{(?P.+?)\}[,]`, "mg");
-static inline_mark_strike                           = ctRegex!(`([-])\{(?P.+?)\}[-]`, "mg");
-static inline_mark_insert                           = ctRegex!(`([+])\{(?P.+?)\}[+]`, "mg");
-static inline_mark_mono                             = ctRegex!(`([#])\{(?P.+?)\}[#]`, "mg");
-static inline_mark_cite                             = ctRegex!(`(["])\{(?P.+?)\}["]`, "mg");
+static inline_mark_emphasis                         = ctRegex!(`(?P[*])\{(?P.+?)\}[*]`, "mg");
+static inline_mark_bold                             = ctRegex!(`(?P[!])\{(?P.+?)\}[!]`, "mg");
+static inline_mark_underscore                       = ctRegex!(`(?P[_])\{(?P.+?)\}[_]`, "mg");
+static inline_mark_italics                          = ctRegex!(`(?P[/])\{(?P.+?)\}[/]`, "mg");
+static inline_mark_superscript                      = ctRegex!(`(?P\^)\{(?P.+?)\}\^`, "mg");
+static inline_mark_subscript                        = ctRegex!(`(?P[,])\{(?P.+?)\}[,]`, "mg");
+static inline_mark_strike                           = ctRegex!(`(?P[-])\{(?P.+?)\}[-]`, "mg");
+static inline_mark_insert                           = ctRegex!(`(?P[+])\{(?P.+?)\}[+]`, "mg");
+static inline_mark_mono                             = ctRegex!(`(?P[#])\{(?P.+?)\}[#]`, "mg");
+static inline_mark_cite                             = ctRegex!(`(?P["])\{(?P.+?)\}["]`, "mg");
 static inline_mark_fontface_clean                   = ctRegex!(`[*!_/^,+#■"-]\{|\}[*!_/^,+#■"-]`, "mg");
 #+END_SRC
 
diff --git a/org/meta_abstraction.org b/org/meta_abstraction.org
index d2adf27..e2f4638 100644
--- a/org/meta_abstraction.org
+++ b/org/meta_abstraction.org
@@ -418,10 +418,10 @@ static auto inline_markup_faces(L)(L line) {
   static auto rgx = Rgx();
   static auto mkup = InlineMarkup();
   line = replaceAll!(m => mkup.quote_o ~ m[1] ~ mkup.quote_c)(line, rgx.within_quotes);
-  line = replaceAll!(m => mkup.mono ~ mkup.ff_o ~ m[2] ~ mkup.ff_c ~ mkup.mono)(line, rgx.inline_mark_mono);
-  line = replaceAll!(m => mkup.cite ~ mkup.ff_o ~ m[2] ~ mkup.ff_c ~ mkup.cite)(line, rgx.inline_mark_cite);
+  line = replaceAll!(m => mkup.mono ~ mkup.ff_o ~ m["text"] ~ mkup.ff_c ~ mkup.mono)(line, rgx.inline_mark_mono);
+  line = replaceAll!(m => mkup.cite ~ mkup.ff_o ~ m["text"] ~ mkup.ff_c ~ mkup.cite)(line, rgx.inline_mark_cite);
   foreach (regx; [rgx.inline_mark_emphasis, rgx.inline_mark_bold, rgx.inline_mark_underscore, rgx.inline_mark_italics, rgx.inline_mark_superscript, rgx.inline_mark_subscript, rgx.inline_mark_strike, rgx.inline_mark_insert]) {
-    line = replaceAll!(m => m[1] ~ mkup.ff_o ~ m[2] ~ mkup.ff_c ~ m[1])(line, regx);
+    line = replaceAll!(m => m["mark"] ~ mkup.ff_o ~ m["text"] ~ mkup.ff_c ~ m["mark"])(line, regx);
   }
   return line;
 }
@@ -434,33 +434,33 @@ static auto links_and_images(L)(L obj_txt) {
       || obj_txt.match(rgx.smid_inline_link_endnote_url_helper_punctuated)
     ) {
       obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s %s%s%s%s%s%s %s%s",
-        mkup.lnk_o, m[1].strip, mkup.lnk_c,
-        mkup.url_o, m[2], mkup.url_c,
+        mkup.lnk_o, m["content"].strip, mkup.lnk_c,
+        mkup.url_o, m["link"], mkup.url_c,
         mkup.en_a_o,
-        mkup.lnk_o, m[2].strip, mkup.lnk_c,
-        mkup.url_o, m[2], mkup.url_c,
+        mkup.lnk_o, m["link"].strip, mkup.lnk_c,
+        mkup.url_o, m["link"], mkup.url_c,
         mkup.en_a_c,
         m[3]
       ))(obj_txt, rgx.smid_inline_link_endnote_url_helper_punctuated);
       obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s %s%s%s%s%s%s %s",
-        mkup.lnk_o, m[1].strip, mkup.lnk_c,
-        mkup.url_o, m[2], mkup.url_c,
+        mkup.lnk_o, m["content"].strip, mkup.lnk_c,
+        mkup.url_o, m["link"], mkup.url_c,
         mkup.en_a_o,
-        mkup.lnk_o, m[2].strip, mkup.lnk_c,
-        mkup.url_o, m[2], mkup.url_c,
+        mkup.lnk_o, m["link"].strip, mkup.lnk_c,
+        mkup.url_o, m["link"], mkup.url_c,
         mkup.en_a_c
       ))(obj_txt, rgx.smid_inline_link_endnote_url_helper);
   } else {
       obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s",
-        m[1],
-        mkup.lnk_o, m[2].strip, mkup.lnk_c,
-        mkup.url_o, m[3], mkup.url_c
+        m["pre"],
+        mkup.lnk_o, m["content"].strip, mkup.lnk_c,
+        mkup.url_o, m["link"], mkup.url_c
       ))(obj_txt, rgx.smid_inline_link_markup_regular);
     }
       obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s",
-        m[1],
-        mkup.lnk_o, m[2].strip, mkup.lnk_c,
-        mkup.url_o, m[2], mkup.url_c
+        m["pre"],
+        mkup.lnk_o, m["link"].strip, mkup.lnk_c,
+        mkup.url_o, m["link"], mkup.url_c
       ))(obj_txt, rgx.smid_inline_link_naked_url); //
   }
   return obj_txt;
@@ -886,8 +886,8 @@ if there is a blurb section you need to:
       debug(paraindent) {
         writeln(line);
       }
-      indent["hang_position"] = (m[1]).to!int;
-      indent["base_position"] = (m[1]).to!int;
+      indent["hang_position"] = (m["indent"]).to!int;
+      indent["base_position"] = (m["indent"]).to!int;
     } else if (line.matchFirst(rgx.para_bullet)) {
       debug(parabullet) {
         writeln(line);
@@ -898,16 +898,16 @@ if there is a blurb section you need to:
         writeln(line);
       }
       indent=[
-        "hang_position" : (m[1]).to!int,
-        "base_position" : (m[2]).to!int,
+        "hang_position" : (m["hang"]).to!int,
+        "base_position" : (m["indent"]).to!int,
       ];
     } else if (auto m = line.matchFirst(rgx.para_bullet_indent)) {
       debug(parabulletindent) {
         writeln(line);
       }
       indent=[
-        "hang_position" : (m[1]).to!int,
-        "base_position" : (m[1]).to!int,
+        "hang_position" : (m["indent"]).to!int,
+        "base_position" : (m["indent"]).to!int,
       ];
       bullet = true;
     }
@@ -3349,7 +3349,7 @@ void _start_block_(L,T,N)(
         line
       );
     }
-    an_object["table_head"]        = m[1].to!string;
+    an_object["table_head"]        = m["attrib"].to!string;
     an_object["block_type"]        = "curly";
     obj_type_status["blocks"]      = TriState.on;
     obj_type_status["table"]       = TriState.on;
@@ -3362,7 +3362,7 @@ void _start_block_(L,T,N)(
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_table_special_markup)) {
     /+ table: special table block markup syntax! +/
-    an_object["table_head"]                       = m[1].to!string;
+    an_object["table_head"]                       = m["attrib"].to!string;
     an_object["block_type"]                       = "special";
     obj_type_status["blocks"]                     = TriState.on;
     obj_type_status["table"]                      = TriState.on;
@@ -3472,7 +3472,7 @@ void _start_block_(L,T,N)(
         line
       );
     }
-    an_object["table_head"]      = m[1].to!string;
+    an_object["table_head"]      = m["attrib"].to!string;
     an_object["block_type"]      = "tic";
     obj_type_status["blocks"]    = TriState.on;
     obj_type_status["table"]     = TriState.on;
@@ -3754,7 +3754,7 @@ void _quote_block_(L,O,T)(
       debug(quote) {                              // quote (curly) close
         writeln(line);
       }
-      an_object[an_object_key] = an_object[an_object_key].stripRight;
+      an_object[an_object_key]       = an_object[an_object_key].stripRight;
       obj_type_status["blocks"]      = TriState.closing;
       obj_type_status["quote"]       = TriState.closing;
       obj_type_status["curly_quote"] = TriState.off;
@@ -3769,7 +3769,7 @@ void _quote_block_(L,O,T)(
       debug(quote) {                              // quote (tic) close
         writeln(line);
       }
-      an_object[an_object_key] = an_object[an_object_key].stripRight;
+      an_object[an_object_key]     = an_object[an_object_key].stripRight;
       obj_type_status["blocks"]    = TriState.closing;
       obj_type_status["quote"]     = TriState.closing;
       obj_type_status["tic_quote"] = TriState.off;
@@ -3968,7 +3968,7 @@ void _poem_block_(L,O,T,C,N,CMM,Ts)(
         processing.remove("verse");
         ++cntr;
       }
-      object_number_poem["end"]   = obj_cite_digits.object_number.to!string;
+      object_number_poem["end"]     = obj_cite_digits.object_number.to!string;
       obj_type_status["blocks"]     = TriState.closing;
       obj_type_status["poem"]       = TriState.closing;
       obj_type_status["curly_poem"] = TriState.off;
@@ -4654,7 +4654,7 @@ auto _book_index_(L,I,O,T,B)(
     debug(bookindexmatch) {
       writefln(
         "* [bookindex] %s\n",
-        m[1].to!string,
+        m["bookindex"].to!string,
       );
     }
     an_object["bookindex_nugget"] = m.captures[1].to!string;
@@ -5057,8 +5057,8 @@ void _para_match_(L,O,K,I,B,T,C)(
       debug(paraindent) {
         writeln(line);
       }
-      indent["hang_position"] = (m[1]).to!int;
-      indent["base_position"] = (m[1]).to!int;
+      indent["hang_position"] = (m["indent"]).to!int;
+      indent["base_position"] = (m["indent"]).to!int;
     } else if (line.matchFirst(rgx.para_bullet)) {
       debug(parabullet) {
         writeln(line);
@@ -5069,16 +5069,16 @@ void _para_match_(L,O,K,I,B,T,C)(
         writeln(line);
       }
       indent=[
-        "hang_position" : (m[1]).to!int,
-        "base_position" : (m[2]).to!int,
+        "hang_position" : (m["hang"]).to!int,
+        "base_position" : (m["indent"]).to!int,
       ];
     } else if (auto m = line.matchFirst(rgx.para_bullet_indent)) {
       debug(parabulletindent) {
         writeln(line);
       }
       indent=[
-        "hang_position" : (m[1]).to!int,
-        "base_position" : (m[1]).to!int,
+        "hang_position" : (m["indent"]).to!int,
+        "base_position" : (m["indent"]).to!int,
       ];
       bullet = true;
     }
@@ -6431,16 +6431,16 @@ struct ObjAttributes {
       ~ " \"indent_base\": 0,";
     } else if (auto m = obj_txt_in.matchFirst(rgx.para_bullet_indent)) {
       _obj_attributes =" \"bullet\": \"true\","
-      ~ " \"indent_hang\": " ~ m[1].to!string ~ ","
-      ~ " \"indent_base\": " ~ m[1].to!string ~ ",";
+      ~ " \"indent_hang\": " ~ m["indent"].to!string ~ ","
+      ~ " \"indent_base\": " ~ m["indent"].to!string ~ ",";
     } else if (auto m = obj_txt_in.matchFirst(rgx.para_indent_hang)) {
       _obj_attributes =" \"bullet\": \"false\","
-      ~ " \"indent_hang\": " ~ m[1].to!string ~ ","
-      ~ " \"indent_base\": " ~ m[2].to!string ~ ",";
+      ~ " \"indent_hang\": " ~ m["hang"].to!string ~ ","
+      ~ " \"indent_base\": " ~ m["indent"].to!string ~ ",";
     } else if (auto m = obj_txt_in.matchFirst(rgx.para_indent)) {
       _obj_attributes =" \"bullet\": \"false\","
-      ~ " \"indent_hang\": " ~ m[1].to!string ~ ","
-      ~ " \"indent_base\": " ~ m[1].to!string ~ ",";
+      ~ " \"indent_hang\": " ~ m["indent"].to!string ~ ","
+      ~ " \"indent_base\": " ~ m["indent"].to!string ~ ",";
     } else {
       _obj_attributes =" \"bullet\": \"false\","
       ~ " \"indent_hang\": 0,"
@@ -7047,27 +7047,27 @@ struct NotesSection {
     ) {
       debug(endnotes_build) {
         writeln(
-          "{^", mkup.ff_o, m[1], ".", mkup.ff_c, "^}"
+          "{^", mkup.ff_o, m["num"], ".", mkup.ff_c, "^}"
           ~ mkup.mark_internal_site_lnk,
           tag_in_seg["seg_lv4"],
-            ".fnSuffix#noteref_\n  ", m[1], " ",
-          m[2]); // sometimes need segment name (segmented html & epub)
+            ".fnSuffix#noteref_\n  ", m["num"], " ",
+          m["note"]); // sometimes need segment name (segmented html & epub)
       }
       // you need anchor for segments at this point ->
-      object_notes["anchor"] ~= "note_" ~ m[1] ~ "』";
+      object_notes["anchor"] ~= "note_" ~ m["num"] ~ "』";
       object_notes["notes"]  ~= (tag_in_seg["seg_lv4"].empty)
       ? (links_and_images(
-          "{" ~ mkup.superscript  ~ mkup.ff_o ~ m[1] ~ "." ~ mkup.ff_c  ~ mkup.superscript  ~ "}#noteref_"
-          ~ m[1]) ~ " "
-          ~ m[2] ~ "』"
+          "{" ~ mkup.superscript  ~ mkup.ff_o ~ m["num"] ~ "." ~ mkup.ff_c  ~ mkup.superscript  ~ "}#noteref_"
+          ~ m["num"]) ~ " "
+          ~ m["note"] ~ "』"
         )
       : (links_and_images(
-          "{" ~ mkup.superscript ~ mkup.ff_o ~ m[1] ~ "." ~ mkup.ff_c  ~ mkup.superscript ~ "}"
+          "{" ~ mkup.superscript ~ mkup.ff_o ~ m["num"] ~ "." ~ mkup.ff_c  ~ mkup.superscript ~ "}"
            ~ mkup.mark_internal_site_lnk
            ~ tag_in_seg["seg_lv4"]
            ~ ".fnSuffix#noteref_"
-           ~ m[1]) ~ " "
-           ~ m[2] ~ "』"
+           ~ m["num"]) ~ " "
+           ~ m["note"] ~ "』"
         );
     }
     return object_notes;
@@ -7195,7 +7195,7 @@ struct NotesSection {
       comp_obj_endnote_.attrib.bullet                  = false;
       foreach (i, endnote; endnotes_["notes"]) {
         auto     m                                     = endnote.matchFirst(rgx.note_ref);
-        string   notenumber                            = m[1].to!string;
+        string   notenumber                            = m["ref"].to!string;
         string   anchor_tag                            = "note_" ~ notenumber;
         comp_obj_endnote_.tags.anchor_tags             = [ endnotes_["anchor"][i] ];
         comp_obj_endnote_.has.inline_links             = true;
diff --git a/org/output_xmls.org b/org/output_xmls.org
index 747ca9d..33995bd 100644
--- a/org/output_xmls.org
+++ b/org/output_xmls.org
@@ -473,7 +473,7 @@ auto inline_links(O,M)(
   if (obj.has.inline_links) {
     if  (obj.metainfo.is_a != "code") {
       _txt = replaceAll!(m =>
-          m[1] ~ "┤" ~ to!string((obj.stow.link[m[2].to!ulong])).encode ~ "├"
+          m[1] ~ "┤" ~ to!string((obj.stow.link[m["num"].to!ulong])).encode ~ "├"
         )(_txt, rgx.inline_link_number_only);
     }
     if ((_txt.match(rgx.mark_internal_site_lnk))
diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d
index 9ad6004..2633665 100644
--- a/src/doc_reform/meta/metadoc_from_src.d
+++ b/src/doc_reform/meta/metadoc_from_src.d
@@ -238,10 +238,10 @@ template DocReformDocAbstraction() {
     static auto rgx = Rgx();
     static auto mkup = InlineMarkup();
     line = replaceAll!(m => mkup.quote_o ~ m[1] ~ mkup.quote_c)(line, rgx.within_quotes);
-    line = replaceAll!(m => mkup.mono ~ mkup.ff_o ~ m[2] ~ mkup.ff_c ~ mkup.mono)(line, rgx.inline_mark_mono);
-    line = replaceAll!(m => mkup.cite ~ mkup.ff_o ~ m[2] ~ mkup.ff_c ~ mkup.cite)(line, rgx.inline_mark_cite);
+    line = replaceAll!(m => mkup.mono ~ mkup.ff_o ~ m["text"] ~ mkup.ff_c ~ mkup.mono)(line, rgx.inline_mark_mono);
+    line = replaceAll!(m => mkup.cite ~ mkup.ff_o ~ m["text"] ~ mkup.ff_c ~ mkup.cite)(line, rgx.inline_mark_cite);
     foreach (regx; [rgx.inline_mark_emphasis, rgx.inline_mark_bold, rgx.inline_mark_underscore, rgx.inline_mark_italics, rgx.inline_mark_superscript, rgx.inline_mark_subscript, rgx.inline_mark_strike, rgx.inline_mark_insert]) {
-      line = replaceAll!(m => m[1] ~ mkup.ff_o ~ m[2] ~ mkup.ff_c ~ m[1])(line, regx);
+      line = replaceAll!(m => m["mark"] ~ mkup.ff_o ~ m["text"] ~ mkup.ff_c ~ m["mark"])(line, regx);
     }
     return line;
   }
@@ -254,33 +254,33 @@ template DocReformDocAbstraction() {
         || obj_txt.match(rgx.smid_inline_link_endnote_url_helper_punctuated)
       ) {
         obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s %s%s%s%s%s%s %s%s",
-          mkup.lnk_o, m[1].strip, mkup.lnk_c,
-          mkup.url_o, m[2], mkup.url_c,
+          mkup.lnk_o, m["content"].strip, mkup.lnk_c,
+          mkup.url_o, m["link"], mkup.url_c,
           mkup.en_a_o,
-          mkup.lnk_o, m[2].strip, mkup.lnk_c,
-          mkup.url_o, m[2], mkup.url_c,
+          mkup.lnk_o, m["link"].strip, mkup.lnk_c,
+          mkup.url_o, m["link"], mkup.url_c,
           mkup.en_a_c,
           m[3]
         ))(obj_txt, rgx.smid_inline_link_endnote_url_helper_punctuated);
         obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s %s%s%s%s%s%s %s",
-          mkup.lnk_o, m[1].strip, mkup.lnk_c,
-          mkup.url_o, m[2], mkup.url_c,
+          mkup.lnk_o, m["content"].strip, mkup.lnk_c,
+          mkup.url_o, m["link"], mkup.url_c,
           mkup.en_a_o,
-          mkup.lnk_o, m[2].strip, mkup.lnk_c,
-          mkup.url_o, m[2], mkup.url_c,
+          mkup.lnk_o, m["link"].strip, mkup.lnk_c,
+          mkup.url_o, m["link"], mkup.url_c,
           mkup.en_a_c
         ))(obj_txt, rgx.smid_inline_link_endnote_url_helper);
     } else {
         obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s",
-          m[1],
-          mkup.lnk_o, m[2].strip, mkup.lnk_c,
-          mkup.url_o, m[3], mkup.url_c
+          m["pre"],
+          mkup.lnk_o, m["content"].strip, mkup.lnk_c,
+          mkup.url_o, m["link"], mkup.url_c
         ))(obj_txt, rgx.smid_inline_link_markup_regular);
       }
         obj_txt = replaceAll!(m => format("%s%s%s%s%s%s%s",
-          m[1],
-          mkup.lnk_o, m[2].strip, mkup.lnk_c,
-          mkup.url_o, m[2], mkup.url_c
+          m["pre"],
+          mkup.lnk_o, m["link"].strip, mkup.lnk_c,
+          mkup.url_o, m["link"], mkup.url_c
         ))(obj_txt, rgx.smid_inline_link_naked_url); //
     }
     return obj_txt;
@@ -646,8 +646,8 @@ template DocReformDocAbstraction() {
               debug(paraindent) {
                 writeln(line);
               }
-              indent["hang_position"] = (m[1]).to!int;
-              indent["base_position"] = (m[1]).to!int;
+              indent["hang_position"] = (m["indent"]).to!int;
+              indent["base_position"] = (m["indent"]).to!int;
             } else if (line.matchFirst(rgx.para_bullet)) {
               debug(parabullet) {
                 writeln(line);
@@ -658,16 +658,16 @@ template DocReformDocAbstraction() {
                 writeln(line);
               }
               indent=[
-                "hang_position" : (m[1]).to!int,
-                "base_position" : (m[2]).to!int,
+                "hang_position" : (m["hang"]).to!int,
+                "base_position" : (m["indent"]).to!int,
               ];
             } else if (auto m = line.matchFirst(rgx.para_bullet_indent)) {
               debug(parabulletindent) {
                 writeln(line);
               }
               indent=[
-                "hang_position" : (m[1]).to!int,
-                "base_position" : (m[1]).to!int,
+                "hang_position" : (m["indent"]).to!int,
+                "base_position" : (m["indent"]).to!int,
               ];
               bullet = true;
             }
@@ -2588,14 +2588,14 @@ template DocReformDocAbstraction() {
           line
         );
       }
-      an_object["table_head"]        = m[1].to!string;
+      an_object["table_head"]        = m["attrib"].to!string;
       an_object["block_type"]        = "curly";
       obj_type_status["blocks"]      = TriState.on;
       obj_type_status["table"]       = TriState.on;
       obj_type_status["curly_table"] = TriState.on;
     } else if (auto m = line.matchFirst(rgx.block_curly_table_special_markup)) {
       /+ table: special table block markup syntax! +/
-      an_object["table_head"]                       = m[1].to!string;
+      an_object["table_head"]                       = m["attrib"].to!string;
       an_object["block_type"]                       = "special";
       obj_type_status["blocks"]                     = TriState.on;
       obj_type_status["table"]                      = TriState.on;
@@ -2668,7 +2668,7 @@ template DocReformDocAbstraction() {
           line
         );
       }
-      an_object["table_head"]      = m[1].to!string;
+      an_object["table_head"]      = m["attrib"].to!string;
       an_object["block_type"]      = "tic";
       obj_type_status["blocks"]    = TriState.on;
       obj_type_status["table"]     = TriState.on;
@@ -2691,7 +2691,7 @@ template DocReformDocAbstraction() {
         debug(quote) {                              // quote (curly) close
           writeln(line);
         }
-        an_object[an_object_key] = an_object[an_object_key].stripRight;
+        an_object[an_object_key]       = an_object[an_object_key].stripRight;
         obj_type_status["blocks"]      = TriState.closing;
         obj_type_status["quote"]       = TriState.closing;
         obj_type_status["curly_quote"] = TriState.off;
@@ -2706,7 +2706,7 @@ template DocReformDocAbstraction() {
         debug(quote) {                              // quote (tic) close
           writeln(line);
         }
-        an_object[an_object_key] = an_object[an_object_key].stripRight;
+        an_object[an_object_key]     = an_object[an_object_key].stripRight;
         obj_type_status["blocks"]    = TriState.closing;
         obj_type_status["quote"]     = TriState.closing;
         obj_type_status["tic_quote"] = TriState.off;
@@ -2878,7 +2878,7 @@ template DocReformDocAbstraction() {
           processing.remove("verse");
           ++cntr;
         }
-        object_number_poem["end"]   = obj_cite_digits.object_number.to!string;
+        object_number_poem["end"]     = obj_cite_digits.object_number.to!string;
         obj_type_status["blocks"]     = TriState.closing;
         obj_type_status["poem"]       = TriState.closing;
         obj_type_status["curly_poem"] = TriState.off;
@@ -3671,7 +3671,7 @@ template DocReformDocAbstraction() {
       debug(bookindexmatch) {
         writefln(
           "* [bookindex] %s\n",
-          m[1].to!string,
+          m["bookindex"].to!string,
         );
       }
       an_object["bookindex_nugget"] = m.captures[1].to!string;
@@ -4049,8 +4049,8 @@ template DocReformDocAbstraction() {
         debug(paraindent) {
           writeln(line);
         }
-        indent["hang_position"] = (m[1]).to!int;
-        indent["base_position"] = (m[1]).to!int;
+        indent["hang_position"] = (m["indent"]).to!int;
+        indent["base_position"] = (m["indent"]).to!int;
       } else if (line.matchFirst(rgx.para_bullet)) {
         debug(parabullet) {
           writeln(line);
@@ -4061,16 +4061,16 @@ template DocReformDocAbstraction() {
           writeln(line);
         }
         indent=[
-          "hang_position" : (m[1]).to!int,
-          "base_position" : (m[2]).to!int,
+          "hang_position" : (m["hang"]).to!int,
+          "base_position" : (m["indent"]).to!int,
         ];
       } else if (auto m = line.matchFirst(rgx.para_bullet_indent)) {
         debug(parabulletindent) {
           writeln(line);
         }
         indent=[
-          "hang_position" : (m[1]).to!int,
-          "base_position" : (m[1]).to!int,
+          "hang_position" : (m["indent"]).to!int,
+          "base_position" : (m["indent"]).to!int,
         ];
         bullet = true;
       }
@@ -5179,16 +5179,16 @@ template DocReformDocAbstraction() {
         ~ " \"indent_base\": 0,";
       } else if (auto m = obj_txt_in.matchFirst(rgx.para_bullet_indent)) {
         _obj_attributes =" \"bullet\": \"true\","
-        ~ " \"indent_hang\": " ~ m[1].to!string ~ ","
-        ~ " \"indent_base\": " ~ m[1].to!string ~ ",";
+        ~ " \"indent_hang\": " ~ m["indent"].to!string ~ ","
+        ~ " \"indent_base\": " ~ m["indent"].to!string ~ ",";
       } else if (auto m = obj_txt_in.matchFirst(rgx.para_indent_hang)) {
         _obj_attributes =" \"bullet\": \"false\","
-        ~ " \"indent_hang\": " ~ m[1].to!string ~ ","
-        ~ " \"indent_base\": " ~ m[2].to!string ~ ",";
+        ~ " \"indent_hang\": " ~ m["hang"].to!string ~ ","
+        ~ " \"indent_base\": " ~ m["indent"].to!string ~ ",";
       } else if (auto m = obj_txt_in.matchFirst(rgx.para_indent)) {
         _obj_attributes =" \"bullet\": \"false\","
-        ~ " \"indent_hang\": " ~ m[1].to!string ~ ","
-        ~ " \"indent_base\": " ~ m[1].to!string ~ ",";
+        ~ " \"indent_hang\": " ~ m["indent"].to!string ~ ","
+        ~ " \"indent_base\": " ~ m["indent"].to!string ~ ",";
       } else {
         _obj_attributes =" \"bullet\": \"false\","
         ~ " \"indent_hang\": 0,"
@@ -5681,27 +5681,27 @@ template DocReformDocAbstraction() {
       ) {
         debug(endnotes_build) {
           writeln(
-            "{^", mkup.ff_o, m[1], ".", mkup.ff_c, "^}"
+            "{^", mkup.ff_o, m["num"], ".", mkup.ff_c, "^}"
             ~ mkup.mark_internal_site_lnk,
             tag_in_seg["seg_lv4"],
-              ".fnSuffix#noteref_\n  ", m[1], " ",
-            m[2]); // sometimes need segment name (segmented html & epub)
+              ".fnSuffix#noteref_\n  ", m["num"], " ",
+            m["note"]); // sometimes need segment name (segmented html & epub)
         }
         // you need anchor for segments at this point ->
-        object_notes["anchor"] ~= "note_" ~ m[1] ~ "』";
+        object_notes["anchor"] ~= "note_" ~ m["num"] ~ "』";
         object_notes["notes"]  ~= (tag_in_seg["seg_lv4"].empty)
         ? (links_and_images(
-            "{" ~ mkup.superscript  ~ mkup.ff_o ~ m[1] ~ "." ~ mkup.ff_c  ~ mkup.superscript  ~ "}#noteref_"
-            ~ m[1]) ~ " "
-            ~ m[2] ~ "』"
+            "{" ~ mkup.superscript  ~ mkup.ff_o ~ m["num"] ~ "." ~ mkup.ff_c  ~ mkup.superscript  ~ "}#noteref_"
+            ~ m["num"]) ~ " "
+            ~ m["note"] ~ "』"
           )
         : (links_and_images(
-            "{" ~ mkup.superscript ~ mkup.ff_o ~ m[1] ~ "." ~ mkup.ff_c  ~ mkup.superscript ~ "}"
+            "{" ~ mkup.superscript ~ mkup.ff_o ~ m["num"] ~ "." ~ mkup.ff_c  ~ mkup.superscript ~ "}"
              ~ mkup.mark_internal_site_lnk
              ~ tag_in_seg["seg_lv4"]
              ~ ".fnSuffix#noteref_"
-             ~ m[1]) ~ " "
-             ~ m[2] ~ "』"
+             ~ m["num"]) ~ " "
+             ~ m["note"] ~ "』"
           );
       }
       return object_notes;
@@ -5817,7 +5817,7 @@ template DocReformDocAbstraction() {
         comp_obj_endnote_.attrib.bullet                  = false;
         foreach (i, endnote; endnotes_["notes"]) {
           auto     m                                     = endnote.matchFirst(rgx.note_ref);
-          string   notenumber                            = m[1].to!string;
+          string   notenumber                            = m["ref"].to!string;
           string   anchor_tag                            = "note_" ~ notenumber;
           comp_obj_endnote_.tags.anchor_tags             = [ endnotes_["anchor"][i] ];
           comp_obj_endnote_.has.inline_links             = true;
diff --git a/src/doc_reform/meta/rgx.d b/src/doc_reform/meta/rgx.d
index 8982ea5..7490903 100644
--- a/src/doc_reform/meta/rgx.d
+++ b/src/doc_reform/meta/rgx.d
@@ -87,36 +87,36 @@ static template DocReformRgxInit() {
     static heading_biblio_blurb                           = ctRegex!(`^:?(?:(1)[~][!](?:(?:biblio(?:graphy)?|references?)|blurb)|[A-D1][~])`);
     static heading_blurb_glossary                         = ctRegex!(`^:?(?:(1)[~][!](?:blurb|glossary)|[A-D1][~])`);
     static para_bullet                                    = ctRegex!(`^_[*] `);
-    static para_bullet_indent                             = ctRegex!(`^_([1-9])[*] `);
+    static para_bullet_indent                             = ctRegex!(`^_(?P[1-9])[*] `);
     static para_indent                                    = ctRegex!(`^_(?P[1-9])[ ]`);
     static para_indent_hang                               = ctRegex!(`^_(?P[0-9])_(?P[0-9])[ ]`);
     static para_attribs                                   = ctRegex!(`^_(?:(?:[0-9])(?:_([0-9]))?|(?:[1-9])?[*]) `);
     static para_inline_link_anchor                        = ctRegex!(`\*[~](?P[a-z0-9_.-]+)(?= |$)`,"i");
     /+ blocked markup +/
-    static block_open                                     = ctRegex!("^((code(?:[.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)|^`{3} (code(?:[.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)(?:[(][ a-zA-Z0-9;:,]*[)])?|^[{]table[(](?:h;)?(?P(?:[ ,]+[0-9]+)+)[)][}]");
+    static block_open                                     = ctRegex!("^((code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)|^`{3} (code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?|^[{]table[(](?:h;)?(?P(?:[ ,]+[0-9]+)+)[)][}]");
     static block_poem_open                                = ctRegex!("^((poem(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)|`{3} poem(?:[(][ a-zA-Z0-9;:,]*[)])?)");
     /+ blocked markup tics +/
-    static block_tic_open                                 = ctRegex!("^`{3} (code(?:[.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)");
-    static block_tic_code_open                            = ctRegex!("^`{3} (?:code)(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
-    static block_tic_poem_open                            = ctRegex!("^`{3} (poem)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
-    static block_tic_group_open                           = ctRegex!("^`{3} (group)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
-    static block_tic_block_open                           = ctRegex!("^`{3} (block)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
-    static block_tic_quote_open                           = ctRegex!("^`{3} (quote)(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
+    static block_tic_open                                 = ctRegex!("^`{3} (code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)");
+    static block_tic_code_open                            = ctRegex!("^`{3} code(?:[.](?P[a-z][0-9a-z#+_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
+    static block_tic_poem_open                            = ctRegex!("^`{3} poem(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
+    static block_tic_group_open                           = ctRegex!("^`{3} group(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
+    static block_tic_block_open                           = ctRegex!("^`{3} block(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
+    static block_tic_quote_open                           = ctRegex!("^`{3} quote(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?");
     static block_tic_table_open                           = ctRegex!("^`{3} table(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?"); // ctRegex!("^`{3} table(?:\(.*?\))?");
     static block_tic_close                                = ctRegex!("^(`{3})$","m");
     /+ blocked markup curly +/
-    static block_curly_open                               = ctRegex!(`^((?:code([.][a-z][0-9a-z_]+)?|poem|group|block|quote|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)`);
+    static block_curly_open                               = ctRegex!(`^((?:code([.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)`);
     static block_curly_code_open                          = ctRegex!(`^(?:code(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
     static block_curly_code_close                         = ctRegex!(`^([}]code)`);
-    static block_curly_poem_open                          = ctRegex!(`^(poem(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
+    static block_curly_poem_open                          = ctRegex!(`^(poem(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
     static block_curly_poem_close                         = ctRegex!(`^([}]poem)`);
-    static block_curly_group_open                         = ctRegex!(`^(group(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
+    static block_curly_group_open                         = ctRegex!(`^(group(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
     static block_curly_group_close                        = ctRegex!(`^([}]group)`);
-    static block_curly_block_open                         = ctRegex!(`^(block(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
+    static block_curly_block_open                         = ctRegex!(`^(block(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
     static block_curly_block_close                        = ctRegex!(`^([}]block)`);
-    static block_curly_quote_open                         = ctRegex!(`^(quote(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
+    static block_curly_quote_open                         = ctRegex!(`^(quote(?:[.](?P[a-z][0-9a-z_]+))?(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
     static block_curly_quote_close                        = ctRegex!(`^([}]quote)`);
-    static block_curly_table_open                         = ctRegex!(`^table(?:[(]([?P a-zA-Z0-9;:,]*)[)])?[{][ ]*$`);
+    static block_curly_table_open                         = ctRegex!(`^table(?:[(](?P[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$`);
     static block_curly_table_close                        = ctRegex!(`^([}]table)`);
     static block_curly_table_special_markup               = ctRegex!(`^[{]table[(](?P(?:(h);)?(?P(?:[, ]+[0-9]+)+))[)][}]`, "mg");
     static code_numbering                                 = ctRegex!(`(?P\bnumber\b)`);
@@ -146,7 +146,7 @@ static template DocReformRgxInit() {
     static inline_curly_delimiter_open_star_or_plus       = ctRegex!(`~\{[+*]`, "m");
     static inline_curly_delimiter_close_regular           = ctRegex!(`\s*\}~`, "m");
     static inline_text_and_note_curly                     = ctRegex!(`(?P.+?)(?:(?:[~])[{][*+ ]*)(?P.+?)(?:[}][~])`, "mg");
-    static note_ref                                       = ctRegex!(`^\S+?noteref_([0-9]+)`, "mg");     // {^{73.}^}#noteref_73
+    static note_ref                                       = ctRegex!(`^\S+?noteref_(?P[0-9]+)`, "mg");     // {^{73.}^}#noteref_73
     static webserv_url_doc_root                           = ctRegex!(`(?P(?Phttps?:\/\/[^ /]+)\/(?P\S*))`, "mg");
     static smid_inline_url_generic                        = ctRegex!(`(?:^|[}(\[ ])(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_#]`, "mg");
     static smid_inline_url                                = ctRegex!(`((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_]\S*)`, "mg");
@@ -169,7 +169,7 @@ static template DocReformRgxInit() {
     static smid_b_mod_image_without_dimensions             = ctRegex!(`[┥](?:~\^\s+|\s*)☼\S+\.(?:png|gif|jpg),w0h0.*[┝](?:┤.*?├|(?:https?|git):\/\/\S+?)(?=[;:!,?.]?([ )\]]|$))`, "mg");
     static smid_image_delimit                              = ctRegex!(`(?P
^|[ ]|[^\S]?)\{\s*(?P.+?)\s*\}(?:image)(?=[;:!,?.]?([ )\]]|$))`, "mg");
     /+ inline markup book index +/
-    static book_index                                     = ctRegex!(`^=\{\s*(.+?)\}$`, "m");
+    static book_index                                     = ctRegex!(`^=\{\s*(?P.+?)\}$`, "m");
     static book_index_open                                = ctRegex!(`^=\{\s*([^}]*?)$`);
     static book_index_close                               = ctRegex!(`^(.*?)\}$`, "m");
     static auto_heading_numbering_lv1                    = ctRegex!(`^1~`, "m");
@@ -283,7 +283,7 @@ static template DocReformRgxInit() {
     static inline_image_info                              = ctRegex!(`☼?(?P[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+)`, "mg");
     static inline_link_anchor                             = ctRegex!(`┃(?P\S+?)┃`, "mg"); // TODO *~text_link_anchor
     static inline_link_                                   = ctRegex!(`┥(?P.+?)┝┤(?P.+?)├`, "mg");
-    static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P\S+?)├`, "mg");
+    static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P#?(\S+?))├`, "mg");
     static inline_link_empty                              = ctRegex!(`┥(?P.+?)┝┤├`, "mg");
     static inline_link_number                             = ctRegex!(`┥(?P.+?)┝┤(?P[0-9]+)├`, "mg"); // not used
     static inline_link_number_only                        = ctRegex!(`(┥.+?┝)┤(?P[0-9]+)├`, "mg");
@@ -303,16 +303,16 @@ static template DocReformRgxInit() {
     /+ inline markup font face mod +/
     static inline_mark_faces                            = ctRegex!(`(?P(?P[*!/_^,+#"-])\{(?P.+?)\}[*!/_^,+#"-])`, "mg");
     static inline_mark_faces_to_mod                     = ctRegex!(`(?P[*!/_^,+#"-])\{(?P.+?)\}([*!/_^,+#"-])`, "mg");
-    static inline_mark_emphasis                         = ctRegex!(`([*])\{(?P.+?)\}[*]`, "mg");
-    static inline_mark_bold                             = ctRegex!(`([!])\{(?P.+?)\}[!]`, "mg");
-    static inline_mark_underscore                       = ctRegex!(`([_])\{(?P.+?)\}[_]`, "mg");
-    static inline_mark_italics                          = ctRegex!(`([/])\{(?P.+?)\}[/]`, "mg");
-    static inline_mark_superscript                      = ctRegex!(`(\^)\{(?P.+?)\}\^`, "mg");
-    static inline_mark_subscript                        = ctRegex!(`([,])\{(?P.+?)\}[,]`, "mg");
-    static inline_mark_strike                           = ctRegex!(`([-])\{(?P.+?)\}[-]`, "mg");
-    static inline_mark_insert                           = ctRegex!(`([+])\{(?P.+?)\}[+]`, "mg");
-    static inline_mark_mono                             = ctRegex!(`([#])\{(?P.+?)\}[#]`, "mg");
-    static inline_mark_cite                             = ctRegex!(`(["])\{(?P.+?)\}["]`, "mg");
+    static inline_mark_emphasis                         = ctRegex!(`(?P[*])\{(?P.+?)\}[*]`, "mg");
+    static inline_mark_bold                             = ctRegex!(`(?P[!])\{(?P.+?)\}[!]`, "mg");
+    static inline_mark_underscore                       = ctRegex!(`(?P[_])\{(?P.+?)\}[_]`, "mg");
+    static inline_mark_italics                          = ctRegex!(`(?P[/])\{(?P.+?)\}[/]`, "mg");
+    static inline_mark_superscript                      = ctRegex!(`(?P\^)\{(?P.+?)\}\^`, "mg");
+    static inline_mark_subscript                        = ctRegex!(`(?P[,])\{(?P.+?)\}[,]`, "mg");
+    static inline_mark_strike                           = ctRegex!(`(?P[-])\{(?P.+?)\}[-]`, "mg");
+    static inline_mark_insert                           = ctRegex!(`(?P[+])\{(?P.+?)\}[+]`, "mg");
+    static inline_mark_mono                             = ctRegex!(`(?P[#])\{(?P.+?)\}[#]`, "mg");
+    static inline_mark_cite                             = ctRegex!(`(?P["])\{(?P.+?)\}["]`, "mg");
     static inline_mark_fontface_clean                   = ctRegex!(`[*!_/^,+#■"-]\{|\}[*!_/^,+#■"-]`, "mg");
     static inline_faces_line                              = ctRegex!(`^[*!/_]_ (?P.+?)((?: [\\]{2}|[~]#){0,2}$)`);
     static inline_emphasis_line                           = ctRegex!(`^\*_ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
diff --git a/src/doc_reform/output/rgx.d b/src/doc_reform/output/rgx.d
index 2ddc57f..7c1247a 100644
--- a/src/doc_reform/output/rgx.d
+++ b/src/doc_reform/output/rgx.d
@@ -72,7 +72,7 @@ static template DocReformOutputRgxInit() {
     static inline_image_info                              = ctRegex!(`☼?(?P[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+)`, "mg");
     static inline_link_anchor                             = ctRegex!(`┃(?P\S+?)┃`, "mg"); // TODO *~text_link_anchor
     static inline_link_                                   = ctRegex!(`┥(?P.+?)┝┤(?P.+?)├`, "mg");
-    static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P\S+?)├`, "mg");
+    static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P#?(\S+?))├`, "mg");
     static inline_link_empty                              = ctRegex!(`┥(?P.+?)┝┤├`, "mg");
     static inline_link_number                             = ctRegex!(`┥(?P.+?)┝┤(?P[0-9]+)├`, "mg"); // not used
     static inline_link_number_only                        = ctRegex!(`(┥.+?┝)┤(?P[0-9]+)├`, "mg");
@@ -92,16 +92,16 @@ static template DocReformOutputRgxInit() {
     /+ inline markup font face mod +/
     static inline_mark_faces                            = ctRegex!(`(?P(?P[*!/_^,+#"-])\{(?P.+?)\}[*!/_^,+#"-])`, "mg");
     static inline_mark_faces_to_mod                     = ctRegex!(`(?P[*!/_^,+#"-])\{(?P.+?)\}([*!/_^,+#"-])`, "mg");
-    static inline_mark_emphasis                         = ctRegex!(`([*])\{(?P.+?)\}[*]`, "mg");
-    static inline_mark_bold                             = ctRegex!(`([!])\{(?P.+?)\}[!]`, "mg");
-    static inline_mark_underscore                       = ctRegex!(`([_])\{(?P.+?)\}[_]`, "mg");
-    static inline_mark_italics                          = ctRegex!(`([/])\{(?P.+?)\}[/]`, "mg");
-    static inline_mark_superscript                      = ctRegex!(`(\^)\{(?P.+?)\}\^`, "mg");
-    static inline_mark_subscript                        = ctRegex!(`([,])\{(?P.+?)\}[,]`, "mg");
-    static inline_mark_strike                           = ctRegex!(`([-])\{(?P.+?)\}[-]`, "mg");
-    static inline_mark_insert                           = ctRegex!(`([+])\{(?P.+?)\}[+]`, "mg");
-    static inline_mark_mono                             = ctRegex!(`([#])\{(?P.+?)\}[#]`, "mg");
-    static inline_mark_cite                             = ctRegex!(`(["])\{(?P.+?)\}["]`, "mg");
+    static inline_mark_emphasis                         = ctRegex!(`(?P[*])\{(?P.+?)\}[*]`, "mg");
+    static inline_mark_bold                             = ctRegex!(`(?P[!])\{(?P.+?)\}[!]`, "mg");
+    static inline_mark_underscore                       = ctRegex!(`(?P[_])\{(?P.+?)\}[_]`, "mg");
+    static inline_mark_italics                          = ctRegex!(`(?P[/])\{(?P.+?)\}[/]`, "mg");
+    static inline_mark_superscript                      = ctRegex!(`(?P\^)\{(?P.+?)\}\^`, "mg");
+    static inline_mark_subscript                        = ctRegex!(`(?P[,])\{(?P.+?)\}[,]`, "mg");
+    static inline_mark_strike                           = ctRegex!(`(?P[-])\{(?P.+?)\}[-]`, "mg");
+    static inline_mark_insert                           = ctRegex!(`(?P[+])\{(?P.+?)\}[+]`, "mg");
+    static inline_mark_mono                             = ctRegex!(`(?P[#])\{(?P.+?)\}[#]`, "mg");
+    static inline_mark_cite                             = ctRegex!(`(?P["])\{(?P.+?)\}["]`, "mg");
     static inline_mark_fontface_clean                   = ctRegex!(`[*!_/^,+#■"-]\{|\}[*!_/^,+#■"-]`, "mg");
     static inline_faces_line                              = ctRegex!(`^[*!/_]_ (?P.+?)((?: [\\]{2}|[~]#){0,2}$)`);
     static inline_emphasis_line                           = ctRegex!(`^\*_ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
diff --git a/src/doc_reform/output/xmls.d b/src/doc_reform/output/xmls.d
index ffcbd1a..e494bab 100644
--- a/src/doc_reform/output/xmls.d
+++ b/src/doc_reform/output/xmls.d
@@ -356,7 +356,7 @@ template outputXHTMLs() {
       if (obj.has.inline_links) {
         if  (obj.metainfo.is_a != "code") {
           _txt = replaceAll!(m =>
-              m[1] ~ "┤" ~ to!string((obj.stow.link[m[2].to!ulong])).encode ~ "├"
+              m[1] ~ "┤" ~ to!string((obj.stow.link[m["num"].to!ulong])).encode ~ "├"
             )(_txt, rgx.inline_link_number_only);
         }
         if ((_txt.match(rgx.mark_internal_site_lnk))
-- 
cgit v1.2.3