/* eslint-disable fecs-camelcase */
/* eslint-disable babel/new-cap */
export function vue (hljs) {
  const XML_IDENT_RE = '[A-Za-z0-9\\._:-]+'
  const TAG_INTERNALS = {
    endsWithParent: true,
    illegal: /</,
    relevance: 0,
    contains: [
      {
        className: 'attr',
        begin: XML_IDENT_RE,
        relevance: 0
      },
      {
        begin: /=\s*/,
        relevance: 0,
        contains: [
          {
            className: 'string',
            endsParent: true,
            variants: [
              {begin: /"/, end: /"/},
              {begin: /'/, end: /'/},
              {begin: /[^\s"'=<>`]+/}
            ]
          }
        ]
      }
    ]
  }
  return {
    case_insensitive: true,
    contains: [
      hljs.COMMENT(
        '<!--',
        '-->',
        {
          relevance: 10
        }
      ),
      {
        className: 'tag',
        /*
        The lookahead pattern (?=...) ensures that 'begin' only matches
        '<style' as a single word, followed by a whitespace or an
        ending braket. The '$' is needed for the lexeme to be recognized
        by hljs.subMode() that tests lexemes outside the stream.
        */
        begin: '<style(?=\\s|>|$)',
        end: '>',
        keywords: {name: 'style'},
        contains: [TAG_INTERNALS],
        starts: {
          end: '</style>',
          returnEnd: true,
          subLanguage: ['css', 'less', 'scss', 'stylus']
        }
      },
      {
        className: 'tag',
        // See the comment in the <style tag about the lookahead pattern
        begin: '<script(?=\\s|>|$)',
        end: '>',
        keywords: {name: 'script'},
        contains: [TAG_INTERNALS],
        starts: {
          end: '</script>',
          returnEnd: true,
          subLanguage: ['javascript']
        }
      },
      {
        className: 'tag',
        // See the comment in the <style tag about the lookahead pattern
        begin: '<template(?=\\s|>|$)',
        end: '>',
        keywords: {name: 'template'},
        contains: [TAG_INTERNALS],
        starts: {
          end: '</template>',
          returnEnd: true,
          subLanguage: ['html']
        }
      },
      {
        className: 'tag',
        begin: '</?',
        end: '/?>',
        contains: [
          {
            className: 'name', begin: /[^/><\s]+/, relevance: 0
          },
          TAG_INTERNALS
        ]
      }
    ]
  }
}