Use best first creator for OpenURL author, not just first position

This also fixes Google Scholar Search lookup to use an author not in first creator
position [1].

[1] https://forums.zotero.org/discussion/58384/
This commit is contained in:
Dan Stillman 2016-07-07 16:29:08 -04:00
parent 83d11947ff
commit 599598566b
3 changed files with 48 additions and 1 deletions

View file

@ -955,6 +955,30 @@ Zotero.Items = function() {
});
/**
* Given API JSON for an item, return the best first creator, regardless of creator order
*
* @return {Object|false} - Creator in API JSON format, or false
*/
this.getFirstCreatorFromJSON = function (json) {
var primaryCreatorType = Zotero.CreatorTypes.getName(
Zotero.CreatorTypes.getPrimaryIDForType(
Zotero.ItemTypes.getID(json.itemType)
)
);
let firstCreator = json.creators.find(creator => {
return creator.creatorType == primaryCreatorType || creator.creatorType == 'author';
});
if (!firstCreator) {
firstCreator = json.creators.find(creator => creator.creatorType == 'editor');
}
if (!firstCreator) {
return false;
}
return firstCreator;
};
/*
* Generate SQL to retrieve firstCreator field
*

View file

@ -205,7 +205,7 @@ Zotero.OpenURL = new function() {
if(item.creators && item.creators.length) {
// encode first author as first and last
var firstCreator = item.creators[0];
let firstCreator = Zotero.Items.getFirstCreatorFromJSON(item);
if(item.itemType == "patent") {
_mapTag(firstCreator.firstName, "invfirst");
_mapTag(firstCreator.lastName, "invlast");

23
test/tests/openurlTest.js Normal file
View file

@ -0,0 +1,23 @@
"use strict";
describe("Zotero.OpenURL", function() {
describe("#createContextObject()", function () {
it("should use firstCreator for author", function* () {
var item = createUnsavedDataObject('item');
item.setCreators([
{
firstName: "Aaa",
lastName: "Editor",
creatorType: 'editor'
},
{
firstName: "Bbb",
lastName: "Author",
creatorType: 'author'
}
]);
var co = Zotero.OpenURL.createContextObject(item, "1.0");
assert.include(co, '&rft.aufirst=Bbb&rft.aulast=Author&');
});
});
});