/++ regex: regular expressions used in sisu document parser +/ module doc_reform.io_out.rgx; static template spineOutputRgxInit() { import doc_reform.io_out.defaults; static struct Rgx { static newline = ctRegex!("\n", "mg"); static space = ctRegex!(`[ ]`, "mg"); static spaces_keep = ctRegex!(`(?P^[ ]+|[ ]{2,})`, "mg"); // code, verse, block static spaces_line_start = ctRegex!(`^(?P[ ]+)`, "mg"); static nbsp_char = ctRegex!(`░`, "mg"); static src_pth_sst_or_ssm = ctRegex!(`^(?P[/]?(?:[a-zA-Z0-9._-]+/)*)(?P[a-zA-Z0-9._-]+[.](?Pss[tm]))$`); static src_pth_pod_sst_or_ssm = ctRegex!(`^(?P[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P[a-zA-Z0-9][a-zA-Z0-9._-]*?[.]ss[tm])$`); static src_pth_contents = ctRegex!(`^(?P[/]?(?:[a-zA-Z0-9._-]+/)*)(?P[a-zA-Z0-9][a-zA-Z0-9._-]*)/pod[.]manifest$`); static src_pth_zip = ctRegex!(`^(?P[/]?(?:[a-zA-Z0-9._-]+/)*)(?P[a-zA-Z0-9._-]+[.]zip)$`); static src_pth_types = ctRegex!(`^(?P[/]?[a-zA-Z0-9._-]+/)*(?P(?P[a-zA-Z0-9._-]+[.]ss[tm])|(?P[a-zA-Z0-9._-]+/pod[.]manifest)|(?P[a-zA-Z0-9._-]+[.]zip))$`); static src_fn = ctRegex!(`^([/]?(?:[a-zA-Z0-9._-]+/)*)(?P(?P[a-zA-Z0-9._-]+)[.](?Pss[tm]))$`); static src_fn_master = ctRegex!(`^(?P/?(?:[a-zA-Z0-9._-]+/)*)(?P[a-zA-Z0-9._-]+[.]ssm)$`); static src_fn_find_inserts = ctRegex!(`^(?P/?(?:[a-zA-Z0-9._-]+/)*)(?P[a-zA-Z0-9._-]+[.]ss[im])$`); static insert_src_fn_ssi_or_sst = ctRegex!(`^<<\s*(?P[a-zA-Z0-9._-]+/)*(?P[a-zA-Z0-9._-]+[.]ss[ti])$`); static src_base_parent_dir_name = ctRegex!(`[/](?P(?:[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure static src_formalised_file_path_parts = ctRegex!(`(?P(?:[/a-zA-Z0-9._-]+?)(?P[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure /+ line breaks +/ static br_empty_line = ctRegex!(`\n[ ]*\n`, "mg"); static br_newlines_linebreaks = ctRegex!(`[\n┘┙]`, "mg"); static br_line = ctRegex!(`┘`, "mg"); static br_nl = ctRegex!(`┙`, "mg"); /+ inline markup footnotes endnotes +/ static inline_notes_al = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg"); static inline_notes_al_special = ctRegex!(`【(?:[*+]\s+)(.+?)】`, "mg"); // TODO remove match when special footnotes are implemented static inline_notes_al_gen = ctRegex!(`【.+?】`, "m"); static inline_notes_al_regular = ctRegex!(`【(.+?)】`, "mg"); static inline_notes_al_gen_text = ctRegex!(`【(?P.+?)】`, "m"); static inline_notes_al_gen_ref = ctRegex!(`【(?P[*+]\s+)\s*(?P.+?)】`, "mg"); static inline_notes_al_all_note = ctRegex!(`【(?P\d+|(?:[*]|[+])+)\s+(?P.+?)\s*】`, "mg"); static inline_notes_al_regular_number_note = ctRegex!(`【(?P\d+)\s+(?P.+?)\s*】`, "mg"); static inline_notes_al_special_char_note = ctRegex!(`【(?P(?:[*]|[+])+)\s+(?P.+?)】`, "mg"); static inline_al_delimiter_open_regular = ctRegex!(`【\s`, "m"); static inline_al_delimiter_open_symbol_star = ctRegex!(`【[*]\s`, "m"); static inline_al_delimiter_open_symbol_plus = ctRegex!(`【[+]\s`, "m"); static inline_text_and_note_al_ = ctRegex!(`(.+?(?:【[*+]*\s+.+?】|$))`, "mg"); /+ inline markup links +/ static inline_image = ctRegex!(`(?P
┥)☼(?P(?P[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+))\s*(?P.*?┝┤.*?├)`, "mg");
    static inline_image_without_dimensions                = ctRegex!(`(?P
┥)☼(?P(?P[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P0)h(?P0))\s*(?P.*?┝┤.*?├)`, "mg");
    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#?(\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");
    static inline_link_stow_uri                           = ctRegex!(`┥(?P.+?)┝┤(?P[^ 0-9#┥┝┤├][^ 0-9┥┝┤├]+)├`, "mg"); // will not stow (stowed links) or object number internal links
    static inline_link_hash                               = ctRegex!(`┥(?P.+?)┝┤(?P#(?P\S+?))├`, "mg");
    static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");
    static inline_link_toc_to_backmatter                  = ctRegex!(`┤#(?Pendnotes|bibliography|bookindex|glossary|blurb)├`, "mg");
    static url                                            = ctRegex!(`https?://`, "mg");
    static uri                                            = ctRegex!(`(?:https?|git)://`, "mg");
    static uri_identify_components                        = ctRegex!(`(?P(?:https?|git)://)(?P\S+?/)(?P[^/]+)$`, "mg");
    static inline_link_subtoc                             = ctRegex!(`^(?P[5-7])~ ┥(?P.+?)┝┤(?P.+?)├`, "mg");
    static inline_link_fn_suffix                          = ctRegex!(`¤(.+?)(\.fnSuffix)`, "mg");
    static inline_seg_link                                = ctRegex!(`(¤)(?:.+?)\.fnSuffix`, "mg");
    static mark_internal_site_lnk                         = ctRegex!(`¤`, "mg");
    static quotation_mark_sql_insert_delimiter            = ctRegex!("[']", "mg");
    /+ inline markup font face mod +/
    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_faces_line                              = ctRegex!(`^[*!/_]_ (?P.+?)((?: [\\]{2}|[~]#){0,2}$)`);
    static inline_emphasis_line                           = ctRegex!(`^\*_ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
    static inline_bold_line                               = ctRegex!(`^!_ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
    static inline_italics_line                            = ctRegex!(`^/_ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
    static inline_underscore_line                         = ctRegex!(`^__ (?P.+?)(?P(?: [\\]{2}|[~]#){0,2}$)`);
    /+ inline markup font face mod +/
    static inline_emphasis                                = ctRegex!(`[*]┨(?P.+?)┣[*]`, "mg");
    static inline_bold                                    = ctRegex!(`[!]┨(?P.+?)┣[!]`, "mg");
    static inline_underscore                              = ctRegex!(`[_]┨(?P.+?)┣[_]`, "mg");
    static inline_italics                                 = ctRegex!(`[/]┨(?P.+?)┣[/]`, "mg");
    static inline_superscript                             = ctRegex!(`\^┨(?P.+?)┣\^`, "mg");
    // static inline_superscript                             = ctRegex!(`[\^]┨(?P.+?)┣[\^]`, "mg");
    static inline_subscript                               = ctRegex!(`[,]┨(?P.+?)┣[,]`, "mg");
    static inline_strike                                  = ctRegex!(`[-]┨(?P.+?)┣[-]`, "mg");
    static inline_insert                                  = ctRegex!(`[+]┨(?P.+?)┣[+]`, "mg");
    static inline_mono                                    = ctRegex!(`[■]┨(?P.+?)┣[■]`, "mg");
    static inline_cite                                    = ctRegex!(`[‖]┨(?P.+?)┣[‖]`, "mg");
    static inline_fontface_clean                          = ctRegex!(`[*!_/^,+■‖-]┨|┣[*!_/^,+■‖-]`, "mg");
    /+ table delimiters +/
    static table_delimiter_col                           = ctRegex!("[ ]*[┊][ ]*", "mg");
    static table_delimiter_row                           = ctRegex!("[ ]*\n", "mg");
    static xhtml_ampersand                            = ctRegex!(`[&]`, "m");      // &
    static xhtml_quotation                            = ctRegex!(`["]`, "m");      // "
    static xhtml_less_than                            = ctRegex!(`[<]`, "m");      // <
    static xhtml_greater_than                         = ctRegex!(`[>]`, "m");      // >
    static xhtml_line_break                           = ctRegex!(` [\\]{2}`, "m"); // 
static latex_special_char = ctRegex!(`([%${}_#&\\])`); static latex_special_char_for_escape = ctRegex!(`([%${}_#\\])`); static latex_special_char_for_escape_and_braces = ctRegex!(`([&])`); static latex_special_char_for_escape_url = ctRegex!(`([%])`); static latex_special_char_escaped = ctRegex!(`\\([%${}_#\\])`); static latex_special_char_escaped_braced = ctRegex!(`[{]\\([&])[}]`); static latex_identify_inline_link = ctRegex!(`┥.+?┝┤\S+?├`, "mg"); static latex_clean_internal_link = ctRegex!(`^(?:#|¤\S+?#)`, "m"); static latex_identify_inline_fontface = ctRegex!(`\\([_#$]┨.+?┣)\\([_#$])`, "mg"); static latex_clean_bookindex_linebreak = ctRegex!(`\s*\\\\\\\\\s*`, "m"); } }