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();