diff --git a/README.md b/README.md index 65062d0..e4ccaa6 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Texinfo language support for Visual Studio Code.
-Block Folding +Folding (Screenshots here...)
diff --git a/package-lock.json b/package-lock.json index 201e094..7325f68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,6 +61,11 @@ "strip-json-comments": "^3.1.1" } }, + "@flatten-js/interval-tree": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.0.12.tgz", + "integrity": "sha512-j2o14WdFPII5cI57j0XNSWQm80gM4G6RT5+NLaH8q7KmQKejR/qZiGiViMjRgMtPiiwaX6hv3hlXeyRL3yzi7g==" + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", diff --git a/package.json b/package.json index 7cdd430..ed53f7f 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "typescript": "^4.0.3" }, "dependencies": { + "@flatten-js/interval-tree": "^1.0.12", "node-html-parser": "^1.3.1" }, "scripts": { diff --git a/src/completion.ts b/src/completion.ts index 84960b9..dcae706 100644 --- a/src/completion.ts +++ b/src/completion.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode'; /** - * Texinfo language completion item provider. + * Provide code completion info for Texinfo source code. */ export class CompletionItemProvider implements vscode.CompletionItemProvider { diff --git a/src/converter.ts b/src/converter.ts index e22263e..95e170e 100644 --- a/src/converter.ts +++ b/src/converter.ts @@ -5,13 +5,13 @@ * @license MIT */ -import { Options } from './options'; +import Options from './options'; import * as utils from './utils'; /** * Texinfo to HTML converter. */ -export class Converter { +export default class Converter { /** * Convert a Texinfo document to HTML. diff --git a/src/extension.ts b/src/extension.ts index fa03879..76cc645 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,8 +6,8 @@ */ import * as vscode from 'vscode'; -import { Options } from './options'; -import { Preview } from './preview'; +import Options from './options'; +import Preview from './preview'; import { CompletionItemProvider } from './completion'; import { FoldingRangeProvider, FoldingRangeContext } from './folding'; diff --git a/src/folding.ts b/src/folding.ts index 6284f28..ca75965 100644 --- a/src/folding.ts +++ b/src/folding.ts @@ -5,6 +5,7 @@ * @license MIT */ +import IntervalTree from '@flatten-js/interval-tree'; import * as vscode from 'vscode'; /** @@ -35,7 +36,7 @@ export class FoldingRangeContext { if (event.document.languageId !== 'texinfo') { return; } - FoldingRangeContext.get(event.document)?.update(event.contentChanges); + FoldingRangeContext.get(event.document).update(event.contentChanges); } static close(document: vscode.TextDocument) { @@ -46,9 +47,15 @@ export class FoldingRangeContext { FoldingRangeContext.map.clear(); } - foldingRanges = []; + get foldingRanges(): vscode.FoldingRange[] { + return this.tempFoldingRanges ?? (this.tempFoldingRanges = this.intervalTree.values); + } - private commentRange?: vscode.FoldingRange; + private intervalTree = new IntervalTree(); + + private tempFoldingRanges?: vscode.FoldingRange[]; + + private commentRange?: [number, number]; private headerStart?: number; @@ -56,7 +63,9 @@ export class FoldingRangeContext { private constructor(private readonly document: vscode.TextDocument) { FoldingRangeContext.map.set(document, this); + console.log(Date.now()); this.calculateFoldingRanges(); + console.log(Date.now()); } private calculateFoldingRanges() { @@ -73,8 +82,8 @@ export class FoldingRangeContext { this.processBlock(lineText, lineNum); } if (this.commentRange !== undefined) { - if (this.commentRange.end - this.commentRange.start > 1) { - this.foldingRanges.push(this.commentRange); + if (this.commentRange[1] - this.commentRange[0] > 1) { + this.insertRange(this.commentRange); } } } @@ -89,17 +98,17 @@ export class FoldingRangeContext { if (this.headerStart === undefined) { this.headerStart = lineNum; } else { - this.foldingRanges.push(new vscode.FoldingRange(lineNum, this.headerStart)); + this.insertRange([lineNum, this.headerStart]); this.headerStart = undefined; } } if (this.commentRange === undefined) { - this.commentRange = new vscode.FoldingRange(lineNum, lineNum, vscode.FoldingRangeKind.Comment); - } else if (this.commentRange.start - 1 === lineNum) { - this.commentRange.start = lineNum; + this.commentRange = [lineNum, lineNum]; + } else if (this.commentRange[0] - 1 === lineNum) { + this.commentRange[0] = lineNum; } else { - this.foldingRanges.push(this.commentRange); - this.commentRange = new vscode.FoldingRange(lineNum, lineNum, vscode.FoldingRangeKind.Comment); + this.insertRange(this.commentRange, vscode.FoldingRangeKind.Comment); + this.commentRange = [lineNum, lineNum]; } return true; } @@ -115,15 +124,28 @@ export class FoldingRangeContext { return; } if (lineText.substring(1, closingBlock.name.length + 2).trim() === closingBlock.name) { - this.foldingRanges.push(new vscode.FoldingRange(lineNum, closingBlock.line)); + this.insertRange([lineNum, closingBlock.line]); } else { this.closingBlocks.push(closingBlock); } } } + private insertRange(range: [start: number, end: number], kind?: vscode.FoldingRangeKind) { + const foldingRange = new vscode.FoldingRange(range[0], range[1], kind); + this.intervalTree.insert(range, foldingRange); + } + private update(events: readonly vscode.TextDocumentContentChangeEvent[]) { - // console.log(events); + console.log(events); + } + + private clear() { + this.intervalTree = new IntervalTree(); + this.tempFoldingRanges = undefined; + this.commentRange = undefined; + this.headerStart = undefined; + this.closingBlocks = []; } } diff --git a/src/options.ts b/src/options.ts index 42c2044..8bb93e2 100644 --- a/src/options.ts +++ b/src/options.ts @@ -14,7 +14,7 @@ let options: Options | undefined; * * See `contributes.configuration` of package.json for details. */ -export class Options { +export default class Options { private static get instance() { return options ?? (options = new Options('texinfo')); diff --git a/src/preview.ts b/src/preview.ts index a1c294c..c2ef413 100644 --- a/src/preview.ts +++ b/src/preview.ts @@ -7,14 +7,14 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import { Converter } from './converter'; -import { Options } from './options'; +import Converter from './converter'; +import Options from './options'; import * as utils from './utils'; /** * Texinfo document preview. */ -export class Preview { +export default class Preview { private static readonly map = new Map();