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