Class: MarkdownIt::RulesBlock::Blockquote
- Inherits:
-
Object
- Object
- MarkdownIt::RulesBlock::Blockquote
- Extended by:
- Common::Utils
- Defined in:
- lib/motion-markdown-it/rules_block/blockquote.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
-
.blockquote(state, startLine, endLine, 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
.blockquote(state, startLine, endLine, 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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 |
# File 'lib/motion-markdown-it/rules_block/blockquote.rb', line 9 def self.blockquote(state, startLine, endLine, silent) oldLineMax = state.lineMax pos = state.bMarks[startLine] + state.tShift[startLine] max = state.eMarks[startLine] # if it's indented more than 3 spaces, it should be a code block return false if (state.sCount[startLine] - state.blkIndent >= 4) # check the block quote marker return false if state.src.charCodeAt(pos) != 0x3E # > pos += 1 # we know that it's going to be a valid blockquote, # so no point trying to find the end of it in silent mode return true if silent # skip spaces after ">" and re-calculate offset initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]) # skip one optional space after '>' if state.src.charCodeAt(pos) == 0x20 # space # ' > test ' # ^ -- position start of line here: pos += 1 initial += 1 offset +=1 adjustTab = false spaceAfterMarker = true elsif state.src.charCodeAt(pos) == 0x09 # tab spaceAfterMarker = true if ((state.bsCount[startLine] + offset) % 4 == 3) # ' >\t test ' # ^ -- position start of line here (tab has width===1) pos += 1 initial += 1 offset += 1 adjustTab = false else # ' >\t test ' # ^ -- position start of line here + shift bsCount slightly # to make extra space appear adjustTab = true end else spaceAfterMarker = false end oldBMarks = [ state.bMarks[startLine] ] state.bMarks[startLine] = pos while pos < max ch = state.src.charCodeAt(pos) if isSpace(ch) if ch == 0x09 offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4 else offset += 1 end else break end pos += 1 end oldBSCount = [ state.bsCount[startLine] ] state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0) lastLineEmpty = pos >= max oldSCount = [ state.sCount[startLine] ] state.sCount[startLine] = offset - initial oldTShift = [ state.tShift[startLine] ] state.tShift[startLine] = pos - state.bMarks[startLine] terminatorRules = state.md.block.ruler.getRules('blockquote') oldParentType = state.parentType state.parentType = 'blockquote' wasOutdented = false # Search the end of the block # # Block ends with either: # 1. an empty line outside: # ``` # > test # # ``` # 2. an empty line inside: # ``` # > # test # ``` # 3. another tag: # ``` # > test # - - - # ``` nextLine = startLine + 1 while nextLine < endLine # check if it's outdented, i.e. it's inside list item and indented # less than said list item: # # ``` # 1. anything # > current blockquote # 2. checking this line # ``` wasOutdented = true if (state.sCount[nextLine] < state.blkIndent) pos = state.bMarks[nextLine] + state.tShift[nextLine] max = state.eMarks[nextLine] if pos >= max # Case 1: line is not inside the blockquote, and this line is empty. break end if state.src.charCodeAt(pos) == 0x3E && !wasOutdented # > pos += 1 # This line is inside the blockquote. # skip spaces after ">" and re-calculate offset initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]) # skip one optional space after '>' if state.src.charCodeAt(pos) == 0x20 # space # ' > test ' # ^ -- position start of line here: pos += 1 initial += 1 offset += 1 adjustTab = false spaceAfterMarker = true elsif state.src.charCodeAt(pos) == 0x09 # tab spaceAfterMarker = true if ((state.bsCount[nextLine] + offset) % 4 == 3) # ' >\t test ' # ^ -- position start of line here (tab has width===1) pos += 1 initial += 1 offset += 1 adjustTab = false else # ' >\t test ' # ^ -- position start of line here + shift bsCount slightly # to make extra space appear adjustTab = true end else spaceAfterMarker = false end oldBMarks.push(state.bMarks[nextLine]) state.bMarks[nextLine] = pos while pos < max ch = state.src.charCodeAt(pos) if isSpace(ch) if ch == 0x09 offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4 else offset += 1 end else break end pos += 1 end lastLineEmpty = pos >= max oldBSCount.push(state.bsCount[nextLine]) state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0) oldSCount.push(state.sCount[nextLine]) state.sCount[nextLine] = offset - initial\ oldTShift.push(state.tShift[nextLine]) state.tShift[nextLine] = pos - state.bMarks[nextLine] nextLine += 1 next else pos += 1 end # Case 2: line is not inside the blockquote, and the last line was empty. break if lastLineEmpty # Case 3: another tag found. terminate = false (0...terminatorRules.length).each do |i| if terminatorRules[i].call(state, nextLine, endLine, true) terminate = true break end end if terminate # Quirk to enforce "hard termination mode" for paragraphs; # normally if you call `tokenize(state, startLine, nextLine)`, # paragraphs will look below nextLine for paragraph continuation, # but if blockquote is terminated by another tag, they shouldn't state.lineMax = nextLine if state.blkIndent != 0 # state.blkIndent was non-zero, we now set it to zero, # so we need to re-calculate all offsets to appear as # if indent wasn't changed oldBMarks.push(state.bMarks[nextLine]) oldBSCount.push(state.bsCount[nextLine]) oldTShift.push(state.tShift[nextLine]) oldSCount.push(state.sCount[nextLine]) state.sCount[nextLine] -= state.blkIndent end break end oldBMarks.push(state.bMarks[nextLine]) oldBSCount.push(state.bsCount[nextLine]) oldTShift.push(state.tShift[nextLine]) oldSCount.push(state.sCount[nextLine]) # A negative indentation means that this is a paragraph continuation # state.sCount[nextLine] = -1 nextLine += 1 end oldIndent = state.blkIndent state.blkIndent = 0 token = state.push('blockquote_open', 'blockquote', 1) token.markup = '>' token.map = lines = [ startLine, 0 ] state.md.block.tokenize(state, startLine, nextLine) token = state.push('blockquote_close', 'blockquote', -1) token.markup = '>' state.lineMax = oldLineMax; state.parentType = oldParentType lines[1] = state.line # Restore original tShift; this might not be necessary since the parser # has already been here, but just to make sure we can do that. (0...oldTShift.length).each do |i| state.bMarks[i + startLine] = oldBMarks[i] state.tShift[i + startLine] = oldTShift[i] state.sCount[i + startLine] = oldSCount[i] state.bsCount[i + startLine] = oldBSCount[i] end state.blkIndent = oldIndent return true end |