Merge branch 'main' into mdx

This commit is contained in:
Remco Haszing 2023-04-10 10:45:06 +02:00 committed by GitHub
commit 598d45b159
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 119 additions and 13 deletions

4
package-lock.json generated
View file

@ -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": {

View file

@ -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;
}

View file

@ -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,

View file

@ -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,
}); });

View file

@ -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

View file

@ -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();
} }
} }

View file

@ -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() {