@mapbox/jsxtreme-markdown
Version:
Transform Markdown into JSX or React component modules
99 lines (78 loc) • 2.16 kB
JavaScript
'use strict';
var trim = require('string.prototype.trim');
var trimTrailingLines = require('trim-trailing-lines');
var interrupt = require('../util/interrupt');
module.exports = paragraph;
var tab = '\t';
var lineFeed = '\n';
var space = ' ';
var tabSize = 4;
// Tokenise paragraph.
function paragraph(eat, value, silent) {
var self = this;
var settings = self.options;
var commonmark = settings.commonmark;
var tokenizers = self.blockTokenizers;
var interruptors = self.interruptParagraph;
var index = value.indexOf(lineFeed);
var length = value.length;
var position;
var subvalue;
var character;
var size;
var now;
while (index < length) {
// Eat everything if there’s no following newline.
if (index === -1) {
index = length;
break;
}
// Stop if the next character is NEWLINE.
if (value.charAt(index + 1) === lineFeed) {
break;
}
// In commonmark-mode, following indented lines are part of the paragraph.
if (commonmark) {
size = 0;
position = index + 1;
while (position < length) {
character = value.charAt(position);
if (character === tab) {
size = tabSize;
break;
} else if (character === space) {
size++;
} else {
break;
}
position++;
}
if (size >= tabSize && character !== lineFeed) {
index = value.indexOf(lineFeed, index + 1);
continue;
}
}
subvalue = value.slice(index + 1);
// Check if the following code contains a possible block.
if (interrupt(interruptors, tokenizers, self, [eat, subvalue, true])) {
break;
}
position = index;
index = value.indexOf(lineFeed, index + 1);
if (index !== -1 && trim(value.slice(position, index)) === '') {
index = position;
break;
}
}
subvalue = value.slice(0, index);
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
now = eat.now();
subvalue = trimTrailingLines(subvalue);
return eat(subvalue)({
type: 'paragraph',
children: self.tokenizeInline(subvalue, now),
});
}