125 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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})
 | |
| }
 | 
