diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js
index 68542f58f0..86e48fd0ca 100644
--- a/chrome/content/zotero/xpcom/citeproc.js
+++ b/chrome/content/zotero/xpcom/citeproc.js
@@ -702,8 +702,8 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
if (blob && blob.new_locale) {
state.opt.lang = blob.new_locale;
}
- for (pos = 0, len = blobs.length; pos < len; pos += 1) {
- blobjr = blobs[pos];
+ for (var i = 0, ilen = blobs.length; i < ilen; i += 1) {
+ blobjr = blobs[i];
if ("string" === typeof blobjr.blobs) {
if ("number" === typeof blobjr.num) {
ret.push(blobjr);
@@ -713,8 +713,11 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
use_prefix = blobjr.strings.prefix;
if (!state.tmp.suppress_decorations) {
llen = blobjr.decorations.length;
- for (ppos = 0; ppos < llen; ppos += 1) {
- params = blobjr.decorations[ppos];
+ for (j = 0, jlen = blobjr.decorations.length; j < jlen; j += 1) {
+ params = blobjr.decorations[j];
+ if (CSL.normalDecorIsOrphan(blobjr, params)) {
+ continue;
+ }
b = state.fun.decorate[params[0]][params[1]](state, b);
}
}
@@ -774,6 +777,9 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
if (["@bibliography", "@display"].indexOf(params[0]) === -1) {
continue;
}
+ if (CSL.normalDecorIsOrphan(blobs_start, params)) {
+ continue;
+ }
blobs_start = state.fun.decorate[params[0]][params[1]].call(blob, state, blobs_start);
}
}
@@ -857,6 +863,9 @@ CSL.Output.Queue.prototype.renderBlobs = function (blobs, delim) {
llen = blob.decorations.length;
for (ppos = 0; ppos < llen; ppos += 1) {
params = blob.decorations[ppos];
+ if (CSL.normalDecorIsOrphan(blob, params)) {
+ continue;
+ }
str = state.fun.decorate[params[0]][params[1]](state, str);
}
}
@@ -1257,6 +1266,24 @@ CSL.setDecorations = function (state, attributes) {
}
return ret;
};
+CSL.normalDecorIsOrphan = function (blob, params) {
+ if (params[1] === "normal") {
+ var use_param = false;
+ for (var k = blob.alldecor.length - 1; k > -1; k += -1) {
+ for (var n = blob.alldecor[k].length - 1; n > -1; n += -1) {
+ if (blob.alldecor[k][n][0] === params[0]) {
+ if (blob.alldecor[k][n][1] !== "normal") {
+ use_param = true;
+ }
+ }
+ }
+ }
+ if (!use_param) {
+ return true;
+ }
+ }
+ return false;
+};
CSL.compareAmbigConfig = function(a, b) {
var ret, pos, len, ppos, llen;
if (a.names.length !== b.names.length) {
@@ -1277,42 +1304,40 @@ CSL.compareAmbigConfig = function(a, b) {
return 0;
};
CSL.cloneAmbigConfig = function (config, oldconfig, tainters) {
- var ret, param, pos, ppos, len, llen;
- ret = {};
+ var ret = {};
ret.names = [];
ret.givens = [];
ret.year_suffix = false;
ret.disambiguate = false;
- for (pos = 0, len = config.names.length; pos < len; pos += 1) {
- param = config.names[pos];
- if (oldconfig && (!oldconfig.names[pos] || oldconfig.names[pos] !== param)) {
- for (ppos = 0, llen = tainters.length; ppos < llen; ppos += 1) {
- this.tmp.taintedItemIDs[tainters[ppos].id] = true;
+ for (var i = 0, ilen = config.names.length; i < ilen; i += 1) {
+ var param = config.names[i];
+ if (oldconfig && (!oldconfig.names[i] || oldconfig.names[i] !== param)) {
+ for (var j = 0, jlen = tainters.length; j < jlen; j += 1) {
+ this.tmp.taintedItemIDs[tainters[j].id] = true;
}
oldconfig = false;
}
- ret.names[pos] = param;
+ ret.names[i] = param;
}
- for (pos = 0, len = config.givens.length; pos < len; pos += 1) {
- param = [];
- llen = config.givens[pos].length;
- for (ppos = 0; ppos < llen; ppos += 1) {
- if (oldconfig && oldconfig.givens[pos][ppos] !== config.givens[pos][ppos]) {
- for (ppos = 0, llen = tainters.length; ppos < llen; ppos += 1) {
- this.tmp.taintedItemIDs[tainters[ppos].id] = true;
+ for (var i = 0, ilen = config.givens.length; i < ilen; i += 1) {
+ var param = [];
+ for (var j = 0, jlen = config.givens[i].length; j < jlen; j += 1) {
+ if (oldconfig && oldconfig.givens[i][j] !== config.givens[i][j]) {
+ for (var k = 0, klen = tainters.length; k < klen; k += 1) {
+ this.tmp.taintedItemIDs[tainters[k].id] = true;
}
oldconfig = false;
}
- param.push(config.givens[pos][ppos]);
+ param.push(config.givens[i][j]);
}
ret.givens.push(param);
}
if (tainters && tainters.length > 1) {
if (tainters.length == 2 || (oldconfig && oldconfig.year_suffix !== config.year_suffix)) {
- for (pos = 0, len = tainters.length; pos < len; pos += 1) {
- var oldYS = this.registry.registry[tainters[pos].id].disambig.year_suffix;
- if (tainters && (false === oldYS || oldYS != pos)) {
- this.tmp.taintedItemIDs[tainters[pos].id] = true;
+ for (var i = 0, ilen = tainters.length; i < ilen; i += 1) {
+ var oldYS = this.registry.registry[tainters[i].id].disambig.year_suffix;
+ if (tainters && (false === oldYS || oldYS != i)) {
+ this.tmp.taintedItemIDs[tainters[i].id] = true;
}
}
oldconfig = false;
@@ -1781,7 +1806,7 @@ CSL.DateParser = function (txt) {
};
CSL.Engine = function (sys, style, lang, forceLang) {
var attrs, langspec, localexml, locale;
- this.processor_version = "1.0.148";
+ this.processor_version = "1.0.150";
this.csl_version = "1.0";
this.sys = sys;
this.sys.xml = new CSL.System.Xml.Parsing();
@@ -2995,21 +3020,20 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) {
return str;
};
CSL.getAmbiguousCite = function (Item, disambig) {
- var use_parallels, ret;
if (disambig) {
this.tmp.disambig_request = disambig;
} else {
this.tmp.disambig_request = false;
}
this.tmp.area = "citation";
- use_parallels = this.parallel.use_parallels;
+ var use_parallels = this.parallel.use_parallels;
this.parallel.use_parallels = false;
this.tmp.suppress_decorations = true;
this.tmp.just_looking = true;
CSL.getCite.call(this, Item, {position: 1});
CSL.Output.Queue.purgeEmptyBlobs(this.output.queue);
CSL.Output.Queue.adjustPunctuation(this, this.output.queue);
- ret = this.output.string(this, this.output.queue);
+ var ret = this.output.string(this, this.output.queue);
this.tmp.just_looking = false;
this.tmp.suppress_decorations = false;
this.parallel.use_parallels = use_parallels;
@@ -3177,6 +3201,9 @@ CSL.getCitationCluster = function (inputList, citationID) {
len = this.citation.opt.layout_decorations.length;
for (pos = 0; pos < len; pos += 1) {
params = this.citation.opt.layout_decorations[pos];
+ if (params[1] === "normal") {
+ continue;
+ }
result = this.fun.decorate[params[0]][params[1]](this, result);
}
}
@@ -7960,7 +7987,7 @@ CSL.Util.FlipFlopper = function (state) {
var tagdefs, pos, len, p, entry, allTags, ret, def, esc, makeHashes, closeTags, flipTags, openToClose, openToDecorations, okReverse, hashes, allTagsLst, lst;
this.state = state;
this.blob = false;
- this.quotechars = ["'", '"'];
+ this.quotechars = ['"', "'"];
tagdefs = [
["", "", "italics", "@font-style", ["italic", "normal","normal"], true],
["", "", "bold", "@font-weight", ["bold", "normal","normal"], true],
@@ -8053,6 +8080,7 @@ CSL.Util.FlipFlopper = function (state) {
};
CSL.Util.FlipFlopper.prototype.init = function (str, blob) {
this.txt_esc = CSL.getSafeEscape(this.state.opt.mode, this.state.tmp.area);
+ str = this._normalizeString(str);
if (!blob) {
this.strs = this.getSplitStrings(str);
this.blob = new CSL.Blob();
@@ -8063,6 +8091,13 @@ CSL.Util.FlipFlopper.prototype.init = function (str, blob) {
}
this.blobstack = new CSL.Stack(this.blob);
};
+CSL.Util.FlipFlopper.prototype._normalizeString = function (str) {
+ for (var i = 0, ilen = 2; i < ilen; i += 1) {
+ str = str.replace(this.quotechars[i + 2], this.quotechars[0]);
+ str = str.replace(this.quotechars[i + 4], this.quotechars[1]);
+ }
+ return str;
+};
CSL.Util.FlipFlopper.prototype.getSplitStrings = function (str) {
var strs, pos, len, newstr, head, tail, expected_closers, expected_openers, expected_flips, tagstack, badTagStack, posA, sameAsOpen, openRev, flipRev, tag, ibeenrunned, posB, wanted_closer, posC, sep, resplice, params, lenA, lenB, lenC, badTagPos, mx, myret;
mx = str.match(this.allTagsRexMatch);
@@ -8541,12 +8576,12 @@ CSL.Output.Formats.prototype.rtf = {
"@passthrough/true": CSL.Output.Formatters.passthrough,
"@strip-periods/true": CSL.Output.Formatters.strip_periods,
"@font-style/italic":"\\i %%STRING%%\\i0{}",
- "@font-style/normal":false,
+ "@font-style/normal":"\\i0{}%STRING%%\\i{}",
"@font-style/oblique":"\\i %%STRING%%\\i0{}",
"@font-variant/small-caps":"\\scaps %%STRING%%\\scaps0{}",
- "@font-variant/normal":false,
+ "@font-variant/normal":"\\scaps0{}%%STRING%%\\scaps{}",
"@font-weight/bold":"\\b %%STRING%%\\b0{}",
- "@font-weight/normal":false,
+ "@font-weight/normal":"\\b0{}%STRING%%\\b{}",
"@font-weight/light":false,
"@text-decoration/none":false,
"@text-decoration/underline":"\\ul %%STRING%%\\ul0{}",
@@ -8595,6 +8630,7 @@ CSL.Registry = function (state) {
this.reflist = [];
this.namereg = new CSL.Registry.NameReg(state);
this.citationreg = new CSL.Registry.CitationReg(state);
+ this.cache = {};
this.mylist = [];
this.myhash = {};
this.deletes = [];
@@ -9186,16 +9222,22 @@ CSL.Disambiguation.prototype.evalScan = function (ismax) {
};
CSL.Disambiguation.prototype.disNames = function (ismax) {
var pos, len;
- if (this.clashes[1] === 0) {
+ if (this.clashes[1] === 0 && this.nonpartners.length === 1) {
mybase = CSL.cloneAmbigConfig(this.base);
mybase.year_suffix = false;
this.state.registry.registerAmbigToken(this.akey, "" + this.partners[0].id, mybase);
- if (this.nonpartners.length === 1) {
- this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.base);
- this.lists[this.listpos] = [this.base,[]];
- } else {
- this.lists[this.listpos] = [this.base, this.nonpartners];
- }
+ this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.base);
+ this.lists[this.listpos] = [this.base, []];
+ } else if (this.clashes[1] === 0) {
+ mybase = CSL.cloneAmbigConfig(this.base);
+ mybase.year_suffix = false;
+ this.state.registry.registerAmbigToken(this.akey, "" + this.partners[0].id, mybase);
+ this.lists[this.listpos] = [this.base, this.nonpartners];
+ } else if (this.nonpartners.length === 1) {
+ mybase = CSL.cloneAmbigConfig(this.base);
+ mybase.year_suffix = false;
+ this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.base);
+ this.lists[this.listpos] = [this.base, this.partners];
} else if (this.clashes[1] < this.clashes[0]) {
this.lists[this.listpos] = [this.base, this.partners];
if (this.nonpartners.length === 1) {
@@ -9218,19 +9260,31 @@ CSL.Disambiguation.prototype.disNames = function (ismax) {
};
CSL.Disambiguation.prototype.disGivens = function (ismax) {
var pos, len;
- if (this.clashes[1] === 0) {
+ if (this.clashes[1] === 0 && this.nonpartners.length === 1) {
if (this.clashes[0] === 1) {
this.base = this.decrementNames();
}
mybase = CSL.cloneAmbigConfig(this.base);
mybase.year_suffix = false;
this.state.registry.registerAmbigToken(this.akey, "" + this.partners[0].id, mybase);
- if (this.nonpartners.length === 1) {
- this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.base);
- this.lists[this.listpos] = [this.base,[]];
- } else {
- this.lists[this.listpos] = [this.base, this.nonpartners];
+ this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.base);
+ this.lists[this.listpos] = [this.base, []];
+ } else if (this.clashes[1] === 0) {
+ if (this.clashes[0] === 1) {
+ this.base = this.decrementNames();
}
+ mybase = CSL.cloneAmbigConfig(this.base);
+ mybase.year_suffix = false;
+ this.state.registry.registerAmbigToken(this.akey, "" + this.partners[0].id, mybase);
+ this.lists[this.listpos] = [this.base, this.nonpartners];
+ } else if (this.nonpartners.length === 1) {
+ if (this.clashes[0] === 1) {
+ this.base = this.decrementNames();
+ }
+ mybase = CSL.cloneAmbigConfig(this.base);
+ mybase.year_suffix = false;
+ this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.base);
+ this.lists[this.listpos] = [this.base, this.partners];
} else if (this.clashes[1] < this.clashes[0]) {
this.lists[this.listpos] = [this.base, this.partners];
if (this.nonpartners.length === 1) {