diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5c8bfa763..b5762c411 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,7 +1,9 @@
{
"editor.formatOnSave": true,
- "editor.codeActionsOnSave": {
- "source.organizeImports": true
+ "[python]": {
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ }
},
"files.watcherExclude": {
"**/.git/objects/**": true,
diff --git a/ftl/core/editing.ftl b/ftl/core/editing.ftl
index df5d391db..6e4d9086a 100644
--- a/ftl/core/editing.ftl
+++ b/ftl/core/editing.ftl
@@ -15,6 +15,7 @@ editing-customize-card-templates = Customize Card Templates
editing-customize-fields = Customize Fields
editing-cut = Cut
editing-double-click-image = double-click image
+editing-double-click-to-expand = (double-click to expand)
editing-edit-current = Edit Current
editing-edit-html = Edit HTML
editing-fields = Fields
@@ -38,6 +39,7 @@ editing-outdent = Decrease indent
editing-paste = Paste
editing-record-audio = Record audio
editing-remove-formatting = Remove formatting
+editing-restore-original-size = Restore original size
editing-select-remove-formatting = Select formatting to remove
editing-show-duplicates = Show Duplicates
editing-subscript = Subscript
diff --git a/package.json b/package.json
index a717f362e..50fafcd1c 100644
--- a/package.json
+++ b/package.json
@@ -76,7 +76,6 @@
"lodash-es": "^4.17.21",
"marked": "^4.0.0",
"mathjax": "^3.1.2",
- "mathjax-full": "^3.2.0",
"protobufjs": "^6.10.2"
},
"resolutions": {
diff --git a/qt/aqt/data/web/js/BUILD.bazel b/qt/aqt/data/web/js/BUILD.bazel
index a28fb5562..78c7ada44 100644
--- a/qt/aqt/data/web/js/BUILD.bazel
+++ b/qt/aqt/data/web/js/BUILD.bazel
@@ -41,13 +41,21 @@ copy_files_into_group(
package = "//ts/reviewer",
)
+copy_files_into_group(
+ name = "mathjax",
+ srcs = [
+ "mathjax.js",
+ ],
+ package = "//ts/mathjax",
+)
+
filegroup(
name = "js",
srcs = [
"aqt",
- "mathjax.js",
"reviewer",
"editor",
+ "mathjax",
"//qt/aqt/data/web/js/vendor",
],
visibility = ["//qt:__subpackages__"],
@@ -68,6 +76,5 @@ eslint_test(
)
exports_files([
- "mathjax.js",
"tsconfig.json",
])
diff --git a/qt/aqt/data/web/js/mathjax.js b/qt/aqt/data/web/js/mathjax.js
deleted file mode 100644
index 2d864715f..000000000
--- a/qt/aqt/data/web/js/mathjax.js
+++ /dev/null
@@ -1,28 +0,0 @@
-window.MathJax = {
- tex: {
- displayMath: [["\\[", "\\]"]],
- processRefs: false,
- processEnvironments: false,
- processEscapes: false,
- packages: {
- "[+]": ["noerrors", "mhchem"],
- },
- },
- startup: {
- typeset: false,
- pageReady: () => {
- return MathJax.startup.defaultPageReady();
- },
- },
- options: {
- renderActions: {
- addMenu: [],
- checkLoading: [],
- },
- ignoreHtmlClass: "tex2jax_ignore",
- processHtmlClass: "tex2jax_process",
- },
- loader: {
- load: ["[tex]/noerrors", "[tex]/mhchem"],
- },
-};
diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py
index 7d081cde4..6c8ce673e 100644
--- a/qt/aqt/editor.py
+++ b/qt/aqt/editor.py
@@ -155,7 +155,10 @@ class Editor:
self.web.stdHtml(
"",
css=[f"css/{file}.css"],
- js=[f"js/{file}.js"],
+ js=[
+ "js/mathjax.js",
+ f"js/{file}.js",
+ ],
context=self,
default_css=False,
)
diff --git a/qt/aqt/sound.py b/qt/aqt/sound.py
index 14dfdf36d..a6bbb17f7 100644
--- a/qt/aqt/sound.py
+++ b/qt/aqt/sound.py
@@ -149,6 +149,14 @@ class AVPlayer:
self._enqueued = tags[:]
self._play_next_if_idle()
+ def append_tags(self, tags: list[AVTag]) -> None:
+ """Append provided tags to the queue, then start playing them if the current player is idle."""
+ self._enqueued.extend(tags)
+ self._play_next_if_idle()
+
+ def queue_is_empty(self) -> bool:
+ return bool(self._enqueued)
+
def stop_and_clear_queue(self) -> None:
self._enqueued = []
self._stop_if_playing()
diff --git a/ts/editable/BUILD.bazel b/ts/editable/BUILD.bazel
index 953890ceb..b9aceca15 100644
--- a/ts/editable/BUILD.bazel
+++ b/ts/editable/BUILD.bazel
@@ -21,8 +21,8 @@ _ts_deps = [
"//ts/lib",
"//ts/domlib",
"//ts/sveltelib",
+ "//ts/mathjax:mathjax_ts",
"@npm//mathjax",
- "@npm//mathjax-full",
"@npm//svelte",
]
diff --git a/ts/editable/ResizableImage.svelte b/ts/editable/ResizableImage.svelte
new file mode 100644
index 000000000..36b06871b
--- /dev/null
+++ b/ts/editable/ResizableImage.svelte
@@ -0,0 +1,11 @@
+
+
diff --git a/ts/editable/index.ts b/ts/editable/index.ts
index 8fa7331d7..f8fa11f71 100644
--- a/ts/editable/index.ts
+++ b/ts/editable/index.ts
@@ -5,3 +5,4 @@ import "./editable-base.css";
/* only imported for the CSS */
import "./ContentEditable.svelte";
import "./Mathjax.svelte";
+import "./ResizableImage.svelte";
diff --git a/ts/editable/mathjax-element.ts b/ts/editable/mathjax-element.ts
index 1d7117cf5..247ccb458 100644
--- a/ts/editable/mathjax-element.ts
+++ b/ts/editable/mathjax-element.ts
@@ -1,8 +1,6 @@
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-import "mathjax/es5/tex-svg-full";
-
import { placeCaretAfter, placeCaretBefore } from "../domlib/place-caret";
import { on } from "../lib/events";
import type { DecoratedElement, DecoratedElementConstructor } from "./decorated";
@@ -15,6 +13,13 @@ const mathjaxTagPattern =
const mathjaxBlockDelimiterPattern = /\\\[(.*?)\\\]/gsu;
const mathjaxInlineDelimiterPattern = /\\\((.*?)\\\)/gsu;
+function trimBreaks(text: string): string {
+ return text
+ .replace(/
/gsu, "\n")
+ .replace(/^\n*/, "")
+ .replace(/\n*$/, "");
+}
+
export const Mathjax: DecoratedElementConstructor = class Mathjax
extends HTMLElement
implements DecoratedElement
@@ -25,9 +30,10 @@ export const Mathjax: DecoratedElementConstructor = class Mathjax
const stored = undecorated.replace(
mathjaxTagPattern,
(_match: string, block: string | undefined, text: string) => {
+ const trimmed = trimBreaks(text);
return typeof block === "string" && block !== "false"
- ? `\\[${text}\\]`
- : `\\(${text}\\)`;
+ ? `\\[${trimmed}\\]`
+ : `\\(${trimmed}\\)`;
},
);
@@ -37,10 +43,12 @@ export const Mathjax: DecoratedElementConstructor = class Mathjax
static toUndecorated(stored: string): string {
return stored
.replace(mathjaxBlockDelimiterPattern, (_match: string, text: string) => {
- return `<${Mathjax.tagName} block="true">${text}${Mathjax.tagName}>`;
+ const trimmed = trimBreaks(text);
+ return `<${Mathjax.tagName} block="true">${trimmed}${Mathjax.tagName}>`;
})
.replace(mathjaxInlineDelimiterPattern, (_match: string, text: string) => {
- return `<${Mathjax.tagName}>${text}${Mathjax.tagName}>`;
+ const trimmed = trimBreaks(text);
+ return `<${Mathjax.tagName}>${trimmed}${Mathjax.tagName}>`;
});
}
diff --git a/ts/editable/mathjax.ts b/ts/editable/mathjax.ts
index bbc4b8006..00a6027d8 100644
--- a/ts/editable/mathjax.ts
+++ b/ts/editable/mathjax.ts
@@ -5,6 +5,8 @@
@typescript-eslint/no-explicit-any: "off",
*/
+import "mathjax/es5/tex-svg";
+
import { mathIcon } from "./icons";
const parser = new DOMParser();
diff --git a/ts/editable/tsconfig.json b/ts/editable/tsconfig.json
index 2a86c8fcc..e4dc590f1 100644
--- a/ts/editable/tsconfig.json
+++ b/ts/editable/tsconfig.json
@@ -5,6 +5,7 @@
{ "path": "../components" },
{ "path": "../lib" },
{ "path": "../domlib" },
- { "path": "../sveltelib" }
+ { "path": "../sveltelib" },
+ { "path": "../mathjax" }
]
}
diff --git a/ts/editor/editor-toolbar/ClozeButtons.svelte b/ts/editor/ClozeButtons.svelte
similarity index 72%
rename from ts/editor/editor-toolbar/ClozeButtons.svelte
rename to ts/editor/ClozeButtons.svelte
index 5dd391d2b..f53c969e8 100644
--- a/ts/editor/editor-toolbar/ClozeButtons.svelte
+++ b/ts/editor/ClozeButtons.svelte
@@ -3,19 +3,18 @@ Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-