From bc67268d823c5d29d6d2fd9922513626edffd188 Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Mon, 2 Mar 2020 01:09:52 +0100 Subject: [PATCH] config_unprettify_json --- qt/aqt/addons.py | 1 + qt/aqt/gui_hooks.py | 29 +++++++++++++++++++++++++++++ qt/tools/genhooks_gui.py | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/qt/aqt/addons.py b/qt/aqt/addons.py index e8c0514cd..ecd7c56dd 100644 --- a/qt/aqt/addons.py +++ b/qt/aqt/addons.py @@ -1301,6 +1301,7 @@ class ConfigEditor(QDialog): def accept(self): txt = self.form.editor.toPlainText() + txt = gui_hooks.addon_config_editor_will_save_json(txt) try: new_conf = json.loads(txt) except Exception as e: diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index b93e04e75..fded1c1c8 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -106,6 +106,35 @@ class _AddonConfigEditorWillDisplayJsonFilter: addon_config_editor_will_display_json = _AddonConfigEditorWillDisplayJsonFilter() +class _AddonConfigEditorWillSaveJsonFilter: + """Allows changing the text of the json configuration that was + received from the user before actually reading it. For + example, you can replace new line in strings by some "\n".""" + + _hooks: List[Callable[[str], str]] = [] + + def append(self, cb: Callable[[str], str]) -> None: + """(text: str)""" + self._hooks.append(cb) + + def remove(self, cb: Callable[[str], str]) -> None: + if cb in self._hooks: + self._hooks.remove(cb) + + def __call__(self, text: str) -> str: + for filter in self._hooks: + try: + text = filter(text) + except: + # if the hook fails, remove it + self._hooks.remove(filter) + raise + return text + + +addon_config_editor_will_save_json = _AddonConfigEditorWillSaveJsonFilter() + + class _AvPlayerDidBeginPlayingHook: _hooks: List[Callable[["aqt.sound.Player", "anki.sound.AVTag"], None]] = [] diff --git a/qt/tools/genhooks_gui.py b/qt/tools/genhooks_gui.py index a2a1e685c..1147c0653 100644 --- a/qt/tools/genhooks_gui.py +++ b/qt/tools/genhooks_gui.py @@ -464,6 +464,14 @@ def emptyNewCard(): while reading the file and let the user uses real new line in string instead of its encoding.""", ), + Hook( + name="addon_config_editor_will_save_json", + args=["text: str"], + return_type="str", + doc="""Allows changing the text of the json configuration that was + received from the user before actually reading it. For + example, you can replace new line in strings by some "\\\\n".""", + ), # Other ################### Hook(