vscode-zoterolens/src/zoteroCodeLensProvider.ts

97 lines
2.7 KiB
TypeScript

import {
CodeLensProvider,
TextDocument,
CodeLens,
Range,
Command
} from "vscode";
import { findReferences } from "./reference";
export class ZoteroCodeLensProvider implements CodeLensProvider {
// Each provider requires a provideCodeLenses function which will give the various documents
// the code lenses
async provideCodeLenses(document: TextDocument): Promise<CodeLens[]> {
const references = findReferences(document);
// some sorting and filtering to have a nicer lens
return references
// sort by line, citekey, pagenr
.sort((a, b) => {
if (a.range.start.line !== b.range.start.line) {
return a.range.start.line - b.range.start.line;
}
if (a.citekey !== b.citekey) {
return a.citekey.localeCompare(b.citekey);
}
// nulls sort before anything else
if (a.pagenr === null) {
return -1;
}
if (b.pagenr === null) {
return 1;
}
return a.pagenr - b.pagenr;
})
// remove duplicate items (which are in sequence)
.filter((reference, index) => {
if (index === 0) { return true; }
if (
references[index - 1].range.start.line !== reference.range.start.line ||
references[index - 1].citekey !== reference.citekey ||
references[index - 1].pagenr !== reference.pagenr
) {
return true;
}
return false;
})
.map((reference, index) => {
let title = "";
if (
index === 0 ||
references[index - 1].range.start.line !== reference.range.start.line ||
references[index - 1].citekey !== reference.citekey
) {
title = `@${reference.citekey}`;
if (reference.pagenr) {
title += ` p.${reference.pagenr}`;
}
} else {
// there has to be a pagenr because of filtering
title = `p.${reference.pagenr}`;
}
// ignore char pos so that the order of the array
// is actually used (by default CodeLenses are sorted by position)
const range = new Range(
reference.range.start.line, 0,
reference.range.end.line, 0
);
return [
new CodeLens(range, {
title: title,
// command: 'zoterolens.showInZotero',
command: 'zoterolens.openZoteroPDF',
arguments: [reference]
}),
// new CodeLens(reference.range, {
// title: '(pdf)',
// command: 'zoterolens.openZoteroPDF',
// arguments: [reference]
// })
]
})
.flat();
// let codeLens = new CodeLens(topOfDocument, c);
// return [codeLens];
}
}