| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- 'use strict';
- var trim = require('trim');
- var interrupt = require('../util/interrupt');
- module.exports = blockquote;
- var C_NEWLINE = '\n';
- var C_TAB = '\t';
- var C_SPACE = ' ';
- var C_GT = '>';
- /* Tokenise a blockquote. */
- 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 !== C_SPACE && character !== C_TAB) {
- break;
- }
- index++;
- }
- if (value.charAt(index) !== C_GT) {
- return;
- }
- if (silent) {
- return true;
- }
- index = 0;
- while (index < length) {
- nextIndex = value.indexOf(C_NEWLINE, index);
- startIndex = index;
- prefixed = false;
- if (nextIndex === -1) {
- nextIndex = length;
- }
- while (index < length) {
- character = value.charAt(index);
- if (character !== C_SPACE && character !== C_TAB) {
- break;
- }
- index++;
- }
- if (value.charAt(index) === C_GT) {
- index++;
- prefixed = true;
- if (value.charAt(index) === C_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(C_NEWLINE));
- while (++index < length) {
- offsets[currentLine] = (offsets[currentLine] || 0) + indents[index];
- currentLine++;
- }
- exit = self.enterBlock();
- contents = self.tokenizeBlock(contents.join(C_NEWLINE), now);
- exit();
- return add({
- type: 'blockquote',
- children: contents
- });
- }
|