This commit is contained in:
CismonX 2020-10-27 01:28:11 +08:00
parent 2b887a6369
commit 319d1df24e
Signed by: cismonx
GPG Key ID: 3094873E29A482FB
7 changed files with 21 additions and 38 deletions

6
package-lock.json generated
View File

@ -74,9 +74,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "14.14.2", "version": "14.14.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.3.tgz",
"integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", "integrity": "sha512-33/L34xS7HVUx23e0wOT2V1qPF1IrHgQccdJVm9uXGTB9vFBrrzBtkQymT8VskeKOxjz55MSqMv0xuLq+u98WQ==",
"dev": true "dev": true
}, },
"@types/vscode": { "@types/vscode": {

View File

@ -15,7 +15,7 @@
}, },
"icon": "assets/texinfo.png", "icon": "assets/texinfo.png",
"devDependencies": { "devDependencies": {
"@types/node": "^14.14.2", "@types/node": "^14.14.3",
"@types/vscode": "^1.50.0", "@types/vscode": "^1.50.0",
"@typescript-eslint/eslint-plugin": "^3.8.0", "@typescript-eslint/eslint-plugin": "^3.8.0",
"@typescript-eslint/parser": "^3.8.0", "@typescript-eslint/parser": "^3.8.0",
@ -75,7 +75,7 @@
"contributes": { "contributes": {
"commands": [ "commands": [
{ {
"command": "texinfo.showPreview", "command": "texinfo.preview.show",
"title": "Show preview", "title": "Show preview",
"icon": "$(open-preview)" "icon": "$(open-preview)"
} }
@ -83,14 +83,14 @@
"menus": { "menus": {
"commandPalette": [ "commandPalette": [
{ {
"command": "texinfo.showPreview", "command": "texinfo.preview.show",
"when": "editorLangId == texinfo", "when": "editorLangId == texinfo",
"group": "navigation" "group": "navigation"
} }
], ],
"editor/title": [ "editor/title": [
{ {
"command": "texinfo.showPreview", "command": "texinfo.preview.show",
"when": "editorLangId == texinfo", "when": "editorLangId == texinfo",
"group": "navigation" "group": "navigation"
} }
@ -98,7 +98,7 @@
}, },
"keybindings": [ "keybindings": [
{ {
"command": "texinfo.showPreview", "command": "texinfo.preview.show",
"key": "ctrl+k v", "key": "ctrl+k v",
"mac": "cmd+k v", "mac": "cmd+k v",
"when": "editorLangId == texinfo" "when": "editorLangId == texinfo"

View File

@ -19,14 +19,11 @@ export default class DocumentSymbolContext {
private documentSymbols?: vscode.DocumentSymbol[]; private documentSymbols?: vscode.DocumentSymbol[];
private foldingRanges?: readonly FoldingRange[];
get values() { get values() {
return this.documentSymbols ??= this.calculcateDocumentSymbols(); return this.documentSymbols ??= this.calculcateDocumentSymbols();
} }
clear() { clear() {
this.foldingRanges = undefined;
this.documentSymbols = undefined; this.documentSymbols = undefined;
} }
@ -37,9 +34,8 @@ export default class DocumentSymbolContext {
*/ */
private calculcateDocumentSymbols() { private calculcateDocumentSymbols() {
const ranges = Array<RangeNode>(this.document.lineCount); const ranges = Array<RangeNode>(this.document.lineCount);
(this.foldingRanges ??= this.documentContext.foldingRange.values) this.documentContext.foldingRange.values.forEach(range => range.kind ?? (ranges[range.start] = range));
.forEach(range => range.kind ?? (ranges[range.start] = range)); return foldingRangeToSymbols(ranges, 0, ranges.length);
return this.documentSymbols = foldingRangeToSymbols(ranges, 0, ranges.length);
} }
} }

View File

@ -6,7 +6,7 @@
*/ */
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { FoldingRange, Range } from '../utils/types'; import { FoldingRange, Range, NamedLine } from '../utils/types';
/** /**
* Stores information about folding ranges for a document. * Stores information about folding ranges for a document.
@ -23,7 +23,7 @@ export default class FoldingRangeContext {
* Get VSCode folding ranges from the context. * Get VSCode folding ranges from the context.
*/ */
get values() { get values() {
return this.foldingRanges ??= this.calculateFoldingRanges(); return this.foldingRanges ?? this.calculateFoldingRanges();
} }
private foldingRanges?: FoldingRange[]; private foldingRanges?: FoldingRange[];
@ -65,7 +65,7 @@ export default class FoldingRangeContext {
private calculateFoldingRanges() { private calculateFoldingRanges() {
this.foldingRanges = []; this.foldingRanges = [];
this.clearTemporaries(); this.clearTemporaries();
let closingBlocks = <ClosingBlock[]>[]; let closingBlocks = <NamedLine[]>[];
let lastLine = this.document.lineCount - 1; let lastLine = this.document.lineCount - 1;
let verbatim = false; let verbatim = false;
for (let idx = lastLine; idx >= 0; --idx) { for (let idx = lastLine; idx >= 0; --idx) {
@ -172,7 +172,7 @@ export default class FoldingRangeContext {
kind?: vscode.FoldingRangeKind kind?: vscode.FoldingRangeKind
}) { }) {
(this.foldingRanges ??= []) (this.foldingRanges ??= [])
.push(new FoldingRange(extraArgs.name ?? '', extraArgs.detail ?? '', start, end, extraArgs.kind)); .push({ name: extraArgs.name ?? '', detail: extraArgs.detail ?? '', start, end, kind: extraArgs.kind });
} }
private clearTemporaries() { private clearTemporaries() {
@ -181,5 +181,3 @@ export default class FoldingRangeContext {
this.closingSubsection = this.closingSection = this.closingChapter = undefined; this.closingSubsection = this.closingSection = this.closingChapter = undefined;
} }
} }
type ClosingBlock = { name: string, line: number };

View File

@ -22,7 +22,7 @@ export function activate(context: vscode.ExtensionContext) {
vscode.workspace.onDidSaveTextDocument(ContextMapping.onDocumentSave), vscode.workspace.onDidSaveTextDocument(ContextMapping.onDocumentSave),
vscode.workspace.onDidCloseTextDocument(ContextMapping.onDocumentClose), vscode.workspace.onDidCloseTextDocument(ContextMapping.onDocumentClose),
vscode.workspace.onDidChangeConfiguration(Options.clear), vscode.workspace.onDidChangeConfiguration(Options.clear),
vscode.commands.registerTextEditorCommand('texinfo.showPreview', PreviewContext.showPreview), vscode.commands.registerTextEditorCommand('texinfo.preview.show', PreviewContext.showPreview),
vscode.languages.registerCompletionItemProvider('texinfo', new CompletionItemProvider(), '@'), vscode.languages.registerCompletionItemProvider('texinfo', new CompletionItemProvider(), '@'),
vscode.languages.registerDocumentSymbolProvider('texinfo', new DocumentSymbolProvider()), vscode.languages.registerDocumentSymbolProvider('texinfo', new DocumentSymbolProvider()),
vscode.languages.registerFoldingRangeProvider('texinfo', new FoldingRangeProvider()), vscode.languages.registerFoldingRangeProvider('texinfo', new FoldingRangeProvider()),

View File

@ -6,6 +6,7 @@
*/ */
import * as htmlparser from 'node-html-parser'; import * as htmlparser from 'node-html-parser';
import { Operator } from './types';
/** /**
* DOM manipulation utilities. * DOM manipulation utilities.
@ -33,7 +34,7 @@ export default class DOM {
* *
* @param transformer * @param transformer
*/ */
transformImageUri(transformer: (src: string) => string) { transformImageUri(transformer: Operator<string>) {
const elements = this.value.querySelectorAll('img'); const elements = this.value.querySelectorAll('img');
if (elements.length === 0) return; if (elements.length === 0) return;
elements.forEach(element => { elements.forEach(element => {

View File

@ -13,24 +13,12 @@ export type Operator<T> = (arg: T) => T;
export type Range = { start: number, end: number }; export type Range = { start: number, end: number };
export type NamedLine = { name: string, line: number };
export type ExecResult = { data?: string, error: string }; export type ExecResult = { data?: string, error: string };
export type FoldingRange = vscode.FoldingRange & { name: string, detail: string };
export function isDefined<T>(value: Optional<T>): value is T { export function isDefined<T>(value: Optional<T>): value is T {
return value !== undefined; return value !== undefined;
} }
/**
* VSCode folding range with name and description.
*/
export class FoldingRange extends vscode.FoldingRange {
constructor(
readonly name: string,
readonly detail: string,
start: number,
end: number,
kind?: vscode.FoldingRangeKind,
) {
super(start, end, kind);
}
}