112 lines
2.5 KiB
JavaScript
112 lines
2.5 KiB
JavaScript
'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})
|
|
}
|