123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- '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})
- }
|