diff options
author | Ralph Amissah <ralph@amissah.com> | 2017-01-14 10:08:53 -0500 |
---|---|---|
committer | Ralph Amissah <ralph@amissah.com> | 2019-04-10 15:14:14 -0400 |
commit | 099d54647f0ff4bf7effb7c554e987eeff11fb85 (patch) | |
tree | c5529ce0c6eabaca66ab6164ff954db64d9eb149 | |
parent | insert file list: gather & make available a list of insert files (if any) (diff) |
identify internal links for downstream munging
-rw-r--r-- | org/ao_abstract_doc_source.org | 43 | ||||
-rw-r--r-- | org/ao_defaults.org | 11 | ||||
-rw-r--r-- | org/ao_output_debugs.org | 2 | ||||
-rw-r--r-- | src/sdp/ao_abstract_doc_source.d | 41 | ||||
-rw-r--r-- | src/sdp/ao_defaults.d | 1 | ||||
-rw-r--r-- | src/sdp/ao_rgx.d | 10 |
6 files changed, 67 insertions, 41 deletions
diff --git a/org/ao_abstract_doc_source.org b/org/ao_abstract_doc_source.org index 4aa20be..e413570 100644 --- a/org/ao_abstract_doc_source.org +++ b/org/ao_abstract_doc_source.org @@ -197,7 +197,7 @@ enum DocStructMarkupHeading { h_text_5, // extra level, drop content_non_header } // header section A-D; header text 1-4 -enum DocStructCollapsedHeading { lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7 } // not yet used +enum DocStructCollapsedHeading { lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7 } /+ biblio variables +/ string biblio_tag_name, biblio_tag_entry, st; string[] biblio_arr_json; @@ -232,7 +232,7 @@ void heading_ancestors(O)( switch (obj.heading_lev_markup) { case 0: lv_ancestors[0] = to!string(obj.text); - foreach(k; 1..8) { // 1 .. 7 ? + foreach(k; 1..8) { lv_ancestors[k] = ""; } goto default; @@ -1430,8 +1430,9 @@ comp_obj_toc.indent_base = indent["base_position"]; comp_obj_toc.bullet = false; if (the_endnotes_section.length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Endnotes", + mkup.mark_internal_site_lnk, "endnotes", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1440,8 +1441,9 @@ if (the_endnotes_section.length > 1) { } if (the_glossary_section.length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffixs", + "{ %s }%s../%s.fnSuffixs", "Glossary", + mkup.mark_internal_site_lnk, "glossary", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1458,8 +1460,9 @@ if (the_glossary_section.length > 1) { } if (the_bibliography_section.length > 1){ toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Bibliography", + mkup.mark_internal_site_lnk, "bibliography", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1477,8 +1480,9 @@ if (the_bibliography_section.length > 1){ } if (the_bookindex_section["seg"].length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Book Index", + mkup.mark_internal_site_lnk, "bookindex", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1497,8 +1501,9 @@ if (the_bookindex_section["scroll"].length > 1) { } if (the_blurb_section.length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Blurb", + mkup.mark_internal_site_lnk, "blurb", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1618,7 +1623,7 @@ if (the_blurb_section.length > 1) { } #+END_SRC -**** loop: all objects structural relationships (sections, segments, objects) +**** [#A] loop: all objects structural relationships (sections, segments, objects) needed for DOM structure, segnames & subtoc, backmatter pointers @@ -3827,6 +3832,8 @@ struct ObjInlineMarkup { in { } body { ObjGenericComposite comp_obj_toc; + mixin InternalMarkup; + auto mkup = InlineMarkup(); char[] heading_toc_ = to!(char[])(obj_["body_nugget"].dup.strip); heading_toc_ = _clean_heading_toc_(heading_toc_); auto attrib=""; @@ -3884,7 +3891,7 @@ struct ObjInlineMarkup { "hang_position" : 0, "base_position" : 0, ]; - toc_txt_ = "{ Table of Contents }../toc.fnSuffix"; + toc_txt_ = "{ Table of Contents }" ~ mkup.mark_internal_site_lnk ~ "../toc.fnSuffix"; toc_txt_= munge.url_links(toc_txt_); comp_obj_toc.indent_hang = indent["hang_position"]; comp_obj_toc.indent_base = indent["base_position"]; @@ -3908,8 +3915,9 @@ struct ObjInlineMarkup { break; case 4: toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", heading_toc_, + mkup.mark_internal_site_lnk, segment_anchor_tag_that_object_belongs_to, ); lev4_subtoc[segment_anchor_tag_that_object_belongs_to] = []; @@ -3925,8 +3933,9 @@ struct ObjInlineMarkup { break; case 5: .. case 7: toc_txt_ = format( - "{ %s }../%s.fnSuffix#%s", + "{ %s }%s../%s.fnSuffix#%s", heading_toc_, + mkup.mark_internal_site_lnk, segment_anchor_tag_that_object_belongs_to, _anchor_tag, ); @@ -4638,6 +4647,8 @@ struct BookIndexReportSection { bool[string] opt_action_bool, ) { mixin SiSUnode; + mixin InternalMarkup; + auto mkup = InlineMarkup(); string type_is; string lev; int heading_lev_markup, heading_lev_collapsed; @@ -4701,7 +4712,7 @@ struct BookIndexReportSection { bi_tmp_scroll ~= munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", "); bi_tmp_seg ~= (segment_anchor_tag_that_object_belongs_to.empty) ? munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", ") - : munge.url_links(" {" ~ ref_ ~ "}../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); + : munge.url_links(" {" ~ ref_ ~ "}" ~ mkup.mark_internal_site_lnk ~ "../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); } bi_tmp_scroll ~= " \\\\\n "; bi_tmp_seg ~= " \\\\\n "; @@ -4718,7 +4729,7 @@ struct BookIndexReportSection { bi_tmp_scroll ~= munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", "); bi_tmp_seg ~= (segment_anchor_tag_that_object_belongs_to.empty) ? munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", ") - : munge.url_links(" {" ~ ref_ ~ "}../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); + : munge.url_links(" {" ~ ref_ ~ "}" ~ mkup.mark_internal_site_lnk ~ "../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); } bi_tmp_scroll ~= " \\\\\n "; bi_tmp_seg ~= " \\\\\n "; @@ -4803,6 +4814,8 @@ struct NotesSection { ); } body { + mixin InternalMarkup; + auto mkup = InlineMarkup(); auto munge = ObjInlineMarkupMunge(); foreach( m; @@ -4813,7 +4826,7 @@ struct NotesSection { ) { debug(endnotes_build) { writeln( - "{^{", m.captures[1], ".}^}../", segment_anchor_tag_that_object_belongs_to, ".fnSuffix#noteref_\n ", m.captures[1], " ", + "{^{", m.captures[1], ".}^}" ~ mkup.mark_internal_site_lnk ~ "../", segment_anchor_tag_that_object_belongs_to, ".fnSuffix#noteref_\n ", m.captures[1], " ", m.captures[2]); // sometimes need segment name (segmented html & epub) } // TODO NEXT you need anchor for segments at this point -> @@ -4824,7 +4837,7 @@ struct NotesSection { m.captures[1]) ~ " " ~ m.captures[2] ~ "』" ) : (munge.url_links( - "{^{" ~ m.captures[1] ~ ".}^}../" ~ + "{^{" ~ m.captures[1] ~ ".}^}" ~ mkup.mark_internal_site_lnk ~ "../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#noteref_" ~ m.captures[1]) ~ " " ~ m.captures[2] ~ "』" ); diff --git a/org/ao_defaults.org b/org/ao_defaults.org index 28ed15c..e54d360 100644 --- a/org/ao_defaults.org +++ b/org/ao_defaults.org @@ -709,6 +709,7 @@ template InternalMarkup() { auto en_b_o = "〖"; auto en_b_c = "〗"; // endnote en_b_o: '~['; en_b_c: ']~'; auto lnk_o = "┥"; auto lnk_c = "┝"; auto url_o = "┤"; auto url_c = "├"; + auto mark_internal_site_lnk = "¤"; auto nbsp = "░"; auto br_line = "┘"; auto br_nl = "┙"; @@ -954,11 +955,11 @@ static inline_text_and_note_al_ = ctRegex!(`(.+?(?:【[*+] #+name: ao_rgx #+BEGIN_SRC d -static inline_url = ctRegex!(`((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+)`, "mg"); -static inline_link_naked_url = ctRegex!(`(^|[ ])((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); -static inline_link_markup_regular = ctRegex!(`(^|[ ])\{\s*(.+?)\s*\}((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); -static inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); -static inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+)`, "mg"); +static inline_url = ctRegex!(`((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+)`, "mg"); +static inline_link_naked_url = ctRegex!(`(^|[ ])((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); +static inline_link_markup_regular = ctRegex!(`(^|[ ])\{\s*(.+?)\s*\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); +static inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); +static inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+)`, "mg"); static inline_a_url = ctRegex!(`(┤)(\S+?)(├)`, "mg"); #+END_SRC diff --git a/org/ao_output_debugs.org b/org/ao_output_debugs.org index f0a8cab..43e1142 100644 --- a/org/ao_output_debugs.org +++ b/org/ao_output_debugs.org @@ -320,7 +320,6 @@ debug(dom) { #+END_SRC *** endnotes_section (seg & scroll) :endnotes: - **** endnotes #+name: ao_output_debugs @@ -380,7 +379,6 @@ debug(section_bibliography) { #+END_SRC *** bookindex_section (seg & scroll) :bookindex: - **** bookindex #+name: ao_output_debugs diff --git a/src/sdp/ao_abstract_doc_source.d b/src/sdp/ao_abstract_doc_source.d index ec1536e..e813260 100644 --- a/src/sdp/ao_abstract_doc_source.d +++ b/src/sdp/ao_abstract_doc_source.d @@ -42,7 +42,7 @@ template SiSUdocAbstraction() { h_text_5, // extra level, drop content_non_header } // header section A-D; header text 1-4 - enum DocStructCollapsedHeading { lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7 } // not yet used + enum DocStructCollapsedHeading { lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7 } /+ biblio variables +/ string biblio_tag_name, biblio_tag_entry, st; string[] biblio_arr_json; @@ -77,7 +77,7 @@ template SiSUdocAbstraction() { switch (obj.heading_lev_markup) { case 0: lv_ancestors[0] = to!string(obj.text); - foreach(k; 1..8) { // 1 .. 7 ? + foreach(k; 1..8) { lv_ancestors[k] = ""; } goto default; @@ -1030,8 +1030,9 @@ template SiSUdocAbstraction() { comp_obj_toc.bullet = false; if (the_endnotes_section.length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Endnotes", + mkup.mark_internal_site_lnk, "endnotes", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1040,8 +1041,9 @@ template SiSUdocAbstraction() { } if (the_glossary_section.length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffixs", + "{ %s }%s../%s.fnSuffixs", "Glossary", + mkup.mark_internal_site_lnk, "glossary", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1058,8 +1060,9 @@ template SiSUdocAbstraction() { } if (the_bibliography_section.length > 1){ toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Bibliography", + mkup.mark_internal_site_lnk, "bibliography", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1077,8 +1080,9 @@ template SiSUdocAbstraction() { } if (the_bookindex_section["seg"].length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Book Index", + mkup.mark_internal_site_lnk, "bookindex", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -1097,8 +1101,9 @@ template SiSUdocAbstraction() { } if (the_blurb_section.length > 1) { toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", "Blurb", + mkup.mark_internal_site_lnk, "blurb", // segment_anchor_tag_that_object_belongs_to ); toc_txt_= munge.url_links(toc_txt_); @@ -3135,6 +3140,8 @@ template SiSUdocAbstraction() { in { } body { ObjGenericComposite comp_obj_toc; + mixin InternalMarkup; + auto mkup = InlineMarkup(); char[] heading_toc_ = to!(char[])(obj_["body_nugget"].dup.strip); heading_toc_ = _clean_heading_toc_(heading_toc_); auto attrib=""; @@ -3192,7 +3199,7 @@ template SiSUdocAbstraction() { "hang_position" : 0, "base_position" : 0, ]; - toc_txt_ = "{ Table of Contents }../toc.fnSuffix"; + toc_txt_ = "{ Table of Contents }" ~ mkup.mark_internal_site_lnk ~ "../toc.fnSuffix"; toc_txt_= munge.url_links(toc_txt_); comp_obj_toc.indent_hang = indent["hang_position"]; comp_obj_toc.indent_base = indent["base_position"]; @@ -3216,8 +3223,9 @@ template SiSUdocAbstraction() { break; case 4: toc_txt_ = format( - "{ %s }../%s.fnSuffix", + "{ %s }%s../%s.fnSuffix", heading_toc_, + mkup.mark_internal_site_lnk, segment_anchor_tag_that_object_belongs_to, ); lev4_subtoc[segment_anchor_tag_that_object_belongs_to] = []; @@ -3233,8 +3241,9 @@ template SiSUdocAbstraction() { break; case 5: .. case 7: toc_txt_ = format( - "{ %s }../%s.fnSuffix#%s", + "{ %s }%s../%s.fnSuffix#%s", heading_toc_, + mkup.mark_internal_site_lnk, segment_anchor_tag_that_object_belongs_to, _anchor_tag, ); @@ -3789,6 +3798,8 @@ template SiSUdocAbstraction() { bool[string] opt_action_bool, ) { mixin SiSUnode; + mixin InternalMarkup; + auto mkup = InlineMarkup(); string type_is; string lev; int heading_lev_markup, heading_lev_collapsed; @@ -3852,7 +3863,7 @@ template SiSUdocAbstraction() { bi_tmp_scroll ~= munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", "); bi_tmp_seg ~= (segment_anchor_tag_that_object_belongs_to.empty) ? munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", ") - : munge.url_links(" {" ~ ref_ ~ "}../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); + : munge.url_links(" {" ~ ref_ ~ "}" ~ mkup.mark_internal_site_lnk ~ "../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); } bi_tmp_scroll ~= " \\\\\n "; bi_tmp_seg ~= " \\\\\n "; @@ -3869,7 +3880,7 @@ template SiSUdocAbstraction() { bi_tmp_scroll ~= munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", "); bi_tmp_seg ~= (segment_anchor_tag_that_object_belongs_to.empty) ? munge.url_links(" {" ~ ref_ ~ "}#" ~ go ~ ", ") - : munge.url_links(" {" ~ ref_ ~ "}../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); + : munge.url_links(" {" ~ ref_ ~ "}" ~ mkup.mark_internal_site_lnk ~ "../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#" ~ go ~ ", "); } bi_tmp_scroll ~= " \\\\\n "; bi_tmp_seg ~= " \\\\\n "; @@ -3937,6 +3948,8 @@ template SiSUdocAbstraction() { ); } body { + mixin InternalMarkup; + auto mkup = InlineMarkup(); auto munge = ObjInlineMarkupMunge(); foreach( m; @@ -3947,7 +3960,7 @@ template SiSUdocAbstraction() { ) { debug(endnotes_build) { writeln( - "{^{", m.captures[1], ".}^}../", segment_anchor_tag_that_object_belongs_to, ".fnSuffix#noteref_\n ", m.captures[1], " ", + "{^{", m.captures[1], ".}^}" ~ mkup.mark_internal_site_lnk ~ "../", segment_anchor_tag_that_object_belongs_to, ".fnSuffix#noteref_\n ", m.captures[1], " ", m.captures[2]); // sometimes need segment name (segmented html & epub) } // TODO NEXT you need anchor for segments at this point -> @@ -3958,7 +3971,7 @@ template SiSUdocAbstraction() { m.captures[1]) ~ " " ~ m.captures[2] ~ "』" ) : (munge.url_links( - "{^{" ~ m.captures[1] ~ ".}^}../" ~ + "{^{" ~ m.captures[1] ~ ".}^}" ~ mkup.mark_internal_site_lnk ~ "../" ~ segment_anchor_tag_that_object_belongs_to ~ ".fnSuffix#noteref_" ~ m.captures[1]) ~ " " ~ m.captures[2] ~ "』" ); diff --git a/src/sdp/ao_defaults.d b/src/sdp/ao_defaults.d index c80933c..1e88e3b 100644 --- a/src/sdp/ao_defaults.d +++ b/src/sdp/ao_defaults.d @@ -619,6 +619,7 @@ template InternalMarkup() { auto en_b_o = "〖"; auto en_b_c = "〗"; // endnote en_b_o: '~['; en_b_c: ']~'; auto lnk_o = "┥"; auto lnk_c = "┝"; auto url_o = "┤"; auto url_c = "├"; + auto mark_internal_site_lnk = "¤"; auto nbsp = "░"; auto br_line = "┘"; auto br_nl = "┙"; diff --git a/src/sdp/ao_rgx.d b/src/sdp/ao_rgx.d index 6641d6a..f800a12 100644 --- a/src/sdp/ao_rgx.d +++ b/src/sdp/ao_rgx.d @@ -149,11 +149,11 @@ template RgxInit() { static inline_al_delimiter_open_plus = ctRegex!(`【\+`, "m"); static inline_text_and_note_al = ctRegex!(`(?P<text>.+?)【(?:[*+ ]*)(?P<note>.+?)】`, "mg"); static inline_text_and_note_al_ = ctRegex!(`(.+?(?:【[*+]*\s+.+?】|$))`, "mg"); - static inline_url = ctRegex!(`((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+)`, "mg"); - static inline_link_naked_url = ctRegex!(`(^|[ ])((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); - static inline_link_markup_regular = ctRegex!(`(^|[ ])\{\s*(.+?)\s*\}((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); - static inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); - static inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|\.\.\/|\.\/|#)\S+)`, "mg"); + static inline_url = ctRegex!(`((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+)`, "mg"); + static inline_link_naked_url = ctRegex!(`(^|[ ])((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); + static inline_link_markup_regular = ctRegex!(`(^|[ ])\{\s*(.+?)\s*\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); + static inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+?)([.,;:?!]?(?:[ ]|$))`, "mg"); + static inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(.+?)\}((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|#)\S+)`, "mg"); static inline_a_url = ctRegex!(`(┤)(\S+?)(├)`, "mg"); /+ inline markup book index +/ static book_index = ctRegex!(`^=\{\s*(.+?)\}$`, "m"); |