diff --git a/addon/chrome/content/templateEditor.xhtml b/addon/chrome/content/templateEditor.xhtml
index 45f4854..5e01c34 100644
--- a/addon/chrome/content/templateEditor.xhtml
+++ b/addon/chrome/content/templateEditor.xhtml
@@ -122,10 +122,12 @@
-
+
@@ -153,7 +155,10 @@
wantdropmarker="true"
>
-
+
diff --git a/package.json b/package.json
index cfe3929..e95f50b 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,7 @@
"hast-util-to-text": "^3.1.2",
"hastscript": "^7.2.0",
"html-docx-js-typescript": "^0.1.5",
- "katex": "^0.16.7",
+ "katex": "^0.16.8",
"rehype-format": "^4.0.1",
"rehype-parse": "^8.0.4",
"rehype-remark": "^9.1.2",
@@ -66,32 +66,32 @@
"unist-util-visit": "^5.0.0",
"unist-util-visit-parents": "^6.0.1",
"yamljs": "^0.3.0",
- "zotero-plugin-toolkit": "^2.1.7"
+ "zotero-plugin-toolkit": "^2.2.4"
},
"devDependencies": {
- "@prettier/plugin-xml": "^3.1.1",
+ "@prettier/plugin-xml": "^3.2.0",
"@types/browser-or-node": "^1.3.0",
"@types/diff": "^5.0.3",
- "@types/node": "^20.4.2",
+ "@types/node": "^20.4.9",
"@types/seedrandom": "^3.0.5",
"@types/yamljs": "^0.2.31",
- "@typescript-eslint/eslint-plugin": "^6.0.0",
- "@typescript-eslint/parser": "^6.0.0",
+ "@typescript-eslint/eslint-plugin": "^6.3.0",
+ "@typescript-eslint/parser": "^6.3.0",
"chokidar-cli": "^3.0.0",
- "compressing": "^1.9.0",
+ "compressing": "^1.9.1",
"concurrently": "^8.2.0",
"cross-env": "^7.0.3",
- "esbuild": "^0.18.1",
- "eslint": "^8.44.0",
- "eslint-config-prettier": "^8.8.0",
- "prettier": "^3.0.0",
- "prosemirror-model": "^1.19.2",
+ "esbuild": "^0.18.20",
+ "eslint": "^8.46.0",
+ "eslint-config-prettier": "^8.10.0",
+ "prettier": "^3.0.1",
+ "prosemirror-model": "^1.19.3",
"prosemirror-state": "^1.4.3",
- "prosemirror-transform": "^1.7.3",
- "prosemirror-view": "^1.31.4",
- "release-it": "^16.1.3",
+ "prosemirror-transform": "^1.7.4",
+ "prosemirror-view": "^1.31.7",
+ "release-it": "^16.1.4",
"replace-in-file": "^7.0.1",
- "typescript": "^5.1.3",
- "zotero-types": "^1.0.15"
+ "typescript": "^5.1.6",
+ "zotero-types": "^1.2.1"
}
}
diff --git a/src/addon.ts b/src/addon.ts
index 9e0081c..eee9198 100644
--- a/src/addon.ts
+++ b/src/addon.ts
@@ -89,6 +89,7 @@ class Addon {
templateEditor: {
window?: Window;
tableHelper?: VirtualizedTableHelper;
+ editor?: any;
templates: { name: string }[];
};
templatePicker: {
diff --git a/src/modules/template/editorWindow.ts b/src/modules/template/editorWindow.ts
index 7fac639..67b04da 100644
--- a/src/modules/template/editorWindow.ts
+++ b/src/modules/template/editorWindow.ts
@@ -3,6 +3,7 @@ import { config } from "../../../package.json";
import { showHint } from "../../utils/hint";
import { itemPicker } from "../../utils/itemPicker";
import { getString } from "../../utils/locale";
+import { waitUtilAsync } from "../../utils/wait";
export async function showTemplateEditor() {
if (
@@ -13,7 +14,6 @@ export async function showTemplateEditor() {
const windowArgs = {
_initPromise: Zotero.Promise.defer(),
};
- // @ts-ignore
const _window = window.openDialog(
`chrome://${config.addonRef}/content/templateEditor.xhtml`,
`${config.addonRef}-templateEditor`,
@@ -128,8 +128,16 @@ export async function showTemplateEditor() {
?.addEventListener("click", (ev) => {
restoreTemplates(_window);
});
+ addon.data.templateEditor.window?.focus();
+ const editorWin = (_window.document.querySelector("#editor") as any)
+ .contentWindow;
+ await waitUtilAsync(() => editorWin?.loadMonaco);
+ const { monaco, editor } = await editorWin.loadMonaco({
+ language: "javascript",
+ theme: "vs-light",
+ });
+ addon.data.templateEditor.editor = editor;
}
- addon.data.templateEditor.window?.focus();
}
async function refresh() {
@@ -154,9 +162,9 @@ function updateEditor() {
const header = addon.data.templateEditor.window?.document.getElementById(
"editor-name",
) as HTMLInputElement;
- const text = addon.data.templateEditor.window?.document.getElementById(
- "editor-textbox",
- ) as HTMLTextAreaElement;
+ const editor = addon.data.templateEditor.window?.document.getElementById(
+ "editor",
+ ) as HTMLIFrameElement;
const saveTemplate =
addon.data.templateEditor.window?.document.getElementById(
"save",
@@ -172,8 +180,7 @@ function updateEditor() {
if (!name) {
header.value = "";
header.setAttribute("disabled", "true");
- text.value = "";
- text.setAttribute("disabled", "true");
+ editor.hidden = true;
saveTemplate.setAttribute("disabled", "true");
deleteTemplate.setAttribute("disabled", "true");
deleteTemplate.hidden = false;
@@ -190,8 +197,8 @@ function updateEditor() {
deleteTemplate.hidden = true;
resetTemplate.hidden = false;
}
- text.value = templateText;
- text.removeAttribute("disabled");
+ addon.data.templateEditor.editor.setValue(templateText);
+ editor.hidden = false;
saveTemplate.removeAttribute("disabled");
deleteTemplate.removeAttribute("disabled");
}
@@ -258,9 +265,6 @@ function saveSelectedTemplate() {
const header = addon.data.templateEditor.window?.document.getElementById(
"editor-name",
) as HTMLInputElement;
- const text = addon.data.templateEditor.window?.document.getElementById(
- "editor-textbox",
- ) as HTMLTextAreaElement;
if (
addon.api.template.SYSTEM_TEMPLATE_NAMES.includes(name) &&
@@ -274,7 +278,7 @@ function saveSelectedTemplate() {
const template = {
name: header.value,
- text: text.value,
+ text: addon.data.templateEditor.editor.getValue(),
};
addon.api.template.setTemplate(template);
if (name !== template.name) {
@@ -303,12 +307,10 @@ function deleteSelectedTemplate() {
function resetSelectedTemplate() {
const name = getSelectedTemplateName();
if (addon.api.template.SYSTEM_TEMPLATE_NAMES.includes(name)) {
- const text = addon.data.templateEditor.window?.document.getElementById(
- "editor-textbox",
- ) as HTMLTextAreaElement;
- text.value =
+ addon.data.templateEditor.editor.setValue(
addon.api.template.DEFAULT_TEMPLATES.find((t) => t.name === name)?.text ||
- "";
+ "",
+ );
showHint(`Template ${name} is reset. Please save before leaving.`);
}
}