Markd::Rule
Constants
ADMONITION_START = /^> \[!((?:NOTE|TIP|IMPORTANT|CAUTION|WARNING)+)](\s*.*)?$/
ATTRIBUTE = ((("(?:" + "\\s+") + ATTRIBUTE_NAME_STRING) + ATTRIBUTE_VALUE_SPEC_STRING) + "?)"
ATTRIBUTE_NAME_STRING = "[a-zA-Z_:][a-zA-Z0-9:._-]*"
ATTRIBUTE_VALUE_SPEC_STRING = ((("(?:" + "\\s*=") + "\\s*") + ATTRIBUTE_VALUE_STRING) + ")"
ATTRIBUTE_VALUE_STRING = ((((("(?:" + UNQUOTED_VALUE_STRING) + "|") + SINGLE_QUOTED_VALUE_STRING) + "|") + DOUBLE_QUOTED_VALUE_STRING) + ")"
AUTO_LINK = /^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*>/i
AUTOLINK_PROTOCOLS = /^(?:http|https|ftp):\/\//
CDATA_STRING = "<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"
CLOSE_TAG = ("</" + TAG_NAME_STRING) + "\\s*[>]"
CLOSE_TAG_STRING = "</#{TAG_NAME_STRING}\\s*[>]"
CODE_INDENT = 4
COMMENT_STRING = "<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->"
DASH = /--+/
DECLARATION_STRING = "<![A-Z]+" + "\\s+[^>]*>"
DOMAIN_NAME = /(?:#{OTHER_DOMAIN_SEGMENTS}\.)*#{OTHER_DOMAIN_SEGMENTS}/
The spec wants to capture greedily, even invalid domain names and then reject the invalid ones later. For example: www.xxx._yyy.zzz is never linked because of the _ in the last segment.
DOUBLE_QUOTED_VALUE_STRING = "\"[^\"]*\""
ELLIPSIS = "..."
EMAIL_AUTO_LINK = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/
ESCAPABLE = /^#{ESCAPABLE_STRING}/
ESCAPABLE_STRING = "[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]"
ESCAPED_CHAR_STRING = "\\\\" + ESCAPABLE_STRING
EXTENDED_EMAIL_AUTO_LINK = /^([a-zA-Z0-9][a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+)[-_]*/
GFM_DISALLOWED_HTML_TAGS = ["title", "textarea", "style", "xmp", "iframe", "noembed", "noframes", "script", "plaintext"] of ::String
HTML_BLOCK_CLOSE = [/<\/(?:script|pre|style)>/i, /-->/, /\?>/, />/, /\]\]>/]
HTML_BLOCK_OPEN = [/^<(?:script|pre|style)(?:\s|>|$)/i, /^<!--/, /^<[?]/, /^<![A-Z]/, /^<!\[CDATA\[/, /^<[\/]?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[123456]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|title|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\s|[\/]?[>]|$)/i, Regex.new(((("^(?:" + OPEN_TAG) + "|") + CLOSE_TAG) + ")\\s*$", Regex::Options::IGNORE_CASE)]
HTML_ENTITY = /^&[a-zA-Z0-9]+;/
HTML_TAG = /^#{HTML_TAG_STRING}/i
HTML_TAG_STRING = "(?:#{OPEN_TAG_STRING}|#{CLOSE_TAG_STRING}|#{COMMENT_STRING}|#{PROCESSING_INSTRUCTION_STRING}|#{DECLARATION_STRING}|#{CDATA_STRING})"
LAST_DOMAIN_SEGMENT = /(?:[a-zA-Z0-9\-\p{Emoji_Presentation}\-]+)/
A valid domain name is:
segments of alphanumeric characters, underscores (_) and hyphens (-) separated by periods (.). There must be at least one period, and no underscores may be present in the last two segments of the domain.
Alphanumeric characters in this context include emojis.
LINE_ENDING = /\n|\x0d|\x0d\n/
LINK_DESTINATION_BRACES = Regex.new(("^(?:[<](?:[^<>\\t\\n\\\\\\x00]|" + ESCAPED_CHAR_STRING) + ")*[>])")
LINK_LABEL = Regex.new(("^\\[(?:[^\\\\\\[\\]]|" + ESCAPED_CHAR_STRING) + "|\\\\){0,}\\]")
LINK_TITLE = Regex.new(("^(?:\"(#{ESCAPED_CHAR_STRING}|[^\"\\x00])*\"" + "|'(#{ESCAPED_CHAR_STRING}|[^'\\x00])*'") + "|\\((#{ESCAPED_CHAR_STRING}|[^)\\x00])*\\))")
MAILTO_AUTO_LINK = /^mailto:[A-Za-z0-9]+@#{DOMAIN_NAME}/
MAYBE_SPECIAL = {'#', '`', '~', '*', '+', '_', '=', '<', '>', '-', '|'}
NUMERIC_HTML_ENTITY = /^&#(?:[Xx][0-9a-fA-F]{1,6}|[0-9]{1,7});/
OPEN_TAG = ((("<" + TAG_NAME_STRING) + ATTRIBUTE) + "*") + "\\s*/?>"
OPEN_TAG_STRING = "<#{TAG_NAME_STRING}#{ATTRIBUTE}*" + "\\s*/?>"
OTHER_DOMAIN_SEGMENTS = /(?:[a-zA-Z0-9\p{Emoji_Presentation}\-_]+)/
PROCESSING_INSTRUCTION_STRING = "[<][?].*?[?][>]"
PROTOCOL_AUTO_LINK = /#{AUTOLINK_PROTOCOLS}#{DOMAIN_NAME}#{VALID_URL_PATH}[^\s?!.,:*_~]/
PUNCTUATION = /[$+<=>^`|~\p{P}]/
SINGLE_QUOTED_VALUE_STRING = "'[^']*'"
TABLE_CELL_SEPARATOR = /(?<!\\)\|/
TABLE_HEADING_SEPARATOR = /^(\|?\s*:{0,1}-:{0,1}+\s*)+(\||\s*)$/
TAG_NAME_STRING = "[A-Za-z][A-Za-z0-9-]*"
THEMATIC_BREAK = /^(?:(?:\*[ \t]*){3,}|(?:_[ \t]*){3,}|(?:-[ \t]*){3,})[ \t]*$/
TICKS = /`+/
UNQUOTED_VALUE_STRING = "[^\"'=<>`\\x00-\\x20]+"
UNSAFE_DATA_PROTOCOL = /^data:image\/(?:png|gif|jpeg|webp)/i
UNSAFE_PROTOCOL = /^javascript:|vbscript:|file:|data:/i
VALID_DOMAIN_NAME = /^(?:#{OTHER_DOMAIN_SEGMENTS}\.)*(?:#{LAST_DOMAIN_SEGMENT}\.)+#{LAST_DOMAIN_SEGMENT}$/
VALID_URL_PATH = /(?:\/[^\s<]*)?/
WHITESPACE = /[ \t\n\x0b\x0c\x0d]+/
WHITESPACE_CHAR = /^[ \t\n\x0b\x0c\x0d]/
WWW_AUTO_LINK = /^www\.#{DOMAIN_NAME}#{VALID_URL_PATH}/
XMPP_AUTO_LINK = /^xmpp:[A-Za-z0-9]+@#{DOMAIN_NAME}#{VALID_URL_PATH}/