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 { 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]; } }