From d121f5f150b96ea9ae1d519db6f938787673d0f6 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Sun, 30 May 2010 19:06:41 +0000 Subject: [PATCH] eliminate unnecessary updateItems() calls, fix changing citations in a document, and several other bug fixes issues with IEEE remain --- chrome/content/zotero/xpcom/integration.js | 151 ++++++++++----------- 1 file changed, 74 insertions(+), 77 deletions(-) diff --git a/chrome/content/zotero/xpcom/integration.js b/chrome/content/zotero/xpcom/integration.js index d3223200c..b5101f994 100644 --- a/chrome/content/zotero/xpcom/integration.js +++ b/chrome/content/zotero/xpcom/integration.js @@ -588,8 +588,7 @@ Zotero.Integration.Document.prototype._updateSession = function(newField, editFi } } - //this._session.updateItems(); - this._session.updateCitations(); + this._session.updateCitations(true); // create new citation or edit existing citation if(editFieldIndex) { @@ -609,35 +608,12 @@ Zotero.Integration.Document.prototype._updateSession = function(newField, editFi } } } - this._session.updateItems(); } /** * Updates bibliographies and fields within a document */ Zotero.Integration.Document.prototype._updateDocument = function(forceCitations, forceBibliography) { - // update bibliographies - var output = new Array(); - if(this._bibliographyFields.length // if blbliography exists - && (this._session.bibliographyHasChanged // and bibliography changed - || forceBibliography)) { // or if we should generate regardless of changes - if(this._session.bibliographyDataHasChanged) { - var bibliographyData = this._session.getBibliographyData(); - for each(var field in this._bibliographyFields) { - field.setCode(BIBLIOGRAPHY_CODE+" "+bibliographyData); - } - } - - var bibliographyText = this._session.getBibliography(); - for each(var field in this._bibliographyFields) { - if(bibliographyText) { - field.setText(bibliographyText, true); - } else { - field.setText("{Bibliography}", false); - } - } - } - // update citations this._session.updateUpdateIndices(forceCitations); this._deleteFields = this._deleteFields.concat(this._session.updateCitations()); @@ -665,6 +641,27 @@ Zotero.Integration.Document.prototype._updateDocument = function(forceCitations, } } + // update bibliographies + if(this._bibliographyFields.length // if blbliography exists + && (this._session.bibliographyHasChanged // and bibliography changed + || forceBibliography)) { // or if we should generate regardless of changes + if(this._session.bibliographyDataHasChanged) { + var bibliographyData = this._session.getBibliographyData(); + for each(var field in this._bibliographyFields) { + field.setCode(BIBLIOGRAPHY_CODE+" "+bibliographyData); + } + } + + var bibliographyText = this._session.getBibliography(); + for each(var field in this._bibliographyFields) { + if(bibliographyText) { + field.setText(bibliographyText, true); + } else { + field.setText("{Bibliography}", false); + } + } + } + // do this operations in reverse in case plug-ins care about order this._deleteFields.sort(); for(var i=(this._deleteFields.length-1); i>=0; i--) { @@ -944,7 +941,7 @@ Zotero.Integration.Session.prototype.setDocPrefs = function(primaryFieldType, se if(!oldData || oldData.style.styleID != data.style.styleID || oldData.prefs.noteType != data.prefs.noteType || oldData.prefs.fieldType != data.prefs.fieldType) { - this.regenerateAll = this.bibliographyHasChanged = true; + this.oldCitationIDs = {}; } return oldData ? oldData : true; @@ -1238,10 +1235,10 @@ Zotero.Integration.Session.prototype.unserializeCitation = function(arg, index) * marks a citation for removal */ Zotero.Integration.Session.prototype.deleteCitation = function(index) { - var oldCitation = this.citationsByIndex[index]; + var oldCitation = (this.citationsByIndex[index] ? this.citationsByIndex[index] : false); this.citationsByIndex[index] = {properties:{"delete":true}}; - if(oldCitation.citationItems & oldCitation.properties.added) { + if(oldCitation && oldCitation.citationItems & oldCitation.properties.added) { // clear out old citations if necessary for each(var citationItem in oldCitation.citationItems) { if(this.citationsByItemID[citationItem.id]) { @@ -1254,8 +1251,9 @@ Zotero.Integration.Session.prototype.deleteCitation = function(index) { } } } + + if(oldCitation.citationID) delete this.citationIDs[oldCitation.citationID]; } - if(oldCitation.citationID) delete this.citationIDs[oldCitation.citationID]; this.updateIndices[index] = true; } @@ -1269,42 +1267,10 @@ Zotero.Integration.Session.prototype.getBibliography = function() { } /** - * Calls CSL.Engine.updateItems() to reconcile item list with current items in document + * Calls CSL.Engine.updateUncitedItems() to reconcile list of uncited items */ -Zotero.Integration.Session.prototype.updateItems = function() { - var items = [[i, this.citationsByItemID[i][0]] for(i in this.citationsByItemID) - if(this.citationsByItemID[i] && this.citationsByItemID[i].length && - this.citationsByItemID[i].some(function(citation) citation.properties && !citation.properties.delete))]; - - items.sort(function(a, b) { - // if first citation of each in different citations, use citation index - if(a[1].properties.index != b[1].properties.index) { - return a[1].properties.index-b[1].properties.index; - } - - // if a and b were both first cited in the same citation, look for index in the citation - for each(var citationItem in a[1].citationItems) { - if(citationItem.id == a[0]) { - return -1; - } else if(citationItem.id == b[0]) { - return 1; - } - } - - // should never happen - Zotero.debug("WARNING: Zotero.Integration.Session.updateItems sort function returned 0"); - return 0; - }); - - // get rid of the second part of the items (the first citation, used for sort purposes) - // and also add in the uncited items - items = [parseInt(item[0]) for each(item in items)].concat([parseInt(i) for(i in this.uncitedItems)]); - - //Zotero.debug("items are "); - //Zotero.debug(items); - - // set items in the bibliography - this.style.updateItems(items); +Zotero.Integration.Session.prototype.updateUncitedItems = function() { + this.style.updateUncitedItems([parseInt(i) for(i in this.uncitedItems)]); } /** @@ -1314,6 +1280,7 @@ Zotero.Integration.Session.prototype.updateUpdateIndices = function(regenerateAl if(regenerateAll || this.regenerateAll) { // update all indices for(var i=0; i