/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { languages } from '../../fillers/monaco-editor-core'; const EMPTY_ELEMENTS: string[] = [ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr' ]; export const conf: languages.LanguageConfiguration = { 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 } } ] }; export const language = { defaultToken: '', tokenPostfix: '', // ignoreCase: true, // The main tokenizer for our languages tokenizer: { root: [ [/\{\{!--/, 'comment.block.start.handlebars', '@commentBlock'], [/\{\{!/, 'comment.start.handlebars', '@comment'], [/\{\{/, { 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: [ [/\}\}/, 'comment.end.handlebars', '@pop'], [/./, 'comment.content.handlebars'] ], commentBlock: [ [/--\}\}/, 'comment.block.end.handlebars', '@pop'], [/./, 'comment.content.handlebars'] ], commentHtml: [ [ /\{\{/, { token: '@rematch', switchTo: '@handlebarsInSimpleState.comment' } ], [/-->/, 'comment.html', '@pop'], [/[^-]+/, 'comment.content.html'], [/./, 'comment.content.html'] ], otherTag: [ [ /\{\{/, { token: '@rematch', switchTo: '@handlebarsInSimpleState.otherTag' } ], [/\/?>/, 'delimiter.html', '@pop'], [/"([^"]*)"/, 'attribute.value'], [/'([^']*)'/, 'attribute.value'], [/[\w\-]+/, 'attribute.name'], [/=/, 'delimiter'], [/[ \t\r\n]+/] // whitespace ], // -- BEGIN