UNPKG

@mapbox/jsxtreme-markdown

Version:
99 lines (78 loc) 2.16 kB
'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), }); }