'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 instructionOpenExpression = /^<\?/ var instructionCloseExpression = /\?>/ var directiveOpenExpression = /^/ var cdataOpenExpression = /^/ 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( '^|$))', '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}) }