commit 227e393922493a9fdba26641df6afbce685d3c54
parent 0f649d660849d284fe70a3d3a5f3a9ceb31c6acb
Author: Simon Kornblith <simon@simonster.com>
Date: Mon, 4 May 2009 20:58:58 +0000
don't let DOI translator hang some page loads
Diffstat:
1 file changed, 36 insertions(+), 19 deletions(-)
diff --git a/translators/DOI.js b/translators/DOI.js
@@ -11,19 +11,46 @@
"lastUpdated":"2009-04-07 15:48:00"
}
-var DOIre = /(?:doi:)?\s*(10\.[\w.]+\/[^\/\s]+)/igm;
-
var items = {};
var selectArray = {};
+// builds a list of DOIs
+function getDOIs(doc) {
+ const DOIre = /\b(10\.[\w.]+\/[^\/\s]+)\.?\b/igm;
+ const DOIXPath = "//text()[contains(., '10.')]";
+
+ DOIre.lastMatch = 0;
+ var DOIs = [];
+
+ var node, m;
+ var results = doc.evaluate(DOIXPath, doc, null, XPathResult.ANY_TYPE, null);
+ while(node = results.iterateNext()) {
+ while(m = DOIre.exec(node.nodeValue)) {
+ var DOI = m[1];
+ if(DOI.substr(-1) == ")" && DOI.indexOf("(") == -1) {
+ DOI = DOI.substr(0, DOI.length-1);
+ }
+ // only add new DOIs
+ if(DOIs.indexOf(DOI) == -1) {
+ DOIs.push(DOI);
+ }
+ }
+ }
+
+ return DOIs;
+}
+
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";
+ const blacklistRe = /^https?:\/\/[^/]*google\.com/i;
+
+ if(!blacklistRe.test(url)) {
+ var DOIs = getDOIs(doc);
+ Zotero.debug(DOIs);
+ if(DOIs.length) {
+ return DOIs.length == 1 ? "journalArticle" : "multiple";
+ }
}
+ return false;
}
function retrieveNextDOI(DOIs, doc) {
@@ -70,17 +97,7 @@ function retrieveNextDOI(DOIs, doc) {
}
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);
- }
-
+ var DOIs = getDOIs(doc);
// retrieve full items asynchronously
Zotero.wait();
retrieveNextDOI(DOIs, doc);