/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See https://github.com/microsoft/monaco-languages/blob/master/LICENSE.md *--------------------------------------------------------------------------------------------*/ // Based on handlebars template in https://github.com/microsoft/monaco-languages/blob/master/src/handlebars/handlebars.ts // Look for "vuejs template attributes" in this file for Vue specific syntax. import { languages } from 'monaco-editor'; /* eslint-disable no-useless-escape */ /* eslint-disable @gitlab/require-i18n-strings */ const EMPTY_ELEMENTS = [ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', ]; const conf = { wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g, comments: { blockComment: ['{{!--', '--}}'], }, brackets: [[''], ['<', '>'], ['{{', '}}'], ['{', '}'], ['(', ')']], autoClosingPairs: [ { open: '{', close: '}' }, { open: '[', close: ']' }, { open: '(', close: ')' }, { open: '"', close: '"' }, { open: "'", close: "'" }, ], surroundingPairs: [ { open: '<', close: '>' }, { open: '"', close: '"' }, { open: "'", close: "'" }, ], onEnterRules: [ { beforeText: new RegExp( `<(?!(?:${EMPTY_ELEMENTS.join('|')}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i', ), afterText: /^<\/(\w[\w\d]*)\s*>$/i, action: { indentAction: languages.IndentAction.IndentOutdent }, }, { beforeText: new RegExp( `<(?!(?:${EMPTY_ELEMENTS.join('|')}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i', ), action: { indentAction: languages.IndentAction.Indent }, }, ], }; const language = { defaultToken: '', tokenPostfix: '', // ignoreCase: true, // The main tokenizer for our languages tokenizer: { root: [ [/\{\{/, { token: '@rematch', switchTo: '@handlebarsInSimpleState.root' }], [/)/, ['delimiter.html', 'tag.html', 'delimiter.html']], [/(<)(script)/, ['delimiter.html', { token: 'tag.html', next: '@script' }]], [/(<)(style)/, ['delimiter.html', { token: 'tag.html', next: '@style' }]], [/(<)([:\w]+)/, ['delimiter.html', { token: 'tag.html', next: '@otherTag' }]], [/(<\/)([\w]+)/, ['delimiter.html', { token: 'tag.html', next: '@otherTag' }]], [/]+/, 'metatag.content.html'], [/>/, 'metatag.html', '@pop'], ], comment: [ [/\{\{/, { token: '@rematch', switchTo: '@handlebarsInSimpleState.comment' }], [/-->/, 'comment.html', '@pop'], [/[^-]+/, 'comment.content.html'], [/./, 'comment.content.html'], ], otherTag: [ [/\{\{/, { token: '@rematch', switchTo: '@handlebarsInSimpleState.otherTag' }], [/\/?>/, 'delimiter.html', '@pop'], // -- BEGIN vuejs template attributes [/(v-|@|:)[\w\-\.\:\[\]]+="([^"]*)"/, 'variable'], [/(v-|@|:)[\w\-\.\:\[\]]+='([^']*)'/, 'variable'], [/"([^"]*)"/, 'attribute.value'], [/'([^']*)'/, 'attribute.value'], [/[\w\-\.\:\[\]]+/, 'attribute.name'], // -- END vuejs template attributes [/=/, 'delimiter'], [/[ \t\r\n]+/], // whitespace ], // -- BEGIN