prism-code-editor
Version:
Lightweight, extensible code editor component for the web using Prism
52 lines (51 loc) • 1.74 kB
JavaScript
import { h as addTextareaListener, n as getClosestToken } from "../../utils-BffvWiz1.js";
//#region src/extensions/matchBrackets/highlight.ts
/**
* Extension adding a `selectionChange` handler to highlight the bracker pair closest to
* the cursor.
*
* You must to add a {@link BracketMatcher} to your editor for this extension to work.
*
* The `.active-bracket` CSS selector can be used to highlight the brackets.
*/
var highlightBracketPairs = () => (editor) => {
let prev;
let els = [];
let selectionChange = () => {
let matcher = editor.extensions.matchBrackets;
let [start, end] = editor.getSelection();
if (matcher) {
let brackets = matcher.brackets;
let pairs = matcher.pairs;
let opening;
let closing;
if (editor.focused && start == end) {
for (let i = 0, bracket; bracket = brackets[++i];) if (!bracket[5] && bracket[2] >= end && brackets[pairs[i]]?.[1] <= end) {
opening = brackets[pairs[i]];
closing = bracket;
break;
}
}
if (closing != prev) {
toggleActive();
if (closing) {
els = [opening, closing].map((bracket) => getClosestToken(editor, ".punctuation", 0, -1, bracket[1]));
if (els[0] != els[1] && opening[2] == closing[1]) {
els[0].textContent += els[1].textContent;
els[1].textContent = "";
els[1] = els[0];
}
toggleActive(true);
} else els = [];
}
prev = closing;
}
};
let toggleActive = (add) => els.forEach((el) => el.classList.toggle("active-bracket", !!add));
addTextareaListener(editor, "focus", selectionChange);
addTextareaListener(editor, "blur", selectionChange);
editor.on("selectionChange", selectionChange);
};
//#endregion
export { highlightBracketPairs };
//# sourceMappingURL=highlight.js.map