From ff6a4400b46945b4dc6c30ca7f4be54bd3b38ce8 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sun, 7 Apr 2019 11:36:03 -0400 Subject: [PATCH] Update citeproc-js to 1.1.236 --- chrome/content/zotero/xpcom/citeproc.js | 364 +++++++++++++++--------- 1 file changed, 230 insertions(+), 134 deletions(-) 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;