@mapbox/jsxtreme-markdown
Version:
Transform Markdown into JSX or React component modules
125 lines (96 loc) • 2.43 kB
JavaScript
'use strict';
var trim = require('string.prototype.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 });
}