prism-code-editor
Version:
Lightweight, extensible code editor component for the web using Prism
46 lines (45 loc) • 1.71 kB
JavaScript
import { f as getClosestToken } from "../../index-2teoWRgh.js";
import { b as addTextareaListener } from "../../index-Bb4AMnd0.js";
const highlightBracketPairs = () => (editor) => {
let brackets, matcher, pairs, activeID = -1, els = [], selectionChange = () => {
matcher || (matcher = editor.extensions.matchBrackets);
let [start, end] = editor.getSelection();
let newID = start == end && editor.focused && matcher ? closest(end) || -1 : -1;
if (newID != activeID) {
toggleActive();
if (newID + 1) {
let opening = brackets[pairs[newID]];
let closing = brackets[newID];
els = [opening, closing].map(
(bracket) => getClosestToken(editor, ".punctuation", 0, -1, bracket[1])
);
if (els[0] != els[1] && opening[1] + opening[3].length == closing[1]) {
els[0].textContent += els[1].textContent;
els[1].textContent = "";
els[1] = els[0];
}
toggleActive(true);
} else
els = [];
activeID = newID;
}
}, closest = (offset) => {
({ brackets, pairs } = matcher);
for (let i = 0, bracket; bracket = brackets[++i]; ) {
if (!bracket[4] && bracket[5] >= offset && brackets[pairs[i]]?.[1] <= offset) {
return i;
}
}
}, toggleActive = (add) => els.forEach((el) => el.classList.toggle("active-bracket", !!add));
addTextareaListener(editor, "focus", selectionChange);
addTextareaListener(editor, "blur", selectionChange);
editor.addListener("selectionChange", selectionChange);
editor.addListener("update", () => {
toggleActive();
activeID = -1;
});
};
export {
highlightBracketPairs
};
//# sourceMappingURL=highlight.js.map