From 33ea8b94f97c35e415241234a4f76684473a8fbf Mon Sep 17 00:00:00 2001 From: Hare Date: Thu, 9 Jul 2026 00:04:34 +0900 Subject: [PATCH] Fix CodeMirror folding ranges --- .../src/lib/codemirror/decodal.js | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) 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; }; }