'use strict' var trim = require('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}) }