diff --git a/chrome/content/zotero/xpcom/retractions.js b/chrome/content/zotero/xpcom/retractions.js index 590e85f17b..2d31588090 100644 --- a/chrome/content/zotero/xpcom/retractions.js +++ b/chrome/content/zotero/xpcom/retractions.js @@ -206,7 +206,7 @@ Zotero.Retractions = { // PMID if (json.extra) { - let pmid = this._extractPMID(json.extra); + let pmid = this._extractExtraFields(json.extra).pmid; if (pmid) { valuesToCheck.push({ type: this.TYPE_PMID, @@ -681,14 +681,17 @@ Zotero.Retractions = { }, _getItemPMID: function (item) { - // TEMP - return this._extractPMID(item.getField('extra')) || null; + return this._extractExtraFields(item.getField('extra')).pmid; }, // TEMP - _extractPMID: function (str) { + _extractExtraFields: function (str) { + var fields = { + doi: null, + pmid: null + }; if (!str) { - return false; + return fields; } var lines = str.split(/\n+/g); for (let line of lines) { @@ -705,11 +708,18 @@ Zotero.Retractions = { .replace(/{:([^:]+):([^}]+)}/); value = value.trim(); - if (field == 'pmid' || field == 'pubmedid') { - return value; + if (field == 'doi' && !fields.doi) { + fields.doi = value; + } + else if ((field == 'pmid' || field == 'pubmedid') && !fields.pmid) { + fields.pmid = value; + } + + if (fields.doi && fields.pmid) { + break; } } - return false; + return fields; }, _valueToKey: function (type, value) { @@ -747,54 +757,61 @@ Zotero.Retractions = { }, _cacheKeyMappings: async function () { - await this._cacheDOIMappings(); - await this._cachePMIDMappings(); - }, - - _cacheDOIMappings: async function () { this._keyItems[this.TYPE_DOI] = new Map(); this._itemKeys[this.TYPE_DOI] = new Map(); - - var sql = "SELECT itemID AS id, value FROM itemData " - + "JOIN itemDataValues USING (valueID) WHERE fieldID=?"; - var rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('DOI')); - for (let row of rows) { - let value = Zotero.Utilities.cleanDOI(row.value); - if (!value) continue; - this._addItemKeyMapping(this.TYPE_DOI, value, row.id); - } - - // Extract from Extract field - sql = "SELECT itemID AS id, value FROM itemData " - + "JOIN itemDataValues USING (valueID) WHERE fieldID=?"; - rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('extra')); - for (let row of rows) { - let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value); - let doi = fields.get('DOI'); - if (!doi) continue; - let value = Zotero.Utilities.cleanDOI(doi); - if (!value) continue; - this._addItemKeyMapping(this.TYPE_DOI, value, row.id); - } - }, - - _cachePMIDMappings: async function () { this._keyItems[this.TYPE_PMID] = new Map(); this._itemKeys[this.TYPE_PMID] = new Map(); - var sql = "SELECT itemID AS id, value FROM itemData " - + "JOIN itemDataValues USING (valueID) WHERE fieldID=?"; - var rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('extra')); + var doiFieldID = Zotero.ItemFields.getID('DOI'); + var extraFieldID = Zotero.ItemFields.getID('extra'); + + var sql = "SELECT itemID AS id, fieldID, value FROM itemData " + + "JOIN itemDataValues USING (valueID) WHERE fieldID IN (?, ?)"; + var rows = await Zotero.DB.queryAsync( + sql, + [ + doiFieldID, + extraFieldID + ] + ); + for (let row of rows) { - /* - let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value); - let pmid = fields.get('pmid') || fields.get('pubmedID'); - if (!pmid) continue; - this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id); - */ - let pmid = this._extractPMID(row.value); - if (!pmid) continue; - this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id); + // DOI field + if (row.fieldID == doiFieldID) { + let value = Zotero.Utilities.cleanDOI(row.value); + if (value) { + this._addItemKeyMapping(this.TYPE_DOI, value, row.id); + } + } + // Extra field + else { + // DOI + /* + let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value); + let doi = fields.get('DOI'); + if (!doi) continue; + */ + let { doi, pmid } = this._extractExtraFields(row.value); + + if (doi) { + let value = Zotero.Utilities.cleanDOI(doi); + if (value) { + this._addItemKeyMapping(this.TYPE_DOI, value, row.id); + } + } + + // PMID + /* + let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value); + let pmid = fields.get('pmid') || fields.get('pubmedID'); + if (!pmid) continue; + this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id); + */ + //let pmid = this._extractPMID(row.value); + if (pmid) { + this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id); + } + } } }, diff --git a/test/tests/retractionsTest.js b/test/tests/retractionsTest.js index 7926299d29..c1948db782 100644 --- a/test/tests/retractionsTest.js +++ b/test/tests/retractionsTest.js @@ -258,6 +258,17 @@ describe("Retractions", function() { var indexes = await Zotero.Retractions.getRetractionsFromJSON(json); assert.sameMembers(indexes, [0]); }); + + it("should identify object with retracted DOI on subsequent line in Extra", async function () { + var json = [ + { + extra: `Foo: Bar\nDOI: ${retractedDOI}` + } + ]; + + var indexes = await Zotero.Retractions.getRetractionsFromJSON(json); + assert.sameMembers(indexes, [0]); + }); });