| '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}) |
| } |