Add extension management service

This commit is contained in:
2025-06-24 14:16:53 +08:00
parent ea025e3f5d
commit f3bcb87828
31 changed files with 1682 additions and 176 deletions

View File

@@ -0,0 +1,37 @@
import {foldService} from '@codemirror/language';
export const foldingOnIndent = foldService.of((state, from, to) => {
const line = state.doc.lineAt(from) // First line
const lines = state.doc.lines // Number of lines in the document
const indent = line.text.search(/\S|$/) // Indent level of the first line
let foldStart = from // Start of the fold
let foldEnd = to // End of the fold
// Check the next line if it is on a deeper indent level
// If it is, check the next line and so on
// If it is not, go on with the foldEnd
let nextLine = line
while (nextLine.number < lines) {
nextLine = state.doc.line(nextLine.number + 1) // Next line
const nextIndent = nextLine.text.search(/\S|$/) // Indent level of the next line
// If the next line is on a deeper indent level, add it to the fold
if (nextIndent > indent) {
foldEnd = nextLine.to // Set the fold end to the end of the next line
} else {
break // If the next line is not on a deeper indent level, stop
}
}
// If the fold is only one line, don't fold it
if (state.doc.lineAt(foldStart).number === state.doc.lineAt(foldEnd).number) {
return null
}
// Set the fold start to the end of the first line
// With this, the fold will not include the first line
foldStart = line.to
// Return a fold that covers the entire indent level
return {from: foldStart, to: foldEnd}
});