You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.4 KiB
130 lines
2.4 KiB
'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
|
|
});
|
|
}
|