Update citeproc-js to 1.4.11

This fixes the "invalid language tag" error when there are invalid
language tags in Language (beta only).

https://forums.zotero.org/discussion/84224/zotero-error-refreshing-report-id-337976002
This commit is contained in:
Dan Stillman 2020-07-18 19:20:50 -04:00
parent ab3a5ddbd8
commit 785b6dd408

View file

@ -59,7 +59,7 @@ Copyright (c) 2009-2019 Frank Bennett
var CSL = { var CSL = {
PROCESSOR_VERSION: "1.4.7", PROCESSOR_VERSION: "1.4.11",
error: function(str) { // default error function error: function(str) { // default error function
if ("undefined" === typeof Error) { if ("undefined" === typeof Error) {
@ -76,6 +76,26 @@ var CSL = {
} }
}, },
toLocaleUpperCase(str) {
var arr = this.tmp.lang_array;
try {
str = str.toLocaleUpperCase(arr);
} catch (e) {
str = str.toUpperCase();
}
return str;
},
toLocaleLowerCase(str) {
var arr = this.tmp.lang_array;
try {
str = str.toLocaleLowerCase(arr);
} catch (e) {
str = str.toLowerCase();
}
return str;
},
LOCATOR_LABELS_REGEXP: new RegExp("^((vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\\.)\\s+(.*)"), LOCATOR_LABELS_REGEXP: new RegExp("^((vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\\.)\\s+(.*)"),
STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\. *)/, STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\. *)/,
@ -2639,6 +2659,7 @@ CSL.getSortCompare = function (default_locale) {
if (CSL.stringCompare) { if (CSL.stringCompare) {
return CSL.stringCompare; return CSL.stringCompare;
} }
var me = this;
var strcmp; var strcmp;
var strcmp_opts = { var strcmp_opts = {
sensitivity:"base", sensitivity:"base",
@ -2652,10 +2673,7 @@ CSL.getSortCompare = function (default_locale) {
default_locale = "en-US"; default_locale = "en-US";
} }
strcmp = function (a, b) { strcmp = function (a, b) {
//var ret = a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase(),default_locale,strcmp_opts); return CSL.toLocaleLowerCase.call(me, a).localeCompare(CSL.toLocaleLowerCase.call(me, b),default_locale,strcmp_opts);
// print(ret+' ('+a+') :: ('+b+')');
//return ret;
return a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase(),default_locale,strcmp_opts);
}; };
var stripPunct = function (str) { var stripPunct = function (str) {
return str.replace(/^[\[\]\'\"]*/g, ""); return str.replace(/^[\[\]\'\"]*/g, "");
@ -7639,8 +7657,6 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
CSL.Engine.prototype.process_CitationCluster = function (sortedItems, citation) { CSL.Engine.prototype.process_CitationCluster = function (sortedItems, citation) {
var str = ""; var str = "";
// Parallels must be evaluated in the calling function
//this.parallel.StartCitation(sortedItems);
if (citation && citation.properties && citation.properties.mode === "composite") { if (citation && citation.properties && citation.properties.mode === "composite") {
citation.properties.mode = "author-only"; citation.properties.mode = "author-only";
var firstChunk = CSL.getCitationCluster.call(this, sortedItems, citation); var firstChunk = CSL.getCitationCluster.call(this, sortedItems, citation);
@ -7709,9 +7725,6 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) {
inputList.sort(this.citation.srt.compareCompositeKeys); inputList.sort(this.citation.srt.compareCompositeKeys);
} }
this.tmp.citation_errors = []; this.tmp.citation_errors = [];
if (this.opt.parallel.enable) {
this.parallel.StartCitation(inputList);
}
var str = CSL.getCitationCluster.call(this, inputList); var str = CSL.getCitationCluster.call(this, inputList);
return str; return str;
}; };
@ -7738,6 +7751,7 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {
parallel_first: flags.parallel_first, parallel_first: flags.parallel_first,
parallel_last_override: flags.parallel_last_override, parallel_last_override: flags.parallel_last_override,
parallel_delimiter_override: flags.parallel_delimiter_override, parallel_delimiter_override: flags.parallel_delimiter_override,
parallel_delimiter_override_on_suppress: flags.parallel_delimiter_override_on_suppress,
condition: flags.condition, condition: flags.condition,
force_suppress: flags.force_suppress, force_suppress: flags.force_suppress,
done_vars: flags.done_vars.slice() done_vars: flags.done_vars.slice()
@ -7979,8 +7993,12 @@ CSL.getCitationCluster = function (inputList, citation) {
inputList[0][1]["suppress-author"] = true; inputList[0][1]["suppress-author"] = true;
} }
} }
if (this.opt.parallel.enable) {
this.parallel.StartCitation(inputList);
}
for (pos = 0; pos < len; pos += 1) { for (pos = 0; pos < len; pos += 1) {
// Also for parallels only
this.tmp.cite_index = pos; this.tmp.cite_index = pos;
Item = inputList[pos][0]; Item = inputList[pos][0];
@ -10245,6 +10263,7 @@ CSL.Node.group = {
label_static: state.tmp.group_context.tip.label_static, label_static: state.tmp.group_context.tip.label_static,
label_capitalize_if_first: label_capitalize_if_first, label_capitalize_if_first: label_capitalize_if_first,
parallel_delimiter_override: this.strings.set_parallel_delimiter_override, parallel_delimiter_override: this.strings.set_parallel_delimiter_override,
parallel_delimiter_override_on_suppress: this.strings.set_parallel_delimiter_override_on_suppress,
condition: condition, condition: condition,
force_suppress: force_suppress, force_suppress: force_suppress,
done_vars: state.tmp.group_context.tip.done_vars.slice() done_vars: state.tmp.group_context.tip.done_vars.slice()
@ -10423,6 +10442,12 @@ CSL.Node.group = {
state.output.endTag(); state.output.endTag();
if (this.realGroup) { if (this.realGroup) {
var flags = state.tmp.group_context.pop(); var flags = state.tmp.group_context.pop();
if (flags.parallel_delimiter_override) {
state.tmp.group_context.tip.parallel_delimiter_override = flags.parallel_delimiter_override;
}
if (flags.parallel_delimiter_override_on_suppress) {
state.tmp.group_context.tip.parallel_delimiter_override_on_suppress = flags.parallel_delimiter_override_on_suppress;
}
if (state.tmp.area === "bibliography_sort") { if (state.tmp.area === "bibliography_sort") {
var citationNumberIdx = flags.done_vars.indexOf("citation-number"); var citationNumberIdx = flags.done_vars.indexOf("citation-number");
if (this.strings.sort_direction && citationNumberIdx > -1 && state.tmp.group_context.length() == 1) { if (this.strings.sort_direction && citationNumberIdx > -1 && state.tmp.group_context.length() == 1) {
@ -10451,7 +10476,8 @@ CSL.Node.group = {
} }
var blobs = state.output.current.value().blobs; var blobs = state.output.current.value().blobs;
var pos = state.output.current.value().blobs.length - 1; var pos = state.output.current.value().blobs.length - 1;
if (!state.tmp.just_looking && (flags.parallel_last || flags.parallel_first || flags.parallel_delimiter_override)) { if (!state.tmp.just_looking && (flags.parallel_last || flags.parallel_first || flags.parallel_delimiter_override || flags.parallel_delimiter_override_on_suppress)) {
// HOWDY
// flags.parallel_last // flags.parallel_last
// flags.parallel_first // flags.parallel_first
var hasRepeat = state.parallel.checkRepeats(flags); var hasRepeat = state.parallel.checkRepeats(flags);
@ -10462,7 +10488,9 @@ CSL.Node.group = {
} }
if (state.tmp.cite_index > 0 && (hasRepeat || (!flags.parallel_first && !flags.parallel_last))) { if (state.tmp.cite_index > 0 && (hasRepeat || (!flags.parallel_first && !flags.parallel_last))) {
//state.sys.print(`${state.tmp.cite_index} ${JSON.stringify(state.tmp.suppress_repeats, null, 2)}`) //state.sys.print(`${state.tmp.cite_index} ${JSON.stringify(state.tmp.suppress_repeats, null, 2)}`)
if (flags.parallel_delimiter_override && state.tmp.suppress_repeats[state.tmp.cite_index-1].SIBLING) { if (hasRepeat && flags.parallel_delimiter_override_on_suppress && state.tmp.suppress_repeats[state.tmp.cite_index-1].SIBLING) {
state.output.queue.slice(-1)[0].parallel_delimiter = flags.parallel_delimiter_override_on_suppress;
} else if (flags.parallel_delimiter_override && state.tmp.suppress_repeats[state.tmp.cite_index-1].SIBLING) {
state.output.queue.slice(-1)[0].parallel_delimiter = flags.parallel_delimiter_override; state.output.queue.slice(-1)[0].parallel_delimiter = flags.parallel_delimiter_override;
} }
} }
@ -16328,6 +16356,9 @@ CSL.Attributes["@parallel-last-override"] = function (state, arg) {
CSL.Attributes["@parallel-delimiter-override"] = function (state, arg) { CSL.Attributes["@parallel-delimiter-override"] = function (state, arg) {
this.strings.set_parallel_delimiter_override = arg; this.strings.set_parallel_delimiter_override = arg;
}; };
CSL.Attributes["@parallel-delimiter-override-on-suppress"] = function (state, arg) {
this.strings.set_parallel_delimiter_override_on_suppress = arg;
};
CSL.Attributes["@require"] = function (state, arg) { CSL.Attributes["@require"] = function (state, arg) {
@ -17040,9 +17071,6 @@ CSL.Parallel.prototype.StartCitation = function (sortedItems, out) {
var idxEnd = 0; var idxEnd = 0;
var parallelMatchList = false; var parallelMatchList = false;
var siblingRanges = []; var siblingRanges = [];
// Okay, shit. This is hard.
// Start is fine.
// End is failing to tag a penultimate item.
for (var i=0,ilen=sortedItems.length-1;i<ilen;i++) { for (var i=0,ilen=sortedItems.length-1;i<ilen;i++) {
var freshMatchList = false; var freshMatchList = false;
@ -18679,10 +18707,9 @@ CSL.Util.Names.doInitialize = function (state, namelist, terminator) {
} }
} }
if (s.length < m[2].length) { if (s.length < m[2].length) {
extra = s.toLocaleLowerCase(); extra = CSL.toLocaleLowerCase.call(state, s);
} }
} }
// namelist[i] = m[1].toLocaleUpperCase() + extra;
namelist[i] = m[1] + extra; namelist[i] = m[1] + extra;
if (i < (ilen - 1)) { if (i < (ilen - 1)) {
if (terminator.match("%s")) { if (terminator.match("%s")) {
@ -19023,8 +19050,7 @@ CSL.Util.Sort = {};
CSL.Util.Sort.strip_prepositions = function (str) { CSL.Util.Sort.strip_prepositions = function (str) {
var m; var m;
if ("string" === typeof str) { if ("string" === typeof str) {
m = str.toLocaleLowerCase(); m = str.match(/^(([aA]|[aA][nN]|[tT][hH][eE])\s+)/);
m = str.match(/^((a|an|the)\s+)/);
} }
if (m) { if (m) {
str = str.substr(m[1].length); str = str.substr(m[1].length);
@ -19564,7 +19590,10 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
var val; var val;
var me = this; var me = this;
var realVariable = variable;
variable = (variable === "page-first") ? "page" : variable;
var fullformAnd = ",\\s+and\\s+|\\s+and\\s+"; var fullformAnd = ",\\s+and\\s+|\\s+and\\s+";
if (this.opt.lang.slice(0, 2) !== "en") { if (this.opt.lang.slice(0, 2) !== "en") {
fullformAnd += "|,\\s+" + this.getTerm("and") + "\\s+|\\s+" + this.getTerm("and") + "\\s+"; fullformAnd += "|,\\s+" + this.getTerm("and") + "\\s+|\\s+" + this.getTerm("and") + "\\s+";
@ -19639,12 +19668,12 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
var info = {}; var info = {};
if (!label && !CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable]) { if (!label && !CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable]) {
label = "var:"+variable; label = "var:"+ variable;
} }
if (label) { if (label) {
var m = label.match(/(\s*)([^\s]+)(\s*)/); var m = label.match(/(\s*)([^\s]+)(\s*)/);
if (variable === "page" && parsePosition === 0 && ["p.", "pp."].indexOf(m[2]) === -1) { if (realVariable === "page" && parsePosition === 0 && ["p.", "pp."].indexOf(m[2]) === -1) {
info.gotosleepability = true; info.gotosleepability = true;
info.labelVisibility = true; info.labelVisibility = true;
} else { } else {
@ -19768,7 +19797,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
var slug = m[0].trim(); var slug = m[0].trim();
var notAlabel = !CSL.STATUTE_SUBDIV_STRINGS[slug] var notAlabel = !CSL.STATUTE_SUBDIV_STRINGS[slug]
|| "undefined" === typeof me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[slug]) || "undefined" === typeof me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[slug])
|| (["locator", "number", "locator-extra", "page"].indexOf(variable) === -1 && CSL.STATUTE_SUBDIV_STRINGS[slug] !== variable); || (["locator", "number", "locator-extra", "page"].indexOf(variable) === -1 && CSL.STATUTE_SUBDIV_STRINGS[slug] !== variable);
if (notAlabel) { if (notAlabel) {
if (i === 0) { if (i === 0) {
m = m.slice(1); m = m.slice(1);
@ -19866,7 +19895,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
if (currentLabelInfo.pos === 0) { if (currentLabelInfo.pos === 0) {
if (["locator", "number", "locator-extra", "page"].indexOf(variable) > -1) { if (["locator", "number", "locator-extra", "page"].indexOf(variable) > -1) {
// Actually, shouldn't we do this always? // Actually, shouldn't we do this always?
if (!me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[currentLabelInfo.label])) { if ("undefined" === typeof me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[currentLabelInfo.label])) {
values[currentLabelInfo.pos].labelVisibility = true; values[currentLabelInfo.pos].labelVisibility = true;
} }
} }
@ -19922,7 +19951,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
fixNumericAndCount(values, groupStartPos, currentLabelInfo); fixNumericAndCount(values, groupStartPos, currentLabelInfo);
fixLabelVisibility(values, groupStartPos, currentLabelInfo); fixLabelVisibility(values, groupStartPos, currentLabelInfo);
if (values.length && values[0].numeric && variable.slice(0, 10) === "number-of-") { if (values.length && values[0].numeric && variable.slice(0, 10) === "number-of-") {
if (parseInt(ItemObject[variable], 10) > 1) { if (parseInt(ItemObject[realVariable], 10) > 1) {
values[0].plural = 1; values[0].plural = 1;
} }
} }
@ -19994,7 +20023,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
} }
function checkPage(variable, val) { function checkPage(variable, val) {
return variable === "page" return "page" === variable
|| (["locator", "locator-extra"].indexOf(variable) > -1 && (["p."].indexOf(val.label) > -1 || ["p."].indexOf(val.origLabel) > -1)); || (["locator", "locator-extra"].indexOf(variable) > -1 && (["p."].indexOf(val.label) > -1 || ["p."].indexOf(val.origLabel) > -1));
} }
@ -20074,7 +20103,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
if (!node) { if (!node) {
return; return;
} }
if (["page", "page-first", "chapter-number", "collection-number", "edition", "issue", "number", "number-of-pages", "number-of-volumes", "volume", "locator", "locator-extra"].indexOf(variable) === -1) { if (["page", "chapter-number", "collection-number", "edition", "issue", "number", "number-of-pages", "number-of-volumes", "volume", "locator", "locator-extra"].indexOf(variable) === -1) {
return; return;
} }
@ -20117,8 +20146,8 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
} }
} }
function setVariableParams(shadow_numbers, variable, values) { function setVariableParams(shadow_numbers, realVariable, values) {
var obj = shadow_numbers[variable]; var obj = shadow_numbers[realVariable];
if (values.length) { if (values.length) {
obj.numeric = values[0].numeric; obj.numeric = values[0].numeric;
obj.collapsible = values[0].collapsible; obj.collapsible = values[0].collapsible;
@ -20133,11 +20162,11 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
// Split out the labels and values. // Split out the labels and values.
// short-circuit if object exists: if numeric, set styling, no other action // short-circuit if object exists: if numeric, set styling, no other action
if (node && this.tmp.shadow_numbers[variable] && this.tmp.shadow_numbers[variable].values.length) { if (node && this.tmp.shadow_numbers[realVariable] && this.tmp.shadow_numbers[realVariable].values.length) {
var values = this.tmp.shadow_numbers[variable].values; var values = this.tmp.shadow_numbers[realVariable].values;
fixRanges(values); fixRanges(values);
//if (!this.tmp.shadow_numbers[variable].masterStyling && !this.tmp.just_looking) { //if (!this.tmp.shadow_numbers[variable].masterStyling && !this.tmp.just_looking) {
this.tmp.shadow_numbers[variable].masterStyling = setStyling(values); this.tmp.shadow_numbers[realVariable].masterStyling = setStyling(values);
//} //}
return; return;
} }
@ -20147,8 +20176,8 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
// This carries value, pluralization and numeric info for use in other contexts. // This carries value, pluralization and numeric info for use in other contexts.
// XXX We used to use one set of params for the entire variable value. // XXX We used to use one set of params for the entire variable value.
// XXX Now params are set on individual objects, of which there may be several after parsing. // XXX Now params are set on individual objects, of which there may be several after parsing.
if (!this.tmp.shadow_numbers[variable]) { if (!this.tmp.shadow_numbers[realVariable]) {
this.tmp.shadow_numbers[variable] = { this.tmp.shadow_numbers[realVariable] = {
values:[] values:[]
}; };
} }
@ -20165,10 +20194,10 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
var languageRole = CSL.LangPrefsMap[variable]; var languageRole = CSL.LangPrefsMap[variable];
if (languageRole) { if (languageRole) {
var localeType = this.opt["cite-lang-prefs"][languageRole][0]; var localeType = this.opt["cite-lang-prefs"][languageRole][0];
val = this.transform.getTextSubField(ItemObject, variable, "locale-"+localeType, true); val = this.transform.getTextSubField(ItemObject, realVariable, "locale-"+localeType, true);
val = val.name; val = val.name;
} else { } else {
val = ItemObject[variable]; val = ItemObject[realVariable];
} }
// XXX HOLDING THIS // XXX HOLDING THIS
@ -20211,7 +20240,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
} }
var defaultLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable]; var defaultLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable];
if (this.tmp.shadow_numbers[variable].values.length === 0) { if (this.tmp.shadow_numbers[realVariable].values.length === 0) {
// XXX // XXX
var values = parseString(val, defaultLabel); var values = parseString(val, defaultLabel);
@ -20224,20 +20253,20 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
for (var obj of values) { for (var obj of values) {
if (!obj.numeric) obj.plural = 0; if (!obj.numeric) obj.plural = 0;
} }
this.tmp.shadow_numbers[variable].values = values; this.tmp.shadow_numbers[realVariable].values = values;
// me.sys.print(JSON.stringify(values)) // me.sys.print(JSON.stringify(values))
if (node) { if (node) {
fixRanges(values); fixRanges(values);
this.tmp.shadow_numbers[variable].masterStyling = setStyling(values); this.tmp.shadow_numbers[realVariable].masterStyling = setStyling(values);
//print("setStyling(): "+JSON.stringify(values, null, 2)); // me.sys.print("setStyling(): "+JSON.stringify(values, null, 2));
} }
setVariableParams(this.tmp.shadow_numbers, variable, values); setVariableParams(this.tmp.shadow_numbers, realVariable, values);
} }
// hack in support for non-numeric numerics like "91 Civ. 5442 (RPP)|91 Civ. 5471" // hack in support for non-numeric numerics like "91 Civ. 5442 (RPP)|91 Civ. 5471"
var info = this.tmp.shadow_numbers[variable]; var info = this.tmp.shadow_numbers[realVariable];
if (variable === "number") { if (variable === "number") {
if (info.values.length === 1 && info.values[0].value.indexOf("|") > -1) { if (info.values.length === 1 && info.values[0].value.indexOf("|") > -1) {
info.values[0].value = info.values[0].value.replace(/\|/g, ", "); info.values[0].value = info.values[0].value.replace(/\|/g, ", ");
@ -21156,14 +21185,14 @@ CSL.Output.Formatters = (function () {
"<sup>": "</sup>" "<sup>": "</sup>"
}; };
function _capitalise (langArray, word) { function _capitalise (word) {
// Weird stuff is (.) transpiled with regexpu // Weird stuff is (.) transpiled with regexpu
// https://github.com/mathiasbynens/regexpu // https://github.com/mathiasbynens/regexpu
var m = word.match(/(^\s*)((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))(.*)/); var m = word.match(/(^\s*)((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))(.*)/);
// Do not uppercase lone Greek letters // Do not uppercase lone Greek letters
// (No case transforms in Greek citations, but chars used in titles to science papers) // (No case transforms in Greek citations, but chars used in titles to science papers)
if (m && !(m[2].match(/^[\u0370-\u03FF]$/) && !m[3])) { if (m && !(m[2].match(/^[\u0370-\u03FF]$/) && !m[3])) {
return m[1] + m[2].toLocaleUpperCase(langArray) + m[3]; return m[1] + CSL.toLocaleUpperCase.call(this, m[2]) + m[3];
} }
return word; return word;
} }
@ -21301,8 +21330,8 @@ CSL.Output.Formatters = (function () {
if (config.lastWordPos) { if (config.lastWordPos) {
var lastWords = wordDoppel.split(config.doppel.strings[config.lastWordPos.strings]); var lastWords = wordDoppel.split(config.doppel.strings[config.lastWordPos.strings]);
var lastWord = lastWords.strings[config.lastWordPos.words]; var lastWord = lastWords.strings[config.lastWordPos.words];
if (lastWord.length > 1 && lastWord.toLocaleLowerCase(config.lang_array).match(config.skipWordsRex)) { if (lastWord.length > 1 && CSL.toLocaleLowerCase.call(this, lastWord).match(config.skipWordsRex)) {
lastWord = _capitalise(config.lang_array, lastWord); lastWord = _capitalise.call(this, lastWord);
lastWords.strings[config.lastWordPos.words] = lastWord; lastWords.strings[config.lastWordPos.words] = lastWord;
} }
config.doppel.strings[config.lastWordPos.strings] = wordDoppel.join(lastWords); config.doppel.strings[config.lastWordPos.strings] = wordDoppel.join(lastWords);
@ -21334,7 +21363,7 @@ CSL.Output.Formatters = (function () {
for (var i=0,ilen=words.length;i<ilen;i++) { for (var i=0,ilen=words.length;i<ilen;i++) {
var word = words[i]; var word = words[i];
if (word) { if (word) {
words[i] = word.toLocaleLowerCase(state.tmp.lang_array); words[i] = CSL.toLocaleLowerCase.call(state, word);
} }
} }
return words.join(" "); return words.join(" ");
@ -21344,7 +21373,7 @@ CSL.Output.Formatters = (function () {
afterPunct: null, afterPunct: null,
isFirst: null isFirst: null
}; };
return _textcaseEngine(config, string); return _textcaseEngine.call(state, config, string);
} }
/** /**
@ -21366,7 +21395,7 @@ CSL.Output.Formatters = (function () {
// 1. Field language tag, if any // 1. Field language tag, if any
// 2. Item language tag, if any // 2. Item language tag, if any
// 3. Value of state.opt.lang // 3. Value of state.opt.lang
words[i] = word.toLocaleUpperCase(state.tmp.lang_array); words[i] = CSL.toLocaleUpperCase.call(state, word);
} }
} }
return words.join(" "); return words.join(" ");
@ -21376,7 +21405,7 @@ CSL.Output.Formatters = (function () {
afterPunct: null, afterPunct: null,
isFirst: null isFirst: null
}; };
return _textcaseEngine(config, string); return _textcaseEngine.call(state, config, string);
} }
/** /**
@ -21385,7 +21414,6 @@ CSL.Output.Formatters = (function () {
*/ */
function sentence(state, string) { function sentence(state, string) {
var config = { var config = {
langArray: state.tmp.lang_array,
quoteState: [], quoteState: [],
capitaliseWords: function(str) { capitaliseWords: function(str) {
var words = str.split(" "); var words = str.split(" ");
@ -21393,10 +21421,10 @@ CSL.Output.Formatters = (function () {
var word = words[i]; var word = words[i];
if (word) { if (word) {
if (config.isFirst) { if (config.isFirst) {
words[i] = _capitalise(state.tmp.lang_array, word); words[i] = _capitalise.call(state, word);
config.isFirst = false; config.isFirst = false;
} else { } else {
words[i] = word.toLocaleLowerCase(state.tmp.lang_array); words[i] = CSL.toLocaleLowerCase.call(state, word);
} }
} }
} }
@ -21407,12 +21435,11 @@ CSL.Output.Formatters = (function () {
afterPunct: null, afterPunct: null,
isFirst: true isFirst: true
}; };
return _textcaseEngine(config, string); return _textcaseEngine.call(state, config, string);
} }
function title(state, string) { function title(state, string) {
var config = { var config = {
langArray: state.tmp.lang_array,
quoteState: [], quoteState: [],
capitaliseWords: function(str, i, followingTag) { capitaliseWords: function(str, i, followingTag) {
if (str.trim()) { if (str.trim()) {
@ -21424,17 +21451,17 @@ CSL.Output.Formatters = (function () {
if (!word) { if (!word) {
continue; continue;
} }
if (word.length > 1 && !word.toLocaleLowerCase(state.tmp.lang_array).match(config.skipWordsRex)) { if (word.length > 1 && !CSL.toLocaleLowerCase.call(state, word).match(config.skipWordsRex)) {
// Capitalize every word that is not a stop-word // Capitalize every word that is not a stop-word
words[j] = _capitalise(state.tmp.lang_array, words[j]); words[j] = _capitalise.call(state, words[j]);
} else if (j === (words.length - 1) && followingTag === "-") { } else if (j === (words.length - 1) && followingTag === "-") {
words[j] = _capitalise(state.tmp.lang_array, words[j]); words[j] = _capitalise.call(state, words[j]);
} else if (config.isFirst) { } else if (config.isFirst) {
// Capitalize first word, even if a stop-word // Capitalize first word, even if a stop-word
words[j] = _capitalise(state.tmp.lang_array, words[j]); words[j] = _capitalise.call(state, words[j]);
} else if (config.afterPunct) { } else if (config.afterPunct) {
// Capitalize after punctuation // Capitalize after punctuation
words[j] = _capitalise(state.tmp.lang_array, words[j]); words[j] = _capitalise.call(state, words[j]);
} }
config.afterPunct = false; config.afterPunct = false;
config.isFirst = false; config.isFirst = false;
@ -21452,7 +21479,7 @@ CSL.Output.Formatters = (function () {
afterPunct: false, afterPunct: false,
isFirst: true isFirst: true
}; };
return _textcaseEngine(config, string); return _textcaseEngine.call(state, config, string);
} }
@ -21462,7 +21489,6 @@ CSL.Output.Formatters = (function () {
*/ */
function capitalizeFirst(state, string) { function capitalizeFirst(state, string) {
var config = { var config = {
langArray: state.tmp.lang_array,
quoteState: [], quoteState: [],
capitaliseWords: function(str) { capitaliseWords: function(str) {
var words = str.split(" "); var words = str.split(" ");
@ -21470,7 +21496,7 @@ CSL.Output.Formatters = (function () {
var word = words[i]; var word = words[i];
if (word) { if (word) {
if (config.isFirst) { if (config.isFirst) {
words[i] = _capitalise(state.tmp.lang_array, word); words[i] = _capitalise.call(state, word);
config.isFirst = false; config.isFirst = false;
break; break;
} }
@ -21483,7 +21509,7 @@ CSL.Output.Formatters = (function () {
afterPunct: null, afterPunct: null,
isFirst: true isFirst: true
}; };
return _textcaseEngine(config, string); return _textcaseEngine.call(state, config, string);
} }
/** /**
@ -21494,14 +21520,13 @@ CSL.Output.Formatters = (function () {
*/ */
function capitalizeAll (state, string) { function capitalizeAll (state, string) {
var config = { var config = {
langArray: state.tmp.lang_array,
quoteState: [], quoteState: [],
capitaliseWords: function(str) { capitaliseWords: function(str) {
var words = str.split(" "); var words = str.split(" ");
for (var i=0,ilen=words.length;i<ilen;i++) { for (var i=0,ilen=words.length;i<ilen;i++) {
var word = words[i]; var word = words[i];
if (word) { if (word) {
words[i] = _capitalise(state.tmp.lang_array, word); words[i] = _capitalise.call(state, word);
} }
} }
return words.join(" "); return words.join(" ");
@ -21511,7 +21536,7 @@ CSL.Output.Formatters = (function () {
afterPunct: null, afterPunct: null,
isFirst: null isFirst: null
}; };
return _textcaseEngine(config, string); return _textcaseEngine.call(state, config, string);
} }
return { return {
passthrough: passthrough, passthrough: passthrough,
@ -22461,9 +22486,11 @@ CSL.Registry.prototype.dodeletes = function (myhash) {
if (this.registry[key].siblings) { if (this.registry[key].siblings) {
if (this.registry[key].siblings.length == 1) { if (this.registry[key].siblings.length == 1) {
var loneSiblingID = this.registry[key].siblings[0]; var loneSiblingID = this.registry[key].siblings[0];
this.registry[loneSiblingID].master = true; if (this.registry[loneSiblingID].siblings) {
this.registry[loneSiblingID].siblings.pop(); this.registry[loneSiblingID].siblings.pop();
this.registry[loneSiblingID].parallel = false; this.registry[loneSiblingID].master = true;
this.registry[loneSiblingID].parallel = false;
}
} else if (this.registry[key].siblings.length > 1) { } else if (this.registry[key].siblings.length > 1) {
var removeIDs = [key]; var removeIDs = [key];
if (this.registry[key].master) { if (this.registry[key].master) {
@ -22845,7 +22872,7 @@ CSL.Registry.prototype.sorttokens = function (nosort) {
*/ */
CSL.Registry.Comparifier = function (state, keyset) { CSL.Registry.Comparifier = function (state, keyset) {
var sort_directions, len, pos, compareKeys; var sort_directions, len, pos, compareKeys;
var sortCompare = CSL.getSortCompare(state.opt["default-locale-sort"]); var sortCompare = CSL.getSortCompare.call(state, state.opt["default-locale-sort"]);
sort_directions = state[keyset].opt.sort_directions; sort_directions = state[keyset].opt.sort_directions;
this.compareKeys = function (a, b) { this.compareKeys = function (a, b) {
len = a.sortkeys ? a.sortkeys.length : 0; len = a.sortkeys ? a.sortkeys.length : 0;