diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js index 55d484259b..9f70593f05 100644 --- a/chrome/content/zotero/xpcom/utilities_internal.js +++ b/chrome/content/zotero/xpcom/utilities_internal.js @@ -972,7 +972,9 @@ Zotero.Utilities.Internal = { for (let cslVar in map) { let normalized = this._normalizeExtraKey(cslVar); let existing = fieldNames.get(normalized) || []; - fieldNames.set(normalized, new Set([...existing, ...map[cslVar]])); + // Text fields are one-to-many; date fields are one-to-one + let additional = Array.isArray(map[cslVar]) ? map[cslVar] : [map[cslVar]]; + fieldNames.set(normalized, new Set([...existing, ...additional])); } } diff --git a/test/tests/utilities_internalTest.js b/test/tests/utilities_internalTest.js index b4db6f431b..71f2b177d0 100644 --- a/test/tests/utilities_internalTest.js +++ b/test/tests/utilities_internalTest.js @@ -215,6 +215,14 @@ describe("Zotero.Utilities.Internal", function () { assert.equal(creators[0].name, 'Bar'); }); + it("should extract a CSL date field", function () { + var str = 'issued: 2000'; + var { fields, extra } = Zotero.Utilities.Internal.extractExtraFields(str); + assert.equal(fields.size, 1); + assert.equal(fields.get('date'), 2000); + assert.strictEqual(extra, ''); + }); + it("should extract a CSL name", function () { var str = 'container-author: First || Last'; var { creators, extra } = Zotero.Utilities.Internal.extractExtraFields(str); @@ -243,6 +251,15 @@ describe("Zotero.Utilities.Internal", function () { assert.lengthOf(creators, 0); assert.strictEqual(extra, str); }); + + it("should extract the citeproc-js cheater syntax", function () { + var issued = '{:number-of-pages:11}\n{:issued:2014}'; + var { fields, extra } = Zotero.Utilities.Internal.extractExtraFields(issued); + assert.equal(fields.size, 2); + assert.equal(fields.get('numPages'), 11); + assert.equal(fields.get('date'), 2014); + assert.strictEqual(extra, ''); + }); }); describe("#combineExtraFields", function () {