From 8db813a661bbade87781b3a25f76a614e1348739 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 12 Aug 2021 17:15:08 +0200 Subject: [PATCH] #21 - Implemented the folding provider for front matter --- src/extension.ts | 5 +++++ src/providers/MarkdownFoldingProvider.ts | 26 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/providers/MarkdownFoldingProvider.ts diff --git a/src/extension.ts b/src/extension.ts index ef30a011..be50bd3b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -5,6 +5,7 @@ import { Project } from './commands/Project'; import { Template } from './commands/Template'; import { COMMAND_NAME } from './constants/Extension'; import { TaxonomyType } from './models'; +import { MarkdownFoldingProvider } from './providers/MarkdownFoldingProvider'; import { TagType } from './viewpanel/TagType'; import { ExplorerView } from './webview/ExplorerView'; @@ -13,6 +14,8 @@ let statusDebouncer: { (fnc: any, time: number): void; }; let editDebounce: { (fnc: any, time: number): void; }; let collection: vscode.DiagnosticCollection; +const mdSelector: vscode.DocumentSelector = { language: 'markdown', scheme: 'file' }; + export async function activate({ subscriptions, extensionUri }: vscode.ExtensionContext) { collection = vscode.languages.createDiagnosticCollection('frontMatter'); @@ -23,6 +26,8 @@ export async function activate({ subscriptions, extensionUri }: vscode.Extension } }); + vscode.languages.registerFoldingRangeProvider(mdSelector, new MarkdownFoldingProvider()); + let insertTags = vscode.commands.registerCommand(COMMAND_NAME.insertTags, async () => { await vscode.commands.executeCommand('workbench.view.extension.frontmatter-explorer'); await vscode.commands.executeCommand('workbench.action.focusSideBar'); diff --git a/src/providers/MarkdownFoldingProvider.ts b/src/providers/MarkdownFoldingProvider.ts new file mode 100644 index 00000000..5053ef86 --- /dev/null +++ b/src/providers/MarkdownFoldingProvider.ts @@ -0,0 +1,26 @@ +import { CancellationToken, FoldingContext, FoldingRange, FoldingRangeKind, FoldingRangeProvider, TextDocument } from 'vscode'; + +export class MarkdownFoldingProvider implements FoldingRangeProvider { + + public async provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): Promise { + const ranges: FoldingRange[] = []; + + const lines = document.getText().split('\n'); + let start: number | null = null; + let end: number | null = null; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (line.startsWith('---')) { + if (i === 0 && start === null) { + start = i; + } else if (start !== null && end === null) { + end = i; + ranges.push(new FoldingRange(start, end, FoldingRangeKind.Region)); + return ranges; + } + } + } + return ranges; + } +} \ No newline at end of file