Skip to content

Instantly share code, notes, and snippets.

@palaniraja
Last active August 21, 2024 08:20
Show Gist options
  • Save palaniraja/c987ed0cc23b3cdbfaa329ce69ed888e to your computer and use it in GitHub Desktop.
Save palaniraja/c987ed0cc23b3cdbfaa329ce69ed888e to your computer and use it in GitHub Desktop.
Kotlin language support for bitbucket
javascript:(function(){window.s0=document.createElement('script');window.s0.setAttribute('type','text/javascript');window.s0.setAttribute('src','https://bookmarkify.it/bookmarklets/58928/raw');document.getElementsByTagName('body')[0].appendChild(window.s0);})();
// source: https://github.com/microsoft/monaco-editor/blob/main/src/basic-languages/kotlin/kotlin.ts
monaco.languages.register({ id: "kotlin" });
monaco.languages.setLanguageConfiguration("kotlin", {
// the default separators except `@$`
wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,
comments: {
lineComment: '//',
blockComment: ['/*', '*/']
},
brackets: [
['{', '}'],
['[', ']'],
['(', ')']
],
autoClosingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
{ open: "'", close: "'" }
],
surroundingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
{ open: "'", close: "'" },
{ open: '<', close: '>' }
],
folding: {
markers: {
start: new RegExp('^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))'),
end: new RegExp('^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))')
}
}
});
monaco.languages.setMonarchTokensProvider("kotlin", {
defaultToken: '',
tokenPostfix: '.kt',
keywords: [
'as',
'as?',
'break',
'class',
'continue',
'do',
'else',
'false',
'for',
'fun',
'if',
'in',
'!in',
'interface',
'is',
'!is',
'null',
'object',
'package',
'return',
'super',
'this',
'throw',
'true',
'try',
'typealias',
'val',
'var',
'when',
'while',
'by',
'catch',
'constructor',
'delegate',
'dynamic',
'field',
'file',
'finally',
'get',
'import',
'init',
'param',
'property',
'receiver',
'set',
'setparam',
'where',
'actual',
'abstract',
'annotation',
'companion',
'const',
'crossinline',
'data',
'enum',
'expect',
'external',
'final',
'infix',
'inline',
'inner',
'internal',
'lateinit',
'noinline',
'open',
'operator',
'out',
'override',
'private',
'protected',
'public',
'reified',
'sealed',
'suspend',
'tailrec',
'vararg',
'field',
'it'
],
operators: [
'+',
'-',
'*',
'/',
'%',
'=',
'+=',
'-=',
'*=',
'/=',
'%=',
'++',
'--',
'&&',
'||',
'!',
'==',
'!=',
'===',
'!==',
'>',
'<',
'<=',
'>=',
'[',
']',
'!!',
'?.',
'?:',
'::',
'..',
':',
'?',
'->',
'@',
';',
'$',
'_'
],
// we include these common regular expressions
symbols: /[=><!~?:&|+\-*\/\^%]+/,
escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
digits: /\d+(_+\d+)*/,
octaldigits: /[0-7]+(_+[0-7]+)*/,
binarydigits: /[0-1]+(_+[0-1]+)*/,
hexdigits: /[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,
// The main tokenizer for our languages
tokenizer: {
root: [
// class name highlighting
[/[A-Z][\w\$]*/, 'type.identifier'],
// identifiers and keywords
[
/[a-zA-Z_$][\w$]*/,
{
cases: {
'@keywords': { token: 'keyword.$0' },
'@default': 'identifier'
}
}
],
// whitespace
{ include: '@whitespace' },
// delimiters and operators
[/[{}()\[\]]/, '@brackets'],
[/[<>](?!@symbols)/, '@brackets'],
[
/@symbols/,
{
cases: {
'@operators': 'delimiter',
'@default': ''
}
}
],
// @ annotations.
[/@\s*[a-zA-Z_\$][\w\$]*/, 'annotation'],
// numbers
[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/, 'number.float'],
[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/, 'number.float'],
[/0[xX](@hexdigits)[Ll]?/, 'number.hex'],
[/0(@octaldigits)[Ll]?/, 'number.octal'],
[/0[bB](@binarydigits)[Ll]?/, 'number.binary'],
[/(@digits)[fFdD]/, 'number.float'],
[/(@digits)[lL]?/, 'number'],
// delimiter: after number because of .\d floats
[/[;,.]/, 'delimiter'],
// strings
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string
[/"""/, 'string', '@multistring'],
[/"/, 'string', '@string'],
// characters
[/'[^\\']'/, 'string'],
[/(')(@escapes)(')/, ['string', 'string.escape', 'string']],
[/'/, 'string.invalid']
],
whitespace: [
[/[ \t\r\n]+/, ''],
[/\/\*\*(?!\/)/, 'comment.doc', '@javadoc'],
[/\/\*/, 'comment', '@comment'],
[/\/\/.*$/, 'comment']
],
comment: [
[/[^\/*]+/, 'comment'],
[/\/\*/, 'comment', '@comment'],
[/\*\//, 'comment', '@pop'],
[/[\/*]/, 'comment']
],
//Identical copy of comment above, except for the addition of .doc
javadoc: [
[/[^\/*]+/, 'comment.doc'],
[/\/\*/, 'comment.doc', '@push'],
[/\/\*/, 'comment.doc.invalid'],
[/\*\//, 'comment.doc', '@pop'],
[/[\/*]/, 'comment.doc']
],
string: [
[/[^\\"]+/, 'string'],
[/@escapes/, 'string.escape'],
[/\\./, 'string.escape.invalid'],
[/"/, 'string', '@pop']
],
multistring: [
[/[^\\"]+/, 'string'],
[/@escapes/, 'string.escape'],
[/\\./, 'string.escape.invalid'],
[/"""/, 'string', '@pop'],
[/./, 'string']
]
}});
var ed = monaco.editor.getModels()[0]
monaco.editor.setModelLanguage(ed, 'kotlin')
@palaniraja
Copy link
Author

Also you can change the editor/code theme to dark mode by

monaco.editor.setTheme('vs-dark');

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment