55 lines
1.9 KiB
JavaScript
55 lines
1.9 KiB
JavaScript
import { parser } from '@lezer/sass';
|
|
import { LRLanguage, foldNodeProp, foldInside, indentNodeProp, continuedIndent, LanguageSupport } from '@codemirror/language';
|
|
import { defineCSSCompletionSource } from '@codemirror/lang-css';
|
|
|
|
/**
|
|
A language provider based on the [Lezer Sass
|
|
parser](https://github.com/lezer-parser/sass), extended with
|
|
highlighting and indentation information.
|
|
*/
|
|
const sassLanguage = /*@__PURE__*/LRLanguage.define({
|
|
name: "sass",
|
|
parser: /*@__PURE__*/parser.configure({
|
|
props: [
|
|
/*@__PURE__*/foldNodeProp.add({
|
|
Block: foldInside,
|
|
Comment(node, state) {
|
|
return { from: node.from + 2, to: state.sliceDoc(node.to - 2, node.to) == "*/" ? node.to - 2 : node.to };
|
|
}
|
|
}),
|
|
/*@__PURE__*/indentNodeProp.add({
|
|
Declaration: /*@__PURE__*/continuedIndent()
|
|
})
|
|
]
|
|
}),
|
|
languageData: {
|
|
commentTokens: { block: { open: "/*", close: "*/" }, line: "//" },
|
|
indentOnInput: /^\s*\}$/,
|
|
wordChars: "$-"
|
|
}
|
|
});
|
|
const indentedSassLanguage = /*@__PURE__*/sassLanguage.configure({
|
|
dialect: "indented",
|
|
props: [
|
|
/*@__PURE__*/indentNodeProp.add({
|
|
"Block RuleSet": cx => cx.baseIndent + cx.unit
|
|
}),
|
|
/*@__PURE__*/foldNodeProp.add({
|
|
Block: node => ({ from: node.from, to: node.to })
|
|
})
|
|
]
|
|
});
|
|
/**
|
|
Property, variable, $-variable, and value keyword completion
|
|
source.
|
|
*/
|
|
const sassCompletionSource = /*@__PURE__*/defineCSSCompletionSource(node => node.name == "VariableName" || node.name == "SassVariableName");
|
|
/**
|
|
Language support for CSS.
|
|
*/
|
|
function sass(config) {
|
|
return new LanguageSupport((config === null || config === void 0 ? void 0 : config.indented) ? indentedSassLanguage : sassLanguage, sassLanguage.data.of({ autocomplete: sassCompletionSource }));
|
|
}
|
|
|
|
export { sass, sassCompletionSource, sassLanguage };
|