diff --git a/site/decodal-site/src/lib/codemirror/decodal.js b/site/decodal-site/src/lib/codemirror/decodal.js index b07631d..a4d3a3f 100644 --- a/site/decodal-site/src/lib/codemirror/decodal.js +++ b/site/decodal-site/src/lib/codemirror/decodal.js @@ -25,19 +25,22 @@ const parserWithMetadata = parser.configure({ LetExpression: context => context.column(context.node.from) + context.unit, }), foldNodeProp.add({ - Object: foldDelimited('lBrace', 'rBrace'), - Array: foldDelimited('lBracket', 'rBracket'), - MatchExpression: foldDelimited('lBrace', 'rBrace'), + Object: foldDelimited('{', '}'), + Array: foldDelimited('[', ']'), + MatchExpression: foldDelimited('{', '}'), }), ], }); -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 }; +function foldDelimited(open, close) { + return (node, state) => { + const text = state.doc.sliceString(node.from, node.to); + const openIndex = text.indexOf(open); + const closeIndex = text.lastIndexOf(close); + if (openIndex < 0 || closeIndex <= openIndex) return null; + const from = node.from + openIndex + open.length; + const to = node.from + closeIndex; + return from < to ? { from, to } : null; }; }