diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py
index 595059b57..568de8ec6 100644
--- a/qt/aqt/editor.py
+++ b/qt/aqt/editor.py
@@ -499,9 +499,6 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
else:
print("uncaught cmd", cmd)
- def mungeHTML(self, txt: str) -> str:
- return gui_hooks.editor_will_munge_html(txt, self)
-
def signal_state_change(
self, new_state: EditorState, old_state: EditorState
) -> None:
@@ -1648,24 +1645,7 @@ def fontMungeHack(font: str) -> str:
return re.sub(" L$", " Light", font)
-def munge_html(txt: str, editor: Editor) -> str:
- return "" if txt in ("
", "
") else txt
-
-
-def remove_null_bytes(txt: str, editor: Editor) -> str:
- # misbehaving apps may include a null byte in the text
- return txt.replace("\x00", "")
-
-
-def reverse_url_quoting(txt: str, editor: Editor) -> str:
- # reverse the url quoting we added to get images to display
- return editor.mw.col.media.escape_media_filenames(txt, unescape=True)
-
-
gui_hooks.editor_will_use_font_for_field.append(fontMungeHack)
-gui_hooks.editor_will_munge_html.append(munge_html)
-gui_hooks.editor_will_munge_html.append(remove_null_bytes)
-gui_hooks.editor_will_munge_html.append(reverse_url_quoting)
def set_cloze_button(editor: Editor) -> None:
diff --git a/qt/aqt/mediasrv.py b/qt/aqt/mediasrv.py
index c08dd0abd..a9a6ccbb3 100644
--- a/qt/aqt/mediasrv.py
+++ b/qt/aqt/mediasrv.py
@@ -684,6 +684,7 @@ exposed_backend_list = [
"get_ignored_before_count",
# CardRenderingService
"encode_iri_paths",
+ "decode_iri_paths",
]
diff --git a/ts/routes/editor/NoteEditor.svelte b/ts/routes/editor/NoteEditor.svelte
index ff179e70c..755eae772 100644
--- a/ts/routes/editor/NoteEditor.svelte
+++ b/ts/routes/editor/NoteEditor.svelte
@@ -290,9 +290,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const fieldSave = new ChangeTimer();
- function transformContentBeforeSave(content: string): string {
- return content.replace(/ data-editor-shrink="(true|false)"/g, "");
- // TODO: mungeHTML()
+ async function transformContentBeforeSave(content: string): Promise {
+ content = content.replace(/ data-editor-shrink="(true|false)"/g, "");
+ // misbehaving apps may include a null byte in the text
+ content = content.replaceAll("\0", "");
+ // reverse the url quoting we added to get images to display
+ content = (await decodeIriPaths({ val: content })).val;
+
+ if (["
", "
"].includes(content)) {
+ return "";
+ }
+ return content;
}
async function updateCurrentNote() {
@@ -304,10 +312,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
}
}
- function updateField(index: number, content: string): void {
- fieldSave.schedule(() => {
+ async function updateField(index: number, content: string): Promise {
+ fieldSave.schedule(async () => {
bridgeCommand(`key:${index}`);
- note!.fields[index] = transformContentBeforeSave(content);
+ note!.fields[index] = await transformContentBeforeSave(content);
updateCurrentNote();
}, 600);
}
@@ -428,6 +436,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
encodeIriPaths,
newNote,
editorUpdateNote,
+ decodeIriPaths,
} from "@generated/backend";
import { wrapInternal } from "@tslib/wrap";
@@ -790,11 +799,13 @@ components and functionality for general note editing.
setAddonButtonsDisabled(false);
bridgeCommand(`focus:${index}`);
}}
- on:focusout={() => {
+ on:focusout={async () => {
$focusedField = null;
setAddonButtonsDisabled(true);
bridgeCommand(`blur:${index}`);
- note!.fields[index] = transformContentBeforeSave(get(content));
+ note!.fields[index] = await transformContentBeforeSave(
+ get(content),
+ );
updateCurrentNote();
}}
on:mouseenter={() => {