import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration; import ILanguage = monaco.languages.IMonarchLanguage; export const conf: IRichLanguageConfiguration = { comments: { lineComment: '#' }, brackets: [['{', '}'], ['[', ']']], autoClosingPairs: [ { open: '"', close: '"', notIn: ['string', 'comment'] }, { open: '\'', close: '\'', notIn: ['string', 'comment'] }, { open: '{', close: '}', notIn: ['string', 'comment'] }, { open: '[', close: ']', notIn: ['string', 'comment'] } ] }; export const language = { tokenPostfix: '.yaml', brackets: [ { token: 'delimiter.bracket', open: '{', close: '}' }, { token: 'delimiter.square', open: '[', close: ']' } ], keywords: ['true', 'True', 'TRUE', 'false', 'False', 'FALSE', 'null', 'Null', 'Null', '~'], numberInteger: /(?:0|[+-]?[0-9]+)/, numberFloat: /(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/, numberOctal: /0o[0-7]+/, numberHex: /0x[0-9a-fA-F]+/, numberInfinity: /[+-]?\.(?:inf|Inf|INF)/, numberNaN: /\.(?:nan|Nan|NAN)/, numberDate: /\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/, escapes: /\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/, tokenizer: { root: [ {include: '@whitespace'}, {include: '@comment'}, // Directive [/%[^ ]+.*$/, 'meta.directive'], // Document Markers [/---/, 'operators.directivesEnd'], [/\.{3}/, 'operators.documentEnd'], // Block Structure Indicators [/[-?:](?= )/, 'operators'], {include: '@anchor'}, {include: '@tagHandle'}, {include: '@flowCollections'}, {include: '@flowScalars'}, {include: '@blockStyle'}, // Numbers [/@numberInteger(?![ \t]*\S+)/, 'number'], [/@numberFloat(?![ \t]*\S+)/, 'number.float'], [/@numberOctal(?![ \t]*\S+)/, 'number.octal'], [/@numberHex(?![ \t]*\S+)/, 'number.hex'], [/@numberInfinity(?![ \t]*\S+)/, 'number.infinity'], [/@numberNaN(?![ \t]*\S+)/, 'number.nan'], [/@numberDate(?![ \t]*\S+)/, 'number.date'], // Key:Value pair [/(".*?"|'.*?'|.*?)([ \t]*)(:)( |$)/, ['type', 'white', 'operators', 'white']], // String nodes [/.+$/, {cases: {'@keywords': 'keyword', '@default': 'string'}}] ], // Flow Collection: Flow Mapping object: [ {include: '@whitespace'}, {include: '@comment'}, // Flow Mapping termination [/\}/, '@brackets', '@pop'], // Flow Mapping delimiter [/,/, 'delimiter.comma'], // Flow Mapping Key:Value delimiter [/:(?= )/, 'operators'], // Flow Mapping Key:Value key [/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/, 'type'], // Start Flow Style {include: '@flowCollections'}, {include: '@flowScalars'}, // Scalar Data types {include: '@tagHandle'}, {include: '@anchor'}, {include: '@flowNumber'}, // Other value (keyword or string) [/[^\},]+/, {cases: {'@keywords': 'keyword', '@default': 'string'}}] ], // Flow Collection: Flow Sequence array: [ {include: '@whitespace'}, {include: '@comment'}, // Flow Sequence termination [/\]/, '@brackets', '@pop'], // Flow Sequence delimiter [/,/, 'delimiter.comma'], // Start Flow Style {include: '@flowCollections'}, {include: '@flowScalars'}, // Scalar Data types {include: '@tagHandle'}, {include: '@anchor'}, {include: '@flowNumber'}, // Other value (keyword or string) [/[^\],]+/, {cases: {'@keywords': 'keyword', '@default': 'string'}}] ], // Flow Scalars (quoted strings) string: [ [/[^\\"']+/, 'string'], [/@escapes/, 'string.escape'], [/\\./, 'string.escape.invalid'], [/["']/, {cases: {'$#==$S2': {token: 'string', next: '@pop'}, '@default': 'string'}}] ], // First line of a Block Style multiString: [ [/^( +).+$/, 'string', '@multiStringContinued.$1'] ], // Further lines of a Block Style // Workaround for indentation detection multiStringContinued: [ [/^( *).+$/, {cases: {'$1==$S2': 'string', '@default': {token: '@rematch', next: '@popall'}}}] ], whitespace: [ [/[ \t\r\n]+/, 'white'] ], // Only line comments comment: [ [/#.*$/, 'comment'] ], // Start Flow Collections flowCollections: [ [/\[/, '@brackets', '@array'], [/\{/, '@brackets', '@object'] ], // Start Flow Scalars (quoted strings) flowScalars: [ [/"/, 'string', '@string."'], [/'/, 'string', '@string.\''] ], // Start Block Scalar blockStyle: [ [/[>|][0-9]*[+-]?$/, 'operators', '@multiString'] ], // Numbers in Flow Collections (terminate with ,) flowNumber: [ [/@numberInteger(?=[ \t]*,)/, 'number'], [/@numberFloat(?=[ \t]*,)/, 'number.float'], [/@numberOctal(?=[ \t]*,)/, 'number.octal'], [/@numberHex(?=[ \t]*,)/, 'number.hex'], [/@numberInfinity(?=[ \t]*,)/, 'number.infinity'], [/@numberNaN(?=[ \t]*,)/, 'number.nan'], [/@numberDate(?=[ \t]*,)/, 'number.date'] ], tagHandle: [ [/\![^ ]*/, 'tag'] ], anchor: [ [/[&*][^ ]+/, 'namespace'] ] } };