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