mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 08:46:37 -04:00
Unify anki-mathjax-* to just anki-mathjax
This commit is contained in:
parent
6b14afda27
commit
d7e0f77439
9 changed files with 86 additions and 97 deletions
|
@ -6,7 +6,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import { convertMathjax } from "./mathjax";
|
import { convertMathjax } from "./mathjax";
|
||||||
|
|
||||||
export let mathjax: string;
|
export let mathjax: string;
|
||||||
export let type: "inline" | "block" | "chemistry";
|
export let block: boolean;
|
||||||
|
|
||||||
$: converted = convertMathjax(mathjax);
|
$: converted = convertMathjax(mathjax);
|
||||||
$: encoded = encodeURIComponent(converted);
|
$: encoded = encodeURIComponent(converted);
|
||||||
|
@ -14,7 +14,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
<img
|
<img
|
||||||
src="data:image/svg+xml,{encoded}"
|
src="data:image/svg+xml,{encoded}"
|
||||||
class:block={type === "block"}
|
class:block
|
||||||
alt="Mathjax"
|
alt="Mathjax"
|
||||||
data-anki="mathjax"
|
data-anki="mathjax"
|
||||||
data-mathjax={mathjax}
|
data-mathjax={mathjax}
|
||||||
|
|
|
@ -25,7 +25,12 @@ function containsInlineContent(element: Element): boolean {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const components = ["anki-mathjax-block", "anki-mathjax-inline"];
|
interface DecoratedElement extends HTMLElement {
|
||||||
|
decorate(): void;
|
||||||
|
undecorate(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const decoratedTags = ["anki-mathjax"];
|
||||||
|
|
||||||
export class Editable extends HTMLElement {
|
export class Editable extends HTMLElement {
|
||||||
set fieldHTML(content: string) {
|
set fieldHTML(content: string) {
|
||||||
|
@ -39,9 +44,9 @@ export class Editable extends HTMLElement {
|
||||||
get fieldHTML(): string {
|
get fieldHTML(): string {
|
||||||
const clone = this.cloneNode(true) as Element;
|
const clone = this.cloneNode(true) as Element;
|
||||||
|
|
||||||
for (const component of components) {
|
for (const component of decoratedTags) {
|
||||||
for (const element of clone.getElementsByTagName(component)) {
|
for (const element of clone.getElementsByTagName(component)) {
|
||||||
(element as any).undecorate();
|
(element as DecoratedElement).undecorate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,4 +4,4 @@
|
||||||
import "./editable-base.css";
|
import "./editable-base.css";
|
||||||
import "./editable-container";
|
import "./editable-container";
|
||||||
import "./editable";
|
import "./editable";
|
||||||
import "./mathjax-components";
|
import "./mathjax-component";
|
||||||
|
|
72
ts/editable/mathjax-component.ts
Normal file
72
ts/editable/mathjax-component.ts
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
import "mathjax/es5/tex-svg-full";
|
||||||
|
|
||||||
|
import Mathjax_svelte from "./Mathjax.svelte";
|
||||||
|
|
||||||
|
class Mathjax extends HTMLElement {
|
||||||
|
block: boolean = false;
|
||||||
|
|
||||||
|
static get observedAttributes(): string[] {
|
||||||
|
return ["block"];
|
||||||
|
}
|
||||||
|
|
||||||
|
connectedCallback(): void {
|
||||||
|
this.decorate();
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeChangedCallback(_name: string, _old: string, newValue: string): void {
|
||||||
|
this.block = newValue !== "false";
|
||||||
|
}
|
||||||
|
|
||||||
|
decorate(): void {
|
||||||
|
const mathjax = (this.dataset.mathjax = this.innerText);
|
||||||
|
this.innerHTML = "";
|
||||||
|
|
||||||
|
new Mathjax_svelte({
|
||||||
|
target: this,
|
||||||
|
props: { mathjax, block: this.block },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
undecorate(): void {
|
||||||
|
this.innerHTML = this.dataset.mathjax ?? "";
|
||||||
|
delete this.dataset.mathjax;
|
||||||
|
|
||||||
|
if (this.block) {
|
||||||
|
this.setAttribute("block", "true");
|
||||||
|
} else {
|
||||||
|
this.removeAttribute("block");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define("anki-mathjax", Mathjax);
|
||||||
|
|
||||||
|
// TODO mathjax regex will prob. fail at double quotes
|
||||||
|
const mathjaxTagPattern =
|
||||||
|
/<anki-mathjax(?:[^>]*?block="(.*?)")?[^>]*?>(.*?)<\/anki-mathjax>/gsu;
|
||||||
|
|
||||||
|
export function toMathjaxDelimiters(html: string): string {
|
||||||
|
return html.replace(
|
||||||
|
mathjaxTagPattern,
|
||||||
|
(_match: string, block: string | undefined, text: string) =>
|
||||||
|
typeof block === "string" && block !== "false"
|
||||||
|
? `\\[${text}\\]`
|
||||||
|
: `\\(${text}\\)`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mathjaxBlockDelimiterPattern = /\\\[(.*?)\\\]/gsu;
|
||||||
|
const mathjaxInlineDelimiterPattern = /\\\((.*?)\\\)/gsu;
|
||||||
|
|
||||||
|
export function toMathjaxTags(html: string): string {
|
||||||
|
return html
|
||||||
|
.replace(
|
||||||
|
mathjaxBlockDelimiterPattern,
|
||||||
|
(_match: string, text: string) =>
|
||||||
|
`<anki-mathjax block="true">${text}</anki-mathjax>`
|
||||||
|
)
|
||||||
|
.replace(
|
||||||
|
mathjaxInlineDelimiterPattern,
|
||||||
|
(_match: string, text: string) => `<anki-mathjax>${text}</anki-mathjax>`
|
||||||
|
);
|
||||||
|
}
|
|
@ -1,84 +0,0 @@
|
||||||
import Mathjax_svelte from "./Mathjax.svelte";
|
|
||||||
|
|
||||||
class MathjaxInline extends HTMLElement {
|
|
||||||
connectedCallback() {
|
|
||||||
this.decorate();
|
|
||||||
}
|
|
||||||
|
|
||||||
decorate(): void {
|
|
||||||
const mathjax = (this.dataset.mathjax = this.innerText);
|
|
||||||
const type = "inline";
|
|
||||||
this.innerHTML = "";
|
|
||||||
|
|
||||||
new Mathjax_svelte({
|
|
||||||
target: this,
|
|
||||||
props: { mathjax, type },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
undecorate(): void {
|
|
||||||
this.innerHTML = this.dataset.mathjax ?? "";
|
|
||||||
delete this.dataset.mathjax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define("anki-mathjax-inline", MathjaxInline);
|
|
||||||
|
|
||||||
class MathjaxBlock extends HTMLElement {
|
|
||||||
connectedCallback() {
|
|
||||||
this.decorate();
|
|
||||||
}
|
|
||||||
|
|
||||||
decorate(): void {
|
|
||||||
const mathjax = (this.dataset.mathjax = this.innerText);
|
|
||||||
const type = "block";
|
|
||||||
this.innerHTML = "";
|
|
||||||
|
|
||||||
new Mathjax_svelte({
|
|
||||||
target: this,
|
|
||||||
props: { mathjax, type },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
undecorate(): void {
|
|
||||||
this.innerHTML = this.dataset.mathjax ?? "";
|
|
||||||
delete this.dataset.mathjax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define("anki-mathjax-block", MathjaxBlock);
|
|
||||||
|
|
||||||
// TODO mathjax regex will prob. fail at double quotes
|
|
||||||
const mathjaxInlineTagPattern =
|
|
||||||
/<anki-mathjax-inline[^>]*?data-mathjax="(.*?)"[^>]*?>.*?<\/anki-mathjax-inline>/gsu;
|
|
||||||
const mathjaxBlockTagPattern =
|
|
||||||
/<anki-mathjax-block[^>]*?data-mathjax="(.*?)"[^>]*?>.*?<\/anki-mathjax-block>/gsu;
|
|
||||||
|
|
||||||
export function toMathjaxDelimiters(html: string): string {
|
|
||||||
return html
|
|
||||||
.replace(
|
|
||||||
mathjaxInlineTagPattern,
|
|
||||||
(_match: string, text: string) => `\\(${text}\\)`
|
|
||||||
)
|
|
||||||
.replace(
|
|
||||||
mathjaxBlockTagPattern,
|
|
||||||
(_match: string, text: string) => `\\[${text}\\]`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const mathjaxInlineDelimiterPattern = /\\\((.*?)\\\)/gsu;
|
|
||||||
const mathjaxBlockDelimiterPattern = /\\\[(.*?)\\\]/gsu;
|
|
||||||
|
|
||||||
export function toMathjaxTags(html: string): string {
|
|
||||||
return html
|
|
||||||
.replace(
|
|
||||||
mathjaxInlineDelimiterPattern,
|
|
||||||
(_match: string, text: string) =>
|
|
||||||
`<anki-mathjax-inline>${text}</anki-mathjax-inline>`
|
|
||||||
)
|
|
||||||
.replace(
|
|
||||||
mathjaxBlockDelimiterPattern,
|
|
||||||
(_match: string, text: string) =>
|
|
||||||
`<anki-mathjax-block>${text}</anki-mathjax-block>`
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -1,8 +1,6 @@
|
||||||
// Copyright: Ankitects Pty Ltd and contributors
|
// Copyright: Ankitects Pty Ltd and contributors
|
||||||
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import "mathjax/es5/tex-svg-full";
|
|
||||||
|
|
||||||
export function convertMathjax(input: string): string {
|
export function convertMathjax(input: string): string {
|
||||||
const svg = globalThis.MathJax.tex2svg(input).children[0];
|
const svg = globalThis.MathJax.tex2svg(input).children[0];
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,7 @@ const latex = {
|
||||||
const htmlanki = {
|
const htmlanki = {
|
||||||
name: "htmlmixed",
|
name: "htmlmixed",
|
||||||
tags: {
|
tags: {
|
||||||
"anki-mathjax-inline": [[null, null, latex]],
|
"anki-mathjax": [[null, null, latex]],
|
||||||
"anki-mathjax-block": [[null, null, latex]],
|
|
||||||
"anki-mathjax-chemistry": [[null, null, latex]],
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ import { bridgeCommand } from "./lib";
|
||||||
import { onInput, onKey, onKeyUp } from "./input-handlers";
|
import { onInput, onKey, onKeyUp } from "./input-handlers";
|
||||||
import { onFocus, onBlur } from "./focus-handlers";
|
import { onFocus, onBlur } from "./focus-handlers";
|
||||||
import { nightModeKey } from "components/context-keys";
|
import { nightModeKey } from "components/context-keys";
|
||||||
import { toMathjaxTags, toMathjaxDelimiters } from "editable/mathjax-components";
|
import { toMathjaxTags, toMathjaxDelimiters } from "editable/mathjax-component";
|
||||||
|
|
||||||
function onCutOrCopy(): void {
|
function onCutOrCopy(): void {
|
||||||
bridgeCommand("cutOrCopy");
|
bridgeCommand("cutOrCopy");
|
||||||
|
|
|
@ -29,7 +29,7 @@ import type { EditorField } from "./editor-field";
|
||||||
import { EditingArea } from "./editing-area";
|
import { EditingArea } from "./editing-area";
|
||||||
import "editable/editable-container";
|
import "editable/editable-container";
|
||||||
import "editable/editable";
|
import "editable/editable";
|
||||||
import "editable/mathjax-components";
|
import "editable/mathjax-component";
|
||||||
|
|
||||||
import { initToolbar, fieldFocused } from "./toolbar";
|
import { initToolbar, fieldFocused } from "./toolbar";
|
||||||
import { initTagEditor } from "./tag-editor";
|
import { initTagEditor } from "./tag-editor";
|
||||||
|
|
Loading…
Reference in a new issue