Class: MarkdownIt::RulesInline::Link
- Inherits:
-
Object
- Object
- MarkdownIt::RulesInline::Link
- Extended by:
- Common::Utils
- Defined in:
- lib/motion-markdown-it/rules_inline/link.rb
Constant Summary
Constants included from Common::Utils
Common::Utils::DIGITAL_ENTITY_TEST_RE, Common::Utils::ENTITY_RE, Common::Utils::HTML_ESCAPE_REPLACE_RE, Common::Utils::HTML_ESCAPE_TEST_RE, Common::Utils::HTML_REPLACEMENTS, Common::Utils::REGEXP_ESCAPE_RE, Common::Utils::UNESCAPE_ALL_RE, Common::Utils::UNESCAPE_MD_RE, Common::Utils::UNICODE_PUNCT_RE
Class Method Summary collapse
-
.link(state, silent) ⇒ Object
——————————————————————————.
Methods included from Common::Utils
arrayReplaceAt, assign, escapeHtml, escapeRE, fromCharCode, fromCodePoint, isMdAsciiPunct, isPunctChar, isSpace, isValidEntityCode, isWhiteSpace, normalizeReference, replaceEntityPattern, unescapeAll, unescapeMd
Class Method Details
.link(state, silent) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/motion-markdown-it/rules_inline/link.rb', line 9 def self.link(state, silent) href = '' oldPos = state.pos max = state.posMax start = state.pos parseReference = true return false if (state.src.charCodeAt(state.pos) != 0x5B) # [ labelStart = state.pos + 1 labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true) # parser failed to find ']', so it's not a valid link return false if (labelEnd < 0) pos = labelEnd + 1 if (pos < max && state.src.charCodeAt(pos) == 0x28) # ( # # Inline link # # might have found a valid shortcut link, disable reference parsing parseReference = false # [link]( <href> "title" ) # ^^ skipping these spaces pos += 1 while pos < max code = state.src.charCodeAt(pos) break if (!isSpace(code) && code != 0x0A) pos += 1 end return false if (pos >= max) # [link]( <href> "title" ) # ^^^^^^ parsing link destination start = pos res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax) if (res[:ok]) href = state.md.normalizeLink.call(res[:str]) if (state.md.validateLink.call(href)) pos = res[:pos] else href = '' end end # [link]( <href> "title" ) # ^^ skipping these spaces start = pos while pos < max code = state.src.charCodeAt(pos) break if (!isSpace(code) && code != 0x0A) pos += 1 end # [link]( <href> "title" ) # ^^^^^^^ parsing link title res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax) if (pos < max && start != pos && res[:ok]) title = res[:str] pos = res[:pos] # [link]( <href> "title" ) # ^^ skipping these spaces while pos < max code = state.src.charCodeAt(pos) break if (!isSpace(code) && code != 0x0A) pos += 1 end else title = '' end if (pos >= max || state.src.charCodeAt(pos) != 0x29) # ) # parsing a valid shortcut link failed, fallback to reference parseReference = true end pos += 1 end if parseReference # # Link reference # return false if state.env[:references].nil? if (pos < max && state.src.charCodeAt(pos) == 0x5B) # [ start = pos + 1 pos = state.md.helpers.parseLinkLabel(state, pos) if (pos >= 0) label = state.src.slice(start...pos) pos += 1 else pos = labelEnd + 1 end else pos = labelEnd + 1 end # covers label === '' and label === undefined # (collapsed reference link and shortcut reference link respectively) label = state.src.slice(labelStart...labelEnd) if label.nil? || label.empty? ref = state.env[:references][normalizeReference(label)] if (!ref) state.pos = oldPos return false end href = ref[:href] title = ref[:title] end # # We found the end of the link, and know for a fact it's a valid link; # so all that's left to do is to call tokenizer. # if (!silent) state.pos = labelStart state.posMax = labelEnd token = state.push('link_open', 'a', 1) token.attrs = attrs = [ [ 'href', href ] ] unless title.nil? || title.empty? attrs.push([ 'title', title ]) end state.md.inline.tokenize(state) token = state.push('link_close', 'a', -1) end state.pos = pos state.posMax = max return true end |