diff --git a/README.md b/README.md index c11a2048..a296122a 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Colorization and configuration supports for multiple languages for the Monaco Ed ![monaco-languages](https://cloud.githubusercontent.com/assets/5047891/15938606/1fd4bac6-2e74-11e6-8839-d455da8bc8a7.gif) +* azcli * bat * clojure * coffee script diff --git a/scripts/bundle.js b/scripts/bundle.js index ebf2dafa..9bce8b1a 100644 --- a/scripts/bundle.js +++ b/scripts/bundle.js @@ -66,8 +66,9 @@ bundleOne('csp/csp'); bundleOne('scheme/scheme'); bundleOne('clojure/clojure'); bundleOne('shell/shell'); -bundleOne('perl/perl') +bundleOne('perl/perl'), bundleOne('powerquery/powerquery') +bundleOne('azcli/azcli') function bundleOne(moduleId, exclude) { requirejs.optimize({ diff --git a/src/azcli/azcli.contribution.ts b/src/azcli/azcli.contribution.ts new file mode 100644 index 00000000..c94c07bd --- /dev/null +++ b/src/azcli/azcli.contribution.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { registerLanguage } from '../_.contribution'; + +// Allow for running under nodejs/requirejs in tests +const _monaco: typeof monaco = (typeof monaco === 'undefined' ? (self).monaco : monaco); + +registerLanguage({ + id: 'azcli', + extensions: ['.azcli'], + aliases: ['Azure CLI', 'azcli'], + loader: () => _monaco.Promise.wrap(import('./azcli')) +}); diff --git a/src/azcli/azcli.test.ts b/src/azcli/azcli.test.ts new file mode 100644 index 00000000..d1ae3bd3 --- /dev/null +++ b/src/azcli/azcli.test.ts @@ -0,0 +1,157 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { testTokenization as actualTestTokenization, ITestItem } from '../test/testRunner'; + +function testTokenization(_language: string | string[], tests: ITestItem[][]): void { + tests = tests.map(t => { + return t.map(t => { + return { + line: t.line.replace(/\n/g, ' '), + tokens: t.tokens + }; + }); + }); + actualTestTokenization(_language, tests); +} + +testTokenization('azcli', [ + // Comment single line + [{ + line: '#', + tokens: [ + { startIndex: 0, type: 'comment.azcli' } + ] + }], + [{ + line: '# az find -q secret', + tokens: [ + { startIndex: 0, type: 'comment.azcli' } + ] + }], + [{ + line: ' # az find -q secret', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' }, + { startIndex: 4, type: 'comment.azcli' } + ] + }], + [{ + line: '#az find -q secret', + tokens: [ + { startIndex: 0, type: 'comment.azcli' } + ] + }], + + // Other cases + [{ + line: 'az find -q secret', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' }, + { startIndex: 7, type: 'key.identifier.azcli' }, + { startIndex: 11, type: 'string.azcli' } + ] + }], + [{ + line: '', + tokens: [ + ] + }], + [{ + line: ' ', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' } + ] + }], + [{ + line: '--assignee', + tokens: [ + { startIndex: 0, type: 'key.identifier.azcli' } + ] + }], + [{ + line: ' --service-principal', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' }, + { startIndex: 3, type: 'key.identifier.azcli' } + ] + }], + [{ + line: 'az ad sp create-for-rb --name ServicePrincipalName --password PASSWORD', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' }, + { startIndex: 23, type: 'key.identifier.azcli' }, + { startIndex: 31, type: 'string.azcli' }, + { startIndex: 52, type: 'key.identifier.azcli' }, + { startIndex: 63, type: 'string.azcli' } + ] + }], + [{ + line: '--name!~`\"$%^&*(|\/\.,-=+', + tokens: [ + { startIndex: 0, type: 'key.identifier.azcli' } + ] + }], + [{ + line: '--name#some comment', + tokens: [ + { startIndex: 0, type: 'key.identifier.azcli' }, + { startIndex: 6, type: 'comment.azcli' } + ] + }], + [{ + line: '--query osPro ``````', + tokens: [ + { startIndex: 0, type: 'key.identifier.azcli' }, + { startIndex: 8, type: 'string.azcli' } + ] + }], + [{ + line: 'az ad sp create-for-rbac', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' } + ] + }], + [{ + line: '123456789', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' } + ] + }], + [{ + line: '- abc', + tokens: [ + { startIndex: 0, type: 'key.identifier.azcli' }, + { startIndex: 2, type: 'string.azcli' } + ] + }], + [{ + line: '- @!$()', + tokens: [ + { startIndex: 0, type: 'key.identifier.azcli' }, + { startIndex: 2, type: 'string.azcli' } + ] + }], + [{ + line: '""', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' } + ] + }], + [{ + line: '// some text', + tokens: [ + { startIndex: 0, type: 'keyword.azcli' } + ] + }], + [{ + line: `'APP_ID'`, + tokens: [ + { startIndex: 0, type: 'keyword.azcli' } + ] + }] +]); diff --git a/src/azcli/azcli.ts b/src/azcli/azcli.ts new file mode 100644 index 00000000..62bf5740 --- /dev/null +++ b/src/azcli/azcli.ts @@ -0,0 +1,65 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration; +import ILanguage = monaco.languages.IMonarchLanguage; + +export const conf: IRichLanguageConfiguration = { + comments: { + lineComment: '#', + } +}; + +export const language = { + defaultToken: 'keyword', + ignoreCase: true, + tokenPostfix: '.azcli', + + str: /[^#\s]/, + + tokenizer: { + root: [ + {include: '@comment'}, + [/\s-+@str*\s*/, { + cases: { + '@eos': { token: 'key.identifier', next: '@popall' }, + '@default': { token: 'key.identifier', next: '@type' } + } + }], + [/^-+@str*\s*/, { + cases: { + '@eos': { token: 'key.identifier', next: '@popall' }, + '@default': { token: 'key.identifier', next: '@type' } + } + }] + ], + + type: [ + {include: '@comment'}, + [/-+@str*\s*/, { + cases: { + '@eos': { token: 'key.identifier', next: '@popall' }, + '@default': 'key.identifier' + } + }], + [/@str+\s*/, { + cases: { + '@eos': { token: 'string', next: '@popall' }, + '@default': 'string' + } + }] + ], + + comment: [ + [/#.*$/, { + cases: { + '@eos': { token: 'comment', next: '@popall' } + } + }] + ] + } +}; diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index d3a43f05..6f96d356 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -51,3 +51,4 @@ import './scheme/scheme.contribution'; import './clojure/clojure.contribution'; import './shell/shell.contribution'; import './perl/perl.contribution'; +import './azcli/azcli.contribution'; diff --git a/test/setup.js b/test/setup.js index f9bd9511..03ca7803 100644 --- a/test/setup.js +++ b/test/setup.js @@ -71,7 +71,8 @@ define(['require'], function (require) { 'release/dev/typescript/typescript.test', 'release/dev/clojure/clojure.test', 'release/dev/shell/shell.test', - 'release/dev/perl/perl.test' + 'release/dev/perl/perl.test', + 'release/dev/azcli/azcli.test' ], function () { run(); // We can launch the tests! }, function (err) {