commit 903d37c434c5da8cb807456e616d6a7f79182fd7
parent 05583b199220a7eab41f2af209c969f61029ec3b
Author: Simon Kornblith <simon@simonster.com>
Date: Mon, 28 Jun 2010 02:47:46 +0000
update to citeproc-js 1.0.37
From Frank's announcement:
Quash duplicate terminal punctuation at the end of citations.
This can happen where an abbreviated term such as id. or
ibid. is rendered at the end of a citation in a note style,
in which the note is terminated with a period.
Eliminate implicit for loops in array constructs, which is
sadly not available in Chromium JS engine.
Diffstat:
1 file changed, 36 insertions(+), 14 deletions(-)
diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js
@@ -92,7 +92,7 @@ var CSL = {
CITE_FIELDS: ["first-reference-note-number", "locator"],
MINIMAL_NAME_FIELDS: ["literal", "family"],
SWAPPING_PUNCTUATION: [".", ",", ";", ":"],
- TERMINAL_PUNCTUATION: [".", "!", "?", ":", "X", "Y"],
+ TERMINAL_PUNCTUATION: [".", "!", "?", ":"],
NONE: 0,
NUMERIC: 1,
POSITION: 2,
@@ -898,6 +898,25 @@ CSL.Output.Queue.appendPunctuationToSuffix = function (predecessor, punct) {
}
}
};
+CSL.Output.Queue.quashDuplicateFinalPunctuation = function (myblobs, chr) {
+ if ("string" === typeof myblobs) {
+ if (chr === myblobs.slice(-1)) {
+ return myblobs.slice(0, -1);
+ } else {
+ return myblobs;
+ }
+ } else if (myblobs.length) {
+ var lastblob = myblobs.slice(-1)[0];
+ if (lastblob.strings.suffix && chr === lastblob.strings.suffix.slice(-1)) {
+ lastblob.strings.suffix = lastblob.strings.suffix.slice(0, -1);
+ } else if ("object" === typeof lastblob.blobs) {
+ return CSL.Output.Queue.quashDuplicateFinalPunctuation(lastblob.blobs, chr);
+ } else if ("string" === typeof lastblob.blobs) {
+ lastblob.blobs = CSL.Output.Queue.quashDuplicateFinalPunctuation(lastblob.blobs, chr);
+ }
+ }
+ return false;
+}
CSL.localeResolve = function (langstr) {
var ret, langlst;
ret = {};
@@ -1468,7 +1487,7 @@ CSL.dateParser = function (txt) {
};
CSL.Engine = function (sys, style, lang, xmlmode) {
var attrs, langspec, localexml, locale;
- this.processor_version = "1.0.36";
+ this.processor_version = "1.0.37";
this.csl_version = "1.0";
this.sys = sys;
this.sys.xml = new CSL.System.Xml.Parsing();
@@ -2282,7 +2301,7 @@ CSL.Engine.prototype.appendCitationCluster = function (citation) {
return this.processCitationCluster(citation, citationsPre, [], CSL.ASSUME_ALL_ITEMS_REGISTERED);
};
CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, citationsPost, flag) {
- var sortedItems, new_citation, pos, len, item, citationByIndex, c, Item, newitem, k, textCitations, noteCitations, update_items, citations, first_ref, last_ref, ipos, ilen, cpos, onecitation, oldvalue, ibidme, suprame, useme, items, i, key, prev_locator, curr_locator, param, ret, obj, ppos, llen, lllen, pppos, ppppos, llllen, cids, note_distance, return_data, lostItemId, lostItemList, lostItemData, otherLostPkeys, disambig;
+ var sortedItems, new_citation, pos, len, item, citationByIndex, c, Item, newitem, k, textCitations, noteCitations, update_items, citations, first_ref, last_ref, ipos, ilen, cpos, onecitation, oldvalue, ibidme, suprame, useme, items, i, key, prev_locator, curr_locator, param, ret, obj, ppos, llen, lllen, pppos, ppppos, llllen, cids, note_distance, return_data, lostItemId, lostItemList, lostItemData, otherLostPkeys, disambig, oldItemIds;
this.debug = false;
return_data = {"bibchange": false};
this.registry.return_data = return_data;
@@ -2499,11 +2518,9 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
for (key in this.tmp.taintedItemIDs) {
if (this.tmp.taintedItemIDs.hasOwnProperty(key)) {
citations = this.registry.citationreg.citationsByItemId[key];
- if (citations) {
for (pos = 0, len = citations.length; pos < len; pos += 1) {
this.tmp.taintedCitationIDs[citations[pos].citationID] = true;
}
- }
}
}
ret = [];
@@ -2514,7 +2531,11 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
for (pos = 0, len = oldCitationList.length; pos < len; pos += 1) {
this.registry.citationreg.citationById[oldCitationList[pos].citationID] = oldCitationList[pos];
}
- this.updateItems([oldItemList[pos].id for (pos in oldItemList)]);
+ oldItemIds = [];
+ for (pos = 0, len = oldItemList.length; pos < len; pos += 1) {
+ oldItemIds.push(oldItemList[pos].id);
+ }
+ this.updateItems(oldItemIds);
for (key in oldAmbigs) {
this.registry.registry[key].disambig = oldAmbigs[key];
}
@@ -2526,11 +2547,9 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
}
obj = [];
citation = this.registry.citationreg.citationById[key];
- if (citation) {
obj.push(citation.properties.index);
obj.push(this.process_CitationCluster.call(this, citation.sortedItems));
ret.push(obj);
- }
}
}
this.tmp.taintedItemIDs = false;
@@ -2644,8 +2663,10 @@ CSL.getCitationCluster = function (inputList, citationID) {
this.parallel.PruneOutputQueue(this);
empties = 0;
myblobs = this.output.queue.slice();
- len = myblobs.length;
- for (pos = 0; pos < len; pos += 1) {
+ if (CSL.TERMINAL_PUNCTUATION.indexOf(this.citation.opt.layout_suffix) > -1) {
+ CSL.Output.Queue.quashDuplicateFinalPunctuation(myblobs, this.citation.opt.layout_suffix.slice(0, 1));
+ }
+ for (pos = 0, len = myblobs.length; pos < len; pos += 1) {
this.output.queue = [myblobs[pos]];
this.tmp.suppress_decorations = myparams[pos].suppress_decorations;
this.tmp.splice_delimiter = myparams[pos].splice_delimiter;
@@ -7290,9 +7311,8 @@ CSL.Registry.prototype.dorefreshes = function () {
regtoken.sortkeys = undefined;
regtoken.ambig = undefined;
Item = this.state.sys.retrieveItem(key);
- old_akey = akey;
- akey = CSL.getAmbiguousCite.call(this.state, Item);
- if (this.state.tmp.taintedItemIDs && this.state.opt.update_mode !== CSL.NUMERIC && old_akey !== akey) {
+ if ("undefined" === typeof akey) {
+ CSL.getAmbiguousCite.call(this.state, Item);
this.state.tmp.taintedItemIDs[key] = true;
}
this.registry[key] = regtoken;
@@ -7896,7 +7916,9 @@ CSL.Disambiguation.prototype.initVars = function (akey) {
myItems = [];
myIds = this.ambigcites[akey];
if (myIds.length > 1) {
- myItems = [this.sys.retrieveItem(myIds[p]) for (p in myIds)];
+ for (pos = 0, len = myIds.length; pos < len; pos += 1) {
+ myItems.push(this.sys.retrieveItem(myIds[pos]));
+ }
this.lists.push([this.base, myItems]);
}
this.modeindex = 0;