203 lines
6.0 KiB
JavaScript
203 lines
6.0 KiB
JavaScript
|
{
|
|||
|
"translatorID": "b28d0d42-8549-4c6d-83fc-8382874a5cb9",
|
|||
|
"label": "DOI Content Negotiation",
|
|||
|
"creator": "Sebastian Karcher",
|
|||
|
"target": "",
|
|||
|
"minVersion": "4.0.29.11",
|
|||
|
"maxVersion": "",
|
|||
|
"priority": 100,
|
|||
|
"inRepository": true,
|
|||
|
"translatorType": 8,
|
|||
|
"browserSupport": "gcs",
|
|||
|
"lastUpdated": "2020-04-20 20:04:00"
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
***** BEGIN LICENSE BLOCK *****
|
|||
|
|
|||
|
Copyright © 2019 Sebastian Karcher
|
|||
|
|
|||
|
This file is part of Zotero.
|
|||
|
|
|||
|
Zotero is free software: you can redistribute it and/or modify
|
|||
|
it under the terms of the GNU Affero General Public License as published by
|
|||
|
the Free Software Foundation, either version 3 of the License, or
|
|||
|
(at your option) any later version.
|
|||
|
|
|||
|
Zotero is distributed in the hope that it will be useful,
|
|||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
|
GNU Affero General Public License for more details.
|
|||
|
|
|||
|
You should have received a copy of the GNU Affero General Public License
|
|||
|
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|
|||
|
***** END LICENSE BLOCK *****
|
|||
|
*/
|
|||
|
|
|||
|
function detectSearch(items) {
|
|||
|
return (filterQuery(items).length > 0);
|
|||
|
}
|
|||
|
|
|||
|
// return an array of DOIs from the query (items or text)
|
|||
|
function filterQuery(items) {
|
|||
|
if (!items) return [];
|
|||
|
|
|||
|
if (typeof items == 'string' || !items.length) items = [items];
|
|||
|
|
|||
|
// filter out invalid queries
|
|||
|
var dois = [], doi;
|
|||
|
for (var i = 0, n = items.length; i < n; i++) {
|
|||
|
if (items[i].DOI && (doi = ZU.cleanDOI(items[i].DOI))) {
|
|||
|
dois.push(doi);
|
|||
|
}
|
|||
|
else if (typeof items[i] == 'string' && (doi = ZU.cleanDOI(items[i]))) {
|
|||
|
dois.push(doi);
|
|||
|
}
|
|||
|
}
|
|||
|
return dois;
|
|||
|
}
|
|||
|
|
|||
|
function doSearch(items) {
|
|||
|
var dois = filterQuery(items);
|
|||
|
if (!dois.length) return;
|
|||
|
processDOIs(dois);
|
|||
|
}
|
|||
|
|
|||
|
function processDOIs(dois) {
|
|||
|
var doi = dois.pop();
|
|||
|
// by content negotiation we asked for datacite or crossref format, or CSL JSON
|
|||
|
ZU.doGet('https://doi.org/' + encodeURIComponent(doi), function (text) {
|
|||
|
if (!text) {
|
|||
|
return;
|
|||
|
}
|
|||
|
Z.debug(text);
|
|||
|
|
|||
|
var trans = Zotero.loadTranslator('import');
|
|||
|
trans.setString(text);
|
|||
|
if (text.includes("<crossref")) {
|
|||
|
// Crossref Unixref
|
|||
|
trans.setTranslator('93514073-b541-4e02-9180-c36d2f3bb401');
|
|||
|
trans.setHandler('itemDone', function (obj, item) {
|
|||
|
item.libraryCatalog = "DOI.org (Crossref)";
|
|||
|
item.complete();
|
|||
|
});
|
|||
|
trans.translate();
|
|||
|
}
|
|||
|
else if (text.includes("http://datacite.org/schema")
|
|||
|
// TEMP
|
|||
|
// https://github.com/zotero/translators/issues/2018#issuecomment-616491407
|
|||
|
|| text.includes('"agency": "DataCite"')
|
|||
|
|| text.includes('"providerId": ')) {
|
|||
|
// Datacite JSON
|
|||
|
trans.setTranslator('b5b5808b-1c61-473d-9a02-e1f5ba7b8eef');
|
|||
|
trans.setHandler('itemDone', function (obj, item) {
|
|||
|
item.libraryCatalog = "DOI.org (Datacite)";
|
|||
|
item.complete();
|
|||
|
});
|
|||
|
trans.translate();
|
|||
|
}
|
|||
|
else {
|
|||
|
// use CSL JSON translator
|
|||
|
trans.setTranslator('bc03b4fe-436d-4a1f-ba59-de4d2d7a63f7');
|
|||
|
trans.setHandler('itemDone', function (obj, item) {
|
|||
|
item.libraryCatalog = "DOI.org (CSL JSON)";
|
|||
|
// check if there are potential issues with character encoding and try to fix it
|
|||
|
// e.g. 10.1057/9780230391116.0016 (en dash in title is presented as escaped unicode)
|
|||
|
for (var field in item) {
|
|||
|
if (typeof item[field] != 'string') continue;
|
|||
|
// check for control characters that should never be in strings from CrossRef
|
|||
|
if (/[\u007F-\u009F]/.test(item[field])) {
|
|||
|
var escaped = item[field].replace(/[^0-9A-Za-z ]/g, function (c) {
|
|||
|
return "%" + c.charCodeAt(0).toString(16);
|
|||
|
});
|
|||
|
item[field] = decodeURIComponent(escaped);
|
|||
|
}
|
|||
|
}
|
|||
|
item.complete();
|
|||
|
});
|
|||
|
trans.translate();
|
|||
|
}
|
|||
|
}, function () {
|
|||
|
if (dois.length) processDOIs(dois);
|
|||
|
}, undefined, { Accept: "application/vnd.datacite.datacite+json, application/vnd.crossref.unixref+xml, application/vnd.citationstyles.csl+json" });
|
|||
|
}
|
|||
|
|
|||
|
/** BEGIN TEST CASES **/
|
|||
|
var testCases = [{
|
|||
|
"type": "search",
|
|||
|
"input": {
|
|||
|
"DOI": "10.12763/ONA1045"
|
|||
|
},
|
|||
|
"items": [{
|
|||
|
"itemType": "journalArticle",
|
|||
|
"url": "http://docnum.univ-lorraine.fr/pulsar/RCR_543952102_NA1045.pdf",
|
|||
|
"pages": "39.79 MB, 402 pages",
|
|||
|
"date": "1734",
|
|||
|
"DOI": "10.12763/ona1045",
|
|||
|
"accessDate": "2019-02-02T02:31:57Z",
|
|||
|
"libraryCatalog": "DOI.org (Datacite)",
|
|||
|
"language": "fre",
|
|||
|
"title": "Code criminel de l'empereur Charles V vulgairement appellé la Caroline contenant les loix qui sont suivies dans les jurisdictions criminelles de l'Empire et à l'usage des conseils de guerre des troupes suisses.",
|
|||
|
"creators": [{
|
|||
|
"firstName": "",
|
|||
|
"lastName": "Heiliges Römisches Reich Deutscher Nation",
|
|||
|
"creatorType": "author"
|
|||
|
},
|
|||
|
{
|
|||
|
"firstName": "Franz Adam. Éditeur Scientifique",
|
|||
|
"lastName": "Vogel",
|
|||
|
"creatorType": "contributor"
|
|||
|
},
|
|||
|
{
|
|||
|
"firstName": "Simon, Claude (167 ?-1752) Éditeur",
|
|||
|
"lastName": "Commercial",
|
|||
|
"creatorType": "contributor"
|
|||
|
},
|
|||
|
{
|
|||
|
"firstName": "",
|
|||
|
"lastName": "Université De Lorraine-Direction De La Documentation Et De L'Edition",
|
|||
|
"creatorType": "contributor"
|
|||
|
}
|
|||
|
],
|
|||
|
"tags": [
|
|||
|
"Droit"
|
|||
|
],
|
|||
|
"relations": [],
|
|||
|
"attachments": [],
|
|||
|
"notes": [
|
|||
|
"<h2>Other</h2>\nLe code est accompagné de commentaires de F. A. Vogel, qui signe l'épitre dédicatoire<h2>Other</h2>\nReliure 18è siècle<h2>Other</h2>\nEx-libris manuscrit \"Ex libris Dufour\""
|
|||
|
]
|
|||
|
}]
|
|||
|
},
|
|||
|
{
|
|||
|
"type": "search",
|
|||
|
"input": {
|
|||
|
"DOI": "10.7336/academicus.2014.09.05"
|
|||
|
},
|
|||
|
"items": [{
|
|||
|
"itemType": "journalArticle",
|
|||
|
"url": "http://academicus.edu.al/?subpage=volumes&nr=9",
|
|||
|
"volume": "9",
|
|||
|
"pages": "69-78",
|
|||
|
"publicationTitle": "Academicus International Scientific Journal",
|
|||
|
"ISSN": "20793715",
|
|||
|
"date": "01/2014",
|
|||
|
"DOI": "10.7336/academicus.2014.09.05",
|
|||
|
"accessDate": "2019-02-02T03:28:48Z",
|
|||
|
"libraryCatalog": "DOI.org (Crossref)",
|
|||
|
"title": "Second world war, communism and post-communism in Albania, an equilateral triangle of a tragic trans-Adriatic story. The Eftimiadi’s Saga",
|
|||
|
"creators": [{
|
|||
|
"firstName": "Muner",
|
|||
|
"lastName": "Paolo",
|
|||
|
"creatorType": "author"
|
|||
|
}],
|
|||
|
"tags": [],
|
|||
|
"relations": [],
|
|||
|
"attachments": [],
|
|||
|
"notes": []
|
|||
|
}]
|
|||
|
}
|
|||
|
]
|
|||
|
/** END TEST CASES **/
|