97 lines
2.7 KiB
TypeScript
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];
|
|
}
|
|
|
|
|
|
}
|
|
|