module
Markd::Rule
Direct including types
- Markd::Rule::BlockQuote
- Markd::Rule::CodeBlock
- Markd::Rule::Document
- Markd::Rule::Heading
- Markd::Rule::HTMLBlock
- Markd::Rule::Item
- Markd::Rule::List
- Markd::Rule::Paragraph
- Markd::Rule::Table
- Markd::Rule::ThematicBreak
Defined in:
markd/rule.crmarkd/rules/block_quote.cr
markd/rules/code_block.cr
markd/rules/document.cr
markd/rules/heading.cr
markd/rules/html_block.cr
markd/rules/item.cr
markd/rules/list.cr
markd/rules/paragraph.cr
markd/rules/table.cr
markd/rules/thematic_break.cr
Constant Summary
-
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 Method Summary
-
#accepts_lines? : Bool
accepts_line
-
#continue(parser : Parser, container : Node) : ContinueStatus
continue
-
#match(parser : Parser, container : Node) : MatchValue
match and parse
-
#token(parser : Parser, container : Node) : Nil
token finalize