mirror of
https://github.com/microsoft/monaco-editor.git
synced 2025-12-22 15:05:39 +01:00
Merge branch 'main' into mdx
This commit is contained in:
commit
598d45b159
7 changed files with 119 additions and 13 deletions
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "monaco-editor",
|
"name": "monaco-editor",
|
||||||
"version": "0.37.0",
|
"version": "0.37.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "monaco-editor",
|
"name": "monaco-editor",
|
||||||
"version": "0.37.0",
|
"version": "0.37.1",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
||||||
|
|
@ -51,8 +51,10 @@ async function initialize(state: IPreviewState) {
|
||||||
|
|
||||||
document.body.innerHTML += state.html;
|
document.body.innerHTML += state.html;
|
||||||
|
|
||||||
|
const js = massageJs(state.js);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
eval(state.js);
|
eval(js);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
const pre = document.createElement("pre");
|
const pre = document.createElement("pre");
|
||||||
pre.appendChild(
|
pre.appendChild(
|
||||||
|
|
@ -61,3 +63,35 @@ async function initialize(state: IPreviewState) {
|
||||||
document.body.insertBefore(pre, document.body.firstChild);
|
document.body.insertBefore(pre, document.body.firstChild);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(globalThis as any).bindModelToCodeStr = function bindModel(
|
||||||
|
model: any,
|
||||||
|
codeStringName: string
|
||||||
|
) {
|
||||||
|
model.onDidChangeContent(() => {
|
||||||
|
const value = model.getValue();
|
||||||
|
window.parent.postMessage(
|
||||||
|
{ kind: "update-code-string", codeStringName, value },
|
||||||
|
"*"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function massageJs(js: string) {
|
||||||
|
/*
|
||||||
|
Alternate experimental syntax: // bind to code string: `editor.getModel()` -> codeString
|
||||||
|
|
||||||
|
const bindToCodeStringRegexp = /\/\/ bind to code string: `(.*?)` -> (.*?)(\n|$)/g;
|
||||||
|
js = js.replaceAll(bindToCodeStringRegexp, (match, p1, p2) => {
|
||||||
|
return `globalThis.bindModelToCodeStr(${p1}, ${JSON.stringify(p2)})\n`;
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
const setFromRegexp = /\/*\Wset from `(.*?)`:\W*\//g;
|
||||||
|
for (const m of js.matchAll(setFromRegexp)) {
|
||||||
|
const p1 = m[1];
|
||||||
|
const target = JSON.stringify("set from `" + p1 + "`");
|
||||||
|
js += `\n try { globalThis.bindModelToCodeStr(${p1}, ${target}); } catch (e) { console.error(e); }`;
|
||||||
|
}
|
||||||
|
return js;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,18 @@
|
||||||
var originalModel = monaco.editor.createModel("heLLo world!", "text/plain");
|
const originalModel = monaco.editor.createModel(
|
||||||
var modifiedModel = monaco.editor.createModel("hello orlando!", "text/plain");
|
/* set from `originalModel`: */ `hello world`,
|
||||||
|
"text/plain"
|
||||||
|
);
|
||||||
|
const modifiedModel = monaco.editor.createModel(
|
||||||
|
/* set from `modifiedModel`: */ `Hello World!`,
|
||||||
|
"text/plain"
|
||||||
|
);
|
||||||
|
|
||||||
var diffEditor = monaco.editor.createDiffEditor(
|
const diffEditor = monaco.editor.createDiffEditor(
|
||||||
document.getElementById("container")
|
document.getElementById("container"),
|
||||||
|
{
|
||||||
|
originalEditable: true,
|
||||||
|
automaticLayout: true,
|
||||||
|
}
|
||||||
);
|
);
|
||||||
diffEditor.setModel({
|
diffEditor.setModel({
|
||||||
original: originalModel,
|
original: originalModel,
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
const text = `function hello() {
|
const value = /* set from `myEditor.getModel()`: */ `function hello() {
|
||||||
alert('Hello world!');
|
alert('Hello world!');
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
// Hover on each property to see its docs!
|
// Hover on each property to see its docs!
|
||||||
monaco.editor.create(document.getElementById("container"), {
|
const myEditor = monaco.editor.create(document.getElementById("container"), {
|
||||||
value: text,
|
value,
|
||||||
language: "javascript",
|
language: "javascript",
|
||||||
automaticLayout: true,
|
automaticLayout: true,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -162,13 +162,19 @@ export class PlaygroundModel {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.debouncer.run(() => {
|
const action = () => {
|
||||||
this.isDirty = false;
|
this.isDirty = false;
|
||||||
lastState = state;
|
lastState = state;
|
||||||
for (const handler of this._previewHandlers) {
|
for (const handler of this._previewHandlers) {
|
||||||
handler.handlePreview(state);
|
handler.handlePreview(state);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
if (state.key !== lastState.key) {
|
||||||
|
action(); // sync update
|
||||||
|
} else {
|
||||||
|
this.debouncer.run(action);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{ name: "update preview" }
|
{ name: "update preview" }
|
||||||
),
|
),
|
||||||
|
|
@ -178,6 +184,17 @@ export class PlaygroundModel {
|
||||||
let disposable: Disposable | undefined = undefined;
|
let disposable: Disposable | undefined = undefined;
|
||||||
|
|
||||||
waitForLoadedMonaco().then((m) => {
|
waitForLoadedMonaco().then((m) => {
|
||||||
|
this.dispose.track(
|
||||||
|
monaco.editor.addEditorAction({
|
||||||
|
id: "reload",
|
||||||
|
label: "Reload",
|
||||||
|
run: (editor, ...args) => {
|
||||||
|
this.reload();
|
||||||
|
},
|
||||||
|
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter],
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
const options =
|
const options =
|
||||||
monaco.languages.typescript.javascriptDefaults.getCompilerOptions();
|
monaco.languages.typescript.javascriptDefaults.getCompilerOptions();
|
||||||
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions(
|
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions(
|
||||||
|
|
@ -222,6 +239,26 @@ export class PlaygroundModel {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setCodeString(codeStringName: string, value: string) {
|
||||||
|
function escapeRegexpChars(str: string) {
|
||||||
|
return str.replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&");
|
||||||
|
}
|
||||||
|
|
||||||
|
const regexp = new RegExp(
|
||||||
|
"(\\b" +
|
||||||
|
escapeRegexpChars(codeStringName) +
|
||||||
|
":[^\\w`]*`)([^`\\\\]|\\n|\\\\\\\\|\\\\`)*`"
|
||||||
|
);
|
||||||
|
debugger;
|
||||||
|
const js = this.js;
|
||||||
|
const str = value.replaceAll("\\", "\\\\").replaceAll("`", "\\`");
|
||||||
|
const newJs = js.replace(regexp, "$1" + str + "`");
|
||||||
|
const autoReload = this.settings.autoReload;
|
||||||
|
this.settings.autoReload = false;
|
||||||
|
this.js = newJs;
|
||||||
|
this.settings.autoReload = autoReload;
|
||||||
|
}
|
||||||
|
|
||||||
public showSettingsDialog(): void {
|
public showSettingsDialog(): void {
|
||||||
this.settingsDialogModel = new SettingsDialogModel(
|
this.settingsDialogModel = new SettingsDialogModel(
|
||||||
this.settings.settings
|
this.settings.settings
|
||||||
|
|
|
||||||
|
|
@ -448,7 +448,16 @@ class Editor extends React.Component<{
|
||||||
() => {
|
() => {
|
||||||
const value = this.props.value.get();
|
const value = this.props.value.get();
|
||||||
if (!this.ignoreChange) {
|
if (!this.ignoreChange) {
|
||||||
this.editor!.setValue(value);
|
this.model.pushEditOperations(
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
range: this.model.getFullModelRange(),
|
||||||
|
text: value,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
() => null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ name: "update text" }
|
{ name: "update text" }
|
||||||
|
|
@ -458,6 +467,7 @@ class Editor extends React.Component<{
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
this.disposables.forEach((d) => d.dispose());
|
this.disposables.forEach((d) => d.dispose());
|
||||||
|
this.model.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,21 @@ export class Preview
|
||||||
targetOrigin: "*",
|
targetOrigin: "*",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
window.addEventListener("message", (e) => {
|
||||||
|
if (e.source !== iframe.contentWindow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const data = e.data as
|
||||||
|
| {
|
||||||
|
kind: "update-code-string";
|
||||||
|
codeStringName: string;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
| { kind: "" };
|
||||||
|
if (data.kind === "update-code-string") {
|
||||||
|
this.props.model.setCodeString(data.codeStringName, data.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue