lexical-medium-editor 1.2.19 → 1.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/components/InlineToolbar/utils.js","../src/Plugins/TextFormatPlugin.jsx","../src/components/InlineToolbar/LinkToolbar.jsx","../src/components/InlineToolbar/InlineToolbar.jsx","../src/Plugins/InlineToolbarPlugin.jsx","../node_modules/prismjs/prism.js","../src/prismSetup.js","../src/components/CodeHighlightMenu/CodeMenu.jsx","../src/Plugins/CodePlugin.jsx","../src/Plugins/HorizontalDividerPlugin.jsx","../src/Plugins/ImagePlugin.jsx","../src/components/BlockToolbar/BlockToolbar.jsx","../src/Plugins/BlockToolbarPlugin.jsx","../src/Plugins/MathPlugin.jsx","../src/Plugins/ListPluginExtended.jsx","../src/Plugins/TabInterceptorPlugin.jsx","../src/Plugins/EditorExposePlugin.jsx","../src/Editor.jsx"],"sourcesContent":["export const OFFSCREEN_POSITION = -1000;\n\nexport function computeInlineToolbarPosition(\n boundingRectCoords,\n toolbarRef,\n topOffset = 0\n) {\n // Ensure the popover reference is valid\n if (!toolbarRef || !toolbarRef.current) {\n console.error(\"Invalid popover reference\");\n return {\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n };\n }\n\n const toolbarElement = toolbarRef.current;\n\n const { x, y } = boundingRectCoords;\n const { width, height } = toolbarElement.getBoundingClientRect();\n\n const centerX = x - width / 2;\n const topY = y - height - topOffset;\n\n return {\n x: centerX,\n y: topY,\n };\n}\n\nexport function getBoundingRectCoords(range) {\n // Ensure the range is valid\n if (!range || typeof range.getBoundingClientRect !== \"function\") {\n console.error(\"Invalid DOM range\");\n return null;\n }\n\n const rect = range.getBoundingClientRect();\n\n const centerX = rect.left + rect.width / 2;\n const topY = rect.top + window.scrollY;\n\n return {\n x: centerX,\n y: topY,\n };\n}\n\nexport function computeBlockToolbarPosition(\n boundingRectCoords,\n toolbarRef,\n offset = 0\n) {\n // Ensure the popover reference is valid\n if (!toolbarRef || !toolbarRef.current) {\n console.error(\"Invalid popover reference\");\n return {\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n };\n }\n\n const { x, y } = boundingRectCoords;\n\n const toolbarElement = toolbarRef.current;\n const { width, height } = toolbarElement.getBoundingClientRect();\n\n const toolbarX = x - width - offset;\n const toolbarY = y - height / 2;\n\n return {\n x: toolbarX,\n y: toolbarY,\n };\n}\n\nexport function computeCodeMenuPosition(\n codeBlockCoords,\n codeMenuRef,\n HORIZONTAL_OFFSET = 16,\n VERTICAL_OFFSET = 12\n) {\n // Ensure the popover reference is valid\n if (!codeMenuRef || !codeMenuRef.current) {\n console.error(\"Invalid popover reference\");\n return {\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n };\n }\n\n const codeMenuElement = codeMenuRef.current;\n\n const { x, y } = codeBlockCoords;\n const { width } = codeMenuElement.getBoundingClientRect();\n\n const X = x - width - HORIZONTAL_OFFSET;\n const Y = y + VERTICAL_OFFSET;\n\n return {\n x: X,\n y: Y,\n };\n}\n","/* Plugins for formatting text */\n\nimport {\n $isHeadingNode,\n $createHeadingNode,\n $isQuoteNode,\n $createQuoteNode,\n HeadingNode,\n} from \"@lexical/rich-text\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n COMMAND_PRIORITY_HIGH,\n createCommand,\n $getSelection,\n $isRangeSelection,\n $createParagraphNode,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n $getRoot,\n TextNode,\n $isParagraphNode,\n} from \"lexical\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { useEffect } from \"react\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { $toggleLink, $isLinkNode } from \"@lexical/link\";\nimport { $isListNode } from \"@lexical/list\";\nimport \"@lexical/utils\";\nimport { $isAtNodeEnd } from \"@lexical/selection\";\n\nexport const TOGGLE_HEADING_COMMAND = createCommand(\"TOGGLE_HEADING_COMMAND\");\nexport const TOGGLE_QUOTE_COMMAND = createCommand(\"TOGGLE_QUOTE_COMMAND\");\nexport const TOGGLE_LINK_COMMAND = createCommand(\"TOGGLE_LINK_COMMAND\");\n\nexport function getSelectedNode(selection) {\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (anchorNode === focusNode) {\n return anchorNode;\n }\n const isBackward = selection.isBackward();\n if (isBackward) {\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\n } else {\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\n }\n}\n\n// Helper function to fetch the tag of a node if it or its ancestor is a heading node.\nfunction fetchTagIfHeadingNode(node) {\n const headingNode = $findMatchingParent(node, $isHeadingNode);\n return headingNode ? headingNode.getTag() : null;\n}\n\nexport function updateToolbarHeadingState(selection) {\n const toolbarHeadingState = {\n isHeadingOne: false,\n isHeadingTwo: false,\n isHeadingThree: false,\n };\n\n const nodes = selection.getNodes();\n if (!nodes.length) return toolbarHeadingState;\n\n const headingTag = fetchTagIfHeadingNode(nodes[0]);\n if (!headingTag) return toolbarHeadingState;\n\n const allMatch = nodes.every(\n (node) => fetchTagIfHeadingNode(node) === headingTag\n );\n\n if (allMatch) {\n const stateKey = {\n h1: \"isHeadingOne\",\n h2: \"isHeadingTwo\",\n h3: \"isHeadingThree\",\n }[headingTag];\n\n if (stateKey) toolbarHeadingState[stateKey] = true;\n }\n\n return toolbarHeadingState;\n}\n\nfunction HeadingPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n TOGGLE_HEADING_COMMAND,\n (toolbarState) => {\n const { isHeadingOne, isHeadingTwo, isHeadingThree } = toolbarState;\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n let tag;\n\n // Apply the toggling logic based on current state in toolbar\n if (isHeadingOne) {\n // H1 --> H3\n tag = \"h3\";\n } else if (isHeadingTwo) {\n // H2 --> H3\n tag = \"h3\";\n } else if (isHeadingThree) {\n // H3 --> None (paragraph)\n tag = null;\n } else {\n // None --> H2\n tag = \"h2\";\n }\n\n // Apply the heading or paragraph node\n $setBlocksType(selection, () =>\n tag ? $createHeadingNode(tag) : $createParagraphNode()\n );\n }\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n\nfunction HeadingOneFirstPlugin() {\n const [editor] = useLexicalComposerContext();\n\n // Effect for NodeTransform: H2 at start -> H1\n useEffect(() => {\n const unregisterTransform = editor.registerNodeTransform(\n HeadingNode,\n (node) => {\n // Check if it's an H2 node\n if (node.getTag() !== \"h2\") {\n return;\n }\n\n // Get the root node and the first child\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n\n // Check if this H2 node is the very first child of the root\n if (firstChild !== null && node.is(firstChild)) {\n const children = node.getChildren();\n const h1Node = $createHeadingNode(\"h1\");\n h1Node.append(...children);\n node.replace(h1Node);\n }\n }\n );\n\n return () => {\n unregisterTransform();\n };\n }, [editor]);\n\n return null;\n}\n\n// Helper function to check if a node or its ancestor is a quote node\nfunction isNodeOrAncestorQuote(node) {\n return $findMatchingParent(node, $isQuoteNode);\n}\n\nexport function updateToolbarQuoteState(selection) {\n const nodes = selection.getNodes();\n if (!nodes.length) return false;\n\n // Check if all nodes are within quote blocks\n return nodes.length > 0 && nodes.every((node) => isNodeOrAncestorQuote(node));\n}\n\nfunction QuotePlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n TOGGLE_QUOTE_COMMAND,\n (toolbarState) => {\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () =>\n toolbarState.isQuote ? $createParagraphNode() : $createQuoteNode()\n );\n }\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n\nexport function getLinkAtSelection(selection) {\n if (!$isRangeSelection(selection)) {\n return null;\n }\n\n const node = getSelectedNode(selection);\n return $findMatchingParent(node, $isLinkNode);\n}\n\nfunction LinkPlugin() {\n const [editor] = useLexicalComposerContext();\n\n // If a link node is clicked while holding the ctrl key, open the link in a new tab\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n const linkNode = getLinkAtSelection(selection);\n if (linkNode && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), \"_blank\");\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n return unregisterListener;\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (linkURL) => {\n $toggleLink(linkURL);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n\n/* Adds a CSS class to ElementNodes (excluding HeadingNodes) that follow a HeadingNode. */\nfunction AdjacentHeadingPlugin() {\n const [editor] = useLexicalComposerContext();\n const HEADING_ABOVE_CLASS = \"heading-above\";\n\n useEffect(() => {\n const unregisterTransform = editor.registerNodeTransform(\n TextNode,\n (textNode) => {\n const parentNode =\n $findMatchingParent(textNode, $isParagraphNode) ||\n $findMatchingParent(textNode, $isListNode);\n\n if (!parentNode) {\n return;\n }\n\n if ($isHeadingNode(parentNode)) {\n return;\n }\n\n const node = parentNode;\n\n const element = editor.getElementByKey(node.getKey());\n if (!element) {\n return;\n }\n\n const prevSibling = node.getPreviousSibling();\n const shouldHaveClass = $isHeadingNode(prevSibling);\n\n // Check if the DOM element *currently* has the class.\n const alreadyHasClass = element.classList.contains(HEADING_ABOVE_CLASS);\n\n // Add or remove the class directly on the DOM element to achieve the desired state.\n if (shouldHaveClass && !alreadyHasClass) {\n element.classList.add(HEADING_ABOVE_CLASS);\n } else if (!shouldHaveClass && alreadyHasClass) {\n element.classList.remove(HEADING_ABOVE_CLASS);\n }\n }\n );\n\n return unregisterTransform;\n }, [editor]);\n\n return null;\n}\n\nexport function TextFormatPlugin({ isHeadingOneFirst }) {\n return (\n <>\n <HeadingPlugin />\n {isHeadingOneFirst && <HeadingOneFirstPlugin />}\n <QuotePlugin />\n <LinkPlugin />\n <AdjacentHeadingPlugin />\n </>\n );\n}\n","import {\n Button,\n Group,\n Toolbar,\n TextField,\n Input,\n} from \"react-aria-components\";\nimport { IconCheck, IconX } from \"@tabler/icons-react\";\nimport { ICON_SIZE } from \"./InlineToolbar\";\nimport { useState } from \"react\";\nimport { TOGGLE_LINK_COMMAND } from \"../../Plugins/TextFormatPlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\n\nimport \"./styles/LinkToolbar.css\";\n\nexport function LinkToolbar({ style, closeToolbar, existingLinkURL }) {\n const [editor] = useLexicalComposerContext();\n const [linkURL, setLinkURL] = useState(existingLinkURL);\n\n // TODO: The left and right arrow keys aren't working at all. Need to debug.\n\n return (\n <Toolbar style={style} aria-details=\"link toolbar\" id=\"link-toolbar\">\n <TextField\n aria-label=\"url\"\n autoFocus={true}\n defaultValue={linkURL}\n onChange={setLinkURL}\n >\n <Input placeholder=\"Enter Link\" />\n </TextField>\n <Group aria-label=\"edit link\">\n <Button\n aria-label=\"Update link\"\n onPress={() => {\n const url = linkURL === \"\" ? null : linkURL;\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);\n closeToolbar();\n }}\n >\n <IconCheck size={ICON_SIZE} />\n </Button>\n <Button aria-label=\"Discard changes\" onPress={closeToolbar}>\n <IconX size={ICON_SIZE} />\n </Button>\n </Group>\n <div className=\"inline-toolbar-pointer\"></div>\n </Toolbar>\n );\n}\n","import {\r\n Button,\r\n Group,\r\n Separator,\r\n ToggleButton,\r\n Toolbar,\r\n} from \"react-aria-components\";\r\nimport {\r\n IconBold,\r\n IconItalic,\r\n IconCode,\r\n IconTextSize,\r\n IconBlockquote,\r\n IconLink,\r\n} from \"@tabler/icons-react\";\r\nimport { useEffect, useState, useRef, useLayoutEffect } from \"react\";\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $getCharacterOffsets,\r\n FORMAT_TEXT_COMMAND,\r\n} from \"lexical\";\r\nimport { createDOMRange } from \"@lexical/selection\";\r\nimport {\r\n computeInlineToolbarPosition,\r\n OFFSCREEN_POSITION,\r\n getBoundingRectCoords,\r\n} from \"./utils\";\r\nimport {\r\n TOGGLE_HEADING_COMMAND,\r\n TOGGLE_QUOTE_COMMAND,\r\n updateToolbarHeadingState,\r\n updateToolbarQuoteState,\r\n getLinkAtSelection,\r\n} from \"../../Plugins/TextFormatPlugin\";\r\nimport { LinkToolbar } from \"./LinkToolbar\";\r\n\r\nimport \"./styles/Toolbar.css\";\r\n\r\nexport const ICON_SIZE = 24;\r\nconst TOP_OFFSET = 16;\r\n\r\nexport default function InlineToolbar({ editor }) {\r\n // State for storing the bounding rectangle coordinates of the selection\r\n const [selectionRectCoords, setSelectionRectCoords] = useState(null);\r\n // State for storing the toolbar's position (x, y coordinates)\r\n const [toolbarPosition, setToolbarPosition] = useState({\r\n x: OFFSCREEN_POSITION,\r\n y: OFFSCREEN_POSITION,\r\n });\r\n const toolbarRef = useRef(null);\r\n const [toolbarState, setToolbarState] = useState({\r\n isBold: false,\r\n isItalic: false,\r\n isCode: false,\r\n isHeadingOne: false,\r\n isHeadingTwo: false,\r\n isHeadingThree: false,\r\n isQuote: false,\r\n });\r\n\r\n // Link toolbar state\r\n const [isLinkToolbarVisible, setLinkToolbarVisible] = useState(false);\r\n const [toolbarWidth, setToolbarWidth] = useState(0);\r\n const [existingLinkURL, setExistingLinkURL] = useState(\"\");\r\n\r\n // Logic for updating/setting toolbar state\r\n const updateToolbarFormatState = (selection) => {\r\n if ($isRangeSelection(selection)) {\r\n setToolbarState({\r\n isBold: selection.hasFormat(\"bold\"),\r\n isItalic: selection.hasFormat(\"italic\"),\r\n isCode: selection.hasFormat(\"code\"),\r\n isQuote: updateToolbarQuoteState(selection),\r\n });\r\n\r\n // update/set heading state\r\n const toolbarHeadingState = updateToolbarHeadingState(selection);\r\n setToolbarState((prev) => ({\r\n ...prev,\r\n ...toolbarHeadingState,\r\n }));\r\n\r\n // Set the link URL if the selection is at a link node\r\n const linkNode = getLinkAtSelection(selection);\r\n setExistingLinkURL(linkNode ? linkNode.getURL() : \"\");\r\n }\r\n };\r\n\r\n // Initialize toolbar state on component mount\r\n useEffect(() => {\r\n editor.read(() => {\r\n const selection = $getSelection();\r\n updateToolbarFormatState(selection);\r\n });\r\n }, [editor]);\r\n\r\n // Update toolbar state\r\n useEffect(() => {\r\n const unregisterListener = editor.registerUpdateListener(\r\n ({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n updateToolbarFormatState(selection);\r\n });\r\n }\r\n );\r\n return unregisterListener;\r\n }, [editor]);\r\n\r\n // Update selection rectangle coordinates when toolbar state changes\r\n useEffect(() => {\r\n editor.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n // Create a DOM range from the selection\r\n const [anchorPoint, focusPoint] = selection.getStartEndPoints();\r\n const [anchorNode, focusNode] = [\r\n anchorPoint.getNode(),\r\n focusPoint.getNode(),\r\n ];\r\n const [anchorOffset, focusOffset] = $getCharacterOffsets(selection);\r\n const selectionDOMRange = createDOMRange(\r\n editor,\r\n anchorNode,\r\n anchorOffset,\r\n focusNode,\r\n focusOffset\r\n );\r\n\r\n // Set bounding rect coords\r\n setSelectionRectCoords(getBoundingRectCoords(selectionDOMRange));\r\n }\r\n });\r\n }, [editor, toolbarState]);\r\n\r\n // Update toolbar position\r\n useEffect(() => {\r\n if (selectionRectCoords) {\r\n setToolbarPosition(\r\n computeInlineToolbarPosition(\r\n selectionRectCoords,\r\n toolbarRef,\r\n TOP_OFFSET\r\n )\r\n );\r\n setTimeout(() => {\r\n toolbarRef.current?.classList.add(\"visible\");\r\n }, 50);\r\n } else {\r\n toolbarRef.current?.classList.remove(\"visible\");\r\n }\r\n }, [selectionRectCoords]);\r\n\r\n // Capture the width of the inline toolbar after it has been rendered\r\n useLayoutEffect(() => {\r\n if (toolbarRef.current) {\r\n const computedStyle = window.getComputedStyle(toolbarRef.current);\r\n const width = parseFloat(computedStyle.width);\r\n setToolbarWidth(width);\r\n }\r\n }, [selectionRectCoords]);\r\n\r\n // TODO: LinkToolbar should not be a separate toolbar.\r\n // It should be a part of the InlineToolbar\r\n\r\n return (\r\n selectionRectCoords &&\r\n (isLinkToolbarVisible ? (\r\n <LinkToolbar\r\n style={{\r\n position: \"absolute\",\r\n top: toolbarPosition.y,\r\n left: toolbarPosition.x,\r\n width: toolbarWidth,\r\n }}\r\n closeToolbar={() => {\r\n setLinkToolbarVisible(false);\r\n setSelectionRectCoords(null);\r\n }}\r\n existingLinkURL={existingLinkURL}\r\n />\r\n ) : (\r\n <Toolbar\r\n style={{\r\n position: \"absolute\",\r\n top: toolbarPosition.y,\r\n left: toolbarPosition.x,\r\n }}\r\n aria-label=\"Text formatting\"\r\n id=\"inline-toolbar\"\r\n ref={toolbarRef}\r\n >\r\n <Group aria-label=\"Style\">\r\n <ToggleButton\r\n aria-label=\"Bold\"\r\n isSelected={toolbarState.isBold}\r\n isDisabled={\r\n toolbarState.isCode ||\r\n toolbarState.isHeadingOne ||\r\n toolbarState.isHeadingTwo ||\r\n toolbarState.isHeadingThree\r\n }\r\n onChange={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\r\n >\r\n <IconBold size={ICON_SIZE} />\r\n </ToggleButton>\r\n <ToggleButton\r\n aria-label=\"Italic\"\r\n isSelected={toolbarState.isItalic}\r\n isDisabled={toolbarState.isCode || toolbarState.isHeadingOne}\r\n onChange={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\r\n }\r\n >\r\n <IconItalic size={ICON_SIZE} />\r\n </ToggleButton>\r\n <ToggleButton\r\n aria-label=\"inline-code\"\r\n isDisabled={toolbarState.isHeadingOne}\r\n isSelected={toolbarState.isCode}\r\n onChange={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\r\n >\r\n <IconCode size={ICON_SIZE} />\r\n </ToggleButton>\r\n </Group>\r\n <Separator orientation=\"vertical\" />\r\n <Group aria-label=\"Text Blocks\">\r\n <ToggleButton\r\n aria-label=\"Heading\"\r\n isSelected={\r\n toolbarState.isHeadingOne ||\r\n toolbarState.isHeadingTwo ||\r\n toolbarState.isHeadingThree\r\n }\r\n onChange={() =>\r\n editor.dispatchCommand(TOGGLE_HEADING_COMMAND, toolbarState)\r\n }\r\n >\r\n <IconTextSize size={ICON_SIZE} />\r\n </ToggleButton>\r\n <ToggleButton\r\n aria-label=\"Quote\"\r\n isSelected={toolbarState.isQuote}\r\n onChange={() =>\r\n editor.dispatchCommand(TOGGLE_QUOTE_COMMAND, toolbarState)\r\n }\r\n >\r\n <IconBlockquote size={ICON_SIZE} />\r\n </ToggleButton>\r\n </Group>\r\n <Separator orientation=\"vertical\" />\r\n <Group aria-label=\"Links\">\r\n <Button\r\n onPress={() => setLinkToolbarVisible(true)}\r\n isDisabled={toolbarState.isHeadingOne}\r\n >\r\n <IconLink size={ICON_SIZE} />\r\n </Button>\r\n </Group>\r\n <div className=\"inline-toolbar-pointer\"></div>\r\n </Toolbar>\r\n ))\r\n );\r\n}\r\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n SELECTION_CHANGE_COMMAND,\n COMMAND_PRIORITY_HIGH,\n BLUR_COMMAND,\n} from \"lexical\";\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { $findMatchingParent } from \"@lexical/utils\";\n\nimport InlineToolbar from \"../components/InlineToolbar/InlineToolbar\";\nimport { $isMathNode } from \"../nodes/MathNode\";\nimport {\n $isMathHighlightNodeBlock,\n $isMathHighlightNodeInline,\n} from \"../nodes/MathHighlightNode\";\nimport { $isCodeNode } from \"@lexical/code\";\n\nconst DOM_ELEMENT = document.body;\n\nexport default function InlineToolbarPlugin() {\n const [shouldShow, setShouldShow] = useState(false);\n const [editor] = useLexicalComposerContext();\n\n // Listen for selection changes and show/hide the toolbar\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection) || selection.isCollapsed()) {\n setShouldShow(false);\n return false;\n }\n\n // Get all selected nodes\n const nodes = selection.getNodes();\n\n // Don't show if any Math nodes are in the selection\n const hasMathNode = nodes.some((node) => $isMathNode(node));\n\n // Don't show if only one node is selected and it's a MathHighlightNode\n const isSingleMathHighlight =\n nodes.length === 1 &&\n ($isMathHighlightNodeInline(nodes[0]) ||\n $findMatchingParent(nodes[0], $isMathHighlightNodeBlock));\n\n const isCodeBlock = nodes.some((node) =>\n $findMatchingParent(node, $isCodeNode)\n );\n\n setShouldShow(!hasMathNode && !isSingleMathHighlight && !isCodeBlock);\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // Hide the toolbar when the editor loses focus\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n BLUR_COMMAND,\n () => {\n setTimeout(() => {\n const toolbar = document.getElementById(\"inline-toolbar\");\n const linkToolbar = document.getElementById(\"link-toolbar\");\n const activeElement = document.activeElement;\n\n if (\n (toolbar &&\n (toolbar === activeElement || toolbar.contains(activeElement))) ||\n (linkToolbar &&\n (linkToolbar === activeElement ||\n linkToolbar.contains(activeElement)))\n ) {\n return;\n }\n\n setShouldShow(false);\n }, 0);\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return (\n shouldShow && createPortal(<InlineToolbar editor={editor} />, DOM_ELEMENT)\n );\n}\n","\n/* **********************************************\n Begin prism-core.js\n********************************************** */\n\n/// <reference lib=\"WebWorker\"/>\n\nvar _self = (typeof window !== 'undefined')\n\t? window // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t\t? self // if in worker\n\t\t\t: {} // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n *\n * @license MIT <https://opensource.org/licenses/MIT>\n * @author Lea Verou <https://lea.verou.me>\n * @namespace\n * @public\n */\nvar Prism = (function (_self) {\n\n\t// Private helper vars\n\tvar lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n\tvar uniqueId = 0;\n\n\t// The grammar object for plaintext\n\tvar plainTextGrammar = {};\n\n\n\tvar _ = {\n\t\t/**\n\t\t * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the\n\t\t * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load\n\t\t * additional languages or plugins yourself.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.\n\t\t *\n\t\t * You obviously have to change this value before the automatic highlighting started. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.manual = true;\n\t\t * // add a new <script> to load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tmanual: _self.Prism && _self.Prism.manual,\n\t\t/**\n\t\t * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses\n\t\t * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your\n\t\t * own worker, you don't want it to do this.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not add its own listeners to the worker.\n\t\t *\n\t\t * You obviously have to change this value before Prism executes. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.disableWorkerMessageHandler = true;\n\t\t * // Load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tdisableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n\n\t\t/**\n\t\t * A namespace for utility methods.\n\t\t *\n\t\t * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may\n\t\t * change or disappear at any time.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t */\n\t\tutil: {\n\t\t\tencode: function encode(tokens) {\n\t\t\t\tif (tokens instanceof Token) {\n\t\t\t\t\treturn new Token(tokens.type, encode(tokens.content), tokens.alias);\n\t\t\t\t} else if (Array.isArray(tokens)) {\n\t\t\t\t\treturn tokens.map(encode);\n\t\t\t\t} else {\n\t\t\t\t\treturn tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\\u00a0/g, ' ');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the name of the type of the given value.\n\t\t\t *\n\t\t\t * @param {any} o\n\t\t\t * @returns {string}\n\t\t\t * @example\n\t\t\t * type(null) === 'Null'\n\t\t\t * type(undefined) === 'Undefined'\n\t\t\t * type(123) === 'Number'\n\t\t\t * type('foo') === 'String'\n\t\t\t * type(true) === 'Boolean'\n\t\t\t * type([1, 2]) === 'Array'\n\t\t\t * type({}) === 'Object'\n\t\t\t * type(String) === 'Function'\n\t\t\t * type(/abc+/) === 'RegExp'\n\t\t\t */\n\t\t\ttype: function (o) {\n\t\t\t\treturn Object.prototype.toString.call(o).slice(8, -1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns a unique number for the given object. Later calls will still return the same number.\n\t\t\t *\n\t\t\t * @param {Object} obj\n\t\t\t * @returns {number}\n\t\t\t */\n\t\t\tobjId: function (obj) {\n\t\t\t\tif (!obj['__id']) {\n\t\t\t\t\tObject.defineProperty(obj, '__id', { value: ++uniqueId });\n\t\t\t\t}\n\t\t\t\treturn obj['__id'];\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Creates a deep clone of the given object.\n\t\t\t *\n\t\t\t * The main intended use of this function is to clone language definitions.\n\t\t\t *\n\t\t\t * @param {T} o\n\t\t\t * @param {Record<number, any>} [visited]\n\t\t\t * @returns {T}\n\t\t\t * @template T\n\t\t\t */\n\t\t\tclone: function deepClone(o, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar clone; var id;\n\t\t\t\tswitch (_.util.type(o)) {\n\t\t\t\t\tcase 'Object':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = /** @type {Record<string, any>} */ ({});\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\tfor (var key in o) {\n\t\t\t\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tclone[key] = deepClone(o[key], visited);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tcase 'Array':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\t(/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {\n\t\t\t\t\t\t\tclone[i] = deepClone(v, visited);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn o;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.\n\t\t\t *\n\t\t\t * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tgetLanguage: function (element) {\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar m = lang.exec(element.className);\n\t\t\t\t\tif (m) {\n\t\t\t\t\t\treturn m[1].toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn 'none';\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Sets the Prism `language-xxxx` class of the given element.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} language\n\t\t\t * @returns {void}\n\t\t\t */\n\t\t\tsetLanguage: function (element, language) {\n\t\t\t\t// remove all `language-xxxx` classes\n\t\t\t\t// (this might leave behind a leading space)\n\t\t\t\telement.className = element.className.replace(RegExp(lang, 'gi'), '');\n\n\t\t\t\t// add the new `language-xxxx` class\n\t\t\t\t// (using `classList` will automatically clean up spaces for us)\n\t\t\t\telement.classList.add('language-' + language);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the script element that is currently executing.\n\t\t\t *\n\t\t\t * This does __not__ work for line script element.\n\t\t\t *\n\t\t\t * @returns {HTMLScriptElement | null}\n\t\t\t */\n\t\t\tcurrentScript: function () {\n\t\t\t\tif (typeof document === 'undefined') {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) {\n\t\t\t\t\treturn /** @type {any} */ (document.currentScript);\n\t\t\t\t}\n\n\t\t\t\t// IE11 workaround\n\t\t\t\t// we'll get the src of the current script by parsing IE11's error stack trace\n\t\t\t\t// this will not work for inline scripts\n\n\t\t\t\ttry {\n\t\t\t\t\tthrow new Error();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Get file src url from stack. Specifically works with the format of stack traces in IE.\n\t\t\t\t\t// A stack will look like this:\n\t\t\t\t\t//\n\t\t\t\t\t// Error\n\t\t\t\t\t// at _.util.currentScript (http://localhost/components/prism-core.js:119:5)\n\t\t\t\t\t// at Global code (http://localhost/components/prism-core.js:606:1)\n\n\t\t\t\t\tvar src = (/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(err.stack) || [])[1];\n\t\t\t\t\tif (src) {\n\t\t\t\t\t\tvar scripts = document.getElementsByTagName('script');\n\t\t\t\t\t\tfor (var i in scripts) {\n\t\t\t\t\t\t\tif (scripts[i].src == src) {\n\t\t\t\t\t\t\t\treturn scripts[i];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns whether a given class is active for `element`.\n\t\t\t *\n\t\t\t * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated\n\t\t\t * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the\n\t\t\t * given class is just the given class with a `no-` prefix.\n\t\t\t *\n\t\t\t * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is\n\t\t\t * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its\n\t\t\t * ancestors have the given class or the negated version of it, then the default activation will be returned.\n\t\t\t *\n\t\t\t * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated\n\t\t\t * version of it, the class is considered active.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} className\n\t\t\t * @param {boolean} [defaultActivation=false]\n\t\t\t * @returns {boolean}\n\t\t\t */\n\t\t\tisActive: function (element, className, defaultActivation) {\n\t\t\t\tvar no = 'no-' + className;\n\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar classList = element.classList;\n\t\t\t\t\tif (classList.contains(className)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (classList.contains(no)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn !!defaultActivation;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tlanguages: {\n\t\t\t/**\n\t\t\t * The grammar for plain, unformatted text.\n\t\t\t */\n\t\t\tplain: plainTextGrammar,\n\t\t\tplaintext: plainTextGrammar,\n\t\t\ttext: plainTextGrammar,\n\t\t\ttxt: plainTextGrammar,\n\n\t\t\t/**\n\t\t\t * Creates a deep copy of the language with the given id and appends the given tokens.\n\t\t\t *\n\t\t\t * If a token in `redef` also appears in the copied language, then the existing token in the copied language\n\t\t\t * will be overwritten at its original position.\n\t\t\t *\n\t\t\t * ## Best practices\n\t\t\t *\n\t\t\t * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)\n\t\t\t * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to\n\t\t\t * understand the language definition because, normally, the order of tokens matters in Prism grammars.\n\t\t\t *\n\t\t\t * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.\n\t\t\t * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.\n\t\t\t *\n\t\t\t * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.\n\t\t\t * @param {Grammar} redef The new tokens to append.\n\t\t\t * @returns {Grammar} The new language created.\n\t\t\t * @public\n\t\t\t * @example\n\t\t\t * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {\n\t\t\t * // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token\n\t\t\t * // at its original position\n\t\t\t * 'comment': { ... },\n\t\t\t * // CSS doesn't have a 'color' token, so this token will be appended\n\t\t\t * 'color': /\\b(?:red|green|blue)\\b/\n\t\t\t * });\n\t\t\t */\n\t\t\textend: function (id, redef) {\n\t\t\t\tvar lang = _.util.clone(_.languages[id]);\n\n\t\t\t\tfor (var key in redef) {\n\t\t\t\t\tlang[key] = redef[key];\n\t\t\t\t}\n\n\t\t\t\treturn lang;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Inserts tokens _before_ another token in a language definition or any other grammar.\n\t\t\t *\n\t\t\t * ## Usage\n\t\t\t *\n\t\t\t * This helper method makes it easy to modify existing languages. For example, the CSS language definition\n\t\t\t * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded\n\t\t\t * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the\n\t\t\t * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do\n\t\t\t * this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.markup.style = {\n\t\t\t * // token\n\t\t\t * };\n\t\t\t * ```\n\t\t\t *\n\t\t\t * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens\n\t\t\t * before existing tokens. For the CSS example above, you would use it like this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'cdata', {\n\t\t\t * 'style': {\n\t\t\t * // token\n\t\t\t * }\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Special cases\n\t\t\t *\n\t\t\t * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar\n\t\t\t * will be ignored.\n\t\t\t *\n\t\t\t * This behavior can be used to insert tokens after `before`:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'comment', {\n\t\t\t * 'comment': Prism.languages.markup.comment,\n\t\t\t * // tokens after 'comment'\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Limitations\n\t\t\t *\n\t\t\t * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object\n\t\t\t * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave\n\t\t\t * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily\n\t\t\t * deleting properties which is necessary to insert at arbitrary positions.\n\t\t\t *\n\t\t\t * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.\n\t\t\t * Instead, it will create a new object and replace all references to the target object with the new one. This\n\t\t\t * can be done without temporarily deleting properties, so the iteration order is well-defined.\n\t\t\t *\n\t\t\t * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if\n\t\t\t * you hold the target object in a variable, then the value of the variable will not change.\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * var oldMarkup = Prism.languages.markup;\n\t\t\t * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });\n\t\t\t *\n\t\t\t * assert(oldMarkup !== Prism.languages.markup);\n\t\t\t * assert(newMarkup === Prism.languages.markup);\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the\n\t\t\t * object to be modified.\n\t\t\t * @param {string} before The key to insert before.\n\t\t\t * @param {Grammar} insert An object containing the key-value pairs to be inserted.\n\t\t\t * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the\n\t\t\t * object to be modified.\n\t\t\t *\n\t\t\t * Defaults to `Prism.languages`.\n\t\t\t * @returns {Grammar} The new grammar object.\n\t\t\t * @public\n\t\t\t */\n\t\t\tinsertBefore: function (inside, before, insert, root) {\n\t\t\t\troot = root || /** @type {any} */ (_.languages);\n\t\t\t\tvar grammar = root[inside];\n\t\t\t\t/** @type {Grammar} */\n\t\t\t\tvar ret = {};\n\n\t\t\t\tfor (var token in grammar) {\n\t\t\t\t\tif (grammar.hasOwnProperty(token)) {\n\n\t\t\t\t\t\tif (token == before) {\n\t\t\t\t\t\t\tfor (var newToken in insert) {\n\t\t\t\t\t\t\t\tif (insert.hasOwnProperty(newToken)) {\n\t\t\t\t\t\t\t\t\tret[newToken] = insert[newToken];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Do not insert token which also occur in insert. See #1525\n\t\t\t\t\t\tif (!insert.hasOwnProperty(token)) {\n\t\t\t\t\t\t\tret[token] = grammar[token];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar old = root[inside];\n\t\t\t\troot[inside] = ret;\n\n\t\t\t\t// Update references in other language definitions\n\t\t\t\t_.languages.DFS(_.languages, function (key, value) {\n\t\t\t\t\tif (value === old && key != inside) {\n\t\t\t\t\t\tthis[key] = ret;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t},\n\n\t\t\t// Traverse a language definition with Depth First Search\n\t\t\tDFS: function DFS(o, callback, type, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar objId = _.util.objId;\n\n\t\t\t\tfor (var i in o) {\n\t\t\t\t\tif (o.hasOwnProperty(i)) {\n\t\t\t\t\t\tcallback.call(o, i, o[i], type || i);\n\n\t\t\t\t\t\tvar property = o[i];\n\t\t\t\t\t\tvar propertyType = _.util.type(property);\n\n\t\t\t\t\t\tif (propertyType === 'Object' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, null, visited);\n\t\t\t\t\t\t} else if (propertyType === 'Array' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, i, visited);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tplugins: {},\n\n\t\t/**\n\t\t * This is the most high-level function in Prism’s API.\n\t\t * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on\n\t\t * each one of them.\n\t\t *\n\t\t * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.\n\t\t *\n\t\t * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAll: function (async, callback) {\n\t\t\t_.highlightAllUnder(document, async, callback);\n\t\t},\n\n\t\t/**\n\t\t * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls\n\t\t * {@link Prism.highlightElement} on each one of them.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-highlightall`\n\t\t * 2. `before-all-elements-highlight`\n\t\t * 3. All hooks of {@link Prism.highlightElement} for each element.\n\t\t *\n\t\t * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.\n\t\t * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAllUnder: function (container, async, callback) {\n\t\t\tvar env = {\n\t\t\t\tcallback: callback,\n\t\t\t\tcontainer: container,\n\t\t\t\tselector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n\t\t\t};\n\n\t\t\t_.hooks.run('before-highlightall', env);\n\n\t\t\tenv.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));\n\n\t\t\t_.hooks.run('before-all-elements-highlight', env);\n\n\t\t\tfor (var i = 0, element; (element = env.elements[i++]);) {\n\t\t\t\t_.highlightElement(element, async === true, env.callback);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Highlights the code inside a single element.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-sanity-check`\n\t\t * 2. `before-highlight`\n\t\t * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.\n\t\t * 4. `before-insert`\n\t\t * 5. `after-highlight`\n\t\t * 6. `complete`\n\t\t *\n\t\t * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for\n\t\t * the element's language.\n\t\t *\n\t\t * @param {Element} element The element containing the code.\n\t\t * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.\n\t\t * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers\n\t\t * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is\n\t\t * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).\n\t\t *\n\t\t * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for\n\t\t * asynchronous highlighting to work. You can build your own bundle on the\n\t\t * [Download page](https://prismjs.com/download.html).\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.\n\t\t * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightElement: function (element, async, callback) {\n\t\t\t// Find language\n\t\t\tvar language = _.util.getLanguage(element);\n\t\t\tvar grammar = _.languages[language];\n\n\t\t\t// Set language on the element, if not present\n\t\t\t_.util.setLanguage(element, language);\n\n\t\t\t// Set language on the parent, for styling\n\t\t\tvar parent = element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre') {\n\t\t\t\t_.util.setLanguage(parent, language);\n\t\t\t}\n\n\t\t\tvar code = element.textContent;\n\n\t\t\tvar env = {\n\t\t\t\telement: element,\n\t\t\t\tlanguage: language,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tcode: code\n\t\t\t};\n\n\t\t\tfunction insertHighlightedCode(highlightedCode) {\n\t\t\t\tenv.highlightedCode = highlightedCode;\n\n\t\t\t\t_.hooks.run('before-insert', env);\n\n\t\t\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\t\t\t_.hooks.run('after-highlight', env);\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t}\n\n\t\t\t_.hooks.run('before-sanity-check', env);\n\n\t\t\t// plugins may change/add the parent/element\n\t\t\tparent = env.element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {\n\t\t\t\tparent.setAttribute('tabindex', '0');\n\t\t\t}\n\n\t\t\tif (!env.code) {\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_.hooks.run('before-highlight', env);\n\n\t\t\tif (!env.grammar) {\n\t\t\t\tinsertHighlightedCode(_.util.encode(env.code));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (async && _self.Worker) {\n\t\t\t\tvar worker = new Worker(_.filename);\n\n\t\t\t\tworker.onmessage = function (evt) {\n\t\t\t\t\tinsertHighlightedCode(evt.data);\n\t\t\t\t};\n\n\t\t\t\tworker.postMessage(JSON.stringify({\n\t\t\t\t\tlanguage: env.language,\n\t\t\t\t\tcode: env.code,\n\t\t\t\t\timmediateClose: true\n\t\t\t\t}));\n\t\t\t} else {\n\t\t\t\tinsertHighlightedCode(_.highlight(env.code, env.grammar, env.language));\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Low-level function, only use if you know what you’re doing. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns a string with the HTML produced.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-tokenize`\n\t\t * 2. `after-tokenize`\n\t\t * 3. `wrap`: On each {@link Token}.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @param {string} language The name of the language definition passed to `grammar`.\n\t\t * @returns {string} The highlighted HTML.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');\n\t\t */\n\t\thighlight: function (text, grammar, language) {\n\t\t\tvar env = {\n\t\t\t\tcode: text,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tlanguage: language\n\t\t\t};\n\t\t\t_.hooks.run('before-tokenize', env);\n\t\t\tif (!env.grammar) {\n\t\t\t\tthrow new Error('The language \"' + env.language + '\" has no grammar.');\n\t\t\t}\n\t\t\tenv.tokens = _.tokenize(env.code, env.grammar);\n\t\t\t_.hooks.run('after-tokenize', env);\n\t\t\treturn Token.stringify(_.util.encode(env.tokens), env.language);\n\t\t},\n\n\t\t/**\n\t\t * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns an array with the tokenized code.\n\t\t *\n\t\t * When the language definition includes nested tokens, the function is called recursively on each of these tokens.\n\t\t *\n\t\t * This method could be useful in other contexts as well, as a very crude parser.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @returns {TokenStream} An array of strings and tokens, a token stream.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * let code = `var foo = 0;`;\n\t\t * let tokens = Prism.tokenize(code, Prism.languages.javascript);\n\t\t * tokens.forEach(token => {\n\t\t * if (token instanceof Prism.Token && token.type === 'number') {\n\t\t * console.log(`Found numeric literal: ${token.content}`);\n\t\t * }\n\t\t * });\n\t\t */\n\t\ttokenize: function (text, grammar) {\n\t\t\tvar rest = grammar.rest;\n\t\t\tif (rest) {\n\t\t\t\tfor (var token in rest) {\n\t\t\t\t\tgrammar[token] = rest[token];\n\t\t\t\t}\n\n\t\t\t\tdelete grammar.rest;\n\t\t\t}\n\n\t\t\tvar tokenList = new LinkedList();\n\t\t\taddAfter(tokenList, tokenList.head, text);\n\n\t\t\tmatchGrammar(text, tokenList, grammar, tokenList.head, 0);\n\n\t\t\treturn toArray(tokenList);\n\t\t},\n\n\t\t/**\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thooks: {\n\t\t\tall: {},\n\n\t\t\t/**\n\t\t\t * Adds the given callback to the list of callbacks for the given hook.\n\t\t\t *\n\t\t\t * The callback will be invoked when the hook it is registered for is run.\n\t\t\t * Hooks are usually directly run by a highlight function but you can also run hooks yourself.\n\t\t\t *\n\t\t\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {HookCallback} callback The callback function which is given environment variables.\n\t\t\t * @public\n\t\t\t */\n\t\t\tadd: function (name, callback) {\n\t\t\t\tvar hooks = _.hooks.all;\n\n\t\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\t\thooks[name].push(callback);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t\t\t *\n\t\t\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.\n\t\t\t * @public\n\t\t\t */\n\t\t\trun: function (name, env) {\n\t\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0, callback; (callback = callbacks[i++]);) {\n\t\t\t\t\tcallback(env);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tToken: Token\n\t};\n\t_self.Prism = _;\n\n\n\t// Typescript note:\n\t// The following can be used to import the Token type in JSDoc:\n\t//\n\t// @typedef {InstanceType<import(\"./prism-core\")[\"Token\"]>} Token\n\n\t/**\n\t * Creates a new token.\n\t *\n\t * @param {string} type See {@link Token#type type}\n\t * @param {string | TokenStream} content See {@link Token#content content}\n\t * @param {string|string[]} [alias] The alias(es) of the token.\n\t * @param {string} [matchedStr=\"\"] A copy of the full string this token was created from.\n\t * @class\n\t * @global\n\t * @public\n\t */\n\tfunction Token(type, content, alias, matchedStr) {\n\t\t/**\n\t\t * The type of the token.\n\t\t *\n\t\t * This is usually the key of a pattern in a {@link Grammar}.\n\t\t *\n\t\t * @type {string}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.type = type;\n\t\t/**\n\t\t * The strings or tokens contained by this token.\n\t\t *\n\t\t * This will be a token stream if the pattern matched also defined an `inside` grammar.\n\t\t *\n\t\t * @type {string | TokenStream}\n\t\t * @public\n\t\t */\n\t\tthis.content = content;\n\t\t/**\n\t\t * The alias(es) of the token.\n\t\t *\n\t\t * @type {string|string[]}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.alias = alias;\n\t\t// Copy of the full string this token was created from\n\t\tthis.length = (matchedStr || '').length | 0;\n\t}\n\n\t/**\n\t * A token stream is an array of strings and {@link Token Token} objects.\n\t *\n\t * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process\n\t * them.\n\t *\n\t * 1. No adjacent strings.\n\t * 2. No empty strings.\n\t *\n\t * The only exception here is the token stream that only contains the empty string and nothing else.\n\t *\n\t * @typedef {Array<string | Token>} TokenStream\n\t * @global\n\t * @public\n\t */\n\n\t/**\n\t * Converts the given token or token stream to an HTML representation.\n\t *\n\t * The following hooks will be run:\n\t * 1. `wrap`: On each {@link Token}.\n\t *\n\t * @param {string | Token | TokenStream} o The token or token stream to be converted.\n\t * @param {string} language The name of current language.\n\t * @returns {string} The HTML representation of the token or token stream.\n\t * @memberof Token\n\t * @static\n\t */\n\tToken.stringify = function stringify(o, language) {\n\t\tif (typeof o == 'string') {\n\t\t\treturn o;\n\t\t}\n\t\tif (Array.isArray(o)) {\n\t\t\tvar s = '';\n\t\t\to.forEach(function (e) {\n\t\t\t\ts += stringify(e, language);\n\t\t\t});\n\t\t\treturn s;\n\t\t}\n\n\t\tvar env = {\n\t\t\ttype: o.type,\n\t\t\tcontent: stringify(o.content, language),\n\t\t\ttag: 'span',\n\t\t\tclasses: ['token', o.type],\n\t\t\tattributes: {},\n\t\t\tlanguage: language\n\t\t};\n\n\t\tvar aliases = o.alias;\n\t\tif (aliases) {\n\t\t\tif (Array.isArray(aliases)) {\n\t\t\t\tArray.prototype.push.apply(env.classes, aliases);\n\t\t\t} else {\n\t\t\t\tenv.classes.push(aliases);\n\t\t\t}\n\t\t}\n\n\t\t_.hooks.run('wrap', env);\n\n\t\tvar attributes = '';\n\t\tfor (var name in env.attributes) {\n\t\t\tattributes += ' ' + name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n\t\t}\n\n\t\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + attributes + '>' + env.content + '</' + env.tag + '>';\n\t};\n\n\t/**\n\t * @param {RegExp} pattern\n\t * @param {number} pos\n\t * @param {string} text\n\t * @param {boolean} lookbehind\n\t * @returns {RegExpExecArray | null}\n\t */\n\tfunction matchPattern(pattern, pos, text, lookbehind) {\n\t\tpattern.lastIndex = pos;\n\t\tvar match = pattern.exec(text);\n\t\tif (match && lookbehind && match[1]) {\n\t\t\t// change the match to remove the text matched by the Prism lookbehind group\n\t\t\tvar lookbehindLength = match[1].length;\n\t\t\tmatch.index += lookbehindLength;\n\t\t\tmatch[0] = match[0].slice(lookbehindLength);\n\t\t}\n\t\treturn match;\n\t}\n\n\t/**\n\t * @param {string} text\n\t * @param {LinkedList<string | Token>} tokenList\n\t * @param {any} grammar\n\t * @param {LinkedListNode<string | Token>} startNode\n\t * @param {number} startPos\n\t * @param {RematchOptions} [rematch]\n\t * @returns {void}\n\t * @private\n\t *\n\t * @typedef RematchOptions\n\t * @property {string} cause\n\t * @property {number} reach\n\t */\n\tfunction matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {\n\t\tfor (var token in grammar) {\n\t\t\tif (!grammar.hasOwnProperty(token) || !grammar[token]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar patterns = grammar[token];\n\t\t\tpatterns = Array.isArray(patterns) ? patterns : [patterns];\n\n\t\t\tfor (var j = 0; j < patterns.length; ++j) {\n\t\t\t\tif (rematch && rematch.cause == token + ',' + j) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar patternObj = patterns[j];\n\t\t\t\tvar inside = patternObj.inside;\n\t\t\t\tvar lookbehind = !!patternObj.lookbehind;\n\t\t\t\tvar greedy = !!patternObj.greedy;\n\t\t\t\tvar alias = patternObj.alias;\n\n\t\t\t\tif (greedy && !patternObj.pattern.global) {\n\t\t\t\t\t// Without the global flag, lastIndex won't work\n\t\t\t\t\tvar flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];\n\t\t\t\t\tpatternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');\n\t\t\t\t}\n\n\t\t\t\t/** @type {RegExp} */\n\t\t\t\tvar pattern = patternObj.pattern || patternObj;\n\n\t\t\t\tfor ( // iterate the token list and keep track of the current token/string position\n\t\t\t\t\tvar currentNode = startNode.next, pos = startPos;\n\t\t\t\t\tcurrentNode !== tokenList.tail;\n\t\t\t\t\tpos += currentNode.value.length, currentNode = currentNode.next\n\t\t\t\t) {\n\n\t\t\t\t\tif (rematch && pos >= rematch.reach) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar str = currentNode.value;\n\n\t\t\t\t\tif (tokenList.length > text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeCount = 1; // this is the to parameter of removeBetween\n\t\t\t\t\tvar match;\n\n\t\t\t\t\tif (greedy) {\n\t\t\t\t\t\tmatch = matchPattern(pattern, pos, text, lookbehind);\n\t\t\t\t\t\tif (!match || match.index >= text.length) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index;\n\t\t\t\t\t\tvar to = match.index + match[0].length;\n\t\t\t\t\t\tvar p = pos;\n\n\t\t\t\t\t\t// find the node that contains the match\n\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\twhile (from >= p) {\n\t\t\t\t\t\t\tcurrentNode = currentNode.next;\n\t\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// adjust pos (and p)\n\t\t\t\t\t\tp -= currentNode.value.length;\n\t\t\t\t\t\tpos = p;\n\n\t\t\t\t\t\t// the current node is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\tif (currentNode.value instanceof Token) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find the last node which is affected by this match\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tvar k = currentNode;\n\t\t\t\t\t\t\tk !== tokenList.tail && (p < to || typeof k.value === 'string');\n\t\t\t\t\t\t\tk = k.next\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tremoveCount++;\n\t\t\t\t\t\t\tp += k.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremoveCount--;\n\n\t\t\t\t\t\t// replace with the new match\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatch = matchPattern(pattern, 0, str, lookbehind);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line no-redeclare\n\t\t\t\t\tvar from = match.index;\n\t\t\t\t\tvar matchStr = match[0];\n\t\t\t\t\tvar before = str.slice(0, from);\n\t\t\t\t\tvar after = str.slice(from + matchStr.length);\n\n\t\t\t\t\tvar reach = pos + str.length;\n\t\t\t\t\tif (rematch && reach > rematch.reach) {\n\t\t\t\t\t\trematch.reach = reach;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeFrom = currentNode.prev;\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\tremoveFrom = addAfter(tokenList, removeFrom, before);\n\t\t\t\t\t\tpos += before.length;\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveRange(tokenList, removeFrom, removeCount);\n\n\t\t\t\t\tvar wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);\n\t\t\t\t\tcurrentNode = addAfter(tokenList, removeFrom, wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\taddAfter(tokenList, currentNode, after);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (removeCount > 1) {\n\t\t\t\t\t\t// at least one Token object was removed, so we have to do some rematching\n\t\t\t\t\t\t// this can only happen if the current pattern is greedy\n\n\t\t\t\t\t\t/** @type {RematchOptions} */\n\t\t\t\t\t\tvar nestedRematch = {\n\t\t\t\t\t\t\tcause: token + ',' + j,\n\t\t\t\t\t\t\treach: reach\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmatchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);\n\n\t\t\t\t\t\t// the reach might have been extended because of the rematching\n\t\t\t\t\t\tif (rematch && nestedRematch.reach > rematch.reach) {\n\t\t\t\t\t\t\trematch.reach = nestedRematch.reach;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @typedef LinkedListNode\n\t * @property {T} value\n\t * @property {LinkedListNode<T> | null} prev The previous node.\n\t * @property {LinkedListNode<T> | null} next The next node.\n\t * @template T\n\t * @private\n\t */\n\n\t/**\n\t * @template T\n\t * @private\n\t */\n\tfunction LinkedList() {\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar head = { value: null, prev: null, next: null };\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar tail = { value: null, prev: head, next: null };\n\t\thead.next = tail;\n\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.head = head;\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.tail = tail;\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * Adds a new node with the given value to the list.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {T} value\n\t * @returns {LinkedListNode<T>} The added node.\n\t * @template T\n\t */\n\tfunction addAfter(list, node, value) {\n\t\t// assumes that node != list.tail && values.length >= 0\n\t\tvar next = node.next;\n\n\t\tvar newNode = { value: value, prev: node, next: next };\n\t\tnode.next = newNode;\n\t\tnext.prev = newNode;\n\t\tlist.length++;\n\n\t\treturn newNode;\n\t}\n\t/**\n\t * Removes `count` nodes after the given node. The given node will not be removed.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {number} count\n\t * @template T\n\t */\n\tfunction removeRange(list, node, count) {\n\t\tvar next = node.next;\n\t\tfor (var i = 0; i < count && next !== list.tail; i++) {\n\t\t\tnext = next.next;\n\t\t}\n\t\tnode.next = next;\n\t\tnext.prev = node;\n\t\tlist.length -= i;\n\t}\n\t/**\n\t * @param {LinkedList<T>} list\n\t * @returns {T[]}\n\t * @template T\n\t */\n\tfunction toArray(list) {\n\t\tvar array = [];\n\t\tvar node = list.head.next;\n\t\twhile (node !== list.tail) {\n\t\t\tarray.push(node.value);\n\t\t\tnode = node.next;\n\t\t}\n\t\treturn array;\n\t}\n\n\n\tif (!_self.document) {\n\t\tif (!_self.addEventListener) {\n\t\t\t// in Node.js\n\t\t\treturn _;\n\t\t}\n\n\t\tif (!_.disableWorkerMessageHandler) {\n\t\t\t// In worker\n\t\t\t_self.addEventListener('message', function (evt) {\n\t\t\t\tvar message = JSON.parse(evt.data);\n\t\t\t\tvar lang = message.language;\n\t\t\t\tvar code = message.code;\n\t\t\t\tvar immediateClose = message.immediateClose;\n\n\t\t\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\t\t\tif (immediateClose) {\n\t\t\t\t\t_self.close();\n\t\t\t\t}\n\t\t\t}, false);\n\t\t}\n\n\t\treturn _;\n\t}\n\n\t// Get current script and highlight\n\tvar script = _.util.currentScript();\n\n\tif (script) {\n\t\t_.filename = script.src;\n\n\t\tif (script.hasAttribute('data-manual')) {\n\t\t\t_.manual = true;\n\t\t}\n\t}\n\n\tfunction highlightAutomaticallyCallback() {\n\t\tif (!_.manual) {\n\t\t\t_.highlightAll();\n\t\t}\n\t}\n\n\tif (!_.manual) {\n\t\t// If the document state is \"loading\", then we'll use DOMContentLoaded.\n\t\t// If the document state is \"interactive\" and the prism.js script is deferred, then we'll also use the\n\t\t// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they\n\t\t// might take longer one animation frame to execute which can create a race condition where only some plugins have\n\t\t// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.\n\t\t// See https://github.com/PrismJS/prism/issues/2102\n\t\tvar readyState = document.readyState;\n\t\tif (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {\n\t\t\tdocument.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);\n\t\t} else {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(highlightAutomaticallyCallback);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(highlightAutomaticallyCallback, 16);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn _;\n\n}(_self));\n\nif (typeof module !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof global !== 'undefined') {\n\tglobal.Prism = Prism;\n}\n\n// some additional documentation/types\n\n/**\n * The expansion of a simple `RegExp` literal to support additional properties.\n *\n * @typedef GrammarToken\n * @property {RegExp} pattern The regular expression of the token.\n * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)\n * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.\n * @property {boolean} [greedy=false] Whether the token is greedy.\n * @property {string|string[]} [alias] An optional alias or list of aliases.\n * @property {Grammar} [inside] The nested grammar of this token.\n *\n * The `inside` grammar will be used to tokenize the text value of each token of this kind.\n *\n * This can be used to make nested and even recursive language definitions.\n *\n * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into\n * each another.\n * @global\n * @public\n */\n\n/**\n * @typedef Grammar\n * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}\n * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.\n * @global\n * @public\n */\n\n/**\n * A function which will invoked after an element was successfully highlighted.\n *\n * @callback HighlightCallback\n * @param {Element} element The element successfully highlighted.\n * @returns {void}\n * @global\n * @public\n */\n\n/**\n * @callback HookCallback\n * @param {Object<string, any>} env The environment variables of the hook.\n * @returns {void}\n * @global\n * @public\n */\n\n\n/* **********************************************\n Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': {\n\t\tpattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/,\n\t\tgreedy: true\n\t},\n\t'prolog': {\n\t\tpattern: /<\\?[\\s\\S]+?\\?>/,\n\t\tgreedy: true\n\t},\n\t'doctype': {\n\t\t// https://www.w3.org/TR/xml/#NT-doctypedecl\n\t\tpattern: /<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'internal-subset': {\n\t\t\t\tpattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: null // see below\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\tgreedy: true\n\t\t\t},\n\t\t\t'punctuation': /^<!|>$|[[\\]]/,\n\t\t\t'doctype-tag': /^DOCTYPE/i,\n\t\t\t'name': /[^\\s<>'\"]+/\n\t\t}\n\t},\n\t'cdata': {\n\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\tgreedy: true\n\t},\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'special-attr': [],\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': [\n\t\t{\n\t\t\tpattern: /&[\\da-z]{1,8};/i,\n\t\t\talias: 'named-entity'\n\t\t},\n\t\t/&#x?[\\da-f]{1,8};/i\n\t]\n};\n\nPrism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n\tPrism.languages.markup['entity'];\nPrism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function (env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t}\n});\n\nObject.defineProperty(Prism.languages.markup.tag, 'addInlined', {\n\t/**\n\t * Adds an inlined language to markup.\n\t *\n\t * An example of an inlined language is CSS with `<style>` tags.\n\t *\n\t * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addInlined('style', 'css');\n\t */\n\tvalue: function addInlined(tagName, lang) {\n\t\tvar includedCdataInside = {};\n\t\tincludedCdataInside['language-' + lang] = {\n\t\t\tpattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\t\tincludedCdataInside['cdata'] = /^<!\\[CDATA\\[|\\]\\]>$/i;\n\n\t\tvar inside = {\n\t\t\t'included-cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tinside: includedCdataInside\n\t\t\t}\n\t\t};\n\t\tinside['language-' + lang] = {\n\t\t\tpattern: /[\\s\\S]+/,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\n\t\tvar def = {};\n\t\tdef[tagName] = {\n\t\t\tpattern: RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: inside\n\t\t};\n\n\t\tPrism.languages.insertBefore('markup', 'cdata', def);\n\t}\n});\nObject.defineProperty(Prism.languages.markup.tag, 'addAttribute', {\n\t/**\n\t * Adds an pattern to highlight languages embedded in HTML attributes.\n\t *\n\t * An example of an inlined language is CSS with `style` attributes.\n\t *\n\t * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addAttribute('style', 'css');\n\t */\n\tvalue: function (attrName, lang) {\n\t\tPrism.languages.markup.tag.inside['special-attr'].push({\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|[\"'\\s])/.source + '(?:' + attrName + ')' + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'attr-name': /^[^\\s=]+/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'value': {\n\t\t\t\t\t\t\tpattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: [lang, 'language-' + lang],\n\t\t\t\t\t\t\tinside: Prism.languages[lang]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/\"|'/\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\nPrism.languages.xml = Prism.languages.extend('markup', {});\nPrism.languages.ssml = Prism.languages.xml;\nPrism.languages.atom = Prism.languages.xml;\nPrism.languages.rss = Prism.languages.xml;\n\n\n/* **********************************************\n Begin prism-css.js\n********************************************** */\n\n(function (Prism) {\n\n\tvar string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\tPrism.languages.css = {\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'atrule': {\n\t\t\tpattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n\t\t\tinside: {\n\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t'selector-function-argument': {\n\t\t\t\t\tpattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector'\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t\t// See rest below\n\t\t\t}\n\t\t},\n\t\t'url': {\n\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\tpattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^url/i,\n\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\talias: 'url'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'selector': {\n\t\t\tpattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': {\n\t\t\tpattern: string,\n\t\t\tgreedy: true\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'important': /!important\\b/i,\n\t\t'function': {\n\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'punctuation': /[(){};:,]/\n\t};\n\n\tPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\n\tvar markup = Prism.languages.markup;\n\tif (markup) {\n\t\tmarkup.tag.addInlined('style', 'css');\n\t\tmarkup.tag.addAttribute('style', 'css');\n\t}\n\n}(Prism));\n\n\n/* **********************************************\n Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\t'punctuation': /[.\\\\]/\n\t\t}\n\t},\n\t'keyword': /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n\t'boolean': /\\b(?:false|true)\\b/,\n\t'function': /\\b\\w+(?=\\()/,\n\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'number': {\n\t\tpattern: RegExp(\n\t\t\t/(^|[^\\w$])/.source +\n\t\t\t'(?:' +\n\t\t\t(\n\t\t\t\t// constant\n\t\t\t\t/NaN|Infinity/.source +\n\t\t\t\t'|' +\n\t\t\t\t// binary integer\n\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// octal integer\n\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// hexadecimal integer\n\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal bigint\n\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source\n\t\t\t) +\n\t\t\t')' +\n\t\t\t/(?![\\w$])/.source\n\t\t),\n\t\tlookbehind: true\n\t},\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: RegExp(\n\t\t\t// lookbehind\n\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t// Regex pattern:\n\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t/\\//.source +\n\t\t\t'(?:' +\n\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source +\n\t\t\t'|' +\n\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +\n\t\t\t')' +\n\t\t\t// lookahead\n\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'regex-source': {\n\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-regex',\n\t\t\t\tinside: Prism.languages.regex\n\t\t\t},\n\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t}\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'hashbang': {\n\t\tpattern: /^#!.*/,\n\t\tgreedy: true,\n\t\talias: 'comment'\n\t},\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'string-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'property'\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'operator', {\n\t'literal-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\talias: 'property'\n\t},\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n\n\t// add attribute support for all DOM events.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\tPrism.languages.markup.tag.addAttribute(\n\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n\t\t'javascript'\n\t);\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n\n/* **********************************************\n Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill\n\tif (!Element.prototype.matches) {\n\t\tElement.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\t}\n\n\tvar LOADING_MESSAGE = 'Loading…';\n\tvar FAILURE_MESSAGE = function (status, message) {\n\t\treturn '✖ Error ' + status + ' while fetching file: ' + message;\n\t};\n\tvar FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';\n\n\tvar EXTENSIONS = {\n\t\t'js': 'javascript',\n\t\t'py': 'python',\n\t\t'rb': 'ruby',\n\t\t'ps1': 'powershell',\n\t\t'psm1': 'powershell',\n\t\t'sh': 'bash',\n\t\t'bat': 'batch',\n\t\t'h': 'c',\n\t\t'tex': 'latex'\n\t};\n\n\tvar STATUS_ATTR = 'data-src-status';\n\tvar STATUS_LOADING = 'loading';\n\tvar STATUS_LOADED = 'loaded';\n\tvar STATUS_FAILED = 'failed';\n\n\tvar SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '=\"' + STATUS_LOADED + '\"])'\n\t\t+ ':not([' + STATUS_ATTR + '=\"' + STATUS_LOADING + '\"])';\n\n\t/**\n\t * Loads the given file.\n\t *\n\t * @param {string} src The URL or path of the source file to load.\n\t * @param {(result: string) => void} success\n\t * @param {(reason: string) => void} error\n\t */\n\tfunction loadFile(src, success, error) {\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('GET', src, true);\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState == 4) {\n\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\tsuccess(xhr.responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (xhr.status >= 400) {\n\t\t\t\t\t\terror(FAILURE_MESSAGE(xhr.status, xhr.statusText));\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror(FAILURE_EMPTY_MESSAGE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\t/**\n\t * Parses the given range.\n\t *\n\t * This returns a range with inclusive ends.\n\t *\n\t * @param {string | null | undefined} range\n\t * @returns {[number, number | undefined] | undefined}\n\t */\n\tfunction parseRange(range) {\n\t\tvar m = /^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(range || '');\n\t\tif (m) {\n\t\t\tvar start = Number(m[1]);\n\t\t\tvar comma = m[2];\n\t\t\tvar end = m[3];\n\n\t\t\tif (!comma) {\n\t\t\t\treturn [start, start];\n\t\t\t}\n\t\t\tif (!end) {\n\t\t\t\treturn [start, undefined];\n\t\t\t}\n\t\t\treturn [start, Number(end)];\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tPrism.hooks.add('before-highlightall', function (env) {\n\t\tenv.selector += ', ' + SELECTOR;\n\t});\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tvar pre = /** @type {HTMLPreElement} */ (env.element);\n\t\tif (pre.matches(SELECTOR)) {\n\t\t\tenv.code = ''; // fast-path the whole thing and go to complete\n\n\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading\n\n\t\t\t// add code element with loading message\n\t\t\tvar code = pre.appendChild(document.createElement('CODE'));\n\t\t\tcode.textContent = LOADING_MESSAGE;\n\n\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\tvar language = env.language;\n\t\t\tif (language === 'none') {\n\t\t\t\t// the language might be 'none' because there is no language set;\n\t\t\t\t// in this case, we want to use the extension as the language\n\t\t\t\tvar extension = (/\\.(\\w+)$/.exec(src) || [, 'none'])[1];\n\t\t\t\tlanguage = EXTENSIONS[extension] || extension;\n\t\t\t}\n\n\t\t\t// set language classes\n\t\t\tPrism.util.setLanguage(code, language);\n\t\t\tPrism.util.setLanguage(pre, language);\n\n\t\t\t// preload the language\n\t\t\tvar autoloader = Prism.plugins.autoloader;\n\t\t\tif (autoloader) {\n\t\t\t\tautoloader.loadLanguages(language);\n\t\t\t}\n\n\t\t\t// load file\n\t\t\tloadFile(\n\t\t\t\tsrc,\n\t\t\t\tfunction (text) {\n\t\t\t\t\t// mark as loaded\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADED);\n\n\t\t\t\t\t// handle data-range\n\t\t\t\t\tvar range = parseRange(pre.getAttribute('data-range'));\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tvar lines = text.split(/\\r\\n?|\\n/g);\n\n\t\t\t\t\t\t// the range is one-based and inclusive on both ends\n\t\t\t\t\t\tvar start = range[0];\n\t\t\t\t\t\tvar end = range[1] == null ? lines.length : range[1];\n\n\t\t\t\t\t\tif (start < 0) { start += lines.length; }\n\t\t\t\t\t\tstart = Math.max(0, Math.min(start - 1, lines.length));\n\t\t\t\t\t\tif (end < 0) { end += lines.length; }\n\t\t\t\t\t\tend = Math.max(0, Math.min(end, lines.length));\n\n\t\t\t\t\t\ttext = lines.slice(start, end).join('\\n');\n\n\t\t\t\t\t\t// add data-start for line numbers\n\t\t\t\t\t\tif (!pre.hasAttribute('data-start')) {\n\t\t\t\t\t\t\tpre.setAttribute('data-start', String(start + 1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// highlight code\n\t\t\t\t\tcode.textContent = text;\n\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t},\n\t\t\t\tfunction (error) {\n\t\t\t\t\t// mark as failed\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\tcode.textContent = error;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\n\tPrism.plugins.fileHighlight = {\n\t\t/**\n\t\t * Executes the File Highlight plugin for all matching `pre` elements under the given container.\n\t\t *\n\t\t * Note: Elements which are already loaded or currently loading will not be touched by this method.\n\t\t *\n\t\t * @param {ParentNode} [container=document]\n\t\t */\n\t\thighlight: function highlight(container) {\n\t\t\tvar elements = (container || document).querySelectorAll(SELECTOR);\n\n\t\t\tfor (var i = 0, element; (element = elements[i++]);) {\n\t\t\t\tPrism.highlightElement(element);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar logged = false;\n\t/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */\n\tPrism.fileHighlight = function () {\n\t\tif (!logged) {\n\t\t\tconsole.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');\n\t\t\tlogged = true;\n\t\t}\n\t\tPrism.plugins.fileHighlight.highlight.apply(this, arguments);\n\t};\n\n}());\n","import Prism from \"prismjs\";\nif (typeof globalThis !== \"undefined\") globalThis.Prism = Prism;\n","import {\n Button,\n ComboBox,\n Input,\n ListBox,\n ListBoxItem,\n Popover,\n} from \"react-aria-components\";\nimport { IconCaretDownFilled } from \"@tabler/icons-react\";\nimport { useState, useRef, useEffect } from \"react\";\nimport { OFFSCREEN_POSITION } from \"../InlineToolbar/utils\";\nimport { computeCodeMenuPosition } from \"../InlineToolbar/utils\";\nimport { getCodeLanguages, getLanguageFriendlyName } from \"@lexical/code\";\nimport \"./styles.css\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $getNodeByKey } from \"lexical\";\nimport { SET_CODE_LANGUAGE_COMMAND } from \"../../Plugins/CodePlugin\";\n\nexport function CodeMenu({ codeBlockCoords, codeNodeKey }) {\n const [editor] = useLexicalComposerContext();\n const [codeMenuPosition, setCodeMenuPosition] = useState({\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n });\n const codeMenuRef = useRef(null);\n const [language, setLanguage] = useState(\"\");\n\n // Get the available code languages\n const codeLanguages = getCodeLanguages();\n\n // Create a unique set of friendly language names\n const friendlyLanguages = Array.from(\n new Set(codeLanguages.map((lang) => getLanguageFriendlyName(lang)))\n );\n\n // Create a reverse dictionary for friendly languages\n const friendlyToOriginal = {};\n codeLanguages.forEach((lang) => {\n const friendly = getLanguageFriendlyName(lang);\n if (!friendlyToOriginal[friendly]) {\n friendlyToOriginal[friendly] = lang;\n }\n });\n\n // Update toolbar position when selection changes\n useEffect(() => {\n setCodeMenuPosition(computeCodeMenuPosition(codeBlockCoords, codeMenuRef));\n }, [codeBlockCoords]);\n\n // Set the current language of the code block\n useEffect(() => {\n editor.read(() => {\n if (codeNodeKey) {\n const codeNode = $getNodeByKey(codeNodeKey);\n const currentLanguage = codeNode.getLanguage();\n setLanguage(getLanguageFriendlyName(currentLanguage));\n }\n });\n }, [editor, codeNodeKey]);\n\n return (\n <ComboBox\n id=\"code-highlight-menu\"\n ref={codeMenuRef}\n style={{\n position: \"absolute\",\n top: codeMenuPosition.y,\n left: codeMenuPosition.x,\n }}\n aria-label=\"Code menu\"\n inputValue={language}\n onInputChange={(friendlyValue) => {\n const originalValue = friendlyToOriginal[friendlyValue];\n editor.dispatchCommand(SET_CODE_LANGUAGE_COMMAND, [\n codeNodeKey,\n originalValue,\n ]);\n setLanguage(friendlyValue);\n }}\n >\n <div>\n <Input />\n <Button>\n <IconCaretDownFilled size={24} />\n </Button>\n </div>\n <Popover>\n <ListBox>\n {friendlyLanguages.map((friendly, index) => (\n <ListBoxItem key={index}>{friendly}</ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </ComboBox>\n );\n}\n","import \"../prismSetup\";\nimport {\n $createCodeNode,\n $isCodeNode,\n registerCodeHighlighting,\n} from \"@lexical/code\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getPreviousSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n createCommand,\n $getSelection,\n SELECTION_CHANGE_COMMAND,\n BLUR_COMMAND,\n $getNodeByKey,\n KEY_BACKSPACE_COMMAND,\n TextNode,\n $isLineBreakNode,\n $isParagraphNode,\n} from \"lexical\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { getSelectedNode } from \"./TextFormatPlugin\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { CodeMenu } from \"../components/CodeHighlightMenu/CodeMenu\";\n\nconst DOM_ELEMENT = document.body;\n\nexport const INSERT_CODE_BLOCK_COMMAND = createCommand(\n \"INSERT_CODE_BLOCK_COMMAND\"\n);\nexport const SET_CODE_LANGUAGE_COMMAND = createCommand(\n \"SET_CODE_LANGUAGE_COMMAND\"\n);\n\nfunction CodeHighlightMenuPlugin() {\n const [codeBlockCoords, setCodeBlockCoords] = useState(null);\n const [codeNodeKey, setCodeNodeKey] = useState(null);\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const [isCodeMenuFocused, setIsCodeMenuFocused] = useState(false);\n const [editor] = useLexicalComposerContext();\n\n const hideCodeMenu = useCallback(() => {\n setCodeBlockCoords(null);\n setCodeNodeKey(null);\n }, []);\n\n const isFocusInCodeMenu = useCallback(() => {\n const codeMenu = document.getElementById(\"code-highlight-menu\");\n const activeElement = document.activeElement;\n\n return !!(\n codeMenu &&\n activeElement &&\n (codeMenu === activeElement || codeMenu.contains(activeElement))\n );\n }, []);\n\n const syncMenuFocusState = useCallback(() => {\n const menuFocused = isFocusInCodeMenu();\n setIsCodeMenuFocused(menuFocused);\n return menuFocused;\n }, [isFocusInCodeMenu]);\n\n const handleEditorBlur = useCallback(() => {\n const menuFocused = syncMenuFocusState();\n setIsEditorFocused(false);\n\n if (!menuFocused) {\n hideCodeMenu();\n }\n }, [hideCodeMenu, syncMenuFocusState]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const menuFocused = syncMenuFocusState();\n\n const rootElement = editor.getRootElement();\n if (rootElement) {\n const hasFocus =\n rootElement === document.activeElement ||\n rootElement.contains(document.activeElement);\n\n setIsEditorFocused((prev) => (prev === hasFocus ? prev : hasFocus));\n }\n\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection)) {\n if (!menuFocused) {\n hideCodeMenu();\n }\n return false;\n }\n\n const node = getSelectedNode(selection);\n const codeNode = $findMatchingParent(node, $isCodeNode);\n if (codeNode) {\n // update selection coordinates when selection changes and the condition is met\n const DOMElement = editor.getElementByKey(codeNode.getKey());\n const boundingRect = DOMElement.getBoundingClientRect();\n\n // Use top-right coordinates\n const X = boundingRect.right;\n const Y = boundingRect.top + window.scrollY;\n\n setCodeBlockCoords({ x: X, y: Y });\n setCodeNodeKey(codeNode.getKey());\n } else {\n if (!menuFocused) {\n hideCodeMenu();\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor, syncMenuFocusState, hideCodeMenu]);\n\n useEffect(() => {\n return editor.registerCommand(\n BLUR_COMMAND,\n () => {\n setTimeout(handleEditorBlur, 0);\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor, handleEditorBlur]);\n\n useEffect(() => {\n const handleFocus = () => {\n setIsEditorFocused(true);\n setIsCodeMenuFocused(false);\n };\n\n const handleBlur = () => setTimeout(handleEditorBlur, 0);\n\n return editor.registerRootListener((rootElement, prevRootElement) => {\n if (rootElement) {\n rootElement.addEventListener(\"focus\", handleFocus);\n rootElement.addEventListener(\"blur\", handleBlur);\n }\n\n if (prevRootElement) {\n prevRootElement.removeEventListener(\"focus\", handleFocus);\n prevRootElement.removeEventListener(\"blur\", handleBlur);\n }\n });\n }, [editor, handleEditorBlur]);\n\n return (\n codeBlockCoords &&\n (isEditorFocused || isCodeMenuFocused) &&\n createPortal(\n <CodeMenu codeBlockCoords={codeBlockCoords} codeNodeKey={codeNodeKey} />,\n DOM_ELEMENT\n )\n );\n}\n\nfunction CodeBlockPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return registerCodeHighlighting(editor);\n }, [editor]);\n\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!node.isSimpleText()) {\n return;\n }\n\n const text = node.getTextContent();\n\n // Check for Code Block Trigger: \"``` \" at start of line/paragraph\n if (text.startsWith(\"``` \")) {\n const prevSibling = node.getPreviousSibling();\n const parentNode = $findMatchingParent(node, $isParagraphNode);\n const isStartOfParagraph =\n parentNode !== null && parentNode.getChildrenSize() === 1;\n const isAfterLineBreak = $isLineBreakNode(prevSibling);\n\n if (isStartOfParagraph || isAfterLineBreak) {\n // If there is more text after \"``` \", don't do anything\n if (text.length > 4) {\n return;\n }\n\n // Create the new code block\n const codeNode = $createCodeNode();\n\n // Replace \"``` \" with the code block\n node.replace(codeNode);\n\n // Select the code block\n codeNode.select();\n\n // Check if the next sibling is a LineBreakNode and remove it\n const nextSibling = codeNode.getNextSibling();\n if ($isLineBreakNode(nextSibling)) {\n nextSibling.remove();\n }\n\n return;\n }\n }\n });\n\n return removeTransform;\n }, [editor]);\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n INSERT_CODE_BLOCK_COMMAND,\n () => {\n const prevSelection = $getPreviousSelection();\n if ($isRangeSelection(prevSelection)) {\n const codeBlockNode = $createCodeNode();\n prevSelection.insertNodes([codeBlockNode]);\n codeBlockNode.selectStart();\n\n // Bring the focus back to the editor\n setTimeout(() => {\n editor.focus();\n }, 0);\n\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n SET_CODE_LANGUAGE_COMMAND,\n (payload) => {\n const [nodeKey, language] = payload;\n const codeNode = $getNodeByKey(nodeKey);\n if ($isCodeNode(codeNode)) {\n codeNode.setLanguage(language);\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n KEY_BACKSPACE_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const node = selection.anchor.getNode();\n const codeNode = $findMatchingParent(node, $isCodeNode);\n\n if (codeNode) {\n // Check if we are at the beginning of the code block\n if (selection.anchor.offset === 0) {\n // Check if code block is empty (only has empty text node or line break)\n const textContent = codeNode.getTextContent();\n if (textContent === \"\") {\n codeNode.remove();\n return true;\n }\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n return null;\n}\n\nexport function CodePlugin() {\n return (\n <>\n <CodeBlockPlugin />\n <CodeHighlightMenuPlugin />\n </>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n COMMAND_PRIORITY_HIGH,\n createCommand,\n $getPreviousSelection,\n $isRangeSelection,\n $createParagraphNode,\n} from \"lexical\";\nimport { useEffect } from \"react\";\nimport {\n $createHorizontalDividerNode,\n HorizontalDividerNode,\n} from \"../nodes/HorizontalDividerNode\";\n\nexport const INSERT_HORIZONTAL_DIVIDER_COMMAND = createCommand(\n \"INSERT_HORIZONTAL_DIVIDER_COMMAND\"\n);\n\nexport function HorizontalDividerPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([HorizontalDividerNode])) {\n throw new Error(\"HorizontalDividerNode not registered on editor\");\n }\n\n const unregisterCommand = editor.registerCommand(\n INSERT_HORIZONTAL_DIVIDER_COMMAND,\n () => {\n const prevSelection = $getPreviousSelection();\n\n if ($isRangeSelection(prevSelection)) {\n const horizontalDividerNode = $createHorizontalDividerNode();\n prevSelection.insertNodes([horizontalDividerNode]);\n\n // Move the selection to the next line after the divider\n let nextNode =\n horizontalDividerNode.getNextSibling() ||\n horizontalDividerNode.getParent().getNextSibling();\n\n if (!nextNode) {\n nextNode = $createParagraphNode();\n horizontalDividerNode.insertAfter(nextNode);\n }\n nextNode.selectStart();\n\n // Bring the focus back to the editor\n setTimeout(() => {\n editor.focus();\n }, 0);\n\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n createCommand,\n COMMAND_PRIORITY_HIGH,\n $getPreviousSelection,\n $isRangeSelection,\n $createParagraphNode,\n SELECTION_CHANGE_COMMAND,\n $getSelection,\n $isNodeSelection,\n COMMAND_PRIORITY_LOW,\n $getNodeByKey,\n PASTE_COMMAND,\n} from \"lexical\";\nimport { useEffect, useRef } from \"react\";\nimport {\n $createImageNode,\n $isImageNode,\n ImageNode,\n IMAGE_UPLOAD_STATE,\n} from \"../nodes/ImageNode\";\nimport { NodeEventPlugin } from \"@lexical/react/LexicalNodeEventPlugin\";\n\nexport const INSERT_IMAGE_COMMAND = createCommand(\"INSERT_IMAGE_COMMAND\");\nconst SELECTED_CLASS_NAME = \"selected\";\n\nfunction isImageFile(file) {\n return file && file.type && file.type.startsWith(\"image/\");\n}\n\n// Inserts an ImageNode at the current selection and returns its key so the\n// caller can update it later (e.g. when a background upload resolves).\nfunction $insertImageNode(src, uploadState) {\n const prevSelection = $getPreviousSelection() || $getSelection();\n if (!$isRangeSelection(prevSelection)) {\n return null;\n }\n\n const imageNode = $createImageNode(src, uploadState);\n prevSelection.insertNodes([imageNode]);\n\n let nextNode =\n imageNode.getNextSibling() || imageNode.getParent().getNextSibling();\n if (!nextNode) {\n nextNode = $createParagraphNode();\n imageNode.insertAfter(nextNode);\n }\n\n imageNode.select();\n return imageNode.getKey();\n}\n\nexport function ImagePlugin({ onImageUpload }) {\n const [editor] = useLexicalComposerContext();\n const selectedImgElemRef = useRef(null);\n const onImageUploadRef = useRef(onImageUpload);\n\n useEffect(() => {\n onImageUploadRef.current = onImageUpload;\n }, [onImageUpload]);\n\n useEffect(() => {\n if (!editor.hasNode(ImageNode)) {\n throw new Error(\"ImagePlugin: ImageNode not registered on editor\");\n }\n }, [editor]);\n\n // Kick off an async upload for a node already inserted with a blob URL.\n // On success swap the src to the returned URL and revoke the blob.\n // On failure mark the node as errored but keep the blob URL visible.\n const startUpload = (nodeKey, file, blobUrl) => {\n const upload = onImageUploadRef.current;\n if (!upload) return;\n\n Promise.resolve()\n .then(() => upload(file))\n .then((remoteUrl) => {\n if (typeof remoteUrl !== \"string\" || !remoteUrl) {\n throw new Error(\"onImageUpload must resolve to a URL string\");\n }\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setSrc(remoteUrl);\n node.setUploadState(IMAGE_UPLOAD_STATE.UPLOADED);\n }\n });\n URL.revokeObjectURL(blobUrl);\n })\n .catch((err) => {\n console.error(\"ImagePlugin: image upload failed\", err);\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setUploadState(IMAGE_UPLOAD_STATE.ERROR);\n }\n });\n });\n };\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n INSERT_IMAGE_COMMAND,\n (payload) => {\n // String payload: caller already has a usable URL — just insert.\n if (typeof payload === \"string\") {\n $insertImageNode(payload, IMAGE_UPLOAD_STATE.UPLOADED);\n return true;\n }\n\n // File payload: show immediately via blob URL, upload in background.\n if (payload instanceof File && isImageFile(payload)) {\n const blobUrl = URL.createObjectURL(payload);\n const hasUpload = !!onImageUploadRef.current;\n const key = $insertImageNode(\n blobUrl,\n hasUpload\n ? IMAGE_UPLOAD_STATE.UPLOADING\n : IMAGE_UPLOAD_STATE.UPLOADED\n );\n if (key && hasUpload) {\n startUpload(key, payload, blobUrl);\n }\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n // handle selection\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n if (selectedImgElemRef.current) {\n selectedImgElemRef.current.classList.remove(SELECTED_CLASS_NAME);\n selectedImgElemRef.current = null;\n }\n\n const selection = $getSelection();\n if ($isNodeSelection(selection) && selection.getNodes().length === 1) {\n const node = selection.getNodes()[0];\n if ($isImageNode(node)) {\n const DOMElement = editor.getElementByKey(node.getKey());\n DOMElement.classList.add(SELECTED_CLASS_NAME);\n selectedImgElemRef.current = DOMElement;\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n\n return unregisterCommand;\n }, [editor]);\n\n useEffect(() => {\n const unregisterPasteCommand = editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n\n const imageFiles = Array.from(clipboardData.files).filter(isImageFile);\n if (imageFiles.length !== 1) return false;\n\n const selection = $getSelection() || $getPreviousSelection();\n if (!$isRangeSelection(selection)) return false;\n\n event.preventDefault();\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, imageFiles[0]);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterPasteCommand;\n }, [editor]);\n\n return (\n <NodeEventPlugin\n nodeType={ImageNode}\n eventType={\"click\"}\n eventListener={(event, editor, key) => {\n const node = $getNodeByKey(key);\n node.select();\n }}\n />\n );\n}\n","import {\r\n Button,\r\n DialogTrigger,\r\n Popover,\r\n Toolbar,\r\n Group,\r\n FileTrigger,\r\n} from \"react-aria-components\";\r\nimport {\r\n IconPlus,\r\n IconCodePlus,\r\n IconPhoto,\r\n IconLineDashed,\r\n} from \"@tabler/icons-react\";\r\nimport { useState, useRef, useEffect } from \"react\";\r\nimport { OFFSCREEN_POSITION } from \"../InlineToolbar/utils\";\r\nimport { computeBlockToolbarPosition } from \"../InlineToolbar/utils\";\r\nimport \"./styles/Popover.css\";\r\n\r\nimport { INSERT_CODE_BLOCK_COMMAND } from \"../../Plugins/CodePlugin\";\r\nimport { INSERT_HORIZONTAL_DIVIDER_COMMAND } from \"../../Plugins/HorizontalDividerPlugin\";\r\nimport { INSERT_IMAGE_COMMAND } from \"../../Plugins/ImagePlugin\";\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\r\n\r\nconst ICON_SIZE = 24;\r\n\r\nfunction BlockToolbar() {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const handleFileSelect = (fileList) => {\r\n if (!fileList || fileList.length === 0) {\r\n return;\r\n }\r\n\r\n const file = fileList[0];\r\n\r\n if (!file.type.startsWith(\"image/\")) {\r\n alert(\"Please select an image file.\");\r\n return;\r\n }\r\n\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, file);\r\n };\r\n\r\n return (\r\n <Toolbar aria-label=\"Block toolbar\" id=\"block-toolbar\">\r\n <Group aria-label=\"Media\">\r\n <FileTrigger\r\n acceptedFileTypes={[\"image/png\", \"image/jpeg\", \"image/gif\"]}\r\n onSelect={handleFileSelect}\r\n allowsMultiple={false}\r\n >\r\n <Button aria-label=\"image\">\r\n <IconPhoto size={ICON_SIZE} />\r\n </Button>\r\n </FileTrigger>\r\n <Button\r\n aria-label=\"code block\"\r\n onPress={() => {\r\n editor.dispatchCommand(INSERT_CODE_BLOCK_COMMAND, undefined);\r\n }}\r\n >\r\n <IconCodePlus size={ICON_SIZE} />\r\n </Button>\r\n <Button\r\n aria-label=\"horizontal divider\"\r\n onPress={() => {\r\n editor.dispatchCommand(\r\n INSERT_HORIZONTAL_DIVIDER_COMMAND,\r\n undefined\r\n );\r\n }}\r\n >\r\n <IconLineDashed size={ICON_SIZE} />\r\n </Button>\r\n </Group>\r\n </Toolbar>\r\n );\r\n}\r\n\r\nexport default function BlockToolbarPopover({\r\n selectionRectCoords,\r\n TOOLBAR_OFFSET,\r\n toolbarTriggerId,\r\n toolbarPopoverId,\r\n}) {\r\n const [toolbarPosition, setToolbarPosition] = useState({\r\n x: OFFSCREEN_POSITION,\r\n y: OFFSCREEN_POSITION,\r\n });\r\n const toolbarRef = useRef(null);\r\n\r\n // Update toolbar position when selection changes\r\n useEffect(() => {\r\n setToolbarPosition(\r\n computeBlockToolbarPosition(\r\n selectionRectCoords,\r\n toolbarRef,\r\n TOOLBAR_OFFSET\r\n )\r\n );\r\n }, [selectionRectCoords]);\r\n\r\n return (\r\n <DialogTrigger>\r\n <Button\r\n aria-label=\"Block toolbar trigger\"\r\n className=\"block-toolbar-trigger\"\r\n id={toolbarTriggerId}\r\n ref={toolbarRef}\r\n style={{\r\n position: \"absolute\",\r\n top: toolbarPosition.y,\r\n left: toolbarPosition.x,\r\n }}\r\n >\r\n <IconPlus size={ICON_SIZE} />\r\n </Button>\r\n <Popover\r\n className=\"block-toolbar-popover\"\r\n id={toolbarPopoverId}\r\n placement=\"end\"\r\n shouldFlip={false}\r\n offset={TOOLBAR_OFFSET}\r\n >\r\n <BlockToolbar />\r\n </Popover>\r\n </DialogTrigger>\r\n );\r\n}\r\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n SELECTION_CHANGE_COMMAND,\n COMMAND_PRIORITY_HIGH,\n $isParagraphNode,\n} from \"lexical\";\nimport { useEffect, useState, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { getSelectedNode } from \"./TextFormatPlugin\";\n\nimport BlockToolbarPopover from \"../components/BlockToolbar/BlockToolbar\";\n\nconst DOM_ELEMENT = document.body;\n\nexport default function BlockToolbarPlugin({ toolbarGap }) {\n const [selectionRectCoords, setSelectionRectCoords] = useState(null);\n const [editor] = useLexicalComposerContext();\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const [toolbarActive, setToolbarActive] = useState(false);\n\n // Generate unique IDs specific to this editor instance\n const randomStringRef = useRef(Math.random().toString(36).substring(2, 9));\n const toolbarTriggerId = `block-toolbar-trigger-${randomStringRef.current}`;\n const toolbarPopoverId = `block-toolbar-popover-${randomStringRef.current}`;\n\n const handleFocus = () => setIsEditorFocused(true);\n const handleBlur = (event) => {\n // Delay the blur event to give time for toolbar click to register\n setTimeout(() => {\n const toolbarTrigger = document.getElementById(toolbarTriggerId);\n if (\n toolbarTrigger &&\n (toolbarTrigger === document.activeElement ||\n toolbarTrigger.contains(document.activeElement) ||\n toolbarTrigger.contains(event.relatedTarget))\n ) {\n // Don't update focus state if we're clicking on the toolbar trigger\n return;\n }\n setIsEditorFocused(false);\n }, 10);\n };\n\n // Add observer to detect if toolbar is active\n useEffect(() => {\n const checkToolbarPresence = () => {\n const isPresent = !!document.getElementById(toolbarPopoverId);\n setToolbarActive(isPresent);\n };\n\n const observer = new MutationObserver(checkToolbarPresence);\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Initial check\n checkToolbarPresence();\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n const unregisterListener = editor.registerRootListener(\n (rootElement, prevRootElement) => {\n if (rootElement) {\n rootElement.addEventListener(\"focus\", handleFocus);\n rootElement.addEventListener(\"blur\", handleBlur);\n }\n\n if (prevRootElement) {\n prevRootElement.removeEventListener(\"focus\", handleFocus);\n prevRootElement.removeEventListener(\"blur\", handleBlur);\n }\n }\n );\n\n return unregisterListener;\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n // Check editor focus state during selection changes\n const rootElement = editor.getRootElement();\n if (rootElement) {\n const hasFocus =\n rootElement === document.activeElement ||\n rootElement.contains(document.activeElement);\n\n // Update focus state only if it changed to avoid re-renders\n if (hasFocus !== isEditorFocused) {\n setIsEditorFocused(hasFocus);\n }\n }\n\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n setSelectionRectCoords(null);\n return false;\n }\n\n const node = getSelectedNode(selection);\n if ($isParagraphNode(node) && node.getTextContent() === \"\") {\n // update selection coordinates when selection changes and the condition is met\n const DOMElement = editor.getElementByKey(node.getKey());\n const boundingRect = DOMElement.getBoundingClientRect();\n\n const X = boundingRect.left;\n const centerY =\n boundingRect.top + boundingRect.height / 2 + window.scrollY;\n\n setSelectionRectCoords({ x: X, y: centerY });\n } else {\n setSelectionRectCoords(null);\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return (\n selectionRectCoords &&\n (isEditorFocused || toolbarActive) &&\n createPortal(\n <BlockToolbarPopover\n selectionRectCoords={selectionRectCoords}\n TOOLBAR_OFFSET={toolbarGap}\n toolbarTriggerId={toolbarTriggerId}\n toolbarPopoverId={toolbarPopoverId}\n />,\n DOM_ELEMENT\n )\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\nimport { $createMathNode, $isMathNode, MathNode } from \"../nodes/MathNode\";\nimport {\n $getNodeByKey,\n $getRoot,\n $getSelection,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n $isParagraphNode,\n COMMAND_PRIORITY_HIGH,\n KEY_ENTER_COMMAND,\n KEY_ARROW_RIGHT_COMMAND,\n KEY_BACKSPACE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n $createTextNode,\n TextNode,\n $getAdjacentNode,\n COMMAND_PRIORITY_NORMAL,\n BLUR_COMMAND,\n $setSelection,\n PASTE_COMMAND,\n} from \"lexical\";\nimport {\n $createMathHighlightNodeBlock,\n $createMathHighlightNodeInline,\n $isMathHighlightNodeBlock,\n $isMathHighlightNodeInline,\n MathHighlightNodeBlock,\n MathHighlightNodeInline,\n} from \"../nodes/MathHighlightNode\";\nimport { NodeEventPlugin } from \"@lexical/react/LexicalNodeEventPlugin\";\nimport { $findMatchingParent, $dfs } from \"@lexical/utils\";\n\nexport const INLINE_DELIMITERS = [\n [\"$\", \"$\"],\n [\"\\\\(\", \"\\\\)\"],\n];\n\nexport const DISPLAY_DELIMITERS = [\n [\"$$\", \"$$\"],\n [\"\\\\[\", \"\\\\]\"],\n];\n\nconst escapeRegex = (str) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nconst getMatch = (text, delimiters) => {\n let earliest = null;\n\n for (const [opening, closing] of delimiters) {\n const regex = new RegExp(\n `(.*?)(${escapeRegex(opening)})(.*?)(${escapeRegex(closing)})`,\n \"g\"\n );\n const match = regex.exec(text);\n if (match) {\n const content = match[3];\n if (content && content.trim() !== \"\") {\n const start = match.index + match[1].length;\n const end = match.index + match[0].length;\n if (!earliest || start < earliest.start) {\n earliest = {\n start,\n end,\n content: opening + content + closing,\n };\n }\n }\n }\n }\n\n return earliest;\n};\n\nconst getSelectedMathHighlightContainer = (selection, nodeMatcher) => {\n if (!$isRangeSelection(selection)) {\n return null;\n }\n\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n const anchorContainer = nodeMatcher(anchorNode)\n ? anchorNode\n : $findMatchingParent(anchorNode, nodeMatcher);\n const focusContainer = nodeMatcher(focusNode)\n ? focusNode\n : $findMatchingParent(focusNode, nodeMatcher);\n\n if (!anchorContainer || !focusContainer) {\n return null;\n }\n\n return anchorContainer.getKey() === focusContainer.getKey()\n ? anchorContainer\n : null;\n};\n\nconst getClipboardPlainText = (clipboardData) =>\n clipboardData.getData(\"text/plain\") ||\n clipboardData.getData(\"text\") ||\n clipboardData.getData(\"text/uri-list\");\n\nexport function MathInlinePlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([MathNode, MathHighlightNodeInline])) {\n throw new Error(\n \"MathInlinePlugin: MathNode or MathHighlightNodeInline not registered on editor\"\n );\n }\n }, [editor]);\n\n // Convert simple text $...$ to MathNode Inline\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!node.isSimpleText()) {\n return;\n }\n\n if (\n $isMathHighlightNodeInline(node) ||\n $findMatchingParent(node, $isMathHighlightNodeBlock)\n ) {\n return;\n }\n\n const text = node.getTextContent();\n const match = getMatch(text, INLINE_DELIMITERS);\n\n if (match) {\n const { start, end, content } = match;\n let targetNode;\n const mathNode = $createMathNode(content, true);\n\n if (start === 0) {\n [targetNode] = node.splitText(end);\n targetNode.insertBefore(mathNode);\n targetNode.remove();\n } else {\n [, targetNode] = node.splitText(start, end);\n targetNode.replace(mathNode);\n }\n return mathNode;\n }\n });\n return removeTransform;\n }, [editor]);\n\n // conversion: MathNode Inline <--> MathHighlightNodeInline upon selection change\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n const nodesToExclude = new Set();\n\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length === 1 && $isMathNode(nodes[0])) {\n const mathNode = nodes[0];\n if (mathNode.isInline()) {\n let equation = mathNode.getEquation();\n // Strip delimiters\n if (equation.startsWith(\"$\") && equation.endsWith(\"$\")) {\n equation = equation.slice(1, -1);\n } else if (equation.startsWith(\"\\\\(\") && equation.endsWith(\"\\\\)\")) {\n equation = equation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeInline(equation);\n mathNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n }\n } else if ($isRangeSelection(selection)) {\n selection.getNodes().forEach(node => nodesToExclude.add(node.getKey()));\n }\n\n // Convert unselected inline highlight nodes back to math nodes\n const root = $getRoot();\n const allTextNodes = root.getAllTextNodes();\n\n // convert unselected MathHighlightNodeInline to MathNode Inline\n allTextNodes.forEach((node) => {\n if (\n $isMathHighlightNodeInline(node) &&\n !nodesToExclude.has(node.getKey())\n ) {\n let equation = node.getTextContent();\n if (!equation) {\n node.remove();\n return;\n }\n\n let isBlock = false;\n if (equation.startsWith(\"$\") && equation.endsWith(\"$\") && equation.length >= 2) {\n equation = equation.slice(1, -1);\n isBlock = true;\n }\n\n const mathNode = isBlock\n ? $createMathNode(`$$${equation}$$`, false)\n : $createMathNode(`$${equation}$`, true);\n node.replace(mathNode);\n }\n });\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // Convert MathHighlightNodeInline to MathNode Inline upon blur\n useEffect(() => {\n return editor.registerCommand(\n BLUR_COMMAND,\n () => {\n editor.update(() => {\n const root = $getRoot();\n const allTextNodes = root.getAllTextNodes();\n\n allTextNodes.forEach((node) => {\n if ($isMathHighlightNodeInline(node)) {\n let equation = node.getTextContent();\n if (!equation) {\n node.remove();\n return;\n }\n\n let isBlock = false;\n if (\n equation.startsWith(\"$\") &&\n equation.endsWith(\"$\") &&\n equation.length >= 2\n ) {\n equation = equation.slice(1, -1);\n isBlock = true;\n }\n\n const mathNode = isBlock\n ? $createMathNode(`$$${equation}$$`, false)\n : $createMathNode(`$${equation}$`, true);\n node.replace(mathNode);\n $setSelection(null);\n }\n });\n });\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n // If a collapsed selection lands on a MathNode Inline from left,\n // convert it to MathHighlightNodeInline and select it at the start\n useEffect(() => {\n return editor.registerCommand(\n KEY_ARROW_RIGHT_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const adjacentNode = $getAdjacentNode(selection.anchor, false);\n\n if ($isMathNode(adjacentNode) && adjacentNode.isInline()) {\n const equation = adjacentNode.getEquation();\n let cleanEquation = equation;\n // Strip delimiters if present\n if (cleanEquation.startsWith(\"$\") && cleanEquation.endsWith(\"$\")) {\n cleanEquation = cleanEquation.slice(1, -1);\n } else if (cleanEquation.startsWith(\"\\\\(\") && cleanEquation.endsWith(\"\\\\)\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeInline(cleanEquation);\n adjacentNode.replace(mathHighlightNode);\n mathHighlightNode.select(0, 0);\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n // If a collapsed selection lands on a MathNode Inline from right upon backspace,\n // convert it to MathHighlightNodeInline and select it at the end\n useEffect(() => {\n return editor.registerCommand(\n KEY_BACKSPACE_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const adjacentNode = $getAdjacentNode(selection.anchor, true);\n\n if ($isMathNode(adjacentNode) && adjacentNode.isInline()) {\n const equation = adjacentNode.getEquation();\n let cleanEquation = equation;\n // Strip delimiters if present\n if (cleanEquation.startsWith(\"$\") && cleanEquation.endsWith(\"$\")) {\n cleanEquation = cleanEquation.slice(1, -1);\n } else if (cleanEquation.startsWith(\"\\\\(\") && cleanEquation.endsWith(\"\\\\)\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeInline(cleanEquation);\n adjacentNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) {\n return false;\n }\n\n const selection = $getSelection();\n const mathHighlightNode = getSelectedMathHighlightContainer(\n selection,\n $isMathHighlightNodeInline\n );\n if (!mathHighlightNode) {\n return false;\n }\n\n const pastedText = getClipboardPlainText(clipboardData);\n if (!pastedText) {\n return false;\n }\n\n event.preventDefault();\n selection.insertText(pastedText);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n // If the selection is inside a MathHighlightNodeInline and there is no next sibling,\n // add a space after it to make it easier to escape\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const node = selection.anchor.getNode();\n\n if ($isMathHighlightNodeInline(node)) {\n const nextSibling = node.getNextSibling();\n if (!nextSibling) {\n node.insertAfter($createTextNode(\" \"));\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_NORMAL\n );\n }, [editor]);\n\n return (\n // Register click event for MathNode\n <NodeEventPlugin\n nodeType={MathNode}\n eventType={\"click\"}\n eventListener={(event, editor, key) => {\n const node = $getNodeByKey(key);\n if (node && node.isInline()) {\n node.select();\n }\n }}\n />\n );\n}\n\nexport function MathBlockPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([MathNode, MathHighlightNodeBlock])) {\n throw new Error(\n \"MathBlockPlugin: MathNode or MathHighlightNodeBlock not registered on editor\"\n );\n }\n }, [editor]);\n\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!node.isSimpleText()) {\n return;\n }\n\n if ($findMatchingParent(node, $isMathHighlightNodeBlock)) {\n return;\n }\n\n const text = node.getTextContent();\n\n // Check for Block Creation Trigger: \"$$ \" at start of line/paragraph\n if (text.startsWith(\"$$ \")) {\n const prevSibling = node.getPreviousSibling();\n const parentNode = $findMatchingParent(node, $isParagraphNode);\n const isStartOfParagraph = parentNode !== null && parentNode.getChildrenSize() === 1;\n const isAfterLineBreak = $isLineBreakNode(prevSibling);\n\n if (isStartOfParagraph || isAfterLineBreak) {\n // If there is more text after \"$$ \", don't do anything\n if (text.length > 3) {\n return;\n }\n\n // Create the new math block\n const mathBlock = $createMathHighlightNodeBlock(\"\");\n\n // Replace \"$$ \" with the math block\n node.replace(mathBlock);\n\n // Select the math block\n mathBlock.select();\n\n // Check if the next sibling is a LineBreakNode and remove it\n const nextSibling = mathBlock.getNextSibling();\n if ($isLineBreakNode(nextSibling)) {\n nextSibling.remove();\n }\n\n return;\n }\n }\n\n const match = getMatch(text, DISPLAY_DELIMITERS);\n\n if (match) {\n const { start, end, content } = match;\n let targetNode;\n const mathNode = $createMathNode(content, false);\n\n if (start === 0) {\n [targetNode] = node.splitText(end);\n targetNode.insertBefore(mathNode);\n targetNode.remove();\n } else {\n [, targetNode] = node.splitText(start, end);\n targetNode.replace(mathNode);\n }\n return mathNode;\n }\n });\n return removeTransform;\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n const nodesToExclude = new Set();\n\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length === 1 && $isMathNode(nodes[0])) {\n const mathNode = nodes[0];\n if (!mathNode.isInline()) {\n let equation = mathNode.getEquation();\n // Strip delimiters\n if (equation.startsWith(\"$$\") && equation.endsWith(\"$$\")) {\n equation = equation.slice(2, -2);\n } else if (equation.startsWith(\"\\\\[\") && equation.endsWith(\"\\\\]\")) {\n equation = equation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeBlock(equation);\n mathNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n }\n } else if ($isRangeSelection(selection)) {\n selection.getNodes().forEach(node => {\n nodesToExclude.add(node.getKey());\n const blockNode = $findMatchingParent(node, $isMathHighlightNodeBlock);\n if (blockNode) {\n nodesToExclude.add(blockNode.getKey());\n }\n });\n }\n\n // Convert unselected block highlight nodes back to math nodes\n const editorState = editor.getEditorState();\n const allNodes = editorState._nodeMap;\n for (const [, node] of allNodes) {\n if ($isMathHighlightNodeBlock(node) && node.isAttached() && !nodesToExclude.has(node.getKey())) {\n const equation = node.getTextContent();\n if (!equation) {\n node.remove();\n continue;\n }\n // Always convert back to block MathNode\n const mathNode = $createMathNode(`$$${equation}$$`, false);\n node.replace(mathNode);\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // Convert MathHighlightNodeBlock to MathNode Block upon blur\n useEffect(() => {\n return editor.registerCommand(\n BLUR_COMMAND,\n () => {\n editor.update(() => {\n const root = $getRoot();\n const nodes = $dfs(root);\n\n nodes.forEach(({ node }) => {\n if ($isMathHighlightNodeBlock(node)) {\n const equation = node.getTextContent();\n if (!equation) {\n node.remove();\n return;\n }\n // Always convert back to block MathNode\n const mathNode = $createMathNode(`$$${equation}$$`, false);\n node.replace(mathNode);\n $setSelection(null);\n }\n });\n });\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n KEY_ENTER_COMMAND,\n () => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const firstNode = selection.getNodes()[0];\n const mathHighlightBlock = $findMatchingParent(\n firstNode,\n $isMathHighlightNodeBlock\n );\n if (!mathHighlightBlock) {\n return false;\n }\n\n const lastChild = mathHighlightBlock.getLastChild();\n const isAtBlockEnd =\n selection.isCollapsed() &&\n ((selection.anchor.getNode().getKey() ===\n mathHighlightBlock.getKey() &&\n selection.anchor.offset === 0 &&\n mathHighlightBlock.getChildrenSize() === 0) ||\n (lastChild &&\n $isLineBreakNode(lastChild) &&\n selection.anchor.getNode().getKey() ===\n mathHighlightBlock.getKey() &&\n selection.anchor.offset ===\n mathHighlightBlock.getChildrenSize()) ||\n (lastChild &&\n $isTextNode(lastChild) &&\n selection.anchor.getNode().getKey() === lastChild.getKey() &&\n selection.anchor.offset === lastChild.getTextContent().length));\n\n if (isAtBlockEnd) {\n return false;\n }\n\n selection.insertLineBreak();\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // If a collapsed selection lands on a MathNode Block from right upon backspace,\n // convert it to MathHighlightNodeBlock and select it at the end\n useEffect(() => {\n return editor.registerCommand(\n KEY_BACKSPACE_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const adjacentNode = $getAdjacentNode(selection.anchor, true);\n\n if ($isMathNode(adjacentNode) && !adjacentNode.isInline()) {\n const equation = adjacentNode.getEquation();\n let cleanEquation = equation;\n // Strip delimiters if present\n if (cleanEquation.startsWith(\"$$\") && cleanEquation.endsWith(\"$$\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n } else if (cleanEquation.startsWith(\"\\\\[\") && cleanEquation.endsWith(\"\\\\]\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeBlock(cleanEquation);\n adjacentNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) {\n return false;\n }\n\n const selection = $getSelection();\n const mathHighlightNode = getSelectedMathHighlightContainer(\n selection,\n $isMathHighlightNodeBlock\n );\n if (!mathHighlightNode) {\n return false;\n }\n\n const pastedText = getClipboardPlainText(clipboardData);\n if (!pastedText) {\n return false;\n }\n\n event.preventDefault();\n selection.insertRawText(pastedText);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n return (\n <NodeEventPlugin\n nodeType={MathNode}\n eventType={\"click\"}\n eventListener={(event, editor, key) => {\n const node = $getNodeByKey(key);\n if (node && !node.isInline()) {\n node.select();\n }\n }}\n />\n );\n}\n","import { $insertList, $isListItemNode } from \"@lexical/list\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\nimport {\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n $createLineBreakNode,\n COMMAND_PRIORITY_HIGH,\n KEY_TAB_COMMAND,\n TextNode,\n ParagraphNode,\n} from \"lexical\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { getSelectedNode } from \"./TextFormatPlugin\";\n\nconst MAX_INDENT_LEVEL = 3;\n\nexport function ListPluginExtended() {\n const [editor] = useLexicalComposerContext();\n\n // Transform: Remove paragraph nodes inside list item nodes\n // Replace with a line break node\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(\n ParagraphNode,\n (paragraphNode) => {\n const parent = paragraphNode.getParent();\n\n // Check if paragraph is inside a ListItemNode\n if ($isListItemNode(parent)) {\n // Replace paragraph with a line break\n const lineBreakNode = $createLineBreakNode();\n paragraphNode.replace(lineBreakNode);\n lineBreakNode.selectEnd();\n }\n }\n );\n\n return removeTransform;\n }, [editor]);\n\n // If a text node begins with '1. ' or '- ', convert it into a list\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!$findMatchingParent(node, $isParagraphNode)) {\n return;\n }\n\n const parentNode = $findMatchingParent(node, $isParagraphNode);\n if (parentNode.getFirstDescendant() !== node) {\n return;\n }\n\n const selection = $getSelection();\n if ($isRangeSelection(selection) && selection.isCollapsed()) {\n const anchor = selection.anchor;\n const offset = anchor.offset;\n\n if (node.getTextContent() === \"1. \" && offset === 3) {\n $insertList(\"number\");\n node.setTextContent(\"\");\n } else if (node.getTextContent() === \"- \" && offset === 2) {\n $insertList(\"bullet\");\n node.setTextContent(\"\");\n }\n }\n });\n\n return removeTransform;\n }, [editor]);\n\n // Handle TAB Command\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n KEY_TAB_COMMAND,\n (event) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const node = getSelectedNode(selection);\n const listItemNode = $findMatchingParent(node, $isListItemNode);\n if (!listItemNode) {\n return false;\n }\n\n const indent = listItemNode.getIndent();\n if (event.shiftKey) {\n if (indent <= 0) {\n return false;\n }\n listItemNode.setIndent(indent - 1);\n } else {\n if (indent > MAX_INDENT_LEVEL) {\n return false;\n }\n listItemNode.setIndent(indent + 1);\n }\n\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\n\nexport function TabInterceptorPlugin() {\n const [editor] = useLexicalComposerContext();\n\n const interceptTab = (event) => {\n if (event.key === \"Tab\") {\n event.preventDefault();\n }\n };\n\n useEffect(() => {\n const unregisterListener = editor.registerRootListener(\n (rootElement, prevRootElement) => {\n if (rootElement) {\n rootElement.addEventListener(\"keydown\", interceptTab);\n }\n\n if (prevRootElement) {\n prevRootElement.removeEventListener(\"keydown\", interceptTab);\n }\n }\n );\n\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\n\n// Exposes the editor to the parent component\nexport function EditorExposePlugin({ editorRef }) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (editorRef) {\n editorRef.current = editor;\n\n // Clear the ref on component unmount\n return () => {\n if (editorRef) {\n editorRef.current = null;\n }\n };\n }\n }, [editor, editorRef]);\n\n return null;\n}\n","import { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport \"./editor-styles.css\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport InlineToolbarPlugin from \"./Plugins/InlineToolbarPlugin.jsx\";\nimport { TextFormatPlugin } from \"./Plugins/TextFormatPlugin.jsx\";\nimport BlockToolbarPlugin from \"./Plugins/BlockToolbarPlugin.jsx\";\nimport { MathInlinePlugin, MathBlockPlugin } from \"./Plugins/MathPlugin.jsx\";\nimport { CodePlugin } from \"./Plugins/CodePlugin.jsx\";\nimport { HorizontalDividerPlugin } from \"./Plugins/HorizontalDividerPlugin.jsx\";\nimport { ImagePlugin } from \"./Plugins/ImagePlugin.jsx\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { ListPluginExtended } from \"./Plugins/ListPluginExtended.jsx\";\nimport { TabInterceptorPlugin } from \"./Plugins/TabInterceptorPlugin.jsx\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { EditorExposePlugin } from \"./Plugins/EditorExposePlugin.jsx\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { ClearEditorPlugin } from \"@lexical/react/LexicalClearEditorPlugin\";\n\nexport default function Editor({\n initialConfig,\n onChange,\n editorRef,\n blockToolbarGap,\n spellCheck,\n isHeadingOneFirst,\n onImageUpload,\n}) {\n return (\n <LexicalComposer initialConfig={initialConfig}>\n <RichTextPlugin\n contentEditable={\n <ContentEditable spellCheck={spellCheck} className=\"editor-input\" />\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n <TextFormatPlugin isHeadingOneFirst={isHeadingOneFirst} />\n <InlineToolbarPlugin />\n <BlockToolbarPlugin toolbarGap={blockToolbarGap} />\n <AutoFocusPlugin />\n <HistoryPlugin />\n <MathInlinePlugin />\n <MathBlockPlugin />\n <CodePlugin />\n <HorizontalDividerPlugin />\n <ImagePlugin onImageUpload={onImageUpload} />\n <ListPlugin />\n <ListPluginExtended />\n <TabInterceptorPlugin />\n <OnChangePlugin onChange={onChange} />\n <EditorExposePlugin editorRef={editorRef} />\n <ClearEditorPlugin />\n </LexicalComposer>\n );\n}\n"],"names":["OFFSCREEN_POSITION","computeInlineToolbarPosition","boundingRectCoords","toolbarRef","topOffset","toolbarElement","x","y","width","height","centerX","topY","getBoundingRectCoords","range","rect","computeBlockToolbarPosition","offset","toolbarX","toolbarY","computeCodeMenuPosition","codeBlockCoords","codeMenuRef","HORIZONTAL_OFFSET","VERTICAL_OFFSET","codeMenuElement","X","Y","TOGGLE_HEADING_COMMAND","createCommand","TOGGLE_QUOTE_COMMAND","TOGGLE_LINK_COMMAND","getSelectedNode","selection","anchor","focus","anchorNode","focusNode","$isAtNodeEnd","fetchTagIfHeadingNode","node","headingNode","$findMatchingParent","$isHeadingNode","updateToolbarHeadingState","toolbarHeadingState","nodes","headingTag","stateKey","HeadingPlugin","editor","useLexicalComposerContext","useEffect","toolbarState","isHeadingOne","isHeadingTwo","isHeadingThree","$getSelection","$isRangeSelection","tag","$setBlocksType","$createHeadingNode","$createParagraphNode","COMMAND_PRIORITY_HIGH","HeadingOneFirstPlugin","unregisterTransform","HeadingNode","firstChild","$getRoot","children","h1Node","isNodeOrAncestorQuote","$isQuoteNode","updateToolbarQuoteState","QuotePlugin","$createQuoteNode","getLinkAtSelection","$isLinkNode","LinkPlugin","CLICK_COMMAND","payload","linkNode","COMMAND_PRIORITY_LOW","linkURL","$toggleLink","AdjacentHeadingPlugin","HEADING_ABOVE_CLASS","TextNode","textNode","parentNode","$isParagraphNode","$isListNode","element","prevSibling","shouldHaveClass","alreadyHasClass","TextFormatPlugin","isHeadingOneFirst","jsxs","Fragment","jsx","LinkToolbar","style","closeToolbar","existingLinkURL","setLinkURL","useState","Toolbar","TextField","Input","Group","Button","url","IconCheck","ICON_SIZE","IconX","TOP_OFFSET","InlineToolbar","selectionRectCoords","setSelectionRectCoords","toolbarPosition","setToolbarPosition","useRef","setToolbarState","isLinkToolbarVisible","setLinkToolbarVisible","toolbarWidth","setToolbarWidth","setExistingLinkURL","updateToolbarFormatState","prev","editorState","anchorPoint","focusPoint","anchorOffset","focusOffset","$getCharacterOffsets","selectionDOMRange","createDOMRange","_a","useLayoutEffect","computedStyle","ToggleButton","FORMAT_TEXT_COMMAND","IconBold","IconItalic","IconCode","Separator","IconTextSize","IconBlockquote","IconLink","DOM_ELEMENT","InlineToolbarPlugin","shouldShow","setShouldShow","SELECTION_CHANGE_COMMAND","hasMathNode","$isMathNode","isSingleMathHighlight","$isMathHighlightNodeInline","$isMathHighlightNodeBlock","isCodeBlock","$isCodeNode","BLUR_COMMAND","toolbar","linkToolbar","activeElement","createPortal","_self","Prism","lang","uniqueId","plainTextGrammar","_","encode","tokens","Token","o","obj","deepClone","visited","clone","id","key","v","i","m","language","err","src","scripts","className","defaultActivation","no","classList","redef","inside","before","insert","root","grammar","ret","token","newToken","old","value","DFS","callback","type","objId","property","propertyType","async","container","env","parent","code","insertHighlightedCode","highlightedCode","worker","evt","text","rest","tokenList","LinkedList","addAfter","matchGrammar","toArray","name","hooks","callbacks","content","alias","matchedStr","stringify","s","e","aliases","attributes","matchPattern","pattern","pos","lookbehind","match","lookbehindLength","startNode","startPos","rematch","patterns","j","patternObj","greedy","flags","currentNode","str","removeCount","from","to","p","k","matchStr","after","reach","removeFrom","removeRange","wrapped","nestedRematch","head","tail","list","next","newNode","count","array","message","immediateClose","script","highlightAutomaticallyCallback","readyState","module","global","tagName","includedCdataInside","def","attrName","string","markup","LOADING_MESSAGE","FAILURE_MESSAGE","status","FAILURE_EMPTY_MESSAGE","EXTENSIONS","STATUS_ATTR","STATUS_LOADING","STATUS_LOADED","STATUS_FAILED","SELECTOR","loadFile","success","error","xhr","parseRange","start","comma","end","pre","extension","autoloader","lines","elements","logged","CodeMenu","codeNodeKey","codeMenuPosition","setCodeMenuPosition","setLanguage","codeLanguages","getCodeLanguages","friendlyLanguages","getLanguageFriendlyName","friendlyToOriginal","friendly","currentLanguage","$getNodeByKey","ComboBox","friendlyValue","originalValue","SET_CODE_LANGUAGE_COMMAND","IconCaretDownFilled","Popover","ListBox","index","ListBoxItem","INSERT_CODE_BLOCK_COMMAND","CodeHighlightMenuPlugin","setCodeBlockCoords","setCodeNodeKey","isEditorFocused","setIsEditorFocused","isCodeMenuFocused","setIsCodeMenuFocused","hideCodeMenu","useCallback","isFocusInCodeMenu","codeMenu","syncMenuFocusState","menuFocused","handleEditorBlur","rootElement","hasFocus","codeNode","boundingRect","handleFocus","handleBlur","prevRootElement","CodeBlockPlugin","registerCodeHighlighting","isStartOfParagraph","isAfterLineBreak","$isLineBreakNode","$createCodeNode","nextSibling","prevSelection","$getPreviousSelection","codeBlockNode","nodeKey","KEY_BACKSPACE_COMMAND","CodePlugin","INSERT_HORIZONTAL_DIVIDER_COMMAND","HorizontalDividerPlugin","HorizontalDividerNode","horizontalDividerNode","$createHorizontalDividerNode","nextNode","INSERT_IMAGE_COMMAND","SELECTED_CLASS_NAME","isImageFile","file","$insertImageNode","uploadState","imageNode","$createImageNode","ImagePlugin","onImageUpload","selectedImgElemRef","onImageUploadRef","ImageNode","startUpload","blobUrl","upload","remoteUrl","$isImageNode","IMAGE_UPLOAD_STATE","hasUpload","$isNodeSelection","DOMElement","PASTE_COMMAND","event","clipboardData","imageFiles","NodeEventPlugin","BlockToolbar","FileTrigger","fileList","IconPhoto","IconCodePlus","IconLineDashed","BlockToolbarPopover","TOOLBAR_OFFSET","toolbarTriggerId","toolbarPopoverId","DialogTrigger","IconPlus","BlockToolbarPlugin","toolbarGap","toolbarActive","setToolbarActive","randomStringRef","toolbarTrigger","checkToolbarPresence","isPresent","observer","centerY","INLINE_DELIMITERS","DISPLAY_DELIMITERS","escapeRegex","getMatch","delimiters","earliest","opening","closing","getSelectedMathHighlightContainer","nodeMatcher","anchorContainer","focusContainer","getClipboardPlainText","MathInlinePlugin","MathNode","MathHighlightNodeInline","targetNode","mathNode","$createMathNode","nodesToExclude","equation","mathHighlightNode","$createMathHighlightNodeInline","isBlock","$setSelection","KEY_ARROW_RIGHT_COMMAND","adjacentNode","$getAdjacentNode","cleanEquation","pastedText","$createTextNode","COMMAND_PRIORITY_NORMAL","MathBlockPlugin","MathHighlightNodeBlock","mathBlock","$createMathHighlightNodeBlock","blockNode","allNodes","$dfs","KEY_ENTER_COMMAND","firstNode","mathHighlightBlock","lastChild","$isTextNode","MAX_INDENT_LEVEL","ListPluginExtended","ParagraphNode","paragraphNode","$isListItemNode","lineBreakNode","$createLineBreakNode","$insertList","KEY_TAB_COMMAND","listItemNode","indent","TabInterceptorPlugin","interceptTab","EditorExposePlugin","editorRef","Editor","initialConfig","onChange","blockToolbarGap","spellCheck","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","AutoFocusPlugin","HistoryPlugin","ListPlugin","OnChangePlugin","ClearEditorPlugin"],"mappings":"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","x_google_ignoreList":[5]}
1
+ {"version":3,"file":"index.es.js","sources":["../src/components/InlineToolbar/utils.js","../src/Plugins/TextFormatPlugin.jsx","../src/components/InlineToolbar/LinkToolbar.jsx","../src/components/InlineToolbar/InlineToolbar.jsx","../src/Plugins/InlineToolbarPlugin.jsx","../node_modules/prismjs/prism.js","../src/prismSetup.js","../src/components/CodeHighlightMenu/CodeMenu.jsx","../src/Plugins/CodePlugin.jsx","../src/Plugins/HorizontalDividerPlugin.jsx","../src/Plugins/ImagePlugin.jsx","../src/components/BlockToolbar/BlockToolbar.jsx","../src/Plugins/BlockToolbarPlugin.jsx","../src/Plugins/MathPlugin.jsx","../src/Plugins/ListPluginExtended.jsx","../src/Plugins/TabInterceptorPlugin.jsx","../src/Plugins/EditorExposePlugin.jsx","../src/Editor.jsx"],"sourcesContent":["export const OFFSCREEN_POSITION = -1000;\n\nexport function computeInlineToolbarPosition(\n boundingRectCoords,\n toolbarRef,\n topOffset = 0\n) {\n // Ensure the popover reference is valid\n if (!toolbarRef || !toolbarRef.current) {\n console.error(\"Invalid popover reference\");\n return {\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n };\n }\n\n const toolbarElement = toolbarRef.current;\n\n const { x, y } = boundingRectCoords;\n const { width, height } = toolbarElement.getBoundingClientRect();\n\n const centerX = x - width / 2;\n const topY = y - height - topOffset;\n\n return {\n x: centerX,\n y: topY,\n };\n}\n\nexport function getBoundingRectCoords(range) {\n // Ensure the range is valid\n if (!range || typeof range.getBoundingClientRect !== \"function\") {\n console.error(\"Invalid DOM range\");\n return null;\n }\n\n const rect = range.getBoundingClientRect();\n\n const centerX = rect.left + rect.width / 2;\n const topY = rect.top + window.scrollY;\n\n return {\n x: centerX,\n y: topY,\n };\n}\n\nexport function computeBlockToolbarPosition(\n boundingRectCoords,\n toolbarRef,\n offset = 0\n) {\n // Ensure the popover reference is valid\n if (!toolbarRef || !toolbarRef.current) {\n console.error(\"Invalid popover reference\");\n return {\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n };\n }\n\n const { x, y } = boundingRectCoords;\n\n const toolbarElement = toolbarRef.current;\n const { width, height } = toolbarElement.getBoundingClientRect();\n\n const toolbarX = x - width - offset;\n const toolbarY = y - height / 2;\n\n return {\n x: toolbarX,\n y: toolbarY,\n };\n}\n\nexport function computeCodeMenuPosition(\n codeBlockCoords,\n codeMenuRef,\n HORIZONTAL_OFFSET = 16,\n VERTICAL_OFFSET = 12\n) {\n // Ensure the popover reference is valid\n if (!codeMenuRef || !codeMenuRef.current) {\n console.error(\"Invalid popover reference\");\n return {\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n };\n }\n\n const codeMenuElement = codeMenuRef.current;\n\n const { x, y } = codeBlockCoords;\n const { width } = codeMenuElement.getBoundingClientRect();\n\n const X = x - width - HORIZONTAL_OFFSET;\n const Y = y + VERTICAL_OFFSET;\n\n return {\n x: X,\n y: Y,\n };\n}\n","/* Plugins for formatting text */\n\nimport {\n $isHeadingNode,\n $createHeadingNode,\n $isQuoteNode,\n $createQuoteNode,\n HeadingNode,\n} from \"@lexical/rich-text\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n COMMAND_PRIORITY_HIGH,\n createCommand,\n $getSelection,\n $isRangeSelection,\n $createParagraphNode,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n $getRoot,\n TextNode,\n $isParagraphNode,\n} from \"lexical\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { useEffect } from \"react\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { $toggleLink, $isLinkNode } from \"@lexical/link\";\nimport { $isListNode } from \"@lexical/list\";\nimport \"@lexical/utils\";\nimport { $isAtNodeEnd } from \"@lexical/selection\";\n\nexport const TOGGLE_HEADING_COMMAND = createCommand(\"TOGGLE_HEADING_COMMAND\");\nexport const TOGGLE_QUOTE_COMMAND = createCommand(\"TOGGLE_QUOTE_COMMAND\");\nexport const TOGGLE_LINK_COMMAND = createCommand(\"TOGGLE_LINK_COMMAND\");\n\nexport function getSelectedNode(selection) {\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (anchorNode === focusNode) {\n return anchorNode;\n }\n const isBackward = selection.isBackward();\n if (isBackward) {\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\n } else {\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\n }\n}\n\n// Helper function to fetch the tag of a node if it or its ancestor is a heading node.\nfunction fetchTagIfHeadingNode(node) {\n const headingNode = $findMatchingParent(node, $isHeadingNode);\n return headingNode ? headingNode.getTag() : null;\n}\n\nexport function updateToolbarHeadingState(selection) {\n const toolbarHeadingState = {\n isHeadingOne: false,\n isHeadingTwo: false,\n isHeadingThree: false,\n };\n\n const nodes = selection.getNodes();\n if (!nodes.length) return toolbarHeadingState;\n\n const headingTag = fetchTagIfHeadingNode(nodes[0]);\n if (!headingTag) return toolbarHeadingState;\n\n const allMatch = nodes.every(\n (node) => fetchTagIfHeadingNode(node) === headingTag\n );\n\n if (allMatch) {\n const stateKey = {\n h1: \"isHeadingOne\",\n h2: \"isHeadingTwo\",\n h3: \"isHeadingThree\",\n }[headingTag];\n\n if (stateKey) toolbarHeadingState[stateKey] = true;\n }\n\n return toolbarHeadingState;\n}\n\nfunction HeadingPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n TOGGLE_HEADING_COMMAND,\n (toolbarState) => {\n const { isHeadingOne, isHeadingTwo, isHeadingThree } = toolbarState;\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n let tag;\n\n // Apply the toggling logic based on current state in toolbar\n if (isHeadingOne) {\n // H1 --> H3\n tag = \"h3\";\n } else if (isHeadingTwo) {\n // H2 --> H3\n tag = \"h3\";\n } else if (isHeadingThree) {\n // H3 --> None (paragraph)\n tag = null;\n } else {\n // None --> H2\n tag = \"h2\";\n }\n\n // Apply the heading or paragraph node\n $setBlocksType(selection, () =>\n tag ? $createHeadingNode(tag) : $createParagraphNode()\n );\n }\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n\nfunction HeadingOneFirstPlugin() {\n const [editor] = useLexicalComposerContext();\n\n // Effect for NodeTransform: H2 at start -> H1\n useEffect(() => {\n const unregisterTransform = editor.registerNodeTransform(\n HeadingNode,\n (node) => {\n // Check if it's an H2 node\n if (node.getTag() !== \"h2\") {\n return;\n }\n\n // Get the root node and the first child\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n\n // Check if this H2 node is the very first child of the root\n if (firstChild !== null && node.is(firstChild)) {\n const children = node.getChildren();\n const h1Node = $createHeadingNode(\"h1\");\n h1Node.append(...children);\n node.replace(h1Node);\n }\n }\n );\n\n return () => {\n unregisterTransform();\n };\n }, [editor]);\n\n return null;\n}\n\n// Helper function to check if a node or its ancestor is a quote node\nfunction isNodeOrAncestorQuote(node) {\n return $findMatchingParent(node, $isQuoteNode);\n}\n\nexport function updateToolbarQuoteState(selection) {\n const nodes = selection.getNodes();\n if (!nodes.length) return false;\n\n // Check if all nodes are within quote blocks\n return nodes.length > 0 && nodes.every((node) => isNodeOrAncestorQuote(node));\n}\n\nfunction QuotePlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n TOGGLE_QUOTE_COMMAND,\n (toolbarState) => {\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () =>\n toolbarState.isQuote ? $createParagraphNode() : $createQuoteNode()\n );\n }\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n\nexport function getLinkAtSelection(selection) {\n if (!$isRangeSelection(selection)) {\n return null;\n }\n\n const node = getSelectedNode(selection);\n return $findMatchingParent(node, $isLinkNode);\n}\n\nfunction LinkPlugin() {\n const [editor] = useLexicalComposerContext();\n\n // If a link node is clicked while holding the ctrl key, open the link in a new tab\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n const linkNode = getLinkAtSelection(selection);\n if (linkNode && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), \"_blank\");\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n return unregisterListener;\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (linkURL) => {\n $toggleLink(linkURL);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n\n/* Adds a CSS class to ElementNodes (excluding HeadingNodes) that follow a HeadingNode. */\nfunction AdjacentHeadingPlugin() {\n const [editor] = useLexicalComposerContext();\n const HEADING_ABOVE_CLASS = \"heading-above\";\n\n useEffect(() => {\n const unregisterTransform = editor.registerNodeTransform(\n TextNode,\n (textNode) => {\n const parentNode =\n $findMatchingParent(textNode, $isParagraphNode) ||\n $findMatchingParent(textNode, $isListNode);\n\n if (!parentNode) {\n return;\n }\n\n if ($isHeadingNode(parentNode)) {\n return;\n }\n\n const node = parentNode;\n\n const element = editor.getElementByKey(node.getKey());\n if (!element) {\n return;\n }\n\n const prevSibling = node.getPreviousSibling();\n const shouldHaveClass = $isHeadingNode(prevSibling);\n\n // Check if the DOM element *currently* has the class.\n const alreadyHasClass = element.classList.contains(HEADING_ABOVE_CLASS);\n\n // Add or remove the class directly on the DOM element to achieve the desired state.\n if (shouldHaveClass && !alreadyHasClass) {\n element.classList.add(HEADING_ABOVE_CLASS);\n } else if (!shouldHaveClass && alreadyHasClass) {\n element.classList.remove(HEADING_ABOVE_CLASS);\n }\n }\n );\n\n return unregisterTransform;\n }, [editor]);\n\n return null;\n}\n\nexport function TextFormatPlugin({ isHeadingOneFirst }) {\n return (\n <>\n <HeadingPlugin />\n {isHeadingOneFirst && <HeadingOneFirstPlugin />}\n <QuotePlugin />\n <LinkPlugin />\n <AdjacentHeadingPlugin />\n </>\n );\n}\n","import {\n Button,\n Group,\n Toolbar,\n TextField,\n Input,\n} from \"react-aria-components\";\nimport { IconCheck, IconX } from \"@tabler/icons-react\";\nimport { ICON_SIZE } from \"./InlineToolbar\";\nimport { useState } from \"react\";\nimport { TOGGLE_LINK_COMMAND } from \"../../Plugins/TextFormatPlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\n\nimport \"./styles/LinkToolbar.css\";\n\nexport function LinkToolbar({ style, closeToolbar, existingLinkURL }) {\n const [editor] = useLexicalComposerContext();\n const [linkURL, setLinkURL] = useState(existingLinkURL);\n\n // TODO: The left and right arrow keys aren't working at all. Need to debug.\n\n return (\n <Toolbar style={style} aria-details=\"link toolbar\" id=\"link-toolbar\">\n <TextField\n aria-label=\"url\"\n autoFocus={true}\n defaultValue={linkURL}\n onChange={setLinkURL}\n >\n <Input placeholder=\"Enter Link\" />\n </TextField>\n <Group aria-label=\"edit link\">\n <Button\n aria-label=\"Update link\"\n onPress={() => {\n const url = linkURL === \"\" ? null : linkURL;\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);\n closeToolbar();\n }}\n >\n <IconCheck size={ICON_SIZE} />\n </Button>\n <Button aria-label=\"Discard changes\" onPress={closeToolbar}>\n <IconX size={ICON_SIZE} />\n </Button>\n </Group>\n <div className=\"inline-toolbar-pointer\"></div>\n </Toolbar>\n );\n}\n","import {\r\n Button,\r\n Group,\r\n Separator,\r\n ToggleButton,\r\n Toolbar,\r\n} from \"react-aria-components\";\r\nimport {\r\n IconBold,\r\n IconItalic,\r\n IconCode,\r\n IconTextSize,\r\n IconBlockquote,\r\n IconLink,\r\n} from \"@tabler/icons-react\";\r\nimport { useEffect, useState, useRef, useLayoutEffect } from \"react\";\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $getCharacterOffsets,\r\n FORMAT_TEXT_COMMAND,\r\n} from \"lexical\";\r\nimport { createDOMRange } from \"@lexical/selection\";\r\nimport {\r\n computeInlineToolbarPosition,\r\n OFFSCREEN_POSITION,\r\n getBoundingRectCoords,\r\n} from \"./utils\";\r\nimport {\r\n TOGGLE_HEADING_COMMAND,\r\n TOGGLE_QUOTE_COMMAND,\r\n updateToolbarHeadingState,\r\n updateToolbarQuoteState,\r\n getLinkAtSelection,\r\n} from \"../../Plugins/TextFormatPlugin\";\r\nimport { LinkToolbar } from \"./LinkToolbar\";\r\n\r\nimport \"./styles/Toolbar.css\";\r\n\r\nexport const ICON_SIZE = 24;\r\nconst TOP_OFFSET = 16;\r\n\r\nexport default function InlineToolbar({ editor }) {\r\n // State for storing the bounding rectangle coordinates of the selection\r\n const [selectionRectCoords, setSelectionRectCoords] = useState(null);\r\n // State for storing the toolbar's position (x, y coordinates)\r\n const [toolbarPosition, setToolbarPosition] = useState({\r\n x: OFFSCREEN_POSITION,\r\n y: OFFSCREEN_POSITION,\r\n });\r\n const toolbarRef = useRef(null);\r\n const [toolbarState, setToolbarState] = useState({\r\n isBold: false,\r\n isItalic: false,\r\n isCode: false,\r\n isHeadingOne: false,\r\n isHeadingTwo: false,\r\n isHeadingThree: false,\r\n isQuote: false,\r\n });\r\n\r\n // Link toolbar state\r\n const [isLinkToolbarVisible, setLinkToolbarVisible] = useState(false);\r\n const [toolbarWidth, setToolbarWidth] = useState(0);\r\n const [existingLinkURL, setExistingLinkURL] = useState(\"\");\r\n\r\n // Logic for updating/setting toolbar state\r\n const updateToolbarFormatState = (selection) => {\r\n if ($isRangeSelection(selection)) {\r\n setToolbarState({\r\n isBold: selection.hasFormat(\"bold\"),\r\n isItalic: selection.hasFormat(\"italic\"),\r\n isCode: selection.hasFormat(\"code\"),\r\n isQuote: updateToolbarQuoteState(selection),\r\n });\r\n\r\n // update/set heading state\r\n const toolbarHeadingState = updateToolbarHeadingState(selection);\r\n setToolbarState((prev) => ({\r\n ...prev,\r\n ...toolbarHeadingState,\r\n }));\r\n\r\n // Set the link URL if the selection is at a link node\r\n const linkNode = getLinkAtSelection(selection);\r\n setExistingLinkURL(linkNode ? linkNode.getURL() : \"\");\r\n }\r\n };\r\n\r\n // Initialize toolbar state on component mount\r\n useEffect(() => {\r\n editor.read(() => {\r\n const selection = $getSelection();\r\n updateToolbarFormatState(selection);\r\n });\r\n }, [editor]);\r\n\r\n // Update toolbar state\r\n useEffect(() => {\r\n const unregisterListener = editor.registerUpdateListener(\r\n ({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n updateToolbarFormatState(selection);\r\n });\r\n }\r\n );\r\n return unregisterListener;\r\n }, [editor]);\r\n\r\n // Update selection rectangle coordinates when toolbar state changes\r\n useEffect(() => {\r\n editor.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n // Create a DOM range from the selection\r\n const [anchorPoint, focusPoint] = selection.getStartEndPoints();\r\n const [anchorNode, focusNode] = [\r\n anchorPoint.getNode(),\r\n focusPoint.getNode(),\r\n ];\r\n const [anchorOffset, focusOffset] = $getCharacterOffsets(selection);\r\n const selectionDOMRange = createDOMRange(\r\n editor,\r\n anchorNode,\r\n anchorOffset,\r\n focusNode,\r\n focusOffset\r\n );\r\n\r\n // Set bounding rect coords\r\n setSelectionRectCoords(getBoundingRectCoords(selectionDOMRange));\r\n }\r\n });\r\n }, [editor, toolbarState]);\r\n\r\n // Update toolbar position\r\n useEffect(() => {\r\n if (selectionRectCoords) {\r\n setToolbarPosition(\r\n computeInlineToolbarPosition(\r\n selectionRectCoords,\r\n toolbarRef,\r\n TOP_OFFSET\r\n )\r\n );\r\n setTimeout(() => {\r\n toolbarRef.current?.classList.add(\"visible\");\r\n }, 50);\r\n } else {\r\n toolbarRef.current?.classList.remove(\"visible\");\r\n }\r\n }, [selectionRectCoords]);\r\n\r\n // Capture the width of the inline toolbar after it has been rendered\r\n useLayoutEffect(() => {\r\n if (toolbarRef.current) {\r\n const computedStyle = window.getComputedStyle(toolbarRef.current);\r\n const width = parseFloat(computedStyle.width);\r\n setToolbarWidth(width);\r\n }\r\n }, [selectionRectCoords]);\r\n\r\n // TODO: LinkToolbar should not be a separate toolbar.\r\n // It should be a part of the InlineToolbar\r\n\r\n return (\r\n selectionRectCoords &&\r\n (isLinkToolbarVisible ? (\r\n <LinkToolbar\r\n style={{\r\n position: \"absolute\",\r\n top: toolbarPosition.y,\r\n left: toolbarPosition.x,\r\n width: toolbarWidth,\r\n }}\r\n closeToolbar={() => {\r\n setLinkToolbarVisible(false);\r\n setSelectionRectCoords(null);\r\n }}\r\n existingLinkURL={existingLinkURL}\r\n />\r\n ) : (\r\n <Toolbar\r\n style={{\r\n position: \"absolute\",\r\n top: toolbarPosition.y,\r\n left: toolbarPosition.x,\r\n }}\r\n aria-label=\"Text formatting\"\r\n id=\"inline-toolbar\"\r\n ref={toolbarRef}\r\n >\r\n <Group aria-label=\"Style\">\r\n <ToggleButton\r\n aria-label=\"Bold\"\r\n isSelected={toolbarState.isBold}\r\n isDisabled={\r\n toolbarState.isCode ||\r\n toolbarState.isHeadingOne ||\r\n toolbarState.isHeadingTwo ||\r\n toolbarState.isHeadingThree\r\n }\r\n onChange={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\r\n >\r\n <IconBold size={ICON_SIZE} />\r\n </ToggleButton>\r\n <ToggleButton\r\n aria-label=\"Italic\"\r\n isSelected={toolbarState.isItalic}\r\n isDisabled={toolbarState.isCode || toolbarState.isHeadingOne}\r\n onChange={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\r\n }\r\n >\r\n <IconItalic size={ICON_SIZE} />\r\n </ToggleButton>\r\n <ToggleButton\r\n aria-label=\"inline-code\"\r\n isDisabled={toolbarState.isHeadingOne}\r\n isSelected={toolbarState.isCode}\r\n onChange={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\r\n >\r\n <IconCode size={ICON_SIZE} />\r\n </ToggleButton>\r\n </Group>\r\n <Separator orientation=\"vertical\" />\r\n <Group aria-label=\"Text Blocks\">\r\n <ToggleButton\r\n aria-label=\"Heading\"\r\n isSelected={\r\n toolbarState.isHeadingOne ||\r\n toolbarState.isHeadingTwo ||\r\n toolbarState.isHeadingThree\r\n }\r\n onChange={() =>\r\n editor.dispatchCommand(TOGGLE_HEADING_COMMAND, toolbarState)\r\n }\r\n >\r\n <IconTextSize size={ICON_SIZE} />\r\n </ToggleButton>\r\n <ToggleButton\r\n aria-label=\"Quote\"\r\n isSelected={toolbarState.isQuote}\r\n onChange={() =>\r\n editor.dispatchCommand(TOGGLE_QUOTE_COMMAND, toolbarState)\r\n }\r\n >\r\n <IconBlockquote size={ICON_SIZE} />\r\n </ToggleButton>\r\n </Group>\r\n <Separator orientation=\"vertical\" />\r\n <Group aria-label=\"Links\">\r\n <Button\r\n onPress={() => setLinkToolbarVisible(true)}\r\n isDisabled={toolbarState.isHeadingOne}\r\n >\r\n <IconLink size={ICON_SIZE} />\r\n </Button>\r\n </Group>\r\n <div className=\"inline-toolbar-pointer\"></div>\r\n </Toolbar>\r\n ))\r\n );\r\n}\r\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n SELECTION_CHANGE_COMMAND,\n COMMAND_PRIORITY_HIGH,\n BLUR_COMMAND,\n} from \"lexical\";\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { $findMatchingParent } from \"@lexical/utils\";\n\nimport InlineToolbar from \"../components/InlineToolbar/InlineToolbar\";\nimport { $isMathNode } from \"../nodes/MathNode\";\nimport {\n $isMathHighlightNodeBlock,\n $isMathHighlightNodeInline,\n} from \"../nodes/MathHighlightNode\";\nimport { $isCodeNode } from \"@lexical/code\";\n\nconst DOM_ELEMENT = document.body;\n\nexport default function InlineToolbarPlugin() {\n const [shouldShow, setShouldShow] = useState(false);\n const [editor] = useLexicalComposerContext();\n\n // Hide the toolbar whenever the editor becomes non-editable\n useEffect(() => {\n return editor.registerEditableListener((editable) => {\n if (!editable) {\n setShouldShow(false);\n }\n });\n }, [editor]);\n\n // Listen for selection changes and show/hide the toolbar\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n if (!editor.isEditable()) {\n setShouldShow(false);\n return false;\n }\n\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection) || selection.isCollapsed()) {\n setShouldShow(false);\n return false;\n }\n\n // Get all selected nodes\n const nodes = selection.getNodes();\n\n // Don't show if any Math nodes are in the selection\n const hasMathNode = nodes.some((node) => $isMathNode(node));\n\n // Don't show if only one node is selected and it's a MathHighlightNode\n const isSingleMathHighlight =\n nodes.length === 1 &&\n ($isMathHighlightNodeInline(nodes[0]) ||\n $findMatchingParent(nodes[0], $isMathHighlightNodeBlock));\n\n const isCodeBlock = nodes.some((node) =>\n $findMatchingParent(node, $isCodeNode)\n );\n\n setShouldShow(!hasMathNode && !isSingleMathHighlight && !isCodeBlock);\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // Hide the toolbar when the editor loses focus\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n BLUR_COMMAND,\n () => {\n setTimeout(() => {\n const toolbar = document.getElementById(\"inline-toolbar\");\n const linkToolbar = document.getElementById(\"link-toolbar\");\n const activeElement = document.activeElement;\n\n if (\n (toolbar &&\n (toolbar === activeElement || toolbar.contains(activeElement))) ||\n (linkToolbar &&\n (linkToolbar === activeElement ||\n linkToolbar.contains(activeElement)))\n ) {\n return;\n }\n\n setShouldShow(false);\n }, 0);\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return (\n shouldShow && createPortal(<InlineToolbar editor={editor} />, DOM_ELEMENT)\n );\n}\n","\n/* **********************************************\n Begin prism-core.js\n********************************************** */\n\n/// <reference lib=\"WebWorker\"/>\n\nvar _self = (typeof window !== 'undefined')\n\t? window // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t\t? self // if in worker\n\t\t\t: {} // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n *\n * @license MIT <https://opensource.org/licenses/MIT>\n * @author Lea Verou <https://lea.verou.me>\n * @namespace\n * @public\n */\nvar Prism = (function (_self) {\n\n\t// Private helper vars\n\tvar lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n\tvar uniqueId = 0;\n\n\t// The grammar object for plaintext\n\tvar plainTextGrammar = {};\n\n\n\tvar _ = {\n\t\t/**\n\t\t * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the\n\t\t * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load\n\t\t * additional languages or plugins yourself.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.\n\t\t *\n\t\t * You obviously have to change this value before the automatic highlighting started. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.manual = true;\n\t\t * // add a new <script> to load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tmanual: _self.Prism && _self.Prism.manual,\n\t\t/**\n\t\t * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses\n\t\t * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your\n\t\t * own worker, you don't want it to do this.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not add its own listeners to the worker.\n\t\t *\n\t\t * You obviously have to change this value before Prism executes. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.disableWorkerMessageHandler = true;\n\t\t * // Load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tdisableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n\n\t\t/**\n\t\t * A namespace for utility methods.\n\t\t *\n\t\t * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may\n\t\t * change or disappear at any time.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t */\n\t\tutil: {\n\t\t\tencode: function encode(tokens) {\n\t\t\t\tif (tokens instanceof Token) {\n\t\t\t\t\treturn new Token(tokens.type, encode(tokens.content), tokens.alias);\n\t\t\t\t} else if (Array.isArray(tokens)) {\n\t\t\t\t\treturn tokens.map(encode);\n\t\t\t\t} else {\n\t\t\t\t\treturn tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\\u00a0/g, ' ');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the name of the type of the given value.\n\t\t\t *\n\t\t\t * @param {any} o\n\t\t\t * @returns {string}\n\t\t\t * @example\n\t\t\t * type(null) === 'Null'\n\t\t\t * type(undefined) === 'Undefined'\n\t\t\t * type(123) === 'Number'\n\t\t\t * type('foo') === 'String'\n\t\t\t * type(true) === 'Boolean'\n\t\t\t * type([1, 2]) === 'Array'\n\t\t\t * type({}) === 'Object'\n\t\t\t * type(String) === 'Function'\n\t\t\t * type(/abc+/) === 'RegExp'\n\t\t\t */\n\t\t\ttype: function (o) {\n\t\t\t\treturn Object.prototype.toString.call(o).slice(8, -1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns a unique number for the given object. Later calls will still return the same number.\n\t\t\t *\n\t\t\t * @param {Object} obj\n\t\t\t * @returns {number}\n\t\t\t */\n\t\t\tobjId: function (obj) {\n\t\t\t\tif (!obj['__id']) {\n\t\t\t\t\tObject.defineProperty(obj, '__id', { value: ++uniqueId });\n\t\t\t\t}\n\t\t\t\treturn obj['__id'];\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Creates a deep clone of the given object.\n\t\t\t *\n\t\t\t * The main intended use of this function is to clone language definitions.\n\t\t\t *\n\t\t\t * @param {T} o\n\t\t\t * @param {Record<number, any>} [visited]\n\t\t\t * @returns {T}\n\t\t\t * @template T\n\t\t\t */\n\t\t\tclone: function deepClone(o, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar clone; var id;\n\t\t\t\tswitch (_.util.type(o)) {\n\t\t\t\t\tcase 'Object':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = /** @type {Record<string, any>} */ ({});\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\tfor (var key in o) {\n\t\t\t\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tclone[key] = deepClone(o[key], visited);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tcase 'Array':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\t(/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {\n\t\t\t\t\t\t\tclone[i] = deepClone(v, visited);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn o;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.\n\t\t\t *\n\t\t\t * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tgetLanguage: function (element) {\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar m = lang.exec(element.className);\n\t\t\t\t\tif (m) {\n\t\t\t\t\t\treturn m[1].toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn 'none';\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Sets the Prism `language-xxxx` class of the given element.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} language\n\t\t\t * @returns {void}\n\t\t\t */\n\t\t\tsetLanguage: function (element, language) {\n\t\t\t\t// remove all `language-xxxx` classes\n\t\t\t\t// (this might leave behind a leading space)\n\t\t\t\telement.className = element.className.replace(RegExp(lang, 'gi'), '');\n\n\t\t\t\t// add the new `language-xxxx` class\n\t\t\t\t// (using `classList` will automatically clean up spaces for us)\n\t\t\t\telement.classList.add('language-' + language);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the script element that is currently executing.\n\t\t\t *\n\t\t\t * This does __not__ work for line script element.\n\t\t\t *\n\t\t\t * @returns {HTMLScriptElement | null}\n\t\t\t */\n\t\t\tcurrentScript: function () {\n\t\t\t\tif (typeof document === 'undefined') {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) {\n\t\t\t\t\treturn /** @type {any} */ (document.currentScript);\n\t\t\t\t}\n\n\t\t\t\t// IE11 workaround\n\t\t\t\t// we'll get the src of the current script by parsing IE11's error stack trace\n\t\t\t\t// this will not work for inline scripts\n\n\t\t\t\ttry {\n\t\t\t\t\tthrow new Error();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Get file src url from stack. Specifically works with the format of stack traces in IE.\n\t\t\t\t\t// A stack will look like this:\n\t\t\t\t\t//\n\t\t\t\t\t// Error\n\t\t\t\t\t// at _.util.currentScript (http://localhost/components/prism-core.js:119:5)\n\t\t\t\t\t// at Global code (http://localhost/components/prism-core.js:606:1)\n\n\t\t\t\t\tvar src = (/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(err.stack) || [])[1];\n\t\t\t\t\tif (src) {\n\t\t\t\t\t\tvar scripts = document.getElementsByTagName('script');\n\t\t\t\t\t\tfor (var i in scripts) {\n\t\t\t\t\t\t\tif (scripts[i].src == src) {\n\t\t\t\t\t\t\t\treturn scripts[i];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns whether a given class is active for `element`.\n\t\t\t *\n\t\t\t * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated\n\t\t\t * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the\n\t\t\t * given class is just the given class with a `no-` prefix.\n\t\t\t *\n\t\t\t * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is\n\t\t\t * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its\n\t\t\t * ancestors have the given class or the negated version of it, then the default activation will be returned.\n\t\t\t *\n\t\t\t * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated\n\t\t\t * version of it, the class is considered active.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} className\n\t\t\t * @param {boolean} [defaultActivation=false]\n\t\t\t * @returns {boolean}\n\t\t\t */\n\t\t\tisActive: function (element, className, defaultActivation) {\n\t\t\t\tvar no = 'no-' + className;\n\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar classList = element.classList;\n\t\t\t\t\tif (classList.contains(className)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (classList.contains(no)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn !!defaultActivation;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tlanguages: {\n\t\t\t/**\n\t\t\t * The grammar for plain, unformatted text.\n\t\t\t */\n\t\t\tplain: plainTextGrammar,\n\t\t\tplaintext: plainTextGrammar,\n\t\t\ttext: plainTextGrammar,\n\t\t\ttxt: plainTextGrammar,\n\n\t\t\t/**\n\t\t\t * Creates a deep copy of the language with the given id and appends the given tokens.\n\t\t\t *\n\t\t\t * If a token in `redef` also appears in the copied language, then the existing token in the copied language\n\t\t\t * will be overwritten at its original position.\n\t\t\t *\n\t\t\t * ## Best practices\n\t\t\t *\n\t\t\t * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)\n\t\t\t * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to\n\t\t\t * understand the language definition because, normally, the order of tokens matters in Prism grammars.\n\t\t\t *\n\t\t\t * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.\n\t\t\t * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.\n\t\t\t *\n\t\t\t * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.\n\t\t\t * @param {Grammar} redef The new tokens to append.\n\t\t\t * @returns {Grammar} The new language created.\n\t\t\t * @public\n\t\t\t * @example\n\t\t\t * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {\n\t\t\t * // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token\n\t\t\t * // at its original position\n\t\t\t * 'comment': { ... },\n\t\t\t * // CSS doesn't have a 'color' token, so this token will be appended\n\t\t\t * 'color': /\\b(?:red|green|blue)\\b/\n\t\t\t * });\n\t\t\t */\n\t\t\textend: function (id, redef) {\n\t\t\t\tvar lang = _.util.clone(_.languages[id]);\n\n\t\t\t\tfor (var key in redef) {\n\t\t\t\t\tlang[key] = redef[key];\n\t\t\t\t}\n\n\t\t\t\treturn lang;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Inserts tokens _before_ another token in a language definition or any other grammar.\n\t\t\t *\n\t\t\t * ## Usage\n\t\t\t *\n\t\t\t * This helper method makes it easy to modify existing languages. For example, the CSS language definition\n\t\t\t * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded\n\t\t\t * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the\n\t\t\t * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do\n\t\t\t * this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.markup.style = {\n\t\t\t * // token\n\t\t\t * };\n\t\t\t * ```\n\t\t\t *\n\t\t\t * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens\n\t\t\t * before existing tokens. For the CSS example above, you would use it like this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'cdata', {\n\t\t\t * 'style': {\n\t\t\t * // token\n\t\t\t * }\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Special cases\n\t\t\t *\n\t\t\t * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar\n\t\t\t * will be ignored.\n\t\t\t *\n\t\t\t * This behavior can be used to insert tokens after `before`:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'comment', {\n\t\t\t * 'comment': Prism.languages.markup.comment,\n\t\t\t * // tokens after 'comment'\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Limitations\n\t\t\t *\n\t\t\t * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object\n\t\t\t * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave\n\t\t\t * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily\n\t\t\t * deleting properties which is necessary to insert at arbitrary positions.\n\t\t\t *\n\t\t\t * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.\n\t\t\t * Instead, it will create a new object and replace all references to the target object with the new one. This\n\t\t\t * can be done without temporarily deleting properties, so the iteration order is well-defined.\n\t\t\t *\n\t\t\t * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if\n\t\t\t * you hold the target object in a variable, then the value of the variable will not change.\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * var oldMarkup = Prism.languages.markup;\n\t\t\t * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });\n\t\t\t *\n\t\t\t * assert(oldMarkup !== Prism.languages.markup);\n\t\t\t * assert(newMarkup === Prism.languages.markup);\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the\n\t\t\t * object to be modified.\n\t\t\t * @param {string} before The key to insert before.\n\t\t\t * @param {Grammar} insert An object containing the key-value pairs to be inserted.\n\t\t\t * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the\n\t\t\t * object to be modified.\n\t\t\t *\n\t\t\t * Defaults to `Prism.languages`.\n\t\t\t * @returns {Grammar} The new grammar object.\n\t\t\t * @public\n\t\t\t */\n\t\t\tinsertBefore: function (inside, before, insert, root) {\n\t\t\t\troot = root || /** @type {any} */ (_.languages);\n\t\t\t\tvar grammar = root[inside];\n\t\t\t\t/** @type {Grammar} */\n\t\t\t\tvar ret = {};\n\n\t\t\t\tfor (var token in grammar) {\n\t\t\t\t\tif (grammar.hasOwnProperty(token)) {\n\n\t\t\t\t\t\tif (token == before) {\n\t\t\t\t\t\t\tfor (var newToken in insert) {\n\t\t\t\t\t\t\t\tif (insert.hasOwnProperty(newToken)) {\n\t\t\t\t\t\t\t\t\tret[newToken] = insert[newToken];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Do not insert token which also occur in insert. See #1525\n\t\t\t\t\t\tif (!insert.hasOwnProperty(token)) {\n\t\t\t\t\t\t\tret[token] = grammar[token];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar old = root[inside];\n\t\t\t\troot[inside] = ret;\n\n\t\t\t\t// Update references in other language definitions\n\t\t\t\t_.languages.DFS(_.languages, function (key, value) {\n\t\t\t\t\tif (value === old && key != inside) {\n\t\t\t\t\t\tthis[key] = ret;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t},\n\n\t\t\t// Traverse a language definition with Depth First Search\n\t\t\tDFS: function DFS(o, callback, type, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar objId = _.util.objId;\n\n\t\t\t\tfor (var i in o) {\n\t\t\t\t\tif (o.hasOwnProperty(i)) {\n\t\t\t\t\t\tcallback.call(o, i, o[i], type || i);\n\n\t\t\t\t\t\tvar property = o[i];\n\t\t\t\t\t\tvar propertyType = _.util.type(property);\n\n\t\t\t\t\t\tif (propertyType === 'Object' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, null, visited);\n\t\t\t\t\t\t} else if (propertyType === 'Array' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, i, visited);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tplugins: {},\n\n\t\t/**\n\t\t * This is the most high-level function in Prism’s API.\n\t\t * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on\n\t\t * each one of them.\n\t\t *\n\t\t * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.\n\t\t *\n\t\t * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAll: function (async, callback) {\n\t\t\t_.highlightAllUnder(document, async, callback);\n\t\t},\n\n\t\t/**\n\t\t * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls\n\t\t * {@link Prism.highlightElement} on each one of them.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-highlightall`\n\t\t * 2. `before-all-elements-highlight`\n\t\t * 3. All hooks of {@link Prism.highlightElement} for each element.\n\t\t *\n\t\t * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.\n\t\t * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAllUnder: function (container, async, callback) {\n\t\t\tvar env = {\n\t\t\t\tcallback: callback,\n\t\t\t\tcontainer: container,\n\t\t\t\tselector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n\t\t\t};\n\n\t\t\t_.hooks.run('before-highlightall', env);\n\n\t\t\tenv.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));\n\n\t\t\t_.hooks.run('before-all-elements-highlight', env);\n\n\t\t\tfor (var i = 0, element; (element = env.elements[i++]);) {\n\t\t\t\t_.highlightElement(element, async === true, env.callback);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Highlights the code inside a single element.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-sanity-check`\n\t\t * 2. `before-highlight`\n\t\t * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.\n\t\t * 4. `before-insert`\n\t\t * 5. `after-highlight`\n\t\t * 6. `complete`\n\t\t *\n\t\t * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for\n\t\t * the element's language.\n\t\t *\n\t\t * @param {Element} element The element containing the code.\n\t\t * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.\n\t\t * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers\n\t\t * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is\n\t\t * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).\n\t\t *\n\t\t * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for\n\t\t * asynchronous highlighting to work. You can build your own bundle on the\n\t\t * [Download page](https://prismjs.com/download.html).\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.\n\t\t * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightElement: function (element, async, callback) {\n\t\t\t// Find language\n\t\t\tvar language = _.util.getLanguage(element);\n\t\t\tvar grammar = _.languages[language];\n\n\t\t\t// Set language on the element, if not present\n\t\t\t_.util.setLanguage(element, language);\n\n\t\t\t// Set language on the parent, for styling\n\t\t\tvar parent = element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre') {\n\t\t\t\t_.util.setLanguage(parent, language);\n\t\t\t}\n\n\t\t\tvar code = element.textContent;\n\n\t\t\tvar env = {\n\t\t\t\telement: element,\n\t\t\t\tlanguage: language,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tcode: code\n\t\t\t};\n\n\t\t\tfunction insertHighlightedCode(highlightedCode) {\n\t\t\t\tenv.highlightedCode = highlightedCode;\n\n\t\t\t\t_.hooks.run('before-insert', env);\n\n\t\t\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\t\t\t_.hooks.run('after-highlight', env);\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t}\n\n\t\t\t_.hooks.run('before-sanity-check', env);\n\n\t\t\t// plugins may change/add the parent/element\n\t\t\tparent = env.element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {\n\t\t\t\tparent.setAttribute('tabindex', '0');\n\t\t\t}\n\n\t\t\tif (!env.code) {\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_.hooks.run('before-highlight', env);\n\n\t\t\tif (!env.grammar) {\n\t\t\t\tinsertHighlightedCode(_.util.encode(env.code));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (async && _self.Worker) {\n\t\t\t\tvar worker = new Worker(_.filename);\n\n\t\t\t\tworker.onmessage = function (evt) {\n\t\t\t\t\tinsertHighlightedCode(evt.data);\n\t\t\t\t};\n\n\t\t\t\tworker.postMessage(JSON.stringify({\n\t\t\t\t\tlanguage: env.language,\n\t\t\t\t\tcode: env.code,\n\t\t\t\t\timmediateClose: true\n\t\t\t\t}));\n\t\t\t} else {\n\t\t\t\tinsertHighlightedCode(_.highlight(env.code, env.grammar, env.language));\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Low-level function, only use if you know what you’re doing. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns a string with the HTML produced.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-tokenize`\n\t\t * 2. `after-tokenize`\n\t\t * 3. `wrap`: On each {@link Token}.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @param {string} language The name of the language definition passed to `grammar`.\n\t\t * @returns {string} The highlighted HTML.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');\n\t\t */\n\t\thighlight: function (text, grammar, language) {\n\t\t\tvar env = {\n\t\t\t\tcode: text,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tlanguage: language\n\t\t\t};\n\t\t\t_.hooks.run('before-tokenize', env);\n\t\t\tif (!env.grammar) {\n\t\t\t\tthrow new Error('The language \"' + env.language + '\" has no grammar.');\n\t\t\t}\n\t\t\tenv.tokens = _.tokenize(env.code, env.grammar);\n\t\t\t_.hooks.run('after-tokenize', env);\n\t\t\treturn Token.stringify(_.util.encode(env.tokens), env.language);\n\t\t},\n\n\t\t/**\n\t\t * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns an array with the tokenized code.\n\t\t *\n\t\t * When the language definition includes nested tokens, the function is called recursively on each of these tokens.\n\t\t *\n\t\t * This method could be useful in other contexts as well, as a very crude parser.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @returns {TokenStream} An array of strings and tokens, a token stream.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * let code = `var foo = 0;`;\n\t\t * let tokens = Prism.tokenize(code, Prism.languages.javascript);\n\t\t * tokens.forEach(token => {\n\t\t * if (token instanceof Prism.Token && token.type === 'number') {\n\t\t * console.log(`Found numeric literal: ${token.content}`);\n\t\t * }\n\t\t * });\n\t\t */\n\t\ttokenize: function (text, grammar) {\n\t\t\tvar rest = grammar.rest;\n\t\t\tif (rest) {\n\t\t\t\tfor (var token in rest) {\n\t\t\t\t\tgrammar[token] = rest[token];\n\t\t\t\t}\n\n\t\t\t\tdelete grammar.rest;\n\t\t\t}\n\n\t\t\tvar tokenList = new LinkedList();\n\t\t\taddAfter(tokenList, tokenList.head, text);\n\n\t\t\tmatchGrammar(text, tokenList, grammar, tokenList.head, 0);\n\n\t\t\treturn toArray(tokenList);\n\t\t},\n\n\t\t/**\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thooks: {\n\t\t\tall: {},\n\n\t\t\t/**\n\t\t\t * Adds the given callback to the list of callbacks for the given hook.\n\t\t\t *\n\t\t\t * The callback will be invoked when the hook it is registered for is run.\n\t\t\t * Hooks are usually directly run by a highlight function but you can also run hooks yourself.\n\t\t\t *\n\t\t\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {HookCallback} callback The callback function which is given environment variables.\n\t\t\t * @public\n\t\t\t */\n\t\t\tadd: function (name, callback) {\n\t\t\t\tvar hooks = _.hooks.all;\n\n\t\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\t\thooks[name].push(callback);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t\t\t *\n\t\t\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.\n\t\t\t * @public\n\t\t\t */\n\t\t\trun: function (name, env) {\n\t\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0, callback; (callback = callbacks[i++]);) {\n\t\t\t\t\tcallback(env);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tToken: Token\n\t};\n\t_self.Prism = _;\n\n\n\t// Typescript note:\n\t// The following can be used to import the Token type in JSDoc:\n\t//\n\t// @typedef {InstanceType<import(\"./prism-core\")[\"Token\"]>} Token\n\n\t/**\n\t * Creates a new token.\n\t *\n\t * @param {string} type See {@link Token#type type}\n\t * @param {string | TokenStream} content See {@link Token#content content}\n\t * @param {string|string[]} [alias] The alias(es) of the token.\n\t * @param {string} [matchedStr=\"\"] A copy of the full string this token was created from.\n\t * @class\n\t * @global\n\t * @public\n\t */\n\tfunction Token(type, content, alias, matchedStr) {\n\t\t/**\n\t\t * The type of the token.\n\t\t *\n\t\t * This is usually the key of a pattern in a {@link Grammar}.\n\t\t *\n\t\t * @type {string}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.type = type;\n\t\t/**\n\t\t * The strings or tokens contained by this token.\n\t\t *\n\t\t * This will be a token stream if the pattern matched also defined an `inside` grammar.\n\t\t *\n\t\t * @type {string | TokenStream}\n\t\t * @public\n\t\t */\n\t\tthis.content = content;\n\t\t/**\n\t\t * The alias(es) of the token.\n\t\t *\n\t\t * @type {string|string[]}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.alias = alias;\n\t\t// Copy of the full string this token was created from\n\t\tthis.length = (matchedStr || '').length | 0;\n\t}\n\n\t/**\n\t * A token stream is an array of strings and {@link Token Token} objects.\n\t *\n\t * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process\n\t * them.\n\t *\n\t * 1. No adjacent strings.\n\t * 2. No empty strings.\n\t *\n\t * The only exception here is the token stream that only contains the empty string and nothing else.\n\t *\n\t * @typedef {Array<string | Token>} TokenStream\n\t * @global\n\t * @public\n\t */\n\n\t/**\n\t * Converts the given token or token stream to an HTML representation.\n\t *\n\t * The following hooks will be run:\n\t * 1. `wrap`: On each {@link Token}.\n\t *\n\t * @param {string | Token | TokenStream} o The token or token stream to be converted.\n\t * @param {string} language The name of current language.\n\t * @returns {string} The HTML representation of the token or token stream.\n\t * @memberof Token\n\t * @static\n\t */\n\tToken.stringify = function stringify(o, language) {\n\t\tif (typeof o == 'string') {\n\t\t\treturn o;\n\t\t}\n\t\tif (Array.isArray(o)) {\n\t\t\tvar s = '';\n\t\t\to.forEach(function (e) {\n\t\t\t\ts += stringify(e, language);\n\t\t\t});\n\t\t\treturn s;\n\t\t}\n\n\t\tvar env = {\n\t\t\ttype: o.type,\n\t\t\tcontent: stringify(o.content, language),\n\t\t\ttag: 'span',\n\t\t\tclasses: ['token', o.type],\n\t\t\tattributes: {},\n\t\t\tlanguage: language\n\t\t};\n\n\t\tvar aliases = o.alias;\n\t\tif (aliases) {\n\t\t\tif (Array.isArray(aliases)) {\n\t\t\t\tArray.prototype.push.apply(env.classes, aliases);\n\t\t\t} else {\n\t\t\t\tenv.classes.push(aliases);\n\t\t\t}\n\t\t}\n\n\t\t_.hooks.run('wrap', env);\n\n\t\tvar attributes = '';\n\t\tfor (var name in env.attributes) {\n\t\t\tattributes += ' ' + name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n\t\t}\n\n\t\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + attributes + '>' + env.content + '</' + env.tag + '>';\n\t};\n\n\t/**\n\t * @param {RegExp} pattern\n\t * @param {number} pos\n\t * @param {string} text\n\t * @param {boolean} lookbehind\n\t * @returns {RegExpExecArray | null}\n\t */\n\tfunction matchPattern(pattern, pos, text, lookbehind) {\n\t\tpattern.lastIndex = pos;\n\t\tvar match = pattern.exec(text);\n\t\tif (match && lookbehind && match[1]) {\n\t\t\t// change the match to remove the text matched by the Prism lookbehind group\n\t\t\tvar lookbehindLength = match[1].length;\n\t\t\tmatch.index += lookbehindLength;\n\t\t\tmatch[0] = match[0].slice(lookbehindLength);\n\t\t}\n\t\treturn match;\n\t}\n\n\t/**\n\t * @param {string} text\n\t * @param {LinkedList<string | Token>} tokenList\n\t * @param {any} grammar\n\t * @param {LinkedListNode<string | Token>} startNode\n\t * @param {number} startPos\n\t * @param {RematchOptions} [rematch]\n\t * @returns {void}\n\t * @private\n\t *\n\t * @typedef RematchOptions\n\t * @property {string} cause\n\t * @property {number} reach\n\t */\n\tfunction matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {\n\t\tfor (var token in grammar) {\n\t\t\tif (!grammar.hasOwnProperty(token) || !grammar[token]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar patterns = grammar[token];\n\t\t\tpatterns = Array.isArray(patterns) ? patterns : [patterns];\n\n\t\t\tfor (var j = 0; j < patterns.length; ++j) {\n\t\t\t\tif (rematch && rematch.cause == token + ',' + j) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar patternObj = patterns[j];\n\t\t\t\tvar inside = patternObj.inside;\n\t\t\t\tvar lookbehind = !!patternObj.lookbehind;\n\t\t\t\tvar greedy = !!patternObj.greedy;\n\t\t\t\tvar alias = patternObj.alias;\n\n\t\t\t\tif (greedy && !patternObj.pattern.global) {\n\t\t\t\t\t// Without the global flag, lastIndex won't work\n\t\t\t\t\tvar flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];\n\t\t\t\t\tpatternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');\n\t\t\t\t}\n\n\t\t\t\t/** @type {RegExp} */\n\t\t\t\tvar pattern = patternObj.pattern || patternObj;\n\n\t\t\t\tfor ( // iterate the token list and keep track of the current token/string position\n\t\t\t\t\tvar currentNode = startNode.next, pos = startPos;\n\t\t\t\t\tcurrentNode !== tokenList.tail;\n\t\t\t\t\tpos += currentNode.value.length, currentNode = currentNode.next\n\t\t\t\t) {\n\n\t\t\t\t\tif (rematch && pos >= rematch.reach) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar str = currentNode.value;\n\n\t\t\t\t\tif (tokenList.length > text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeCount = 1; // this is the to parameter of removeBetween\n\t\t\t\t\tvar match;\n\n\t\t\t\t\tif (greedy) {\n\t\t\t\t\t\tmatch = matchPattern(pattern, pos, text, lookbehind);\n\t\t\t\t\t\tif (!match || match.index >= text.length) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index;\n\t\t\t\t\t\tvar to = match.index + match[0].length;\n\t\t\t\t\t\tvar p = pos;\n\n\t\t\t\t\t\t// find the node that contains the match\n\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\twhile (from >= p) {\n\t\t\t\t\t\t\tcurrentNode = currentNode.next;\n\t\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// adjust pos (and p)\n\t\t\t\t\t\tp -= currentNode.value.length;\n\t\t\t\t\t\tpos = p;\n\n\t\t\t\t\t\t// the current node is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\tif (currentNode.value instanceof Token) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find the last node which is affected by this match\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tvar k = currentNode;\n\t\t\t\t\t\t\tk !== tokenList.tail && (p < to || typeof k.value === 'string');\n\t\t\t\t\t\t\tk = k.next\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tremoveCount++;\n\t\t\t\t\t\t\tp += k.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremoveCount--;\n\n\t\t\t\t\t\t// replace with the new match\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatch = matchPattern(pattern, 0, str, lookbehind);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line no-redeclare\n\t\t\t\t\tvar from = match.index;\n\t\t\t\t\tvar matchStr = match[0];\n\t\t\t\t\tvar before = str.slice(0, from);\n\t\t\t\t\tvar after = str.slice(from + matchStr.length);\n\n\t\t\t\t\tvar reach = pos + str.length;\n\t\t\t\t\tif (rematch && reach > rematch.reach) {\n\t\t\t\t\t\trematch.reach = reach;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeFrom = currentNode.prev;\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\tremoveFrom = addAfter(tokenList, removeFrom, before);\n\t\t\t\t\t\tpos += before.length;\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveRange(tokenList, removeFrom, removeCount);\n\n\t\t\t\t\tvar wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);\n\t\t\t\t\tcurrentNode = addAfter(tokenList, removeFrom, wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\taddAfter(tokenList, currentNode, after);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (removeCount > 1) {\n\t\t\t\t\t\t// at least one Token object was removed, so we have to do some rematching\n\t\t\t\t\t\t// this can only happen if the current pattern is greedy\n\n\t\t\t\t\t\t/** @type {RematchOptions} */\n\t\t\t\t\t\tvar nestedRematch = {\n\t\t\t\t\t\t\tcause: token + ',' + j,\n\t\t\t\t\t\t\treach: reach\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmatchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);\n\n\t\t\t\t\t\t// the reach might have been extended because of the rematching\n\t\t\t\t\t\tif (rematch && nestedRematch.reach > rematch.reach) {\n\t\t\t\t\t\t\trematch.reach = nestedRematch.reach;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @typedef LinkedListNode\n\t * @property {T} value\n\t * @property {LinkedListNode<T> | null} prev The previous node.\n\t * @property {LinkedListNode<T> | null} next The next node.\n\t * @template T\n\t * @private\n\t */\n\n\t/**\n\t * @template T\n\t * @private\n\t */\n\tfunction LinkedList() {\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar head = { value: null, prev: null, next: null };\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar tail = { value: null, prev: head, next: null };\n\t\thead.next = tail;\n\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.head = head;\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.tail = tail;\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * Adds a new node with the given value to the list.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {T} value\n\t * @returns {LinkedListNode<T>} The added node.\n\t * @template T\n\t */\n\tfunction addAfter(list, node, value) {\n\t\t// assumes that node != list.tail && values.length >= 0\n\t\tvar next = node.next;\n\n\t\tvar newNode = { value: value, prev: node, next: next };\n\t\tnode.next = newNode;\n\t\tnext.prev = newNode;\n\t\tlist.length++;\n\n\t\treturn newNode;\n\t}\n\t/**\n\t * Removes `count` nodes after the given node. The given node will not be removed.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {number} count\n\t * @template T\n\t */\n\tfunction removeRange(list, node, count) {\n\t\tvar next = node.next;\n\t\tfor (var i = 0; i < count && next !== list.tail; i++) {\n\t\t\tnext = next.next;\n\t\t}\n\t\tnode.next = next;\n\t\tnext.prev = node;\n\t\tlist.length -= i;\n\t}\n\t/**\n\t * @param {LinkedList<T>} list\n\t * @returns {T[]}\n\t * @template T\n\t */\n\tfunction toArray(list) {\n\t\tvar array = [];\n\t\tvar node = list.head.next;\n\t\twhile (node !== list.tail) {\n\t\t\tarray.push(node.value);\n\t\t\tnode = node.next;\n\t\t}\n\t\treturn array;\n\t}\n\n\n\tif (!_self.document) {\n\t\tif (!_self.addEventListener) {\n\t\t\t// in Node.js\n\t\t\treturn _;\n\t\t}\n\n\t\tif (!_.disableWorkerMessageHandler) {\n\t\t\t// In worker\n\t\t\t_self.addEventListener('message', function (evt) {\n\t\t\t\tvar message = JSON.parse(evt.data);\n\t\t\t\tvar lang = message.language;\n\t\t\t\tvar code = message.code;\n\t\t\t\tvar immediateClose = message.immediateClose;\n\n\t\t\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\t\t\tif (immediateClose) {\n\t\t\t\t\t_self.close();\n\t\t\t\t}\n\t\t\t}, false);\n\t\t}\n\n\t\treturn _;\n\t}\n\n\t// Get current script and highlight\n\tvar script = _.util.currentScript();\n\n\tif (script) {\n\t\t_.filename = script.src;\n\n\t\tif (script.hasAttribute('data-manual')) {\n\t\t\t_.manual = true;\n\t\t}\n\t}\n\n\tfunction highlightAutomaticallyCallback() {\n\t\tif (!_.manual) {\n\t\t\t_.highlightAll();\n\t\t}\n\t}\n\n\tif (!_.manual) {\n\t\t// If the document state is \"loading\", then we'll use DOMContentLoaded.\n\t\t// If the document state is \"interactive\" and the prism.js script is deferred, then we'll also use the\n\t\t// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they\n\t\t// might take longer one animation frame to execute which can create a race condition where only some plugins have\n\t\t// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.\n\t\t// See https://github.com/PrismJS/prism/issues/2102\n\t\tvar readyState = document.readyState;\n\t\tif (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {\n\t\t\tdocument.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);\n\t\t} else {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(highlightAutomaticallyCallback);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(highlightAutomaticallyCallback, 16);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn _;\n\n}(_self));\n\nif (typeof module !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof global !== 'undefined') {\n\tglobal.Prism = Prism;\n}\n\n// some additional documentation/types\n\n/**\n * The expansion of a simple `RegExp` literal to support additional properties.\n *\n * @typedef GrammarToken\n * @property {RegExp} pattern The regular expression of the token.\n * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)\n * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.\n * @property {boolean} [greedy=false] Whether the token is greedy.\n * @property {string|string[]} [alias] An optional alias or list of aliases.\n * @property {Grammar} [inside] The nested grammar of this token.\n *\n * The `inside` grammar will be used to tokenize the text value of each token of this kind.\n *\n * This can be used to make nested and even recursive language definitions.\n *\n * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into\n * each another.\n * @global\n * @public\n */\n\n/**\n * @typedef Grammar\n * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}\n * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.\n * @global\n * @public\n */\n\n/**\n * A function which will invoked after an element was successfully highlighted.\n *\n * @callback HighlightCallback\n * @param {Element} element The element successfully highlighted.\n * @returns {void}\n * @global\n * @public\n */\n\n/**\n * @callback HookCallback\n * @param {Object<string, any>} env The environment variables of the hook.\n * @returns {void}\n * @global\n * @public\n */\n\n\n/* **********************************************\n Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': {\n\t\tpattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/,\n\t\tgreedy: true\n\t},\n\t'prolog': {\n\t\tpattern: /<\\?[\\s\\S]+?\\?>/,\n\t\tgreedy: true\n\t},\n\t'doctype': {\n\t\t// https://www.w3.org/TR/xml/#NT-doctypedecl\n\t\tpattern: /<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'internal-subset': {\n\t\t\t\tpattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: null // see below\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\tgreedy: true\n\t\t\t},\n\t\t\t'punctuation': /^<!|>$|[[\\]]/,\n\t\t\t'doctype-tag': /^DOCTYPE/i,\n\t\t\t'name': /[^\\s<>'\"]+/\n\t\t}\n\t},\n\t'cdata': {\n\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\tgreedy: true\n\t},\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'special-attr': [],\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': [\n\t\t{\n\t\t\tpattern: /&[\\da-z]{1,8};/i,\n\t\t\talias: 'named-entity'\n\t\t},\n\t\t/&#x?[\\da-f]{1,8};/i\n\t]\n};\n\nPrism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n\tPrism.languages.markup['entity'];\nPrism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function (env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t}\n});\n\nObject.defineProperty(Prism.languages.markup.tag, 'addInlined', {\n\t/**\n\t * Adds an inlined language to markup.\n\t *\n\t * An example of an inlined language is CSS with `<style>` tags.\n\t *\n\t * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addInlined('style', 'css');\n\t */\n\tvalue: function addInlined(tagName, lang) {\n\t\tvar includedCdataInside = {};\n\t\tincludedCdataInside['language-' + lang] = {\n\t\t\tpattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\t\tincludedCdataInside['cdata'] = /^<!\\[CDATA\\[|\\]\\]>$/i;\n\n\t\tvar inside = {\n\t\t\t'included-cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tinside: includedCdataInside\n\t\t\t}\n\t\t};\n\t\tinside['language-' + lang] = {\n\t\t\tpattern: /[\\s\\S]+/,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\n\t\tvar def = {};\n\t\tdef[tagName] = {\n\t\t\tpattern: RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: inside\n\t\t};\n\n\t\tPrism.languages.insertBefore('markup', 'cdata', def);\n\t}\n});\nObject.defineProperty(Prism.languages.markup.tag, 'addAttribute', {\n\t/**\n\t * Adds an pattern to highlight languages embedded in HTML attributes.\n\t *\n\t * An example of an inlined language is CSS with `style` attributes.\n\t *\n\t * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addAttribute('style', 'css');\n\t */\n\tvalue: function (attrName, lang) {\n\t\tPrism.languages.markup.tag.inside['special-attr'].push({\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|[\"'\\s])/.source + '(?:' + attrName + ')' + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'attr-name': /^[^\\s=]+/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'value': {\n\t\t\t\t\t\t\tpattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: [lang, 'language-' + lang],\n\t\t\t\t\t\t\tinside: Prism.languages[lang]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/\"|'/\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\nPrism.languages.xml = Prism.languages.extend('markup', {});\nPrism.languages.ssml = Prism.languages.xml;\nPrism.languages.atom = Prism.languages.xml;\nPrism.languages.rss = Prism.languages.xml;\n\n\n/* **********************************************\n Begin prism-css.js\n********************************************** */\n\n(function (Prism) {\n\n\tvar string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\tPrism.languages.css = {\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'atrule': {\n\t\t\tpattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n\t\t\tinside: {\n\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t'selector-function-argument': {\n\t\t\t\t\tpattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector'\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t\t// See rest below\n\t\t\t}\n\t\t},\n\t\t'url': {\n\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\tpattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^url/i,\n\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\talias: 'url'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'selector': {\n\t\t\tpattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': {\n\t\t\tpattern: string,\n\t\t\tgreedy: true\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'important': /!important\\b/i,\n\t\t'function': {\n\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'punctuation': /[(){};:,]/\n\t};\n\n\tPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\n\tvar markup = Prism.languages.markup;\n\tif (markup) {\n\t\tmarkup.tag.addInlined('style', 'css');\n\t\tmarkup.tag.addAttribute('style', 'css');\n\t}\n\n}(Prism));\n\n\n/* **********************************************\n Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\t'punctuation': /[.\\\\]/\n\t\t}\n\t},\n\t'keyword': /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n\t'boolean': /\\b(?:false|true)\\b/,\n\t'function': /\\b\\w+(?=\\()/,\n\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'number': {\n\t\tpattern: RegExp(\n\t\t\t/(^|[^\\w$])/.source +\n\t\t\t'(?:' +\n\t\t\t(\n\t\t\t\t// constant\n\t\t\t\t/NaN|Infinity/.source +\n\t\t\t\t'|' +\n\t\t\t\t// binary integer\n\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// octal integer\n\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// hexadecimal integer\n\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal bigint\n\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source\n\t\t\t) +\n\t\t\t')' +\n\t\t\t/(?![\\w$])/.source\n\t\t),\n\t\tlookbehind: true\n\t},\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: RegExp(\n\t\t\t// lookbehind\n\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t// Regex pattern:\n\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t/\\//.source +\n\t\t\t'(?:' +\n\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source +\n\t\t\t'|' +\n\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +\n\t\t\t')' +\n\t\t\t// lookahead\n\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'regex-source': {\n\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-regex',\n\t\t\t\tinside: Prism.languages.regex\n\t\t\t},\n\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t}\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'hashbang': {\n\t\tpattern: /^#!.*/,\n\t\tgreedy: true,\n\t\talias: 'comment'\n\t},\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'string-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'property'\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'operator', {\n\t'literal-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\talias: 'property'\n\t},\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n\n\t// add attribute support for all DOM events.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\tPrism.languages.markup.tag.addAttribute(\n\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n\t\t'javascript'\n\t);\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n\n/* **********************************************\n Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill\n\tif (!Element.prototype.matches) {\n\t\tElement.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\t}\n\n\tvar LOADING_MESSAGE = 'Loading…';\n\tvar FAILURE_MESSAGE = function (status, message) {\n\t\treturn '✖ Error ' + status + ' while fetching file: ' + message;\n\t};\n\tvar FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';\n\n\tvar EXTENSIONS = {\n\t\t'js': 'javascript',\n\t\t'py': 'python',\n\t\t'rb': 'ruby',\n\t\t'ps1': 'powershell',\n\t\t'psm1': 'powershell',\n\t\t'sh': 'bash',\n\t\t'bat': 'batch',\n\t\t'h': 'c',\n\t\t'tex': 'latex'\n\t};\n\n\tvar STATUS_ATTR = 'data-src-status';\n\tvar STATUS_LOADING = 'loading';\n\tvar STATUS_LOADED = 'loaded';\n\tvar STATUS_FAILED = 'failed';\n\n\tvar SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '=\"' + STATUS_LOADED + '\"])'\n\t\t+ ':not([' + STATUS_ATTR + '=\"' + STATUS_LOADING + '\"])';\n\n\t/**\n\t * Loads the given file.\n\t *\n\t * @param {string} src The URL or path of the source file to load.\n\t * @param {(result: string) => void} success\n\t * @param {(reason: string) => void} error\n\t */\n\tfunction loadFile(src, success, error) {\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('GET', src, true);\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState == 4) {\n\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\tsuccess(xhr.responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (xhr.status >= 400) {\n\t\t\t\t\t\terror(FAILURE_MESSAGE(xhr.status, xhr.statusText));\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror(FAILURE_EMPTY_MESSAGE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\t/**\n\t * Parses the given range.\n\t *\n\t * This returns a range with inclusive ends.\n\t *\n\t * @param {string | null | undefined} range\n\t * @returns {[number, number | undefined] | undefined}\n\t */\n\tfunction parseRange(range) {\n\t\tvar m = /^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(range || '');\n\t\tif (m) {\n\t\t\tvar start = Number(m[1]);\n\t\t\tvar comma = m[2];\n\t\t\tvar end = m[3];\n\n\t\t\tif (!comma) {\n\t\t\t\treturn [start, start];\n\t\t\t}\n\t\t\tif (!end) {\n\t\t\t\treturn [start, undefined];\n\t\t\t}\n\t\t\treturn [start, Number(end)];\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tPrism.hooks.add('before-highlightall', function (env) {\n\t\tenv.selector += ', ' + SELECTOR;\n\t});\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tvar pre = /** @type {HTMLPreElement} */ (env.element);\n\t\tif (pre.matches(SELECTOR)) {\n\t\t\tenv.code = ''; // fast-path the whole thing and go to complete\n\n\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading\n\n\t\t\t// add code element with loading message\n\t\t\tvar code = pre.appendChild(document.createElement('CODE'));\n\t\t\tcode.textContent = LOADING_MESSAGE;\n\n\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\tvar language = env.language;\n\t\t\tif (language === 'none') {\n\t\t\t\t// the language might be 'none' because there is no language set;\n\t\t\t\t// in this case, we want to use the extension as the language\n\t\t\t\tvar extension = (/\\.(\\w+)$/.exec(src) || [, 'none'])[1];\n\t\t\t\tlanguage = EXTENSIONS[extension] || extension;\n\t\t\t}\n\n\t\t\t// set language classes\n\t\t\tPrism.util.setLanguage(code, language);\n\t\t\tPrism.util.setLanguage(pre, language);\n\n\t\t\t// preload the language\n\t\t\tvar autoloader = Prism.plugins.autoloader;\n\t\t\tif (autoloader) {\n\t\t\t\tautoloader.loadLanguages(language);\n\t\t\t}\n\n\t\t\t// load file\n\t\t\tloadFile(\n\t\t\t\tsrc,\n\t\t\t\tfunction (text) {\n\t\t\t\t\t// mark as loaded\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADED);\n\n\t\t\t\t\t// handle data-range\n\t\t\t\t\tvar range = parseRange(pre.getAttribute('data-range'));\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tvar lines = text.split(/\\r\\n?|\\n/g);\n\n\t\t\t\t\t\t// the range is one-based and inclusive on both ends\n\t\t\t\t\t\tvar start = range[0];\n\t\t\t\t\t\tvar end = range[1] == null ? lines.length : range[1];\n\n\t\t\t\t\t\tif (start < 0) { start += lines.length; }\n\t\t\t\t\t\tstart = Math.max(0, Math.min(start - 1, lines.length));\n\t\t\t\t\t\tif (end < 0) { end += lines.length; }\n\t\t\t\t\t\tend = Math.max(0, Math.min(end, lines.length));\n\n\t\t\t\t\t\ttext = lines.slice(start, end).join('\\n');\n\n\t\t\t\t\t\t// add data-start for line numbers\n\t\t\t\t\t\tif (!pre.hasAttribute('data-start')) {\n\t\t\t\t\t\t\tpre.setAttribute('data-start', String(start + 1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// highlight code\n\t\t\t\t\tcode.textContent = text;\n\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t},\n\t\t\t\tfunction (error) {\n\t\t\t\t\t// mark as failed\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\tcode.textContent = error;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\n\tPrism.plugins.fileHighlight = {\n\t\t/**\n\t\t * Executes the File Highlight plugin for all matching `pre` elements under the given container.\n\t\t *\n\t\t * Note: Elements which are already loaded or currently loading will not be touched by this method.\n\t\t *\n\t\t * @param {ParentNode} [container=document]\n\t\t */\n\t\thighlight: function highlight(container) {\n\t\t\tvar elements = (container || document).querySelectorAll(SELECTOR);\n\n\t\t\tfor (var i = 0, element; (element = elements[i++]);) {\n\t\t\t\tPrism.highlightElement(element);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar logged = false;\n\t/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */\n\tPrism.fileHighlight = function () {\n\t\tif (!logged) {\n\t\t\tconsole.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');\n\t\t\tlogged = true;\n\t\t}\n\t\tPrism.plugins.fileHighlight.highlight.apply(this, arguments);\n\t};\n\n}());\n","import Prism from \"prismjs\";\nif (typeof globalThis !== \"undefined\") globalThis.Prism = Prism;\n","import {\n Button,\n ComboBox,\n Input,\n ListBox,\n ListBoxItem,\n Popover,\n} from \"react-aria-components\";\nimport { IconCaretDownFilled } from \"@tabler/icons-react\";\nimport { useState, useRef, useEffect } from \"react\";\nimport { OFFSCREEN_POSITION } from \"../InlineToolbar/utils\";\nimport { computeCodeMenuPosition } from \"../InlineToolbar/utils\";\nimport { getCodeLanguages, getLanguageFriendlyName } from \"@lexical/code\";\nimport \"./styles.css\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $getNodeByKey } from \"lexical\";\nimport { SET_CODE_LANGUAGE_COMMAND } from \"../../Plugins/CodePlugin\";\n\nexport function CodeMenu({ codeBlockCoords, codeNodeKey }) {\n const [editor] = useLexicalComposerContext();\n const [codeMenuPosition, setCodeMenuPosition] = useState({\n x: OFFSCREEN_POSITION,\n y: OFFSCREEN_POSITION,\n });\n const codeMenuRef = useRef(null);\n const [language, setLanguage] = useState(\"\");\n\n // Get the available code languages\n const codeLanguages = getCodeLanguages();\n\n // Create a unique set of friendly language names\n const friendlyLanguages = Array.from(\n new Set(codeLanguages.map((lang) => getLanguageFriendlyName(lang)))\n );\n\n // Create a reverse dictionary for friendly languages\n const friendlyToOriginal = {};\n codeLanguages.forEach((lang) => {\n const friendly = getLanguageFriendlyName(lang);\n if (!friendlyToOriginal[friendly]) {\n friendlyToOriginal[friendly] = lang;\n }\n });\n\n // Update toolbar position when selection changes\n useEffect(() => {\n setCodeMenuPosition(computeCodeMenuPosition(codeBlockCoords, codeMenuRef));\n }, [codeBlockCoords]);\n\n // Set the current language of the code block\n useEffect(() => {\n editor.read(() => {\n if (codeNodeKey) {\n const codeNode = $getNodeByKey(codeNodeKey);\n const currentLanguage = codeNode.getLanguage();\n setLanguage(getLanguageFriendlyName(currentLanguage));\n }\n });\n }, [editor, codeNodeKey]);\n\n return (\n <ComboBox\n id=\"code-highlight-menu\"\n ref={codeMenuRef}\n style={{\n position: \"absolute\",\n top: codeMenuPosition.y,\n left: codeMenuPosition.x,\n }}\n aria-label=\"Code menu\"\n inputValue={language}\n onInputChange={(friendlyValue) => {\n const originalValue = friendlyToOriginal[friendlyValue];\n editor.dispatchCommand(SET_CODE_LANGUAGE_COMMAND, [\n codeNodeKey,\n originalValue,\n ]);\n setLanguage(friendlyValue);\n }}\n >\n <div>\n <Input />\n <Button>\n <IconCaretDownFilled size={24} />\n </Button>\n </div>\n <Popover>\n <ListBox>\n {friendlyLanguages.map((friendly, index) => (\n <ListBoxItem key={index}>{friendly}</ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </ComboBox>\n );\n}\n","import \"../prismSetup\";\nimport {\n $createCodeNode,\n $isCodeNode,\n registerCodeHighlighting,\n} from \"@lexical/code\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getPreviousSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n createCommand,\n $getSelection,\n SELECTION_CHANGE_COMMAND,\n BLUR_COMMAND,\n $getNodeByKey,\n KEY_BACKSPACE_COMMAND,\n TextNode,\n $isLineBreakNode,\n $isParagraphNode,\n} from \"lexical\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { getSelectedNode } from \"./TextFormatPlugin\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { CodeMenu } from \"../components/CodeHighlightMenu/CodeMenu\";\n\nconst DOM_ELEMENT = document.body;\n\nexport const INSERT_CODE_BLOCK_COMMAND = createCommand(\n \"INSERT_CODE_BLOCK_COMMAND\"\n);\nexport const SET_CODE_LANGUAGE_COMMAND = createCommand(\n \"SET_CODE_LANGUAGE_COMMAND\"\n);\n\nfunction CodeHighlightMenuPlugin() {\n const [codeBlockCoords, setCodeBlockCoords] = useState(null);\n const [codeNodeKey, setCodeNodeKey] = useState(null);\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const [isCodeMenuFocused, setIsCodeMenuFocused] = useState(false);\n const [editor] = useLexicalComposerContext();\n\n const hideCodeMenu = useCallback(() => {\n setCodeBlockCoords(null);\n setCodeNodeKey(null);\n }, []);\n\n const isFocusInCodeMenu = useCallback(() => {\n const codeMenu = document.getElementById(\"code-highlight-menu\");\n const activeElement = document.activeElement;\n\n return !!(\n codeMenu &&\n activeElement &&\n (codeMenu === activeElement || codeMenu.contains(activeElement))\n );\n }, []);\n\n const syncMenuFocusState = useCallback(() => {\n const menuFocused = isFocusInCodeMenu();\n setIsCodeMenuFocused(menuFocused);\n return menuFocused;\n }, [isFocusInCodeMenu]);\n\n const handleEditorBlur = useCallback(() => {\n const menuFocused = syncMenuFocusState();\n setIsEditorFocused(false);\n\n if (!menuFocused) {\n hideCodeMenu();\n }\n }, [hideCodeMenu, syncMenuFocusState]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const menuFocused = syncMenuFocusState();\n\n const rootElement = editor.getRootElement();\n if (rootElement) {\n const hasFocus =\n rootElement === document.activeElement ||\n rootElement.contains(document.activeElement);\n\n setIsEditorFocused((prev) => (prev === hasFocus ? prev : hasFocus));\n }\n\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection)) {\n if (!menuFocused) {\n hideCodeMenu();\n }\n return false;\n }\n\n const node = getSelectedNode(selection);\n const codeNode = $findMatchingParent(node, $isCodeNode);\n if (codeNode) {\n // update selection coordinates when selection changes and the condition is met\n const DOMElement = editor.getElementByKey(codeNode.getKey());\n const boundingRect = DOMElement.getBoundingClientRect();\n\n // Use top-right coordinates\n const X = boundingRect.right;\n const Y = boundingRect.top + window.scrollY;\n\n setCodeBlockCoords({ x: X, y: Y });\n setCodeNodeKey(codeNode.getKey());\n } else {\n if (!menuFocused) {\n hideCodeMenu();\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor, syncMenuFocusState, hideCodeMenu]);\n\n useEffect(() => {\n return editor.registerCommand(\n BLUR_COMMAND,\n () => {\n setTimeout(handleEditorBlur, 0);\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor, handleEditorBlur]);\n\n useEffect(() => {\n const handleFocus = () => {\n setIsEditorFocused(true);\n setIsCodeMenuFocused(false);\n };\n\n const handleBlur = () => setTimeout(handleEditorBlur, 0);\n\n return editor.registerRootListener((rootElement, prevRootElement) => {\n if (rootElement) {\n rootElement.addEventListener(\"focus\", handleFocus);\n rootElement.addEventListener(\"blur\", handleBlur);\n }\n\n if (prevRootElement) {\n prevRootElement.removeEventListener(\"focus\", handleFocus);\n prevRootElement.removeEventListener(\"blur\", handleBlur);\n }\n });\n }, [editor, handleEditorBlur]);\n\n return (\n codeBlockCoords &&\n (isEditorFocused || isCodeMenuFocused) &&\n createPortal(\n <CodeMenu codeBlockCoords={codeBlockCoords} codeNodeKey={codeNodeKey} />,\n DOM_ELEMENT\n )\n );\n}\n\nfunction CodeBlockPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return registerCodeHighlighting(editor);\n }, [editor]);\n\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!node.isSimpleText()) {\n return;\n }\n\n const text = node.getTextContent();\n\n // Check for Code Block Trigger: \"``` \" at start of line/paragraph\n if (text.startsWith(\"``` \")) {\n const prevSibling = node.getPreviousSibling();\n const parentNode = $findMatchingParent(node, $isParagraphNode);\n const isStartOfParagraph =\n parentNode !== null && parentNode.getChildrenSize() === 1;\n const isAfterLineBreak = $isLineBreakNode(prevSibling);\n\n if (isStartOfParagraph || isAfterLineBreak) {\n // If there is more text after \"``` \", don't do anything\n if (text.length > 4) {\n return;\n }\n\n // Create the new code block\n const codeNode = $createCodeNode();\n\n // Replace \"``` \" with the code block\n node.replace(codeNode);\n\n // Select the code block\n codeNode.select();\n\n // Check if the next sibling is a LineBreakNode and remove it\n const nextSibling = codeNode.getNextSibling();\n if ($isLineBreakNode(nextSibling)) {\n nextSibling.remove();\n }\n\n return;\n }\n }\n });\n\n return removeTransform;\n }, [editor]);\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n INSERT_CODE_BLOCK_COMMAND,\n () => {\n const prevSelection = $getPreviousSelection();\n if ($isRangeSelection(prevSelection)) {\n const codeBlockNode = $createCodeNode();\n prevSelection.insertNodes([codeBlockNode]);\n codeBlockNode.selectStart();\n\n // Bring the focus back to the editor\n setTimeout(() => {\n editor.focus();\n }, 0);\n\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n SET_CODE_LANGUAGE_COMMAND,\n (payload) => {\n const [nodeKey, language] = payload;\n const codeNode = $getNodeByKey(nodeKey);\n if ($isCodeNode(codeNode)) {\n codeNode.setLanguage(language);\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n KEY_BACKSPACE_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const node = selection.anchor.getNode();\n const codeNode = $findMatchingParent(node, $isCodeNode);\n\n if (codeNode) {\n // Check if we are at the beginning of the code block\n if (selection.anchor.offset === 0) {\n // Check if code block is empty (only has empty text node or line break)\n const textContent = codeNode.getTextContent();\n if (textContent === \"\") {\n codeNode.remove();\n return true;\n }\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n return null;\n}\n\nexport function CodePlugin() {\n return (\n <>\n <CodeBlockPlugin />\n <CodeHighlightMenuPlugin />\n </>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n COMMAND_PRIORITY_HIGH,\n createCommand,\n $getPreviousSelection,\n $isRangeSelection,\n $createParagraphNode,\n} from \"lexical\";\nimport { useEffect } from \"react\";\nimport {\n $createHorizontalDividerNode,\n HorizontalDividerNode,\n} from \"../nodes/HorizontalDividerNode\";\n\nexport const INSERT_HORIZONTAL_DIVIDER_COMMAND = createCommand(\n \"INSERT_HORIZONTAL_DIVIDER_COMMAND\"\n);\n\nexport function HorizontalDividerPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([HorizontalDividerNode])) {\n throw new Error(\"HorizontalDividerNode not registered on editor\");\n }\n\n const unregisterCommand = editor.registerCommand(\n INSERT_HORIZONTAL_DIVIDER_COMMAND,\n () => {\n const prevSelection = $getPreviousSelection();\n\n if ($isRangeSelection(prevSelection)) {\n const horizontalDividerNode = $createHorizontalDividerNode();\n prevSelection.insertNodes([horizontalDividerNode]);\n\n // Move the selection to the next line after the divider\n let nextNode =\n horizontalDividerNode.getNextSibling() ||\n horizontalDividerNode.getParent().getNextSibling();\n\n if (!nextNode) {\n nextNode = $createParagraphNode();\n horizontalDividerNode.insertAfter(nextNode);\n }\n nextNode.selectStart();\n\n // Bring the focus back to the editor\n setTimeout(() => {\n editor.focus();\n }, 0);\n\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n createCommand,\n COMMAND_PRIORITY_HIGH,\n $getPreviousSelection,\n $isRangeSelection,\n $createParagraphNode,\n SELECTION_CHANGE_COMMAND,\n $getSelection,\n $isNodeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n $getNodeByKey,\n PASTE_COMMAND,\n BLUR_COMMAND,\n} from \"lexical\";\nimport { useEffect, useRef } from \"react\";\nimport {\n $createImageNode,\n $isImageNode,\n ImageNode,\n IMAGE_UPLOAD_STATE,\n} from \"../nodes/ImageNode\";\nimport { NodeEventPlugin } from \"@lexical/react/LexicalNodeEventPlugin\";\n\nexport const INSERT_IMAGE_COMMAND = createCommand(\"INSERT_IMAGE_COMMAND\");\nconst SELECTED_CLASS_NAME = \"selected\";\n\nfunction isImageFile(file) {\n return file && file.type && file.type.startsWith(\"image/\");\n}\n\n// Inserts an ImageNode at the current selection and returns its key so the\n// caller can update it later (e.g. when a background upload resolves).\nfunction $insertImageNode(src, uploadState) {\n const prevSelection = $getPreviousSelection() || $getSelection();\n if (!$isRangeSelection(prevSelection)) {\n return null;\n }\n\n const imageNode = $createImageNode(src, uploadState);\n prevSelection.insertNodes([imageNode]);\n\n let nextNode =\n imageNode.getNextSibling() || imageNode.getParent().getNextSibling();\n if (!nextNode) {\n nextNode = $createParagraphNode();\n imageNode.insertAfter(nextNode);\n }\n\n imageNode.select();\n return imageNode.getKey();\n}\n\nexport function ImagePlugin({ onImageUpload }) {\n const [editor] = useLexicalComposerContext();\n const selectedImgElemRef = useRef(null);\n const onImageUploadRef = useRef(onImageUpload);\n\n useEffect(() => {\n onImageUploadRef.current = onImageUpload;\n }, [onImageUpload]);\n\n useEffect(() => {\n if (!editor.hasNode(ImageNode)) {\n throw new Error(\"ImagePlugin: ImageNode not registered on editor\");\n }\n }, [editor]);\n\n // Kick off an async upload for a node already inserted with a blob URL.\n // On success swap the src to the returned URL and revoke the blob.\n // On failure mark the node as errored but keep the blob URL visible.\n const startUpload = (nodeKey, file, blobUrl) => {\n const upload = onImageUploadRef.current;\n if (!upload) return;\n\n Promise.resolve()\n .then(() => upload(file))\n .then((remoteUrl) => {\n if (typeof remoteUrl !== \"string\" || !remoteUrl) {\n throw new Error(\"onImageUpload must resolve to a URL string\");\n }\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setSrc(remoteUrl);\n node.setUploadState(IMAGE_UPLOAD_STATE.UPLOADED);\n }\n });\n URL.revokeObjectURL(blobUrl);\n })\n .catch((err) => {\n console.error(\"ImagePlugin: image upload failed\", err);\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setUploadState(IMAGE_UPLOAD_STATE.ERROR);\n }\n });\n });\n };\n\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n INSERT_IMAGE_COMMAND,\n (payload) => {\n // String payload: caller already has a usable URL — just insert.\n if (typeof payload === \"string\") {\n $insertImageNode(payload, IMAGE_UPLOAD_STATE.UPLOADED);\n return true;\n }\n\n // File payload: show immediately via blob URL, upload in background.\n if (payload instanceof File && isImageFile(payload)) {\n const blobUrl = URL.createObjectURL(payload);\n const hasUpload = !!onImageUploadRef.current;\n const key = $insertImageNode(\n blobUrl,\n hasUpload\n ? IMAGE_UPLOAD_STATE.UPLOADING\n : IMAGE_UPLOAD_STATE.UPLOADED\n );\n if (key && hasUpload) {\n startUpload(key, payload, blobUrl);\n }\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n // handle selection\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n if (selectedImgElemRef.current) {\n selectedImgElemRef.current.classList.remove(SELECTED_CLASS_NAME);\n selectedImgElemRef.current = null;\n }\n\n const selection = $getSelection();\n if ($isNodeSelection(selection) && selection.getNodes().length === 1) {\n const node = selection.getNodes()[0];\n if ($isImageNode(node)) {\n const DOMElement = editor.getElementByKey(node.getKey());\n DOMElement.classList.add(SELECTED_CLASS_NAME);\n selectedImgElemRef.current = DOMElement;\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n\n return unregisterCommand;\n }, [editor]);\n\n // Unselect image node when the editor loses focus\n useEffect(() => {\n const unregisterBlurCommand = editor.registerCommand(\n BLUR_COMMAND,\n () => {\n const selection = $getSelection();\n if (\n $isNodeSelection(selection) &&\n selection.getNodes().length === 1 &&\n $isImageNode(selection.getNodes()[0])\n ) {\n $setSelection(null);\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n\n return unregisterBlurCommand;\n }, [editor]);\n\n useEffect(() => {\n const unregisterPasteCommand = editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n\n const imageFiles = Array.from(clipboardData.files).filter(isImageFile);\n if (imageFiles.length !== 1) return false;\n\n const selection = $getSelection() || $getPreviousSelection();\n if (!$isRangeSelection(selection)) return false;\n\n event.preventDefault();\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, imageFiles[0]);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterPasteCommand;\n }, [editor]);\n\n return (\n <NodeEventPlugin\n nodeType={ImageNode}\n eventType={\"click\"}\n eventListener={(event, editor, key) => {\n if (!editor.isEditable()) {\n return;\n }\n const node = $getNodeByKey(key);\n node.select();\n }}\n />\n );\n}\n","import {\r\n Button,\r\n DialogTrigger,\r\n Popover,\r\n Toolbar,\r\n Group,\r\n FileTrigger,\r\n} from \"react-aria-components\";\r\nimport {\r\n IconPlus,\r\n IconCodePlus,\r\n IconPhoto,\r\n IconLineDashed,\r\n} from \"@tabler/icons-react\";\r\nimport { useState, useRef, useEffect } from \"react\";\r\nimport { OFFSCREEN_POSITION } from \"../InlineToolbar/utils\";\r\nimport { computeBlockToolbarPosition } from \"../InlineToolbar/utils\";\r\nimport \"./styles/Popover.css\";\r\n\r\nimport { INSERT_CODE_BLOCK_COMMAND } from \"../../Plugins/CodePlugin\";\r\nimport { INSERT_HORIZONTAL_DIVIDER_COMMAND } from \"../../Plugins/HorizontalDividerPlugin\";\r\nimport { INSERT_IMAGE_COMMAND } from \"../../Plugins/ImagePlugin\";\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\r\n\r\nconst ICON_SIZE = 24;\r\n\r\nfunction BlockToolbar() {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const handleFileSelect = (fileList) => {\r\n if (!fileList || fileList.length === 0) {\r\n return;\r\n }\r\n\r\n const file = fileList[0];\r\n\r\n if (!file.type.startsWith(\"image/\")) {\r\n alert(\"Please select an image file.\");\r\n return;\r\n }\r\n\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, file);\r\n };\r\n\r\n return (\r\n <Toolbar aria-label=\"Block toolbar\" id=\"block-toolbar\">\r\n <Group aria-label=\"Media\">\r\n <FileTrigger\r\n acceptedFileTypes={[\"image/png\", \"image/jpeg\", \"image/gif\"]}\r\n onSelect={handleFileSelect}\r\n allowsMultiple={false}\r\n >\r\n <Button aria-label=\"image\">\r\n <IconPhoto size={ICON_SIZE} />\r\n </Button>\r\n </FileTrigger>\r\n <Button\r\n aria-label=\"code block\"\r\n onPress={() => {\r\n editor.dispatchCommand(INSERT_CODE_BLOCK_COMMAND, undefined);\r\n }}\r\n >\r\n <IconCodePlus size={ICON_SIZE} />\r\n </Button>\r\n <Button\r\n aria-label=\"horizontal divider\"\r\n onPress={() => {\r\n editor.dispatchCommand(\r\n INSERT_HORIZONTAL_DIVIDER_COMMAND,\r\n undefined\r\n );\r\n }}\r\n >\r\n <IconLineDashed size={ICON_SIZE} />\r\n </Button>\r\n </Group>\r\n </Toolbar>\r\n );\r\n}\r\n\r\nexport default function BlockToolbarPopover({\r\n selectionRectCoords,\r\n TOOLBAR_OFFSET,\r\n toolbarTriggerId,\r\n toolbarPopoverId,\r\n}) {\r\n const [toolbarPosition, setToolbarPosition] = useState({\r\n x: OFFSCREEN_POSITION,\r\n y: OFFSCREEN_POSITION,\r\n });\r\n const toolbarRef = useRef(null);\r\n\r\n // Update toolbar position when selection changes\r\n useEffect(() => {\r\n setToolbarPosition(\r\n computeBlockToolbarPosition(\r\n selectionRectCoords,\r\n toolbarRef,\r\n TOOLBAR_OFFSET\r\n )\r\n );\r\n }, [selectionRectCoords]);\r\n\r\n return (\r\n <DialogTrigger>\r\n <Button\r\n aria-label=\"Block toolbar trigger\"\r\n className=\"block-toolbar-trigger\"\r\n id={toolbarTriggerId}\r\n ref={toolbarRef}\r\n style={{\r\n position: \"absolute\",\r\n top: toolbarPosition.y,\r\n left: toolbarPosition.x,\r\n }}\r\n >\r\n <IconPlus size={ICON_SIZE} />\r\n </Button>\r\n <Popover\r\n className=\"block-toolbar-popover\"\r\n id={toolbarPopoverId}\r\n placement=\"end\"\r\n shouldFlip={false}\r\n offset={TOOLBAR_OFFSET}\r\n >\r\n <BlockToolbar />\r\n </Popover>\r\n </DialogTrigger>\r\n );\r\n}\r\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n SELECTION_CHANGE_COMMAND,\n COMMAND_PRIORITY_HIGH,\n $isParagraphNode,\n} from \"lexical\";\nimport { useEffect, useState, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { getSelectedNode } from \"./TextFormatPlugin\";\n\nimport BlockToolbarPopover from \"../components/BlockToolbar/BlockToolbar\";\n\nconst DOM_ELEMENT = document.body;\n\nexport default function BlockToolbarPlugin({ toolbarGap }) {\n const [selectionRectCoords, setSelectionRectCoords] = useState(null);\n const [editor] = useLexicalComposerContext();\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const [toolbarActive, setToolbarActive] = useState(false);\n\n // Generate unique IDs specific to this editor instance\n const randomStringRef = useRef(Math.random().toString(36).substring(2, 9));\n const toolbarTriggerId = `block-toolbar-trigger-${randomStringRef.current}`;\n const toolbarPopoverId = `block-toolbar-popover-${randomStringRef.current}`;\n\n const handleFocus = () => setIsEditorFocused(true);\n const handleBlur = (event) => {\n // Delay the blur event to give time for toolbar click to register\n setTimeout(() => {\n const toolbarTrigger = document.getElementById(toolbarTriggerId);\n if (\n toolbarTrigger &&\n (toolbarTrigger === document.activeElement ||\n toolbarTrigger.contains(document.activeElement) ||\n toolbarTrigger.contains(event.relatedTarget))\n ) {\n // Don't update focus state if we're clicking on the toolbar trigger\n return;\n }\n setIsEditorFocused(false);\n }, 10);\n };\n\n // Add observer to detect if toolbar is active\n useEffect(() => {\n const checkToolbarPresence = () => {\n const isPresent = !!document.getElementById(toolbarPopoverId);\n setToolbarActive(isPresent);\n };\n\n const observer = new MutationObserver(checkToolbarPresence);\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Initial check\n checkToolbarPresence();\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n const unregisterListener = editor.registerRootListener(\n (rootElement, prevRootElement) => {\n if (rootElement) {\n rootElement.addEventListener(\"focus\", handleFocus);\n rootElement.addEventListener(\"blur\", handleBlur);\n }\n\n if (prevRootElement) {\n prevRootElement.removeEventListener(\"focus\", handleFocus);\n prevRootElement.removeEventListener(\"blur\", handleBlur);\n }\n }\n );\n\n return unregisterListener;\n }, [editor]);\n\n // Hide the toolbar whenever the editor becomes non-editable\n useEffect(() => {\n return editor.registerEditableListener((editable) => {\n if (!editable) {\n setSelectionRectCoords(null);\n }\n });\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n if (!editor.isEditable()) {\n setSelectionRectCoords(null);\n return false;\n }\n\n // Check editor focus state during selection changes\n const rootElement = editor.getRootElement();\n if (rootElement) {\n const hasFocus =\n rootElement === document.activeElement ||\n rootElement.contains(document.activeElement);\n\n // Update focus state only if it changed to avoid re-renders\n if (hasFocus !== isEditorFocused) {\n setIsEditorFocused(hasFocus);\n }\n }\n\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n setSelectionRectCoords(null);\n return false;\n }\n\n const node = getSelectedNode(selection);\n if ($isParagraphNode(node) && node.getTextContent() === \"\") {\n // update selection coordinates when selection changes and the condition is met\n const DOMElement = editor.getElementByKey(node.getKey());\n const boundingRect = DOMElement.getBoundingClientRect();\n\n const X = boundingRect.left;\n const centerY =\n boundingRect.top + boundingRect.height / 2 + window.scrollY;\n\n setSelectionRectCoords({ x: X, y: centerY });\n } else {\n setSelectionRectCoords(null);\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n return (\n selectionRectCoords &&\n (isEditorFocused || toolbarActive) &&\n createPortal(\n <BlockToolbarPopover\n selectionRectCoords={selectionRectCoords}\n TOOLBAR_OFFSET={toolbarGap}\n toolbarTriggerId={toolbarTriggerId}\n toolbarPopoverId={toolbarPopoverId}\n />,\n DOM_ELEMENT\n )\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\nimport { $createMathNode, $isMathNode, MathNode } from \"../nodes/MathNode\";\nimport {\n $getNodeByKey,\n $getRoot,\n $getSelection,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n $isParagraphNode,\n COMMAND_PRIORITY_HIGH,\n KEY_ENTER_COMMAND,\n KEY_ARROW_RIGHT_COMMAND,\n KEY_BACKSPACE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n $createTextNode,\n TextNode,\n $getAdjacentNode,\n COMMAND_PRIORITY_NORMAL,\n BLUR_COMMAND,\n $setSelection,\n PASTE_COMMAND,\n} from \"lexical\";\nimport {\n $createMathHighlightNodeBlock,\n $createMathHighlightNodeInline,\n $isMathHighlightNodeBlock,\n $isMathHighlightNodeInline,\n MathHighlightNodeBlock,\n MathHighlightNodeInline,\n} from \"../nodes/MathHighlightNode\";\nimport { NodeEventPlugin } from \"@lexical/react/LexicalNodeEventPlugin\";\nimport { $findMatchingParent, $dfs } from \"@lexical/utils\";\n\nexport const INLINE_DELIMITERS = [\n [\"$\", \"$\"],\n [\"\\\\(\", \"\\\\)\"],\n];\n\nexport const DISPLAY_DELIMITERS = [\n [\"$$\", \"$$\"],\n [\"\\\\[\", \"\\\\]\"],\n];\n\nconst escapeRegex = (str) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nconst getMatch = (text, delimiters) => {\n let earliest = null;\n\n for (const [opening, closing] of delimiters) {\n const regex = new RegExp(\n `(.*?)(${escapeRegex(opening)})(.*?)(${escapeRegex(closing)})`,\n \"g\"\n );\n const match = regex.exec(text);\n if (match) {\n const content = match[3];\n if (content && content.trim() !== \"\") {\n const start = match.index + match[1].length;\n const end = match.index + match[0].length;\n if (!earliest || start < earliest.start) {\n earliest = {\n start,\n end,\n content: opening + content + closing,\n };\n }\n }\n }\n }\n\n return earliest;\n};\n\nconst getSelectedMathHighlightContainer = (selection, nodeMatcher) => {\n if (!$isRangeSelection(selection)) {\n return null;\n }\n\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n const anchorContainer = nodeMatcher(anchorNode)\n ? anchorNode\n : $findMatchingParent(anchorNode, nodeMatcher);\n const focusContainer = nodeMatcher(focusNode)\n ? focusNode\n : $findMatchingParent(focusNode, nodeMatcher);\n\n if (!anchorContainer || !focusContainer) {\n return null;\n }\n\n return anchorContainer.getKey() === focusContainer.getKey()\n ? anchorContainer\n : null;\n};\n\nconst getClipboardPlainText = (clipboardData) =>\n clipboardData.getData(\"text/plain\") ||\n clipboardData.getData(\"text\") ||\n clipboardData.getData(\"text/uri-list\");\n\nexport function MathInlinePlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([MathNode, MathHighlightNodeInline])) {\n throw new Error(\n \"MathInlinePlugin: MathNode or MathHighlightNodeInline not registered on editor\"\n );\n }\n }, [editor]);\n\n // Convert simple text $...$ to MathNode Inline\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!node.isSimpleText()) {\n return;\n }\n\n if (\n $isMathHighlightNodeInline(node) ||\n $findMatchingParent(node, $isMathHighlightNodeBlock)\n ) {\n return;\n }\n\n const text = node.getTextContent();\n const match = getMatch(text, INLINE_DELIMITERS);\n\n if (match) {\n const { start, end, content } = match;\n let targetNode;\n const mathNode = $createMathNode(content, true);\n\n if (start === 0) {\n [targetNode] = node.splitText(end);\n targetNode.insertBefore(mathNode);\n targetNode.remove();\n } else {\n [, targetNode] = node.splitText(start, end);\n targetNode.replace(mathNode);\n }\n return mathNode;\n }\n });\n return removeTransform;\n }, [editor]);\n\n // conversion: MathNode Inline <--> MathHighlightNodeInline upon selection change\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n const nodesToExclude = new Set();\n\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length === 1 && $isMathNode(nodes[0]) && editor.isEditable()) {\n const mathNode = nodes[0];\n if (mathNode.isInline()) {\n let equation = mathNode.getEquation();\n // Strip delimiters\n if (equation.startsWith(\"$\") && equation.endsWith(\"$\")) {\n equation = equation.slice(1, -1);\n } else if (equation.startsWith(\"\\\\(\") && equation.endsWith(\"\\\\)\")) {\n equation = equation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeInline(equation);\n mathNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n }\n } else if ($isRangeSelection(selection)) {\n selection.getNodes().forEach(node => nodesToExclude.add(node.getKey()));\n }\n\n // Convert unselected inline highlight nodes back to math nodes\n const root = $getRoot();\n const allTextNodes = root.getAllTextNodes();\n\n // convert unselected MathHighlightNodeInline to MathNode Inline\n allTextNodes.forEach((node) => {\n if (\n $isMathHighlightNodeInline(node) &&\n !nodesToExclude.has(node.getKey())\n ) {\n let equation = node.getTextContent();\n if (!equation) {\n node.remove();\n return;\n }\n\n let isBlock = false;\n if (equation.startsWith(\"$\") && equation.endsWith(\"$\") && equation.length >= 2) {\n equation = equation.slice(1, -1);\n isBlock = true;\n }\n\n const mathNode = isBlock\n ? $createMathNode(`$$${equation}$$`, false)\n : $createMathNode(`$${equation}$`, true);\n node.replace(mathNode);\n }\n });\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // Convert MathHighlightNodeInline to MathNode Inline upon blur\n useEffect(() => {\n return editor.registerCommand(\n BLUR_COMMAND,\n () => {\n editor.update(() => {\n const root = $getRoot();\n const allTextNodes = root.getAllTextNodes();\n\n allTextNodes.forEach((node) => {\n if ($isMathHighlightNodeInline(node)) {\n let equation = node.getTextContent();\n if (!equation) {\n node.remove();\n return;\n }\n\n let isBlock = false;\n if (\n equation.startsWith(\"$\") &&\n equation.endsWith(\"$\") &&\n equation.length >= 2\n ) {\n equation = equation.slice(1, -1);\n isBlock = true;\n }\n\n const mathNode = isBlock\n ? $createMathNode(`$$${equation}$$`, false)\n : $createMathNode(`$${equation}$`, true);\n node.replace(mathNode);\n $setSelection(null);\n }\n });\n });\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n // If a collapsed selection lands on a MathNode Inline from left,\n // convert it to MathHighlightNodeInline and select it at the start\n useEffect(() => {\n return editor.registerCommand(\n KEY_ARROW_RIGHT_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const adjacentNode = $getAdjacentNode(selection.anchor, false);\n\n if ($isMathNode(adjacentNode) && adjacentNode.isInline()) {\n const equation = adjacentNode.getEquation();\n let cleanEquation = equation;\n // Strip delimiters if present\n if (cleanEquation.startsWith(\"$\") && cleanEquation.endsWith(\"$\")) {\n cleanEquation = cleanEquation.slice(1, -1);\n } else if (cleanEquation.startsWith(\"\\\\(\") && cleanEquation.endsWith(\"\\\\)\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeInline(cleanEquation);\n adjacentNode.replace(mathHighlightNode);\n mathHighlightNode.select(0, 0);\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n // If a collapsed selection lands on a MathNode Inline from right upon backspace,\n // convert it to MathHighlightNodeInline and select it at the end\n useEffect(() => {\n return editor.registerCommand(\n KEY_BACKSPACE_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const adjacentNode = $getAdjacentNode(selection.anchor, true);\n\n if ($isMathNode(adjacentNode) && adjacentNode.isInline()) {\n const equation = adjacentNode.getEquation();\n let cleanEquation = equation;\n // Strip delimiters if present\n if (cleanEquation.startsWith(\"$\") && cleanEquation.endsWith(\"$\")) {\n cleanEquation = cleanEquation.slice(1, -1);\n } else if (cleanEquation.startsWith(\"\\\\(\") && cleanEquation.endsWith(\"\\\\)\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeInline(cleanEquation);\n adjacentNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) {\n return false;\n }\n\n const selection = $getSelection();\n const mathHighlightNode = getSelectedMathHighlightContainer(\n selection,\n $isMathHighlightNodeInline\n );\n if (!mathHighlightNode) {\n return false;\n }\n\n const pastedText = getClipboardPlainText(clipboardData);\n if (!pastedText) {\n return false;\n }\n\n event.preventDefault();\n selection.insertText(pastedText);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n // If the selection is inside a MathHighlightNodeInline and there is no next sibling,\n // add a space after it to make it easier to escape\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const node = selection.anchor.getNode();\n\n if ($isMathHighlightNodeInline(node)) {\n const nextSibling = node.getNextSibling();\n if (!nextSibling) {\n node.insertAfter($createTextNode(\" \"));\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_NORMAL\n );\n }, [editor]);\n\n return (\n // Register click event for MathNode\n <NodeEventPlugin\n nodeType={MathNode}\n eventType={\"click\"}\n eventListener={(event, editor, key) => {\n if (!editor.isEditable()) {\n return;\n }\n const node = $getNodeByKey(key);\n if (node && node.isInline()) {\n node.select();\n }\n }}\n />\n );\n}\n\nexport function MathBlockPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([MathNode, MathHighlightNodeBlock])) {\n throw new Error(\n \"MathBlockPlugin: MathNode or MathHighlightNodeBlock not registered on editor\"\n );\n }\n }, [editor]);\n\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!node.isSimpleText()) {\n return;\n }\n\n if ($findMatchingParent(node, $isMathHighlightNodeBlock)) {\n return;\n }\n\n const text = node.getTextContent();\n\n // Check for Block Creation Trigger: \"$$ \" at start of line/paragraph\n if (text.startsWith(\"$$ \")) {\n const prevSibling = node.getPreviousSibling();\n const parentNode = $findMatchingParent(node, $isParagraphNode);\n const isStartOfParagraph = parentNode !== null && parentNode.getChildrenSize() === 1;\n const isAfterLineBreak = $isLineBreakNode(prevSibling);\n\n if (isStartOfParagraph || isAfterLineBreak) {\n // If there is more text after \"$$ \", don't do anything\n if (text.length > 3) {\n return;\n }\n\n // Create the new math block\n const mathBlock = $createMathHighlightNodeBlock(\"\");\n\n // Replace \"$$ \" with the math block\n node.replace(mathBlock);\n\n // Select the math block\n mathBlock.select();\n\n // Check if the next sibling is a LineBreakNode and remove it\n const nextSibling = mathBlock.getNextSibling();\n if ($isLineBreakNode(nextSibling)) {\n nextSibling.remove();\n }\n\n return;\n }\n }\n\n const match = getMatch(text, DISPLAY_DELIMITERS);\n\n if (match) {\n const { start, end, content } = match;\n let targetNode;\n const mathNode = $createMathNode(content, false);\n\n if (start === 0) {\n [targetNode] = node.splitText(end);\n targetNode.insertBefore(mathNode);\n targetNode.remove();\n } else {\n [, targetNode] = node.splitText(start, end);\n targetNode.replace(mathNode);\n }\n return mathNode;\n }\n });\n return removeTransform;\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n const nodesToExclude = new Set();\n\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length === 1 && $isMathNode(nodes[0]) && editor.isEditable()) {\n const mathNode = nodes[0];\n if (!mathNode.isInline()) {\n let equation = mathNode.getEquation();\n // Strip delimiters\n if (equation.startsWith(\"$$\") && equation.endsWith(\"$$\")) {\n equation = equation.slice(2, -2);\n } else if (equation.startsWith(\"\\\\[\") && equation.endsWith(\"\\\\]\")) {\n equation = equation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeBlock(equation);\n mathNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n }\n } else if ($isRangeSelection(selection)) {\n selection.getNodes().forEach(node => {\n nodesToExclude.add(node.getKey());\n const blockNode = $findMatchingParent(node, $isMathHighlightNodeBlock);\n if (blockNode) {\n nodesToExclude.add(blockNode.getKey());\n }\n });\n }\n\n // Convert unselected block highlight nodes back to math nodes\n const editorState = editor.getEditorState();\n const allNodes = editorState._nodeMap;\n for (const [, node] of allNodes) {\n if ($isMathHighlightNodeBlock(node) && node.isAttached() && !nodesToExclude.has(node.getKey())) {\n const equation = node.getTextContent();\n if (!equation) {\n node.remove();\n continue;\n }\n // Always convert back to block MathNode\n const mathNode = $createMathNode(`$$${equation}$$`, false);\n node.replace(mathNode);\n }\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // Convert MathHighlightNodeBlock to MathNode Block upon blur\n useEffect(() => {\n return editor.registerCommand(\n BLUR_COMMAND,\n () => {\n editor.update(() => {\n const root = $getRoot();\n const nodes = $dfs(root);\n\n nodes.forEach(({ node }) => {\n if ($isMathHighlightNodeBlock(node)) {\n const equation = node.getTextContent();\n if (!equation) {\n node.remove();\n return;\n }\n // Always convert back to block MathNode\n const mathNode = $createMathNode(`$$${equation}$$`, false);\n node.replace(mathNode);\n $setSelection(null);\n }\n });\n });\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n useEffect(() => {\n const unregisterListener = editor.registerCommand(\n KEY_ENTER_COMMAND,\n () => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const firstNode = selection.getNodes()[0];\n const mathHighlightBlock = $findMatchingParent(\n firstNode,\n $isMathHighlightNodeBlock\n );\n if (!mathHighlightBlock) {\n return false;\n }\n\n const lastChild = mathHighlightBlock.getLastChild();\n const isAtBlockEnd =\n selection.isCollapsed() &&\n ((selection.anchor.getNode().getKey() ===\n mathHighlightBlock.getKey() &&\n selection.anchor.offset === 0 &&\n mathHighlightBlock.getChildrenSize() === 0) ||\n (lastChild &&\n $isLineBreakNode(lastChild) &&\n selection.anchor.getNode().getKey() ===\n mathHighlightBlock.getKey() &&\n selection.anchor.offset ===\n mathHighlightBlock.getChildrenSize()) ||\n (lastChild &&\n $isTextNode(lastChild) &&\n selection.anchor.getNode().getKey() === lastChild.getKey() &&\n selection.anchor.offset === lastChild.getTextContent().length));\n\n if (isAtBlockEnd) {\n return false;\n }\n\n selection.insertLineBreak();\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n return unregisterListener;\n }, [editor]);\n\n // If a collapsed selection lands on a MathNode Block from right upon backspace,\n // convert it to MathHighlightNodeBlock and select it at the end\n useEffect(() => {\n return editor.registerCommand(\n KEY_BACKSPACE_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n const adjacentNode = $getAdjacentNode(selection.anchor, true);\n\n if ($isMathNode(adjacentNode) && !adjacentNode.isInline()) {\n const equation = adjacentNode.getEquation();\n let cleanEquation = equation;\n // Strip delimiters if present\n if (cleanEquation.startsWith(\"$$\") && cleanEquation.endsWith(\"$$\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n } else if (cleanEquation.startsWith(\"\\\\[\") && cleanEquation.endsWith(\"\\\\]\")) {\n cleanEquation = cleanEquation.slice(2, -2);\n }\n\n const mathHighlightNode = $createMathHighlightNodeBlock(cleanEquation);\n adjacentNode.replace(mathHighlightNode);\n mathHighlightNode.select();\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) {\n return false;\n }\n\n const selection = $getSelection();\n const mathHighlightNode = getSelectedMathHighlightContainer(\n selection,\n $isMathHighlightNodeBlock\n );\n if (!mathHighlightNode) {\n return false;\n }\n\n const pastedText = getClipboardPlainText(clipboardData);\n if (!pastedText) {\n return false;\n }\n\n event.preventDefault();\n selection.insertRawText(pastedText);\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n }, [editor]);\n\n return (\n <NodeEventPlugin\n nodeType={MathNode}\n eventType={\"click\"}\n eventListener={(event, editor, key) => {\n if (!editor.isEditable()) {\n return;\n }\n const node = $getNodeByKey(key);\n if (node && !node.isInline()) {\n node.select();\n }\n }}\n />\n );\n}\n","import { $insertList, $isListItemNode } from \"@lexical/list\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\nimport {\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n $createLineBreakNode,\n COMMAND_PRIORITY_HIGH,\n KEY_TAB_COMMAND,\n TextNode,\n ParagraphNode,\n} from \"lexical\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { getSelectedNode } from \"./TextFormatPlugin\";\n\nconst MAX_INDENT_LEVEL = 3;\n\nexport function ListPluginExtended() {\n const [editor] = useLexicalComposerContext();\n\n // Transform: Remove paragraph nodes inside list item nodes\n // Replace with a line break node\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(\n ParagraphNode,\n (paragraphNode) => {\n const parent = paragraphNode.getParent();\n\n // Check if paragraph is inside a ListItemNode\n if ($isListItemNode(parent)) {\n // Replace paragraph with a line break\n const lineBreakNode = $createLineBreakNode();\n paragraphNode.replace(lineBreakNode);\n lineBreakNode.selectEnd();\n }\n }\n );\n\n return removeTransform;\n }, [editor]);\n\n // If a text node begins with '1. ' or '- ', convert it into a list\n useEffect(() => {\n const removeTransform = editor.registerNodeTransform(TextNode, (node) => {\n if (!$findMatchingParent(node, $isParagraphNode)) {\n return;\n }\n\n const parentNode = $findMatchingParent(node, $isParagraphNode);\n if (parentNode.getFirstDescendant() !== node) {\n return;\n }\n\n const selection = $getSelection();\n if ($isRangeSelection(selection) && selection.isCollapsed()) {\n const anchor = selection.anchor;\n const offset = anchor.offset;\n\n if (node.getTextContent() === \"1. \" && offset === 3) {\n $insertList(\"number\");\n node.setTextContent(\"\");\n } else if (node.getTextContent() === \"- \" && offset === 2) {\n $insertList(\"bullet\");\n node.setTextContent(\"\");\n }\n }\n });\n\n return removeTransform;\n }, [editor]);\n\n // Handle TAB Command\n useEffect(() => {\n const unregisterCommand = editor.registerCommand(\n KEY_TAB_COMMAND,\n (event) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const node = getSelectedNode(selection);\n const listItemNode = $findMatchingParent(node, $isListItemNode);\n if (!listItemNode) {\n return false;\n }\n\n const indent = listItemNode.getIndent();\n if (event.shiftKey) {\n if (indent <= 0) {\n return false;\n }\n listItemNode.setIndent(indent - 1);\n } else {\n if (indent > MAX_INDENT_LEVEL) {\n return false;\n }\n listItemNode.setIndent(indent + 1);\n }\n\n return true;\n },\n COMMAND_PRIORITY_HIGH\n );\n\n return unregisterCommand;\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\n\nexport function TabInterceptorPlugin() {\n const [editor] = useLexicalComposerContext();\n\n const interceptTab = (event) => {\n if (event.key === \"Tab\") {\n event.preventDefault();\n }\n };\n\n useEffect(() => {\n const unregisterListener = editor.registerRootListener(\n (rootElement, prevRootElement) => {\n if (rootElement) {\n rootElement.addEventListener(\"keydown\", interceptTab);\n }\n\n if (prevRootElement) {\n prevRootElement.removeEventListener(\"keydown\", interceptTab);\n }\n }\n );\n\n return unregisterListener;\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\n\n// Exposes the editor to the parent component\nexport function EditorExposePlugin({ editorRef }) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (editorRef) {\n editorRef.current = editor;\n\n // Clear the ref on component unmount\n return () => {\n if (editorRef) {\n editorRef.current = null;\n }\n };\n }\n }, [editor, editorRef]);\n\n return null;\n}\n","import { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport \"./editor-styles.css\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport InlineToolbarPlugin from \"./Plugins/InlineToolbarPlugin.jsx\";\nimport { TextFormatPlugin } from \"./Plugins/TextFormatPlugin.jsx\";\nimport BlockToolbarPlugin from \"./Plugins/BlockToolbarPlugin.jsx\";\nimport { MathInlinePlugin, MathBlockPlugin } from \"./Plugins/MathPlugin.jsx\";\nimport { CodePlugin } from \"./Plugins/CodePlugin.jsx\";\nimport { HorizontalDividerPlugin } from \"./Plugins/HorizontalDividerPlugin.jsx\";\nimport { ImagePlugin } from \"./Plugins/ImagePlugin.jsx\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { ListPluginExtended } from \"./Plugins/ListPluginExtended.jsx\";\nimport { TabInterceptorPlugin } from \"./Plugins/TabInterceptorPlugin.jsx\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { EditorExposePlugin } from \"./Plugins/EditorExposePlugin.jsx\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { ClearEditorPlugin } from \"@lexical/react/LexicalClearEditorPlugin\";\n\nexport default function Editor({\n initialConfig,\n onChange,\n editorRef,\n blockToolbarGap,\n spellCheck,\n isHeadingOneFirst,\n onImageUpload,\n}) {\n return (\n <LexicalComposer initialConfig={initialConfig}>\n <RichTextPlugin\n contentEditable={\n <ContentEditable spellCheck={spellCheck} className=\"editor-input\" />\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n <TextFormatPlugin isHeadingOneFirst={isHeadingOneFirst} />\n <InlineToolbarPlugin />\n <BlockToolbarPlugin toolbarGap={blockToolbarGap} />\n <AutoFocusPlugin />\n <HistoryPlugin />\n <MathInlinePlugin />\n <MathBlockPlugin />\n <CodePlugin />\n <HorizontalDividerPlugin />\n <ImagePlugin onImageUpload={onImageUpload} />\n <ListPlugin />\n <ListPluginExtended />\n <TabInterceptorPlugin />\n <OnChangePlugin onChange={onChange} />\n <EditorExposePlugin editorRef={editorRef} />\n <ClearEditorPlugin />\n </LexicalComposer>\n );\n}\n"],"names":["OFFSCREEN_POSITION","computeInlineToolbarPosition","boundingRectCoords","toolbarRef","topOffset","toolbarElement","x","y","width","height","centerX","topY","getBoundingRectCoords","range","rect","computeBlockToolbarPosition","offset","toolbarX","toolbarY","computeCodeMenuPosition","codeBlockCoords","codeMenuRef","HORIZONTAL_OFFSET","VERTICAL_OFFSET","codeMenuElement","X","Y","TOGGLE_HEADING_COMMAND","createCommand","TOGGLE_QUOTE_COMMAND","TOGGLE_LINK_COMMAND","getSelectedNode","selection","anchor","focus","anchorNode","focusNode","$isAtNodeEnd","fetchTagIfHeadingNode","node","headingNode","$findMatchingParent","$isHeadingNode","updateToolbarHeadingState","toolbarHeadingState","nodes","headingTag","stateKey","HeadingPlugin","editor","useLexicalComposerContext","useEffect","toolbarState","isHeadingOne","isHeadingTwo","isHeadingThree","$getSelection","$isRangeSelection","tag","$setBlocksType","$createHeadingNode","$createParagraphNode","COMMAND_PRIORITY_HIGH","HeadingOneFirstPlugin","unregisterTransform","HeadingNode","firstChild","$getRoot","children","h1Node","isNodeOrAncestorQuote","$isQuoteNode","updateToolbarQuoteState","QuotePlugin","$createQuoteNode","getLinkAtSelection","$isLinkNode","LinkPlugin","CLICK_COMMAND","payload","linkNode","COMMAND_PRIORITY_LOW","linkURL","$toggleLink","AdjacentHeadingPlugin","HEADING_ABOVE_CLASS","TextNode","textNode","parentNode","$isParagraphNode","$isListNode","element","prevSibling","shouldHaveClass","alreadyHasClass","TextFormatPlugin","isHeadingOneFirst","jsxs","Fragment","jsx","LinkToolbar","style","closeToolbar","existingLinkURL","setLinkURL","useState","Toolbar","TextField","Input","Group","Button","url","IconCheck","ICON_SIZE","IconX","TOP_OFFSET","InlineToolbar","selectionRectCoords","setSelectionRectCoords","toolbarPosition","setToolbarPosition","useRef","setToolbarState","isLinkToolbarVisible","setLinkToolbarVisible","toolbarWidth","setToolbarWidth","setExistingLinkURL","updateToolbarFormatState","prev","editorState","anchorPoint","focusPoint","anchorOffset","focusOffset","$getCharacterOffsets","selectionDOMRange","createDOMRange","_a","useLayoutEffect","computedStyle","ToggleButton","FORMAT_TEXT_COMMAND","IconBold","IconItalic","IconCode","Separator","IconTextSize","IconBlockquote","IconLink","DOM_ELEMENT","InlineToolbarPlugin","shouldShow","setShouldShow","editable","SELECTION_CHANGE_COMMAND","hasMathNode","$isMathNode","isSingleMathHighlight","$isMathHighlightNodeInline","$isMathHighlightNodeBlock","isCodeBlock","$isCodeNode","BLUR_COMMAND","toolbar","linkToolbar","activeElement","createPortal","_self","Prism","lang","uniqueId","plainTextGrammar","_","encode","tokens","Token","o","obj","deepClone","visited","clone","id","key","v","i","m","language","err","src","scripts","className","defaultActivation","no","classList","redef","inside","before","insert","root","grammar","ret","token","newToken","old","value","DFS","callback","type","objId","property","propertyType","async","container","env","parent","code","insertHighlightedCode","highlightedCode","worker","evt","text","rest","tokenList","LinkedList","addAfter","matchGrammar","toArray","name","hooks","callbacks","content","alias","matchedStr","stringify","s","e","aliases","attributes","matchPattern","pattern","pos","lookbehind","match","lookbehindLength","startNode","startPos","rematch","patterns","j","patternObj","greedy","flags","currentNode","str","removeCount","from","to","p","k","matchStr","after","reach","removeFrom","removeRange","wrapped","nestedRematch","head","tail","list","next","newNode","count","array","message","immediateClose","script","highlightAutomaticallyCallback","readyState","module","global","tagName","includedCdataInside","def","attrName","string","markup","LOADING_MESSAGE","FAILURE_MESSAGE","status","FAILURE_EMPTY_MESSAGE","EXTENSIONS","STATUS_ATTR","STATUS_LOADING","STATUS_LOADED","STATUS_FAILED","SELECTOR","loadFile","success","error","xhr","parseRange","start","comma","end","pre","extension","autoloader","lines","elements","logged","CodeMenu","codeNodeKey","codeMenuPosition","setCodeMenuPosition","setLanguage","codeLanguages","getCodeLanguages","friendlyLanguages","getLanguageFriendlyName","friendlyToOriginal","friendly","currentLanguage","$getNodeByKey","ComboBox","friendlyValue","originalValue","SET_CODE_LANGUAGE_COMMAND","IconCaretDownFilled","Popover","ListBox","index","ListBoxItem","INSERT_CODE_BLOCK_COMMAND","CodeHighlightMenuPlugin","setCodeBlockCoords","setCodeNodeKey","isEditorFocused","setIsEditorFocused","isCodeMenuFocused","setIsCodeMenuFocused","hideCodeMenu","useCallback","isFocusInCodeMenu","codeMenu","syncMenuFocusState","menuFocused","handleEditorBlur","rootElement","hasFocus","codeNode","boundingRect","handleFocus","handleBlur","prevRootElement","CodeBlockPlugin","registerCodeHighlighting","isStartOfParagraph","isAfterLineBreak","$isLineBreakNode","$createCodeNode","nextSibling","prevSelection","$getPreviousSelection","codeBlockNode","nodeKey","KEY_BACKSPACE_COMMAND","CodePlugin","INSERT_HORIZONTAL_DIVIDER_COMMAND","HorizontalDividerPlugin","HorizontalDividerNode","horizontalDividerNode","$createHorizontalDividerNode","nextNode","INSERT_IMAGE_COMMAND","SELECTED_CLASS_NAME","isImageFile","file","$insertImageNode","uploadState","imageNode","$createImageNode","ImagePlugin","onImageUpload","selectedImgElemRef","onImageUploadRef","ImageNode","startUpload","blobUrl","upload","remoteUrl","$isImageNode","IMAGE_UPLOAD_STATE","hasUpload","$isNodeSelection","DOMElement","$setSelection","PASTE_COMMAND","event","clipboardData","imageFiles","NodeEventPlugin","BlockToolbar","FileTrigger","fileList","IconPhoto","IconCodePlus","IconLineDashed","BlockToolbarPopover","TOOLBAR_OFFSET","toolbarTriggerId","toolbarPopoverId","DialogTrigger","IconPlus","BlockToolbarPlugin","toolbarGap","toolbarActive","setToolbarActive","randomStringRef","toolbarTrigger","checkToolbarPresence","isPresent","observer","centerY","INLINE_DELIMITERS","DISPLAY_DELIMITERS","escapeRegex","getMatch","delimiters","earliest","opening","closing","getSelectedMathHighlightContainer","nodeMatcher","anchorContainer","focusContainer","getClipboardPlainText","MathInlinePlugin","MathNode","MathHighlightNodeInline","targetNode","mathNode","$createMathNode","nodesToExclude","equation","mathHighlightNode","$createMathHighlightNodeInline","isBlock","KEY_ARROW_RIGHT_COMMAND","adjacentNode","$getAdjacentNode","cleanEquation","pastedText","$createTextNode","COMMAND_PRIORITY_NORMAL","MathBlockPlugin","MathHighlightNodeBlock","mathBlock","$createMathHighlightNodeBlock","blockNode","allNodes","$dfs","KEY_ENTER_COMMAND","firstNode","mathHighlightBlock","lastChild","$isTextNode","MAX_INDENT_LEVEL","ListPluginExtended","ParagraphNode","paragraphNode","$isListItemNode","lineBreakNode","$createLineBreakNode","$insertList","KEY_TAB_COMMAND","listItemNode","indent","TabInterceptorPlugin","interceptTab","EditorExposePlugin","editorRef","Editor","initialConfig","onChange","blockToolbarGap","spellCheck","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","AutoFocusPlugin","HistoryPlugin","ListPlugin","OnChangePlugin","ClearEditorPlugin"],"mappings":"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","x_google_ignoreList":[5]}