-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathmonaco.js
115 lines (101 loc) · 2.57 KB
/
monaco.js
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* Gets injected into the iframe after monaco loader runs.
*/
export default `
const eventTypes = {
ready: 'ready',
valueChanged: 'valueChanged',
languageChanged: 'languageChanged',
themeChanged: 'themeChanged',
};
class MonacoEditor {
constructor() {
this.language = 'javascript';
this.value = '';
this.editor = null;
this.setupEventListener('message', this.handleMessage.bind(this));
this.setupEditor();
}
setupEditor() {
require.config({ paths: { vs: 'node_modules/monaco-editor/min/vs' } });
require(['vs/editor/editor.main'], () => {
this.editor = monaco.editor.create(document.getElementById('container'), {
value: this.value,
language: this.language,
scrollBeyondLastLine: false,
minimap: {
enabled: false
}
});
const model = this.editor.getModel();
model.onDidChangeContent(() => {
const value = model.getValue();
this.onValueChanged(value);
});
this.ready();
});
}
ready() {
this.postMessage(eventTypes.ready, null);
this.setupEventListener(
eventTypes.valueChanged,
this.onValueChanged.bind(this)
);
}
_handleMessage(data) {
switch (data.event) {
case eventTypes.valueChanged:
this.onInputValueChanged(data.payload);
break;
case eventTypes.languageChanged:
this.onLanguageChanged(data.payload);
break;
case eventTypes.themeChanged:
this.onThemeChanged(data.payload);
break;
default:
break;
}
}
handleMessage(message) {
try {
const data = JSON.parse(message.data);
this._handleMessage(data);
} catch (error) {
console.error(error);
return;
}
}
postMessage(event, payload) {
window.parent.postMessage(
JSON.stringify({ event, payload }),
window.parent.location.href
);
}
setupEventListener(type, callback) {
window.addEventListener(type, data => {
callback(data);
});
}
onInputValueChanged(newValue) {
if (newValue !== this.value) {
this.value = newValue;
this.editor.getModel().setValue(newValue);
this.postMessage(eventTypes.valueChanged, newValue);
}
}
onValueChanged(newValue) {
if (newValue !== this.value) {
this.value = newValue;
this.postMessage(eventTypes.valueChanged, newValue);
}
}
onLanguageChanged(newLang) {
monaco.editor.setModelLanguage(this.editor.getModel(), newLang);
}
onThemeChanged(newValue) {
monaco.editor.setTheme(newValue);
}
}
new MonacoEditor();
`;