UNPKG

@mapbox/jsxtreme-markdown

Version:
112 lines (90 loc) 2.58 kB
'use strict'; var openCloseTag = require('../util/html').openCloseTag; module.exports = blockHtml; var tab = '\t'; var space = ' '; var lineFeed = '\n'; var lessThan = '<'; var rawOpenExpression = /^<(script|pre|style)(?=(\s|>|$))/i; var rawCloseExpression = /<\/(script|pre|style)>/i; var commentOpenExpression = /^<!--/; var commentCloseExpression = /-->/; var instructionOpenExpression = /^<\?/; var instructionCloseExpression = /\?>/; var directiveOpenExpression = /^<![A-Za-z]/; var directiveCloseExpression = />/; var cdataOpenExpression = /^<!\[CDATA\[/; var cdataCloseExpression = /]]>/; var elementCloseExpression = /^$/; var otherElementOpenExpression = new RegExp(openCloseTag.source + '\\s*$'); function blockHtml(eat, value, silent) { var self = this; var blocks = self.options.blocks.join('|'); var elementOpenExpression = new RegExp( '^</?(' + blocks + ')(?=(\\s|/?>|$))', 'i' ); var length = value.length; var index = 0; var next; var line; var offset; var character; var count; var sequence; var subvalue; var sequences = [ [rawOpenExpression, rawCloseExpression, true], [commentOpenExpression, commentCloseExpression, true], [instructionOpenExpression, instructionCloseExpression, true], [directiveOpenExpression, directiveCloseExpression, true], [cdataOpenExpression, cdataCloseExpression, true], [elementOpenExpression, elementCloseExpression, true], [otherElementOpenExpression, elementCloseExpression, false], ]; // Eat initial spacing. while (index < length) { character = value.charAt(index); if (character !== tab && character !== space) { break; } index++; } if (value.charAt(index) !== lessThan) { return; } next = value.indexOf(lineFeed, index + 1); next = next === -1 ? length : next; line = value.slice(index, next); offset = -1; count = sequences.length; while (++offset < count) { if (sequences[offset][0].test(line)) { sequence = sequences[offset]; break; } } if (!sequence) { return; } if (silent) { return sequence[2]; } index = next; if (!sequence[1].test(line)) { while (index < length) { next = value.indexOf(lineFeed, index + 1); next = next === -1 ? length : next; line = value.slice(index + 1, next); if (sequence[1].test(line)) { if (line) { index = next; } break; } index = next; } } subvalue = value.slice(0, index); return eat(subvalue)({ type: 'html', value: subvalue }); }