prism-react-editor
Version:
Lightweight, extensible code editor component for React apps
72 lines (71 loc) • 2.33 kB
JavaScript
"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