diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js index 64c80f734..cd48720a1 100644 --- a/chrome/content/zotero/xpcom/citeproc.js +++ b/chrome/content/zotero/xpcom/citeproc.js @@ -126,7 +126,7 @@ var CSL = { MARK_TRAILING_NAMES: true, POSITION_TEST_VARS: ["position", "first-reference-note-number", "near-note"], AREAS: ["citation", "citation_sort", "bibliography", "bibliography_sort"], - MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","edition","genre","title-short","subjurisdiction","medium"], + MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","edition","genre","title-short","medium","jurisdiction"], CITE_FIELDS: ["first-reference-note-number", "locator", "locator-revision"], MINIMAL_NAME_FIELDS: ["literal", "family"], SWAPPING_PUNCTUATION: [".", "!", "?", ":",","], @@ -1061,9 +1061,6 @@ CSL.Output.Queue.prototype.append = function (str, tokname, notSerious, ignorePr curr = this.current.value(); } if ("string" === typeof blob.blobs) { - if (this.state.tmp.strip_periods && !noStripPeriods) { - blob.blobs = blob.blobs.replace(/\./g, ""); - } if (!ignorePredecessor) { this.state.tmp.term_predecessor = true; } @@ -1076,6 +1073,9 @@ CSL.Output.Queue.prototype.append = function (str, tokname, notSerious, ignorePr if (blob.strings["text-case"]) { blob.blobs = CSL.Output.Formatters[blob.strings["text-case"]](this.state, str); } + if (this.state.tmp.strip_periods && !noStripPeriods) { + blob.blobs = blob.blobs.replace(/\./g, ""); + } this.state.fun.flipflopper.init(str, blob); this.state.fun.flipflopper.processTags(); } else if (useblob) { @@ -1276,6 +1276,9 @@ CSL.Output.Queue.prototype.renderBlobs = function (blobs, delim, has_more) { if (blob.strings["text-case"]) { str = CSL.Output.Formatters[blob.strings["text-case"]](this.state, str); } + if (str && this.state.tmp.strip_periods && !noStripPeriods) { + str = str.replace(/\./g, ""); + } if (!state.tmp.suppress_decorations) { llen = blob.decorations.length; for (ppos = 0; ppos < llen; ppos += 1) { @@ -2153,7 +2156,7 @@ CSL.DateParser = function () { }; CSL.Engine = function (sys, style, lang, forceLang) { var attrs, langspec, localexml, locale; - this.processor_version = "1.0.298"; + this.processor_version = "1.0.301"; this.csl_version = "1.0"; this.sys = sys; this.sys.xml = new CSL.System.Xml.Parsing(); @@ -2473,6 +2476,14 @@ CSL.Engine.prototype.retrieveItem = function (id) { Item.volume = Item.number; Item.number = undefined; } + if (Item.page) { + Item["page-first"] = Item.page; + var num = "" + Item.page; + m = num.split(/\s*(?:&|,|-)\s*/); + if (m[0].slice(-1) !== "\\") { + Item["page-first"] = m[0]; + } + } if (this.opt.development_extensions.field_hack && Item.note) { m = Item.note.match(CSL.NOTE_FIELDS_REGEXP); if (m) { @@ -2498,12 +2509,6 @@ CSL.Engine.prototype.retrieveItem = function (id) { } } } - if (this.opt.development_extensions.jurisdiction_subfield && Item.jurisdiction) { - var subjurisdictions = Item.jurisdiction.split(";"); - if (subjurisdictions.length > 1) { - Item.subjurisdiction = subjurisdictions.join(";"); - } - } for (var i = 1, ilen = CSL.DATE_VARIABLES.length; i < ilen; i += 1) { var dateobj = Item[CSL.DATE_VARIABLES[i]]; if (dateobj) { @@ -4720,7 +4725,11 @@ CSL.Node.group = { if (state.tmp.group_context.mystack.length) { state.output.current.value().parent = state.tmp.group_context.value()[4]; } - state.tmp.group_context.push([false, false, false, false, state.output.current.value()], CSL.LITERAL); + var label_form = state.tmp.group_context.value()[5]; + if (this.strings.label_form_override) { + label_form = this.strings.label_form_override; + } + state.tmp.group_context.push([false, false, false, false, state.output.current.value(), label_form], CSL.LITERAL); if (this.strings.oops) { state.tmp.group_context.value()[3] = this.strings.oops; } @@ -6853,7 +6862,11 @@ CSL.evaluateStringPluralism = function (str) { return 0; }; CSL.castLabel = function (state, node, term, plural, mode) { - var ret = state.getTerm(term, node.strings.form, plural, false, mode); + var label_form = node.strings.form; + if (state.tmp.group_context.value()[5]) { + label_form = state.tmp.group_context.value()[5]; + } + var ret = state.getTerm(term, label_form, plural, false, mode); if (state.tmp.strip_periods) { ret = ret.replace(/\./g, ""); } else { @@ -7285,9 +7298,6 @@ CSL.Node.number = { varname = this.variables[0]; state.parallel.StartVariable(this.variables[0]); state.parallel.AppendToVariable(Item[this.variables[0]]); - if (varname === "page-range" || varname === "page-first") { - varname = "page"; - } var node = this; if (!state.tmp.shadow_numbers[varname] || (state.tmp.shadow_numbers[varname].values.length @@ -7567,14 +7577,9 @@ CSL.Node.text = { } else if (this.variables_real[0] === "page-first") { func = function (state, Item) { var idx, value; - value = state.getVariable(Item, "page", form); + value = state.getVariable(Item, "page-first", form); if (value) { - value = ""+value; - value = value.replace("\u2013", "-", "g"); - idx = value.indexOf("-"); - if (idx > -1) { - value = value.slice(0, idx); - } + value = value.replace("\\", ""); state.output.append(value, this, false, false, true); } }; @@ -7691,9 +7696,30 @@ CSL.Node.text = { } }; CSL.Attributes = {}; +CSL.Attributes["@subjurisdictions"] = function (state, arg) { + var trysubjurisdictions = parseInt(arg, 10); + var func = function (state, Item, item) { + var subjurisdictions = 0; + if (Item.jurisdiction) { + var subjurisdictions = Item.jurisdiction.split(";").length; + } + if (subjurisdictions) { + subjurisdictions += -1; + } + var ret = false; + if (subjurisdictions >= trysubjurisdictions) { + ret = true; + } + return [ret]; + }; + this.tests.push(func); +} +CSL.Attributes["@label-form"] = function (state, arg) { + this.strings.label_form_override = arg; +} CSL.Attributes["@has-year-only"] = function (state, arg) { - trydates = arg.split(/\s+/); - func = function (state, Item, item) { + var trydates = arg.split(/\s+/); + var func = function (state, Item, item) { var ret = []; for (var i = 0, ilen = trydates.length; i < ilen; i += 1) { var trydate = Item[trydates[i]]; @@ -7708,8 +7734,8 @@ CSL.Attributes["@has-year-only"] = function (state, arg) { this.tests.push(func); } CSL.Attributes["@has-month-or-season-only"] = function (state, arg) { - trydates = arg.split(/\s+/); - func = function (state, Item, item) { + var trydates = arg.split(/\s+/); + var func = function (state, Item, item) { var ret = []; for (var i = 0, ilen = trydates.length; i < ilen; i += 1) { var trydate = Item[trydates[i]]; @@ -7724,8 +7750,8 @@ CSL.Attributes["@has-month-or-season-only"] = function (state, arg) { this.tests.push(func); } CSL.Attributes["@has-day-only"] = function (state, arg) { - trydates = arg.split(/\s+/); - func = function (state, Item, item) { + var trydates = arg.split(/\s+/); + var func = function (state, Item, item) { var ret = []; for (var i = 0, ilen = trydates.length; i < ilen; i += 1) { var trydate = Item[trydates[i]]; @@ -7849,9 +7875,6 @@ CSL.Attributes["@variable"] = function (state, arg) { len = this.variables.length; for (pos = 0; pos < len; pos += 1) { variable = this.variables[pos]; - if (variable === "page-first") { - variable = "page"; - } if (variable === "authority" && "string" === typeof Item[variable] && "names" === this.name) { @@ -8407,7 +8430,9 @@ CSL.Attributes["@text-case"] = function (state, arg) { if (arg === "title") { var m = false; var default_locale = state.opt["default-locale"][0].slice(0, 2); - if (Item.language) { + if (Item.jurisdiction) { + this.strings["text-case"] = "passthrough"; + } else if (Item.language) { m = Item.language.match(/^\s*([A-Za-z]{2})(?:$|-| )/); if (!m) { this.strings["text-case"] = "passthrough"; @@ -8634,7 +8659,7 @@ CSL.Transform = function (state) { if (!myabbrev_family) { return basevalue; } - if (["publisher-place", "event-place", "subjurisdiction"].indexOf(myabbrev_family) > -1) { + if (["publisher-place", "event-place", "jurisdiction"].indexOf(myabbrev_family) > -1) { myabbrev_family = "place"; } if (["publisher", "authority"].indexOf(myabbrev_family) > -1) { @@ -8820,11 +8845,14 @@ CSL.Transform = function (state) { if (myabbrev_family) { primary = abbreviate(state, Item, alternative_varname, primary, myabbrev_family, true); if (primary) { - var m = primary.match(/^!([-_a-z]+)<< -1 || num.indexOf("--") > -1) { this.tmp.shadow_numbers[variable].plural = 1; } - if (this.variable === "page-first") { - m = num.split(/\s*(?:&|,|-)\s*/); - if (m) { - num = m[0]; - if (num.match(/[0-9]/)) { - this.tmp.shadow_numbers[variable].numeric = true; - } - } - } var lst = num.split(/(?:,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/); var m = num.match(/(,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/g); var elements = [];