commit 599598566ba636ba92c73767cbfa07fb5e44b04c
parent 83d11947ffd27fb8712d6ddd61a1f2dd82ac2952
Author: Dan Stillman <dstillman@zotero.org>
Date: Thu, 7 Jul 2016 16:29:08 -0400
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/
Diffstat:
3 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/chrome/content/zotero/xpcom/data/items.js b/chrome/content/zotero/xpcom/data/items.js
@@ -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
*
diff --git a/chrome/content/zotero/xpcom/openurl.js b/chrome/content/zotero/xpcom/openurl.js
@@ -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");
diff --git a/test/tests/openurlTest.js b/test/tests/openurlTest.js
@@ -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&');
+ });
+ });
+});