diff --git a/site/decodal-site/src/lib/codemirror/decodal.js b/site/decodal-site/src/lib/codemirror/decodal.js index ca81334..b07631d 100644 --- a/site/decodal-site/src/lib/codemirror/decodal.js +++ b/site/decodal-site/src/lib/codemirror/decodal.js @@ -1,4 +1,4 @@ -import { LRLanguage, LanguageSupport, HighlightStyle, syntaxHighlighting, foldNodeProp, foldInside, indentNodeProp } from '@codemirror/language'; +import { LRLanguage, LanguageSupport, HighlightStyle, syntaxHighlighting, foldNodeProp, indentNodeProp } from '@codemirror/language'; import { styleTags, tags as t } from '@lezer/highlight'; import { parser } from './decodal-parser.js'; @@ -25,13 +25,22 @@ const parserWithMetadata = parser.configure({ LetExpression: context => context.column(context.node.from) + context.unit, }), foldNodeProp.add({ - Object: foldInside, - Array: foldInside, - MatchExpression: foldInside, + Object: foldDelimited('lBrace', 'rBrace'), + Array: foldDelimited('lBracket', 'rBracket'), + MatchExpression: foldDelimited('lBrace', 'rBrace'), }), ], }); +function foldDelimited(openName, closeName) { + return (node) => { + const open = node.getChild(openName); + const close = node.getChild(closeName); + if (!open || !close || open.to >= close.from) return null; + return { from: open.to, to: close.from }; + }; +} + export const decodalLanguage = LRLanguage.define({ parser: parserWithMetadata, languageData: {