Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/frontend/editors/slate/elements/math/editable.tsx
1698 views
1
/*
2
* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.
3
* License: MS-RSL – see LICENSE.md for details
4
*/
5
6
import React from "react";
7
import { register, RenderElementProps } from "../register";
8
import { useSlate } from "../hooks";
9
import { SlateMath } from "./math-widget";
10
import { useSetElement } from "../set-element";
11
12
const Element: React.FC<RenderElementProps> = ({
13
attributes,
14
children,
15
element,
16
}) => {
17
if (element.type != "math_block" && element.type != "math_inline") {
18
// type guard.
19
throw Error("bug");
20
}
21
const editor = useSlate();
22
const setElement = useSetElement(editor, element);
23
24
return (
25
<span {...attributes}>
26
<SlateMath
27
value={element.value}
28
isInline={!!element["isInline"] && !element["display"]}
29
onChange={(value) => {
30
setElement({ value });
31
}}
32
/>
33
{children}
34
</span>
35
);
36
};
37
38
register({
39
slateType: "math_inline",
40
Element,
41
fromSlate: ({ node }) => {
42
const delim = node.value.trim().startsWith("\\begin{")
43
? ""
44
: node.display
45
? "$$"
46
: "$";
47
return `${delim}${node.value}${delim}`;
48
},
49
});
50
51
register({
52
slateType: "math_block",
53
Element,
54
fromSlate: ({ node }) => {
55
const value = node.value.trim();
56
let start, end;
57
if (value.startsWith("\\begin{")) {
58
start = "";
59
end = "\n\n";
60
} else {
61
start = "\n$$\n";
62
end = "\n$$\n\n";
63
}
64
return `${start}${value}${end}`;
65
},
66
});
67
68