Class: MarkdownIt::RulesInline::Image
- Inherits:
-
Object
- Object
- MarkdownIt::RulesInline::Image
- Extended by:
- Common::Utils
- Defined in:
- lib/motion-markdown-it/rules_inline/image.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
-
.image(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
.image(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 |
# File 'lib/motion-markdown-it/rules_inline/image.rb', line 9 def self.image(state, silent) href = '' oldPos = state.pos max = state.posMax return false if (state.src.charCodeAt(state.pos) != 0x21) # ! return false if (state.src.charCodeAt(state.pos + 1) != 0x5B) # [ labelStart = state.pos + 2 labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false) # 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 # # [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) # ) state.pos = oldPos return false end pos += 1 else # # 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) content = state.src.slice(labelStart...labelEnd) state.md.inline.parse( content, state.md, state.env, tokens = [] ) token = state.push('image', 'img', 0) token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ] token.children = tokens token.content = content; unless (title.nil? || title.empty?) attrs.push([ 'title', title ]) end end state.pos = pos state.posMax = max return true end |