✨ Add extension management service
This commit is contained in:
37
frontend/src/views/editor/extensions/fold/foldExtension.ts
Normal file
37
frontend/src/views/editor/extensions/fold/foldExtension.ts
Normal 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}
|
||||
});
|
||||
Reference in New Issue
Block a user