-
Notifications
You must be signed in to change notification settings - Fork 0
/
chrysalis.ts
76 lines (71 loc) · 1.87 KB
/
chrysalis.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import {
Monaco,
MonacoLangDef,
MonacoThemeDef,
MonarchLangugageBracket,
MonarchTokenizerRule
} from "./types";
/**
* Given a monaco instance, this method will return two bound functions,
* wrapping the monarch in its' chrysalis per-se, to enable further customization.
*/
export function chrysalis(monaco: typeof Monaco) {
return {
registerCustomLanguage(languageId: string, languageDef: MonacoLangDef): typeof Monaco {
return registerCustomLanguage(monaco, languageId, languageDef);
},
registerCustomTheme(themeName: string, themeData: MonacoThemeDef): typeof Monaco {
return registerCustomTheme(monaco, themeName, themeData);
}
};
}
/**
* Generate a Monarch language definition
*/
export function createMonarchLanguage(
brackets: MonarchLangugageBracket[],
rules: MonarchTokenizerRule[]
): MonacoLangDef {
return {
// @todo this is gross
brackets: brackets as Monaco.languages.IMonarchLanguageBracket[],
tokenizer: {
root: rules
}
};
}
/**
* Generate a Monarch theme definition
*/
export function createMonarchTheme(
theme: Pick<MonacoThemeDef, "rules" | "colors">,
options: Omit<MonacoThemeDef, "rules" | "colors"> = {
base: "vs",
inherit: false
}
): MonacoThemeDef {
return { ...options, ...theme };
}
/**
* Register a custom theme with a Monaco Editor instance
*/
export function registerCustomTheme<T extends typeof Monaco>(
monaco: T,
themeName: string,
themeData: MonacoThemeDef
): T {
monaco.editor.defineTheme(themeName, themeData);
return monaco;
}
/**
* Register a custom language with a Monaco Editor instance
*/
export function registerCustomLanguage<T extends typeof Monaco>(
monaco: T,
languageId: string,
languageDef: MonacoLangDef
): T {
monaco.languages.register({ id: languageId });
monaco.languages.setMonarchTokensProvider(languageId, languageDef);
return monaco;
}