diff --git a/extension/bootstrap.js b/extension/bootstrap.js index b9eab7e..259e467 100644 --- a/extension/bootstrap.js +++ b/extension/bootstrap.js @@ -23,6 +23,44 @@ const textMediaType = "text/plain; charset=UTF-8"; const badRequestCode = 400; const okCode = 200; +function loadZotero () { + let callback = function (resolve, reject) { + if (!Zotero) { + if (!("@zotero.org/Zotero;1" in Components.classes)) { + let timer = Components.classes["@mozilla.org/timer;1"].createInstanceComponents.interfaces.nsITimer; + return timer.initWithCallback(function () { + return callback(resolve, reject); + }, 10000, Components.interfaces.nsITimer.TYPE_ONE_SHOT); + } else { + Zotero = Components.classes["@zotero.org/Zotero;1"] + .getService(Components.interfaces.nsISupports).wrappedJSObject; + return resolve(Zotero); + } + } else { + return resolve(Zotero); + } + }; + return new Promise(callback); +} + +function buildZoteroLink(item) { + // This is almost a direct copy from Zutilo + let libraryType = Zotero.Libraries.get(item.libraryID).libraryType; + var path = "undefined" + switch (libraryType) { + case 'group': + path = Zotero.URI.getLibraryPath(item.libraryID) + break; + case 'user': + path = 'library' + break; + default: + break; + } + return 'zotero://select/' + path + '/items/'+ item.key +} + + function collectionSearch(name) { let collections = Zotero.Collections.getByLibrary( Zotero.Libraries.userLibraryID, @@ -118,6 +156,8 @@ async function buildResponse(items, format, style, locale) { return buildQuickBibResponse(items); } else if (format === "paths") { return buildPathsResponse(items, style); + } else if (format === 'zoteroLink') { + return [okCode, 'application/json', jsonStringify(items.map(buildZoteroLink))]; } else if (format && format.match(uuidRe)) { return buildExportResponse(items, format); } else {