zotero/translators/DOI.js

86 lines
No EOL
2.1 KiB
JavaScript

{
"translatorID":"c159dcfe-8a53-4301-a499-30f6549c340d",
"translatorType":4,
"label":"DOI",
"creator":"Simon Kornblith",
"target":null,
"minVersion":"1.0.10",
"maxVersion":"",
"priority":300,
"inRepository":true,
"lastUpdated":"2009-04-07 15:48:00"
}
var DOIre = /doi:\s*(10\.[\w.]+\/[^\/\s]+)/ig;
var items = {};
var selectArray = {};
function detectWeb(doc, url) {
var m1 = DOIre.exec(doc.documentElement.textContent);
var m2 = DOIre.exec(doc.documentElement.textContent);
if(m1 & m2) {
return "multiple";
} else if(m1) {
return "journalArticle";
}
}
function retrieveNextDOI(DOIs, doc) {
if(DOIs.length) {
// retrieve DOI
var DOI = DOIs.shift();
var translate = Zotero.loadTranslator("search");
translate.setTranslator("11645bd1-0420-45c1-badb-53fb41eeb753");
var item = {"itemType":"journalArticle", "DOI":DOI};
translate.setSearch(item);
// don't save when item is done
translate.setHandler("itemDone", function(translate, item) {
item.repository = "CrossRef";
items[DOI] = item;
selectArray[DOI] = item.title;
});
translate.setHandler("done", function(translate) {
retrieveNextDOI(DOIs, doc);
});
translate.translate();
} else {
// all DOIs retrieved now
// check to see if there is more than one DOI
var numDOIs = 0;
for(var DOI in selectArray) {
numDOIs++;
if(numDOIs == 2) break;
}
if(numDOIs == 0) {
throw "DOI Translator: could not find DOI";
} else if(numDOIs == 1) {
// do we want to add URL of the page?
items[DOI].url = doc.location.href;
items[DOI].attachments = [{document:doc}];
items[DOI].complete();
} else {
selectArray = Zotero.selectItems(selectArray);
for(var DOI in selectArray) {
items[DOI].complete();
}
}
Zotero.done();
}
}
function doWeb(doc, url) {
// build a list of DOIs
DOIre.lastMatch = 0;
DOIs = [];
while((m = DOIre.exec(doc.documentElement.textContent))) {
var DOI = m[1];
if(DOI.substr(-1) == ")" && DOI.indexOf("(") == -1) {
DOI = DOI.substr(0, DOI.length-1);
}
DOIs.push(DOI);
}
// retrieve full items asynchronously
Zotero.wait();
retrieveNextDOI(DOIs, doc);
}