diff --git a/chrome/content/zotero/xpcom/date.js b/chrome/content/zotero/xpcom/date.js index c41b5eec50..d34c326a33 100644 --- a/chrome/content/zotero/xpcom/date.js +++ b/chrome/content/zotero/xpcom/date.js @@ -330,6 +330,8 @@ Zotero.Date = new function(){ } if(date.month) date.month--; // subtract one for JS style + else delete date.month; + Zotero.debug("DATE: retrieved with algorithms: "+JSON.stringify(date)); parts.push( @@ -369,7 +371,7 @@ Zotero.Date = new function(){ } // MONTH - if(!date.month) { + if(date.month === undefined) { // compile month regular expression var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']; diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js index 23ec452f1b..18fae8927b 100644 --- a/chrome/content/zotero/xpcom/utilities.js +++ b/chrome/content/zotero/xpcom/utilities.js @@ -99,6 +99,7 @@ const CSL_DATE_MAPPINGS = { /* * Mappings for types + * Also see itemFromCSLJSON */ const CSL_TYPE_MAPPINGS = { 'book':"book", @@ -1611,7 +1612,7 @@ Zotero.Utilities = { cslItem[variable] = {"date-parts":[dateParts]}; // if no month, use season as month - if(dateObj.part && !dateObj.month) { + if(dateObj.part && dateObj.month === undefined) { cslItem[variable].season = dateObj.part; } } else { @@ -1645,14 +1646,44 @@ Zotero.Utilities = { * @param {Object} cslItem */ "itemFromCSLJSON":function(item, cslItem) { - var isZoteroItem = item instanceof Zotero.Item, zoteroType; + var isZoteroItem = item instanceof Zotero.Item, + zoteroType; - for(var type in CSL_TYPE_MAPPINGS) { - if(CSL_TYPE_MAPPINGS[type] == cslItem.type) { - zoteroType = type; - break; + // Some special cases to help us map item types correctly + // This ensures that we don't lose data on import. The fields + // we check are incompatible with the alternative item types + if (cslItem.type == 'book') { + zoteroType = 'book'; + if (cslItem.version) { + zoteroType = 'computerProgram'; + } + } else if (cslItem.type == 'bill') { + zoteroType = 'bill'; + if (cslItem.publisher || cslItem['number-of-volumes']) { + zoteroType = 'hearing'; + } + } else if (cslItem.type == 'song') { + zoteroType = 'audioRecording'; + if (cslItem.number) { + zoteroType = 'podcast'; + } + } else if (cslItem.type == 'motion_picture') { + zoteroType = 'film'; + if (cslItem['collection-title'] || cslItem['publisher-place'] + || cslItem['event-place'] || cslItem.volume + || cslItem['number-of-volumes'] || cslItem.ISBN + ) { + zoteroType = 'videoRecording'; + } + } else { + for(var type in CSL_TYPE_MAPPINGS) { + if(CSL_TYPE_MAPPINGS[type] == cslItem.type) { + zoteroType = type; + break; + } } } + if(!zoteroType) zoteroType = "document"; var itemTypeID = Zotero.ItemTypes.getID(zoteroType); @@ -1667,9 +1698,14 @@ Zotero.Utilities = { for(var variable in CSL_TEXT_MAPPINGS) { if(variable in cslItem) { var textMappings = CSL_TEXT_MAPPINGS[variable]; - for(var i in textMappings) { - var field = textMappings[i], - fieldID = Zotero.ItemFields.getID(field); + for(var i=0; i itemFromCSLJSON -> itemToCSLJSON", function() { + let data = loadSampleData('citeProcJSExport'); + + Zotero.DB.beginTransaction(); + + for (let i in data) { + let item = data[i]; + + let zItem = new Zotero.Item(); + Zotero.Utilities.itemFromCSLJSON(zItem, item); + zItem = Zotero.Items.get(zItem.save()); + + let newItem = Zotero.Utilities.itemToCSLJSON(zItem); + + delete newItem.id; + delete item.id; + + assert.deepEqual(newItem, item, i + ' export -> import -> export is stable'); + } + + Zotero.DB.commitTransaction(); + + }); + it("should import exported standalone note", function() { + let note = new Zotero.Item('note'); + note.setNote('Some note longer than 50 characters, which will become the title.'); + note = Zotero.Items.get(note.save()); + + let jsonNote = Zotero.Utilities.itemToCSLJSON(note); + + let zItem = new Zotero.Item(); + Zotero.Utilities.itemFromCSLJSON(zItem, jsonNote); + zItem = Zotero.Items.get(zItem.save()); + + assert.equal(zItem.getField('title'), jsonNote.title, 'title imported correctly'); + }); + it("should import exported standalone attachment", function() { + let file = getTestDataDirectory(); + file.append("empty.pdf"); + + let attachment = Zotero.Items.get(Zotero.Attachments.importFromFile(file)); + attachment.setField('title', 'Empty'); + attachment.setField('accessDate', '2001-02-03 12:13:14'); + attachment.setField('url', 'http://example.com'); + attachment.setNote('Note'); + + attachment.save(); + + let jsonAttachment = Zotero.Utilities.itemToCSLJSON(attachment); + + let zItem = new Zotero.Item(); + Zotero.Utilities.itemFromCSLJSON(zItem, jsonAttachment); + zItem = Zotero.Items.get(zItem.save()); + + assert.equal(zItem.getField('title'), jsonAttachment.title, 'title imported correctly'); + }); + }); });