From 19ff243b92f604d979722fceb67fa65cf055a8cb Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Tue, 7 Apr 2009 15:50:37 +0000 Subject: [PATCH] first pass at a generic DOI translator. works on Annual Reviews article pages, which we don't currently have a translator for. needs more testing. --- translators/DOI.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 translators/DOI.js diff --git a/translators/DOI.js b/translators/DOI.js new file mode 100644 index 000000000..fd4edd536 --- /dev/null +++ b/translators/DOI.js @@ -0,0 +1,86 @@ +{ + "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); +} \ No newline at end of file