UNPKG

@mapbox/jsxtreme-markdown

Version:
125 lines (96 loc) 2.43 kB
'use strict'; var trim = require('string.prototype.trim'); var interrupt = require('../util/interrupt'); module.exports = blockquote; var lineFeed = '\n'; var tab = '\t'; var space = ' '; var greaterThan = '>'; function blockquote(eat, value, silent) { var self = this; var offsets = self.offset; var tokenizers = self.blockTokenizers; var interruptors = self.interruptBlockquote; var now = eat.now(); var currentLine = now.line; var length = value.length; var values = []; var contents = []; var indents = []; var add; var index = 0; var character; var rest; var nextIndex; var content; var line; var startIndex; var prefixed; var exit; while (index < length) { character = value.charAt(index); if (character !== space && character !== tab) { break; } index++; } if (value.charAt(index) !== greaterThan) { return; } if (silent) { return true; } index = 0; while (index < length) { nextIndex = value.indexOf(lineFeed, index); startIndex = index; prefixed = false; if (nextIndex === -1) { nextIndex = length; } while (index < length) { character = value.charAt(index); if (character !== space && character !== tab) { break; } index++; } if (value.charAt(index) === greaterThan) { index++; prefixed = true; if (value.charAt(index) === space) { index++; } } else { index = startIndex; } content = value.slice(index, nextIndex); if (!prefixed && !trim(content)) { index = startIndex; break; } if (!prefixed) { rest = value.slice(index); // Check if the following code contains a possible block. if (interrupt(interruptors, tokenizers, self, [eat, rest, true])) { break; } } line = startIndex === index ? content : value.slice(startIndex, nextIndex); indents.push(index - startIndex); values.push(line); contents.push(content); index = nextIndex + 1; } index = -1; length = indents.length; add = eat(values.join(lineFeed)); while (++index < length) { offsets[currentLine] = (offsets[currentLine] || 0) + indents[index]; currentLine++; } exit = self.enterBlock(); contents = self.tokenizeBlock(contents.join(lineFeed), now); exit(); return add({ type: 'blockquote', children: contents }); }