2023-08-14 23:02:41 +03:00
|
|
|
import { bracketMatching, MatchResult } from '@codemirror/language';
|
|
|
|
import { Decoration, EditorView } from '@codemirror/view';
|
|
|
|
|
2023-08-15 00:41:09 +03:00
|
|
|
const matchingMark = Decoration.mark({class: "cc-matchingBracket"});
|
|
|
|
const nonmatchingMark = Decoration.mark({class: "cc-nonmatchingBracket"});
|
2023-08-14 23:02:41 +03:00
|
|
|
|
|
|
|
function bracketRender(match: MatchResult) {
|
2023-08-15 00:41:09 +03:00
|
|
|
const decorations = [];
|
|
|
|
const mark = match.matched ? matchingMark : nonmatchingMark;
|
|
|
|
decorations.push(mark.range(match.start.from, match.start.to));
|
|
|
|
if (match.end) {
|
|
|
|
decorations.push(mark.range(match.end.from, match.end.to));
|
|
|
|
}
|
|
|
|
return decorations;
|
2023-08-14 23:02:41 +03:00
|
|
|
}
|
|
|
|
|
2023-08-15 00:41:09 +03:00
|
|
|
const darkTheme = EditorView.baseTheme({
|
|
|
|
'.cc-matchingBracket': {
|
|
|
|
fontWeight: 600,
|
|
|
|
},
|
|
|
|
'.cc-nonmatchingBracket': {
|
|
|
|
color: '#ef4444',
|
|
|
|
fontWeight: 700,
|
|
|
|
},
|
|
|
|
'&.cm-focused .cc-matchingBracket': {
|
|
|
|
backgroundColor: '#734f00',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const lightTheme = EditorView.baseTheme({
|
|
|
|
'.cc-matchingBracket': {
|
|
|
|
fontWeight: 600,
|
|
|
|
},
|
|
|
|
'.cc-nonmatchingBracket': {
|
|
|
|
color: '#ef4444',
|
|
|
|
fontWeight: 700,
|
|
|
|
},
|
|
|
|
'&.cm-focused .cc-matchingBracket': {
|
|
|
|
backgroundColor: '#dae6f2',
|
|
|
|
},
|
|
|
|
});
|
2023-08-14 23:02:41 +03:00
|
|
|
|
2023-08-15 00:41:09 +03:00
|
|
|
export function ccBracketMatching(darkMode: boolean) {
|
|
|
|
return [bracketMatching({ renderMatch: bracketRender }), darkMode ? darkTheme : lightTheme];
|
2023-08-14 23:02:41 +03:00
|
|
|
}
|