From 4ad97611aa9f7c052856dbce3a0ea6b11723b0fb Mon Sep 17 00:00:00 2001 From: Frank Bennett Date: Sun, 2 Jun 2019 07:17:12 +0900 Subject: [PATCH] Bump version, update CHANGES, bundle as 1.2.7 --- CHANGES.txt | 10 ++++++++++ citeproc.js | 28 ++++++++++++++++++++++++---- citeproc_commonjs.js | 28 ++++++++++++++++++++++++---- src/load.js | 2 +- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ed587b765..690509e5a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,15 @@ Summary of changes to citeproc-js since version 1.2 release. +======================== +Changes in version 1.2.7 +======================== + +- Fix bug triggered by APA bug and multilingual settings + +- Localize ampersand if poss, but render full form of "and" + (either en or localized) as-is, recognizing as plural. + See: https://forums.zotero.org/discussion/77628/citeproc-js-referring-to-single-vs-multiple-paragraphs + ======================== Changes in version 1.2.6 ======================== diff --git a/citeproc.js b/citeproc.js index 2591522ba..1f9536492 100644 --- a/citeproc.js +++ b/citeproc.js @@ -23,7 +23,7 @@ Copyright (c) 2009-2019 Frank Bennett respectively. */ var CSL = { - PROCESSOR_VERSION: "1.2.6", + PROCESSOR_VERSION: "1.2.7", LOCATOR_LABELS_REGEXP: new RegExp("^((art|ch|subch|col|fig|l|n|no|op|p|pp|para|subpara|supp|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\\.)\\s+(.*)"), STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:art|bk|ch|subch|col|fig|fol|l|n|no|op|p|pp|para|subpara|supp|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/, STATUTE_SUBDIV_PLAIN_REGEX_FRONT: /(?:^\s*[.,;]*\s*(?:art|bk|ch|subch|col|fig|fol|l|n|no|op|p|pp|para|subpara|supp|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/, @@ -697,7 +697,7 @@ var CSL = { subTitle = CSL.Output.Formatters["capitalize-first"](state, subTitle); } return [mainTitle, subJoin, subTitle].join(""); - } else { + } else if (vals[title.title]) { if (sentenceCase) { return CSL.Output.Formatters.sentence(state, vals[title.title]); } else if (state.opt.development_extensions.uppercase_subtitles) { @@ -720,6 +720,8 @@ var CSL = { } else { return vals[title.title]; } + } else { + return ""; } }, getSafeEscape: function(state) { @@ -14631,6 +14633,19 @@ CSL.Util.Suffixator.prototype.format = function (N) { CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) { var val; var me = this; + var fullformAnd = ",\\s+and\\s+|\\s+and\\s+"; + if (this.opt.lang.slice(0, 2) !== "en") { + fullformAnd += "|,\\s+" + this.getTerm("and") + "\\s+|\\s+" + this.getTerm("and") + "\\s+"; + } + var symbolAnd = "\\s*&\\s*"; + var andRex = new RegExp("^" + symbolAnd+ "$"); + var joinerMatchRex = new RegExp("(" + symbolAnd + "|" + fullformAnd + "|;\\s+|,\\s+|\\s*\\\\*[\\-\\u2013]+\\s*)", "g"); + var joinerSplitRex = new RegExp("(?:" + symbolAnd + "|" + fullformAnd + "|;\\s+|,\\s+|\\s*\\\\*[\\-\\u2013]+\\s*|\\s*&\\s*)"); + var localeAnd = this.getTerm("and"); + var localeAmpersand = this.getTerm("and", "symbol"); + if (localeAnd === localeAmpersand) { + localeAmpersand = "&"; + } function normalizeFieldValue(str) { str = str.trim(); var m = str.match(/^([^ ]+)/); @@ -14691,9 +14706,14 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) { defaultLabel = defaultLabel ? defaultLabel : ""; str = normalizeFieldValue(str, defaultLabel); var elems = []; - var m = str.match(/(;\s+|,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/g); + var m = str.match(joinerMatchRex); if (m) { - var lst = str.split(/(?:;\s+|,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/); + for (var i=0, ilen=m.length; i respectively. */ var CSL = { - PROCESSOR_VERSION: "1.2.6", + PROCESSOR_VERSION: "1.2.7", LOCATOR_LABELS_REGEXP: new RegExp("^((art|ch|subch|col|fig|l|n|no|op|p|pp|para|subpara|supp|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\\.)\\s+(.*)"), STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:art|bk|ch|subch|col|fig|fol|l|n|no|op|p|pp|para|subpara|supp|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/, STATUTE_SUBDIV_PLAIN_REGEX_FRONT: /(?:^\s*[.,;]*\s*(?:art|bk|ch|subch|col|fig|fol|l|n|no|op|p|pp|para|subpara|supp|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/, @@ -697,7 +697,7 @@ var CSL = { subTitle = CSL.Output.Formatters["capitalize-first"](state, subTitle); } return [mainTitle, subJoin, subTitle].join(""); - } else { + } else if (vals[title.title]) { if (sentenceCase) { return CSL.Output.Formatters.sentence(state, vals[title.title]); } else if (state.opt.development_extensions.uppercase_subtitles) { @@ -720,6 +720,8 @@ var CSL = { } else { return vals[title.title]; } + } else { + return ""; } }, getSafeEscape: function(state) { @@ -14631,6 +14633,19 @@ CSL.Util.Suffixator.prototype.format = function (N) { CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) { var val; var me = this; + var fullformAnd = ",\\s+and\\s+|\\s+and\\s+"; + if (this.opt.lang.slice(0, 2) !== "en") { + fullformAnd += "|,\\s+" + this.getTerm("and") + "\\s+|\\s+" + this.getTerm("and") + "\\s+"; + } + var symbolAnd = "\\s*&\\s*"; + var andRex = new RegExp("^" + symbolAnd+ "$"); + var joinerMatchRex = new RegExp("(" + symbolAnd + "|" + fullformAnd + "|;\\s+|,\\s+|\\s*\\\\*[\\-\\u2013]+\\s*)", "g"); + var joinerSplitRex = new RegExp("(?:" + symbolAnd + "|" + fullformAnd + "|;\\s+|,\\s+|\\s*\\\\*[\\-\\u2013]+\\s*|\\s*&\\s*)"); + var localeAnd = this.getTerm("and"); + var localeAmpersand = this.getTerm("and", "symbol"); + if (localeAnd === localeAmpersand) { + localeAmpersand = "&"; + } function normalizeFieldValue(str) { str = str.trim(); var m = str.match(/^([^ ]+)/); @@ -14691,9 +14706,14 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) { defaultLabel = defaultLabel ? defaultLabel : ""; str = normalizeFieldValue(str, defaultLabel); var elems = []; - var m = str.match(/(;\s+|,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/g); + var m = str.match(joinerMatchRex); if (m) { - var lst = str.split(/(?:;\s+|,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/); + for (var i=0, ilen=m.length; i