text: '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})
  }
  