www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 1da2221d40dff881b7aecbf13c71ef28a2e86e76
parent a8c367156d715b46f552fb52c0646b89bb9405d2
Author: Simon Kornblith <simon@simonster.com>
Date:   Thu, 24 Jul 2008 22:25:03 +0000

closes #971, Add support for secondary key


Diffstat:
Mchrome/content/zotero/xpcom/cite.js | 68+++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Mchrome/content/zotero/xpcom/integration.js | 103++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
2 files changed, 129 insertions(+), 42 deletions(-)

diff --git a/chrome/content/zotero/xpcom/cite.js b/chrome/content/zotero/xpcom/cite.js @@ -665,7 +665,7 @@ Zotero.CSL.prototype.formatBibliography = function(itemSet, format) { if(item == undefined) continue; // try to get custom bibliography - var string = item.getProperty("bibliography-"+format); + var string = item.getProperty("bibliography-"+(format == "Integration" ? "RTF" : format)); if(!string) { string = new Zotero.CSL.FormattedString(context, format); this._processElements(item, context.layout, string, context); @@ -1441,8 +1441,8 @@ Zotero.CSL.prototype._compareItem = function(a, b, context, cache) { var sortA = []; var sortB = []; - var aID = a.getID(); - var bID = b.getID(); + var aID = a.id; + var bID = b.id; // author if(context.sort.key.length()) { @@ -1863,7 +1863,7 @@ Zotero.CSL.Global = new function() { Zotero.CSL.CitationItem = function(item) { if(item) { this.item = item; - this.itemID = item.getID(); + this.itemID = item.id; } } @@ -1967,6 +1967,9 @@ Zotero.CSL.Item = function(item) { throw "Zotero.CSL.Item called to wrap a non-item"; } + this.id = this.zoteroItem.id; + this.key = this.zoteroItem.key; + // don't return URL or accessed information for journal articles if a // pages field exists var itemType = Zotero.ItemTypes.getName(this.zoteroItem.itemTypeID); @@ -1980,6 +1983,18 @@ Zotero.CSL.Item = function(item) { this._refreshItem(); } + +/** + * Returns some identifier for the item. Used to create citations. In Zotero, + * this is the item ID + * + * @deprecated + **/ +Zotero.CSL.Item.prototype.getID = function() { + Zotero.debug("Zotero.CSL.Item.getID() deprecated; use Zotero.CSL.Item.id"); + return this.zoteroItem.id; +} + /** * Refreshes item if it has been modified */ @@ -1993,14 +2008,6 @@ Zotero.CSL.Item.prototype._refreshItem = function() { } } - -/* - * Returns some identifier for the item. Used to create citations. In Zotero, - * this is the item ID - */ -Zotero.CSL.Item.prototype.getID = function() { - return this.zoteroItem.getID(); -} /* * Mappings for names */ @@ -2442,6 +2449,7 @@ Zotero.CSL.ItemSet = function(items, csl) { this.items = []; this.itemsById = {}; + this.itemsByKey = {}; // add items this.add(items); @@ -2465,9 +2473,14 @@ Zotero.CSL.ItemSet = function(items, csl) { this.resort(); } -/* - * Gets CSL.Item objects from an item set using their IDs - */ + +/** + * Gets CSL.Item objects from an item set using their ids + * + * @param {Array} ids An array of ids + * @return {Array} items An array whose indexes correspond to those of ids, whose values are either + * the CSL.Item objects or false + **/ Zotero.CSL.ItemSet.prototype.getItemsByIds = function(ids) { var items = []; for each(var id in ids) { @@ -2480,6 +2493,25 @@ Zotero.CSL.ItemSet.prototype.getItemsByIds = function(ids) { return items; } +/** + * Gets CSL.Item objects from an item set using their keys + * + * @param {Array} keys An array of keys + * @return {Array} items An array whose indexes correspond to those of keys, whose values are either + * the CSL.Item objects or false + **/ +Zotero.CSL.ItemSet.prototype.getItemsByKeys = function(keys) { + var items = []; + for each(var key in keys) { + if(this.itemsByKey[key] != undefined) { + items.push(this.itemsByKey[key]); + } else { + items.push(false); + } + } + return items; +} + /* * Adds items to the given item set; must be passed either CSL.Item * objects or objects that may be wrapped as CSL.Item objects @@ -2496,7 +2528,8 @@ Zotero.CSL.ItemSet.prototype.add = function(items) { newItem.setProperty("index", this.items.length); - this.itemsById[newItem.getID()] = newItem; + this.itemsById[newItem.id] = newItem; + this.itemsByKey[newItem.key] = newItem; this.items.push(newItem); newItems.push(newItem); } @@ -2516,7 +2549,8 @@ Zotero.CSL.ItemSet.prototype.remove = function(items) { } else { var item = this.itemsById[items[i]]; } - this.itemsById[item.getID()] = undefined; + this.itemsById[item.id] = undefined; + this.itemsByKey[item.key] = undefined; this.items.splice(this.items.indexOf(item), 1); } } diff --git a/chrome/content/zotero/xpcom/integration.js b/chrome/content/zotero/xpcom/integration.js @@ -422,9 +422,8 @@ Zotero.Integration.Request = function(xml) { this.status = 200; this.statusText = "OK"; } catch(e) { - Components.utils.reportError(e); - Zotero.debug(e); + Components.utils.reportError(e); // Get a code for this error var code = (e.name ? e.name : "GenericError"); @@ -480,9 +479,6 @@ Zotero.Integration.Request.prototype.initializeSession = function() { } this.needPrefs = this.needPrefs || !this._session.setStyle(styleID, preferences); - if(this.header.bibliography.length()) { - session.loadBibliographyData(Zotero.Utilities.prototype.trim(this.header.bibliography.toString())); - } } else { this._session = Zotero.Integration.sessions[this._sessionID]; } @@ -556,8 +552,14 @@ Zotero.Integration.Request.prototype.processCitations = function() { } } + // load bibliography data here + if(this.header.bibliography.length()) { + this._session.loadBibliographyData(Zotero.Utilities.prototype.trim(this.header.bibliography.toString())); + } + this._session.updateItemSet(); + // create new citation if(editCitationIndex) { this._session.updateCitations(editCitationIndex-1); var added = this._session.editCitation(editCitationIndex, editCitation); @@ -572,6 +574,7 @@ Zotero.Integration.Request.prototype.processCitations = function() { } this._session.updateCitations(); + // edit bibliography if(this.body.updateBibliography.@edit.toString()) { this._session.editBibliography(); } @@ -854,9 +857,15 @@ Zotero.Integration.Session.prototype.getCitationField = function(citation) { var citationItems = ""; for(var j=0; j<citation.citationItems.length; j++) { var citationItem = ""; + + // ensure key is saved + if(citation.citationItems[j].key == undefined) { + citation.citationItems[j].key = citation.citationItems[j].item.key; + } + for(var k in citation.citationItems[j]) { type = typeof(citation.citationItems[j][k]); - if(citation.citationItems[j][k] && Zotero.Integration.Session._acceptableTypes.indexOf(type) !== -1) { + if(citation.citationItems[j][k] && k != "itemID" && Zotero.Integration.Session._acceptableTypes.indexOf(type) !== -1) { citationItem += ',"'+k+'":'+Zotero.JSON.serialize(citation.citationItems[j][k]); } } @@ -927,13 +936,23 @@ Zotero.Integration.Session.prototype.completeCitation = function(object) { for(var i=0; i<object.citationItems.length; i++) { var citationItem = object.citationItems[i]; - var item = this.itemSet.getItemsByIds([citationItem.itemID])[0]; + var zoteroItem; + if(citationItem.key) { + var item = this.itemSet.getItemsByKeys([citationItem.key])[0]; + } else { + this.updateItemIDs[citationItem.itemID] = true; + var item = this.itemSet.getItemsByIds([citationItem.itemID])[0]; + } // loop through items not in itemSet if(item == false) { - item = Zotero.Items.get(citationItem.itemID); - if(!item) return false; - item = this.itemSet.add([item])[0]; + if(citationItem.key) { + zoteroItem = Zotero.Items.getByKey(citationItem.key); + } else { + zoteroItem = Zotero.Items.get(citationItem.itemID); + } + if(!zoteroItem) return false; + item = this.itemSet.add([zoteroItem])[0]; this.dateModified[citationItem.itemID] = item.zoteroItem.getField("dateModified", true, true); this.updateItemIDs[citationItem.itemID] = true; @@ -941,6 +960,7 @@ Zotero.Integration.Session.prototype.completeCitation = function(object) { } citationItem.item = item; + if(!citationItem.itemID) citationItem.itemID = item.id; } return true; } @@ -1182,7 +1202,7 @@ Zotero.Integration.Session.prototype.updateItemSet = function() { // see if old items were deleted or changed for each(var item in this.itemSet.items) { - var itemID = item.getID(); + var itemID = item.id; // see if items were removed if(!this.citationsByItemID[itemID] && !this.uncitedItems[itemID]) { @@ -1222,7 +1242,7 @@ Zotero.Integration.Session.prototype.sortItemSet = function() { // add to list of updated item IDs for each(var item in citationChanged) { - this.updateItemIDs[item.getID()] = true; + this.updateItemIDs[item.id] = true; this.bibliographyHasChanged = true; } } @@ -1364,11 +1384,16 @@ Zotero.Integration.Session.prototype.loadBibliographyData = function(json) { // set custom bibliography entries if(documentData.custom) { for(var itemID in documentData.custom) { - var item = this.itemSet.getItemsByIds([itemID])[0]; + if(typeof(itemID) == "string") { // key + var item = this.itemSet.getItemsByKeys([itemID])[0]; + } else { // item ID + this.bibliographyDataHasChanged = true; + var item = this.itemSet.getItemsByIds([itemID])[0]; + } if (!item) { continue; } - item.setProperty("bibliography-Integration", documentData.custom[itemID]); + item.setProperty("bibliography-RTF", documentData.custom[itemID]); } } } @@ -1377,14 +1402,42 @@ Zotero.Integration.Session.prototype.loadBibliographyData = function(json) { * adds items in this.uncitedItems to itemSet, if they are not already there */ Zotero.Integration.Session.prototype.loadUncitedItems = function() { + var needConversion = false; + for(var itemID in this.uncitedItems) { // skip "undefined" if(!this.uncitedItems[itemID]) continue; // if not yet in item set, add to item set - var item = this.itemSet.getItemsByIds([itemID])[0]; + if(typeof(itemID) == "string") { // key + var item = this.itemSet.getItemsByKeys([itemID])[0]; + itemID = Zotero.Items.getByKey(itemID); + } else { // item ID + needConversion = true; + var item = this.itemSet.getItemsByIds([itemID])[0]; + } if(!item) this.itemSet.add([itemID])[0]; } + + // need a second loop to convert, since we need to modify this.uncitedItems + if(needConversion) { + this.bibliographyDataHasChanged = true; + + oldUncitedItems = this.uncitedItems; + this.uncitedItems = {}; + for(var itemID in oldUncitedItems) { + if(!oldUncitedItems[itemID]) continue; + + if(typeof(itemID) == "string") { // key + this.uncitedItems[itemID] = true; + } else { // itemID + var item = Zotero.Items.get(itemID); + if(item) { + this.uncitedItems[item.key] = true; + } + } + } + } } /* @@ -1394,9 +1447,11 @@ Zotero.Integration.Session.prototype.getBibliographyData = function() { var bibliographyData = {}; // add uncited if there is anything - for(var item in this.uncitedItems) { - bibliographyData.uncited = this.uncitedItems; - break; + for each(var item in this.uncitedItems) { + if(item) { + bibliographyData.uncited = this.uncitedItems; + break; + } } // look for custom bibliography entries @@ -1404,10 +1459,8 @@ Zotero.Integration.Session.prototype.getBibliographyData = function() { for(var i=0; i<this.itemSet.items.length; i++) { var custom = this.itemSet.items[i].getProperty("bibliography-Integration"); if(custom !== "") { - var itemID = this.itemSet.items[i].getID(); - if(!bibliographyData.custom) bibliographyData.custom = {}; - bibliographyData.custom[itemID] = custom; + bibliographyData.custom[this.itemSet.items[i].key] = custom; } } } @@ -1431,14 +1484,14 @@ Zotero.Integration.Session.BibliographyEditInterface.prototype.getItemSet = func } Zotero.Integration.Session.BibliographyEditInterface.prototype.isCited = function(item) { - if(this.session.citationsByItemID[item.getID()]) return true; + if(this.session.citationsByItemID[item.id]) return true; return false; } Zotero.Integration.Session.BibliographyEditInterface.prototype.add = function(item) { // create new item this.session.itemSet.add([item]); - this.session.uncitedItems[item.getID()] = true; + this.session.uncitedItems[item.key] = true; this.session.sortItemSet(); } @@ -1448,7 +1501,7 @@ Zotero.Integration.Session.BibliographyEditInterface.prototype.remove = function this.session.sortItemSet(); // delete citations if necessary - var itemID = item.getID(); + var itemID = item.id; if(this.session.citationsByItemID[itemID]) { for(var j=0; j<this.session.citationsByItemID[itemID].length; j++) { var citation = this.session.citationsByItemID[itemID][j]; @@ -1458,7 +1511,7 @@ Zotero.Integration.Session.BibliographyEditInterface.prototype.remove = function } // delete uncited if neceessary - if(this.session.uncitedItems[itemID]) this.session.uncitedItems[itemID] = undefined; + if(this.session.uncitedItems[item.key]) this.session.uncitedItems[item.key] = undefined; } Zotero.Integration.Session.BibliographyEditInterface.prototype.preview = function(item) {