diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js
index 44dff5eb26..cbd75c4860 100644
--- a/chrome/content/zotero/xpcom/citeproc.js
+++ b/chrome/content/zotero/xpcom/citeproc.js
@@ -23,10 +23,10 @@ Copyright (c) 2009-2019 Frank Bennett
respectively.
*/
var CSL = {
- PROCESSOR_VERSION: "1.1.228",
- LOCATOR_LABELS_REGEXP: new RegExp("^((art|ch|subch|col|fig|l|n|no|op|p|pp|para|subpara|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|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|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/,
+ PROCESSOR_VERSION: "1.1.235",
+ 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)\. *)/,
STATUTE_SUBDIV_STRINGS: {
"art.": "article",
"bk.": "book",
@@ -40,6 +40,7 @@ var CSL = {
"r.": "rule",
"sec.": "section",
"subsec.": "subsection",
+ "supp.": "supplement",
"sch.": "schedule",
"tit.": "title",
"col.": "column",
@@ -65,6 +66,7 @@ var CSL = {
"rule": "r.",
"section": "sec.",
"subsection": "subsec.",
+ "supplement": "supp.",
"schedule": "sch.",
"title": "tit.",
"column": "col.",
@@ -99,6 +101,7 @@ var CSL = {
"r": "rule",
"sec": "section",
"subsec": "subsection",
+ "supp": "supplement",
"sv": "sub-verbo",
"sch": "schedule",
"tit": "title",
@@ -511,6 +514,7 @@ var CSL = {
"number-of-pages",
"number-of-volumes",
"volume",
+ "supplement",
"citation-number"
],
DATE_VARIABLES: [
@@ -525,6 +529,10 @@ var CSL = {
"alt-issued",
"alt-event"
],
+ VARIABLES_WITH_SHORT_FORM: [
+ "title",
+ "container-title"
+ ],
TITLE_FIELD_SPLITS: function(seg) {
var keys = ["title", "short", "main", "sub"];
var ret = {};
@@ -631,7 +639,7 @@ var CSL = {
if (sentenceCase) {
mainTitle = CSL.Output.Formatters.sentence(state, mainTitle);
subTitle = CSL.Output.Formatters.sentence(state, subTitle);
- } else {
+ } else if (state.opt.development_extensions.uppercase_subtitles) {
subTitle = CSL.Output.Formatters["capitalize-first"](state, subTitle);
}
return [mainTitle, subTitle].join(vals[title.title].slice(mainTitle.length, -1 * subTitle.length));
@@ -2474,7 +2482,7 @@ CSL.DateParser = function () {
continue;
}
if (element === "~" || element === "?" || element === "c" || element.match(/^cir/)) {
- thedate.circa = "" + 1;
+ thedate.circa = true;
}
for (var k=0,klen=this.monthRexes.length; k -1 && state.tmp.shadow_numbers[node.strings.term].label) {
- myterm = state.tmp.shadow_numbers[node.strings.term].label;
- }
- if (node.decorations && (state.opt.development_extensions.csl_reverse_lookup_support || state.sys.csl_reverse_lookup_support)) {
- node.decorations.reverse();
- node.decorations.push(["@showid","true", node.cslid]);
- node.decorations.reverse();
+ var theItem = (item && node.strings.term === "locator") ? item : Item;
+ if (theItem[node.strings.term]) {
+ state.processNumber(false, theItem, node.strings.term, Item.type);
+ plural = state.tmp.shadow_numbers[node.strings.term].plural;
+ if (!state.tmp.shadow_numbers[node.strings.term].labelForm
+ && !state.tmp.shadow_numbers[node.strings.term].labelDecorations) {
+ state.tmp.shadow_numbers[node.strings.term].labelForm = node.strings.form;
+ state.tmp.shadow_numbers[node.strings.term].labelCapitalizeIfFirst = node.strings.capitalize_if_first;
+ state.tmp.shadow_numbers[node.strings.term].labelDecorations = node.decorations.slice();
+ }
+ if (["locator", "number", "page"].indexOf(node.strings.term) > -1 && state.tmp.shadow_numbers[node.strings.term].label) {
+ myterm = state.tmp.shadow_numbers[node.strings.term].label;
+ }
+ if (node.decorations && (state.opt.development_extensions.csl_reverse_lookup_support || state.sys.csl_reverse_lookup_support)) {
+ node.decorations.reverse();
+ node.decorations.push(["@showid","true", node.cslid]);
+ node.decorations.reverse();
+ }
}
}
return CSL.castLabel(state, node, myterm, plural, CSL.TOLERANT);
@@ -10605,22 +10628,27 @@ CSL.Node.names = {
this.etal_style = "empty";
}
this.etal_term = state.getTerm(state.tmp.etal_term, "long", 0);
- if (CSL.STARTSWITH_ROMANESQUE_REGEXP.test(this.etal_term)) {
- this.etal_prefix_single = " ";
- this.etal_prefix_multiple = state.tmp.name_delimiter;
- if (state.tmp["delimiter-precedes-et-al"] === "always") {
- this.etal_prefix_single = state.tmp.name_delimiter;
- } else if (state.tmp["delimiter-precedes-et-al"] === "never") {
- this.etal_prefix_multiple = " ";
- } else if (state.tmp["delimiter-precedes-et-al"] === "after-inverted-name") {
- this.etal_prefix_single = state.tmp.name_delimiter;
- this.etal_prefix_multiple = " ";
+ this.etal_prefix_single = " ";
+ this.etal_prefix_multiple = state.tmp.name_delimiter;
+ if (state.tmp["delimiter-precedes-et-al"] === "always") {
+ this.etal_prefix_single = state.tmp.name_delimiter;
+ } else if (state.tmp["delimiter-precedes-et-al"] === "never") {
+ this.etal_prefix_multiple = " ";
+ } else if (state.tmp["delimiter-precedes-et-al"] === "after-inverted-name") {
+ this.etal_prefix_single = state.tmp.name_delimiter;
+ this.etal_prefix_multiple = " ";
+ }
+ this.etal_suffix = "";
+ if (!CSL.STARTSWITH_ROMANESQUE_REGEXP.test(this.etal_term)) {
+ if (this.etal_prefix_single === " ") {
+ this.etal_prefix_single = "";
+ }
+ if (this.etal_prefix_multiple === " ") {
+ this.etal_prefix_multiple = "";
+ }
+ if (this.etal_suffix === " ") {
+ this.etal_suffix = "";
}
- this.etal_suffix = "";
- } else {
- this.etal_prefix_single = "";
- this.etal_prefix_multiple = "";
- this.etal_suffix = "";
}
for (var i = 0, ilen = 3; i < ilen; i += 1) {
var key = ["family", "given"][i];
@@ -10705,13 +10733,22 @@ CSL.Node.number = {
if (this.variables.length === 0) {
return;
}
+ var varname;
+ varname = this.variables[0];
if ("undefined" === typeof item) {
var item = {};
}
- var varname;
- varname = this.variables[0];
- if (varname === "locator" && state.tmp.just_looking) {
- return;
+ if (["locator", "locator-extra"].indexOf(varname) > -1) {
+ if (state.tmp.just_looking) {
+ return;
+ }
+ if (!item[varname]) {
+ return;
+ }
+ } else {
+ if (!Item[varname]) {
+ return;
+ }
}
state.parallel.StartVariable(this.variables[0]);
if (this.variables[0] === "locator") {
@@ -10727,12 +10764,12 @@ CSL.Node.number = {
return false;
}
if (["locator", "locator-extra"].indexOf(varname) > -1) {
- state.processNumber(node, item, varname, Item.type);
+ state.processNumber.call(state, node, item, varname, Item.type);
} else {
- if (!state.tmp.group_context.tip.condition && Item[varname]) {
+ if (!state.tmp.group_context.tip.condition) {
state.tmp.just_did_number = true;
}
- state.processNumber(node, Item, varname, Item.type);
+ state.processNumber.call(state, node, Item, varname, Item.type);
}
CSL.Util.outputNumericField(state, varname, Item.id);
state.parallel.CloseVariable("number");
@@ -11198,21 +11235,19 @@ CSL.Attributes["@is-numeric"] = function (state, arg) {
if (["locator","locator-extra"].indexOf(variable) > -1) {
myitem = item;
}
- if ("undefined" === typeof myitem) {
+ if (!myitem[variable]) {
return false;
}
if (CSL.NUMERIC_VARIABLES.indexOf(variable) > -1) {
if (!state.tmp.shadow_numbers[variable]) {
state.processNumber(false, myitem, variable, Item.type);
}
- if (myitem[variable] && state.tmp.shadow_numbers[variable].numeric) {
+ if (state.tmp.shadow_numbers[variable].numeric) {
return true;
}
} else if (["title", "locator-extra","version"].indexOf(variable) > -1) {
- if (myitem[variable]) {
- if (myitem[variable].slice(-1) === "" + parseInt(myitem[variable].slice(-1), 10)) {
- return true;
- }
+ if (myitem[variable].slice(-1) === "" + parseInt(myitem[variable].slice(-1), 10)) {
+ return true;
}
}
return false;
@@ -11543,16 +11578,13 @@ CSL.Attributes["@page"] = function (state, arg) {
};
CSL.Attributes["@number"] = function (state, arg) {
this.tests ? {} : this.tests = [];
- var trylabels = arg.replace("sub verbo", "sub-verbo");
- trylabels = trylabels.split(/\s+/);
+ var trylabels = arg.split(/\s+/);
var maketest = function(trylabel) {
return function (Item) {
var label;
state.processNumber(false, Item, "number", Item.type);
if (!state.tmp.shadow_numbers.number.label) {
label = "number";
- } else if (state.tmp.shadow_numbers.number.label === "sub verbo") {
- label = "sub-verbo";
} else {
label = state.tmp.shadow_numbers.number.label;
}
@@ -12933,12 +12965,12 @@ CSL.Transform = function (state) {
ret = Item.multi.main[field];
}
if (!state.opt.development_extensions.strict_text_case_locales
- || state.opt.development_extensions.normalize_lang_keys_to_lowercase) {
+ || state.opt.development_extensions.normalize_lang_keys_to_lowercase) {
ret = ret.toLowerCase();
}
return ret;
}
- function getTextSubField (Item, field, locale_type, use_default, stopOrig) {
+ function getTextSubField (Item, field, locale_type, use_default, stopOrig, family_var) {
var opt, o, ret, opts;
var usedOrig = stopOrig;
var usingOrig = false;
@@ -12949,52 +12981,105 @@ CSL.Transform = function (state) {
token: CSL.Util.cloneToken(this)
};
}
- ret = {name:"", usedOrig:stopOrig,locale:getFieldLocale(Item,field)};
- opts = state.opt[locale_type];
- var hasVal = false;
- if (locale_type === 'locale-orig') {
- if (stopOrig) {
- ret = {name:"", usedOrig:stopOrig};
- } else {
- ret = {name:Item[field], usedOrig:false, locale:getFieldLocale(Item,field)};
- }
- hasVal = true;
- usingOrig = true;
- } else if (use_default && ("undefined" === typeof opts || opts.length === 0)) {
- var ret = {name:Item[field], usedOrig:true, locale:getFieldLocale(Item,field)};
- hasVal = true;
- usingOrig = true;
+ var stickyLongForm = false;
+ if (CSL.VARIABLES_WITH_SHORT_FORM.indexOf(field) > -1
+ && family_var) {
+ field = field + "-short";
+ stickyLongForm = true;
}
- if (!hasVal) {
- for (var i = 0, ilen = opts.length; i < ilen; i += 1) {
- opt = opts[i];
- o = opt.split(/[\-_]/)[0];
- if (opt && Item.multi && Item.multi._keys[field] && Item.multi._keys[field][opt]) {
- ret.name = Item.multi._keys[field][opt];
- ret.locale = opt;
- break;
- } else if (o && Item.multi && Item.multi._keys[field] && Item.multi._keys[field][o]) {
- ret.name = Item.multi._keys[field][o];
- ret.locale = o;
- break;
+ var breakMe = false;
+ var firstValue = null;
+ var fieldsToTry = [];
+ if (field.slice(-6) === "-short") {
+ fieldsToTry.push(field);
+ fieldsToTry.push(field.slice(0, -6))
+ } else {
+ fieldsToTry.push(field);
+ }
+ for (var h=0,hlen=fieldsToTry.length; h -1) {
- if (!usedOrig
- && (!ret.token.strings["text-case"]
- || ret.token.strings["text-case"] === "sentence"
- || ret.token.strings["text-case"] === "normal")) {
- var locale = usingOrig ? false : ret.locale;
- var seg = field.slice(0,-5);
- var sentenceCase = ret.token.strings["text-case"] === "sentence" ? true : false;
- ret.name = CSL.titlecaseSentenceOrNormal(state, Item, seg, locale, sentenceCase);
- delete ret.token.strings["text-case"];
+ if (!hasVal) {
+ for (var i = 0, ilen = opts.length; i < ilen; i += 1) {
+ opt = opts[i];
+ o = opt.split(/[\-_]/)[0];
+ if (opt && Item.multi && Item.multi._keys[field] && Item.multi._keys[field][opt]) {
+ ret.name = Item.multi._keys[field][opt];
+ ret.locale = opt;
+ hasVal = true;
+ variantMatch = true;
+ usingOrig = false;
+ break;
+ } else if (o && Item.multi && Item.multi._keys[field] && Item.multi._keys[field][o]) {
+ ret.name = Item.multi._keys[field][o];
+ ret.locale = o;
+ hasVal = true;
+ variantMatch = true;
+ usingOrig = false;
+ break;
+ }
+ }
+ if (!ret.name && use_default) {
+ ret = {name:Item[field], usedOrig:true, locale:getFieldLocale(Item,field)};
+ usingOrig = true;
+ }
+ }
+ ret.token = CSL.Util.cloneToken(this);
+ if (h === 0) {
+ if (variantMatch) {
+ ret.found_variant_ok = true;
+ }
+ firstValue = ret;
+ if (!stickyLongForm && ("undefined" === typeof opts || opts.length === 0)) {
+ breakMe = true;
+ }
+ if (variantMatch) {
+ breakMe = true;
+ }
+ } else {
+ if (!stickyLongForm && !variantMatch && firstValue) {
+ ret = firstValue;
+ field = fieldsToTry[0];
+ } else if (variantMatch) {
+ ret.found_variant_ok = true;
+ }
+ }
+ if (["title", "container-title"].indexOf(field) > -1) {
+ if (!usedOrig
+ && (!ret.token.strings["text-case"]
+ || ret.token.strings["text-case"] === "sentence"
+ || ret.token.strings["text-case"] === "normal")) {
+ var locale = state.opt.lang;
+ var lang;
+ if (usingOrig) {
+ lang = false;
+ } else {
+ lang = ret.locale;
+ }
+ var seg = field.slice(0,-5);
+ var sentenceCase = ret.token.strings["text-case"] === "sentence" ? true : false;
+ ret.name = CSL.titlecaseSentenceOrNormal(state, Item, seg, lang, sentenceCase);
+ delete ret.token.strings["text-case"];
+ }
+ }
+ if (breakMe) {
+ break;
}
}
return ret;
@@ -13079,7 +13164,10 @@ CSL.Transform = function (state) {
if (state.tmp.area.slice(-5) === "_sort") {
slot.primary = 'locale-sort';
} else {
- if (localesets && !state.tmp.multi_layout) {
+ if (localesets && localesets.length === 1 && localesets[0] === "locale-orig") {
+ slot.primary = "locale-orig";
+ localesets = false;
+ } else if (localesets && !state.tmp.multi_layout) {
var slotnames = ["primary", "secondary", "tertiary"];
for (var i = 0, ilen = slotnames.length; i < ilen; i += 1) {
if (localesets.length - 1 < i) {
@@ -13113,11 +13201,17 @@ CSL.Transform = function (state) {
}
return null;
}
- var res = getTextSubField.call(this, Item, variables[0], slot.primary, true);
+ var res = getTextSubField.call(this, Item, variables[0], slot.primary, true, null, family_var);
primary = res.name;
primary_locale = res.locale;
var primary_tok = res.token;
var primaryUsedOrig = res.usedOrig;
+ if (family_var && !res.found_variant_ok) {
+ primary = abbreviate(state, primary_tok, Item, alternative_varname, primary, family_var, true);
+ if (primary) {
+ primary = quashCheck(primary);
+ }
+ }
if (publisherCheck(this, Item, primary, family_var)) {
return null;
}
@@ -13126,27 +13220,25 @@ CSL.Transform = function (state) {
var secondary_tok;
var tertiary_tok;
if (slot.secondary) {
- res = getTextSubField.call(this, Item, variables[0], slot.secondary, false, res.usedOrig);
+ res = getTextSubField.call(this, Item, variables[0], slot.secondary, false, res.usedOrig, null, family_var);
secondary = res.name;
secondary_locale = res.locale;
secondary_tok = res.token;
+ if (family_var && !res.found_variant_ok) {
+ if (secondary) {
+ secondary = abbreviate(state, secondary_tok, Item, false, secondary, family_var, true);
+ }
+ }
}
if (slot.tertiary) {
- res = getTextSubField.call(this, Item, variables[0], slot.tertiary, false, res.usedOrig);
+ res = getTextSubField.call(this, Item, variables[0], slot.tertiary, false, res.usedOrig, null, family_var);
tertiary = res.name;
tertiary_locale = res.locale;
tertiary_tok = res.token;
- }
- if (family_var) {
- primary = abbreviate(state, primary_tok, Item, alternative_varname, primary, family_var, true);
- if (primary) {
- primary = quashCheck(primary);
- }
- if (secondary) {
- secondary = abbreviate(state, secondary_tok, Item, false, secondary, family_var, true);
- }
- if (tertiary) {
- tertiary = abbreviate(state, tertiary_tok, Item, false, tertiary, family_var, true);
+ if (family_var && !res.found_variant_ok) {
+ if (tertiary) {
+ tertiary = abbreviate(state, tertiary_tok, Item, false, tertiary, family_var, true);
+ }
}
}
var primaryPrefix;
@@ -13744,11 +13836,15 @@ CSL.Util.Names.doInitialize = function (state, namelist, terminator) {
};
CSL.Util.Names.getRawName = function (name) {
var ret = [];
- if (name.given) {
- ret.push(name.given);
- }
- if (name.family) {
- ret.push(name.family);
+ if (name.literal) {
+ ret.push(name.literal);
+ } else {
+ if (name.given) {
+ ret.push(name.given);
+ }
+ if (name.family) {
+ ret.push(name.family);
+ }
}
return ret.join(" ");
};
@@ -14595,7 +14691,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
currentLabelInfo.count = groupCount;
currentLabelInfo.numeric = true;
fixNumericAndCount(values, groupStartPos, currentLabelInfo);
- if (i === 0 || (lastVal.label !== thisVal.label)) {
+ if (lastVal.label !== thisVal.label) {
fixLabelVisibility(values, groupStartPos, currentLabelInfo);
}
groupStartPos = i;