module

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}/

Instance methods

accepts_lines?

accepts_line

Source
continue(parser : Parser, container : Node) : ContinueStatus

continue

Source
match(parser : Parser, container : Node) : MatchValue

match and parse

Source
token(parser : Parser, container : Node) : Nil

token finalize

Source

Nested types