monaco-editor/src/xml/xml.ts
2020-09-19 01:28:33 +02:00

99 lines
2.6 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import type { languages } from '../fillers/monaco-editor-core';
export const conf: languages.LanguageConfiguration = {
comments: {
blockComment: ['<!--', '-->']
},
brackets: [['<', '>']],
autoClosingPairs: [
{ open: '<', close: '>' },
{ open: "'", close: "'" },
{ open: '"', close: '"' }
],
surroundingPairs: [
{ open: '<', close: '>' },
{ open: "'", close: "'" },
{ open: '"', close: '"' }
]
};
export const language = <languages.IMonarchLanguage>{
defaultToken: '',
tokenPostfix: '.xml',
ignoreCase: true,
// Useful regular expressions
qualifiedName: /(?:[\w\.\-]+:)?[\w\.\-]+/,
tokenizer: {
root: [
[/[^<&]+/, ''],
{ include: '@whitespace' },
// Standard opening tag
[/(<)(@qualifiedName)/, [{ token: 'delimiter' }, { token: 'tag', next: '@tag' }]],
// Standard closing tag
[
/(<\/)(@qualifiedName)(\s*)(>)/,
[{ token: 'delimiter' }, { token: 'tag' }, '', { token: 'delimiter' }]
],
// Meta tags - instruction
[/(<\?)(@qualifiedName)/, [{ token: 'delimiter' }, { token: 'metatag', next: '@tag' }]],
// Meta tags - declaration
[/(<\!)(@qualifiedName)/, [{ token: 'delimiter' }, { token: 'metatag', next: '@tag' }]],
// CDATA
[/<\!\[CDATA\[/, { token: 'delimiter.cdata', next: '@cdata' }],
[/&\w+;/, 'string.escape']
],
cdata: [
[/[^\]]+/, ''],
[/\]\]>/, { token: 'delimiter.cdata', next: '@pop' }],
[/\]/, '']
],
tag: [
[/[ \t\r\n]+/, ''],
[
/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,
['attribute.name', '', 'attribute.value']
],
[
/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,
['attribute.name', '', 'attribute.value']
],
[
/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,
['attribute.name', '', 'attribute.value']
],
[/@qualifiedName/, 'attribute.name'],
[/\?>/, { token: 'delimiter', next: '@pop' }],
[/(\/)(>)/, [{ token: 'tag' }, { token: 'delimiter', next: '@pop' }]],
[/>/, { token: 'delimiter', next: '@pop' }]
],
whitespace: [
[/[ \t\r\n]+/, ''],
[/<!--/, { token: 'comment', next: '@comment' }]
],
comment: [
[/[^<\-]+/, 'comment.content'],
[/-->/, { token: 'comment', next: '@pop' }],
[/<!--/, 'comment.content.invalid'],
[/[<\-]/, 'comment.content']
]
}
};