UNPKG

prism-react-editor

Version:

Lightweight, extensible code editor component for React apps

72 lines (71 loc) 2.33 kB
"use client"; import { useLayoutEffect } from "react"; import { t as testBracket } from "../../local-Cq-4Fajb.js"; const useBracketMatcher = (editor, rainbowBrackets = true, pairs = "()[]{}") => { useLayoutEffect(() => { let bracketIndex; let sp; const stack = []; const brackets = []; const pairMap = []; const matchRecursive = (tokens, position) => { for (let i = 0, token; token = tokens[i++]; ) { let length = token.length; if (typeof token != "string") { let content = token.content; if (Array.isArray(content)) { matchRecursive(content, position); } else if ((token.alias || token.type) == "punctuation") { let bracketType = testBracket(content, pairs, length - 1); let isOpening = bracketType % 2; if (bracketType) { brackets[bracketIndex] = [ token, position, position + length, sp, content, !!isOpening ]; if (isOpening) stack[sp++] = [bracketIndex, bracketType + 1]; else { for (let i2 = sp; i2; ) { let entry = stack[--i2]; if (bracketType == entry[1]) { pairMap[pairMap[bracketIndex] = entry[0]] = bracketIndex; brackets[bracketIndex][3] = sp = i2; i2 = 0; } } } bracketIndex++; } } } position += length; } }; const cleanup = editor.on("tokenize", (tokens) => { pairMap.length = brackets.length = sp = bracketIndex = 0; matchRecursive(tokens, 0); if (rainbowBrackets) { for (let i = 0, bracket; bracket = brackets[i]; ) { let alias = bracket[0].alias; bracket[0].alias = (alias ? alias + " " : "") + `bracket-${i++ in pairMap ? "level-" + bracket[3] % 12 : "error"}`; } } }); editor.extensions.matchBrackets = { brackets, pairs: pairMap }; return () => { delete editor.extensions.matchBrackets; cleanup(); }; }, [rainbowBrackets, pairs]); }; export { useBracketMatcher }; //# sourceMappingURL=index.js.map