Use Zotero.Utilities.itemToCSLJSON when sending items to citeproc
This commit is contained in:
parent
7f52e00341
commit
f0bd1e77ff
2 changed files with 59 additions and 141 deletions
|
@ -522,100 +522,20 @@ Zotero.Cite.System.prototype = {
|
|||
throw "Zotero.Cite.System.retrieveItem called on non-item "+item;
|
||||
}
|
||||
|
||||
var cslItem = Zotero.Utilities.itemToCSLJSON(zoteroItem);
|
||||
|
||||
if (!Zotero.Prefs.get("export.citePaperJournalArticleURL")) {
|
||||
var itemType = Zotero.ItemTypes.getName(zoteroItem.itemTypeID);
|
||||
// don't return URL or accessed information for journal articles if a
|
||||
// pages field exists
|
||||
var itemType = Zotero.ItemTypes.getName(zoteroItem.itemTypeID);
|
||||
var cslType = CSL_TYPE_MAPPINGS[itemType];
|
||||
if(!cslType) cslType = "article";
|
||||
var ignoreURL = ((zoteroItem.getField("accessDate", true, true) || zoteroItem.getField("url", true, true)) &&
|
||||
["journalArticle", "newspaperArticle", "magazineArticle"].indexOf(itemType) !== -1
|
||||
if (["journalArticle", "newspaperArticle", "magazineArticle"].indexOf(itemType) !== -1
|
||||
&& zoteroItem.getField("pages")
|
||||
&& !Zotero.Prefs.get("export.citePaperJournalArticleURL"));
|
||||
|
||||
var cslItem = {
|
||||
'id':zoteroItem.id,
|
||||
'type':cslType
|
||||
};
|
||||
|
||||
// get all text variables (there must be a better way)
|
||||
// TODO: does citeproc-js permit short forms?
|
||||
for(var variable in CSL_TEXT_MAPPINGS) {
|
||||
var fields = CSL_TEXT_MAPPINGS[variable];
|
||||
if(variable == "URL" && ignoreURL) continue;
|
||||
for each(var field in fields) {
|
||||
var value = zoteroItem.getField(field, false, true).toString();
|
||||
if(value != "") {
|
||||
// Strip enclosing quotes
|
||||
if(value.match(/^".+"$/)) {
|
||||
value = value.substr(1, value.length-2);
|
||||
}
|
||||
cslItem[variable] = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// separate name variables
|
||||
var authorID = Zotero.CreatorTypes.getPrimaryIDForType(zoteroItem.itemTypeID);
|
||||
var creators = zoteroItem.getCreators();
|
||||
for each(var creator in creators) {
|
||||
if(creator.creatorTypeID == authorID) {
|
||||
var creatorType = "author";
|
||||
} else {
|
||||
var creatorType = Zotero.CreatorTypes.getName(creator.creatorTypeID);
|
||||
}
|
||||
|
||||
var creatorType = CSL_NAMES_MAPPINGS[creatorType];
|
||||
if(!creatorType) continue;
|
||||
|
||||
var nameObj = {'family':creator.ref.lastName, 'given':creator.ref.firstName};
|
||||
|
||||
if(cslItem[creatorType]) {
|
||||
cslItem[creatorType].push(nameObj);
|
||||
} else {
|
||||
cslItem[creatorType] = [nameObj];
|
||||
) {
|
||||
delete cslItem.URL;
|
||||
delete cslItem.accessed;
|
||||
}
|
||||
}
|
||||
|
||||
// get date variables
|
||||
for(var variable in CSL_DATE_MAPPINGS) {
|
||||
var date = zoteroItem.getField(CSL_DATE_MAPPINGS[variable], false, true);
|
||||
if(date) {
|
||||
var dateObj = Zotero.Date.strToDate(date);
|
||||
// otherwise, use date-parts
|
||||
var dateParts = [];
|
||||
if(dateObj.year) {
|
||||
// add year, month, and day, if they exist
|
||||
dateParts.push(dateObj.year);
|
||||
if(dateObj.month !== undefined) {
|
||||
dateParts.push(dateObj.month+1);
|
||||
if(dateObj.day) {
|
||||
dateParts.push(dateObj.day);
|
||||
}
|
||||
}
|
||||
cslItem[variable] = {"date-parts":[dateParts]};
|
||||
|
||||
// if no month, use season as month
|
||||
if(dateObj.part && !dateObj.month) {
|
||||
cslItem[variable].season = dateObj.part;
|
||||
}
|
||||
} else {
|
||||
// if no year, pass date literally
|
||||
cslItem[variable] = {"literal":date};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// extract PMID
|
||||
var extra = zoteroItem.getField("extra", false, true);
|
||||
if(typeof extra === "string") {
|
||||
var m = /(?:^|\n)PMID:\s*([0-9]+)/.exec(extra);
|
||||
if(m) cslItem.PMID = m[1];
|
||||
m = /(?:^|\n)PMCID:\s*((?:PMC)?[0-9]+)/.exec(extra);
|
||||
if(m) cslItem.PMCID = m[1];
|
||||
}
|
||||
|
||||
//this._cache[zoteroItem.id] = cslItem;
|
||||
return cslItem;
|
||||
},
|
||||
|
||||
|
|
|
@ -1504,77 +1504,67 @@ Zotero.Utilities = {
|
|||
|
||||
/**
|
||||
* Converts an item from toArray() format to citeproc-js JSON
|
||||
* @param {Zotero.Item} item
|
||||
* @param {Zotero.Item} zoteroItem
|
||||
* @return {Object} The CSL item
|
||||
*/
|
||||
"itemToCSLJSON":function(item) {
|
||||
if(item instanceof Zotero.Item) {
|
||||
item = item.toArray();
|
||||
"itemToCSLJSON":function(zoteroItem) {
|
||||
if (zoteroItem instanceof Zotero.Item) {
|
||||
zoteroItem = zoteroItem.toArray();
|
||||
}
|
||||
|
||||
var itemType = item.itemType;
|
||||
var cslType = CSL_TYPE_MAPPINGS[itemType];
|
||||
if(!cslType) cslType = "article";
|
||||
var cslType = CSL_TYPE_MAPPINGS[zoteroItem.itemType] || "article";
|
||||
var itemTypeID = Zotero.ItemTypes.getID(zoteroItem.itemType);
|
||||
|
||||
var cslItem = {
|
||||
'id':item.itemID,
|
||||
'id':zoteroItem.itemID,
|
||||
'type':cslType
|
||||
};
|
||||
|
||||
// Map text fields
|
||||
var itemTypeID = Zotero.ItemTypes.getID(itemType);
|
||||
// get all text variables (there must be a better way)
|
||||
for(var variable in CSL_TEXT_MAPPINGS) {
|
||||
var fields = CSL_TEXT_MAPPINGS[variable];
|
||||
for(var i=0, n=fields.length; i<n; i++) {
|
||||
var field = fields[i], value = undefined;
|
||||
var field = fields[i],
|
||||
value;
|
||||
|
||||
if(field in item) {
|
||||
value = item[field];
|
||||
if(field in zoteroItem) {
|
||||
value = zoteroItem[field];
|
||||
} else {
|
||||
var fieldID = Zotero.ItemFields.getID(field),
|
||||
baseMapping
|
||||
baseMapping;
|
||||
if(Zotero.ItemFields.isValidForType(fieldID, itemTypeID)
|
||||
&& (baseMapping = Zotero.ItemFields.getBaseIDFromTypeAndField(itemTypeID, fieldID))) {
|
||||
value = item[Zotero.ItemTypes.getName(baseMapping)];
|
||||
value = zoteroItem[Zotero.ItemTypes.getName(baseMapping)];
|
||||
}
|
||||
}
|
||||
|
||||
if (!value) continue;
|
||||
|
||||
var valueLength = value.length;
|
||||
if(valueLength) {
|
||||
if (typeof value == 'string') {
|
||||
// Strip enclosing quotes
|
||||
if(value[0] === '"' && value[valueLength-1] === '"') {
|
||||
value = value.substr(1, valueLength-2);
|
||||
if(value.charAt(0) == '"' && value.indexOf('"', 1) == value.length - 1) {
|
||||
value = value.substring(1, value.length-1);
|
||||
}
|
||||
}
|
||||
|
||||
cslItem[variable] = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// separate name variables
|
||||
var authorID = Zotero.CreatorTypes.getPrimaryIDForType(itemTypeID);
|
||||
var authorFieldName = Zotero.CreatorTypes.getName(authorID);
|
||||
var creators = item.creators;
|
||||
if(creators) {
|
||||
for(var i=0, n=creators.length; i<n; i++) {
|
||||
var author = Zotero.CreatorTypes.getName(Zotero.CreatorTypes.getPrimaryIDForType(itemTypeID));
|
||||
var creators = zoteroItem.creators;
|
||||
for(var i=0; i<creators.length; i++) {
|
||||
var creator = creators[i];
|
||||
|
||||
if(creator.creatorType == authorFieldName) {
|
||||
var creatorType = "author";
|
||||
} else {
|
||||
var creatorType = CSL_NAMES_MAPPINGS[creator.creatorType]
|
||||
var creatorType = creator.creatorType;
|
||||
if(creatorType == author) {
|
||||
creatorType = "author";
|
||||
}
|
||||
|
||||
creatorType = CSL_NAMES_MAPPINGS[creatorType];
|
||||
if(!creatorType) continue;
|
||||
|
||||
if(creator.fieldMode == 1) {
|
||||
var nameObj = {'literal':creator.lastName};
|
||||
} else {
|
||||
var nameObj = {'family':creator.lastName, 'given':creator.firstName};
|
||||
}
|
||||
|
||||
if(cslItem[creatorType]) {
|
||||
cslItem[creatorType].push(nameObj);
|
||||
|
@ -1582,11 +1572,10 @@ Zotero.Utilities = {
|
|||
cslItem[creatorType] = [nameObj];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// get date variables
|
||||
for(var variable in CSL_DATE_MAPPINGS) {
|
||||
var date = item[CSL_DATE_MAPPINGS[variable]];
|
||||
var date = zoteroItem[CSL_DATE_MAPPINGS[variable]];
|
||||
if(date) {
|
||||
var dateObj = Zotero.Date.strToDate(date);
|
||||
// otherwise, use date-parts
|
||||
|
@ -1613,7 +1602,16 @@ Zotero.Utilities = {
|
|||
}
|
||||
}
|
||||
|
||||
//this._cache[item.id] = cslItem;
|
||||
// extract PMID
|
||||
var extra = zoteroItem.extra;
|
||||
if(typeof extra === "string") {
|
||||
var m = /(?:^|\n)PMID:\s*([0-9]+)/.exec(extra);
|
||||
if(m) cslItem.PMID = m[1];
|
||||
m = /(?:^|\n)PMCID:\s*((?:PMC)?[0-9]+)/.exec(extra);
|
||||
if(m) cslItem.PMCID = m[1];
|
||||
}
|
||||
|
||||
//this._cache[zoteroItem.id] = cslItem;
|
||||
return cslItem;
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in a new issue