Created
May 24, 2012 09:51
-
-
Save fbennett/2780519 to your computer and use it in GitHub Desktop.
Integration patch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| commit 3bdcea42337805aaf25be96640937d2fb2ea59de | |
| Author: Frank Bennett <biercenator@gmail.com> | |
| Date: Thu May 31 10:02:36 2012 +0900 | |
| Integration patch | |
| diff --git a/chrome/content/zotero/integration/progressMeter.xul b/chrome/content/zotero/integration/progressMeter.xul | |
| new file mode 100644 | |
| index 0000000..386bff6 | |
| --- /dev/null | |
| +++ b/chrome/content/zotero/integration/progressMeter.xul | |
| @@ -0,0 +1,45 @@ | |
| +<?xml version="1.0"?> | |
| +<!-- | |
| + ***** BEGIN LICENSE BLOCK ***** | |
| + | |
| + Copyright © 2009 Center for History and New Media | |
| + George Mason University, Fairfax, Virginia, USA | |
| + http://zotero.org | |
| + | |
| + This file is part of Zotero. | |
| + | |
| + Zotero is free software: you can redistribute it and/or modify | |
| + it under the terms of the GNU Affero General Public License as published by | |
| + the Free Software Foundation, either version 3 of the License, or | |
| + (at your option) any later version. | |
| + | |
| + Zotero is distributed in the hope that it will be useful, | |
| + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| + GNU Affero General Public License for more details. | |
| + | |
| + You should have received a copy of the GNU Affero General Public License | |
| + along with Zotero. If not, see <http://www.gnu.org/licenses/>. | |
| + | |
| + ***** END LICENSE BLOCK ***** | |
| +--> | |
| +<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> | |
| +<?xml-stylesheet href="chrome://global/skin/dialog.css" type="text/css"?> | |
| +<?xml-stylesheet href="chrome://zotero/skin/zotero.css" type="text/css"?> | |
| +<?xml-stylesheet href="chrome://zotero/skin/overlay.css" type="text/css"?> | |
| +<?xml-stylesheet href="chrome://zotero-platform/content/overlay.css" type="text/css"?> | |
| +<?xml-stylesheet href="chrome://zotero/skin/integration.css" type="text/css"?> | |
| +<!DOCTYPE window SYSTEM "chrome://zotero/locale/zotero.dtd"> | |
| + | |
| +<dialog | |
| + id="zotero-add-citation-dialog" | |
| + title="Progress" | |
| + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> | |
| + | |
| + <progressmeter id="storage-progress" hidden="false" | |
| + width="300" | |
| + mode="undetermined"/> | |
| + | |
| + | |
| + | |
| +</dialog> | |
| diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js | |
| index bfb67c3..7b66119 100644 | |
| --- a/chrome/content/zotero/xpcom/citeproc.js | |
| +++ b/chrome/content/zotero/xpcom/citeproc.js | |
| @@ -82,7 +82,6 @@ var CSL = { | |
| "Chapter": "Ch.", | |
| "subchapter": "subch.", | |
| "page": "p.", | |
| - "page": "pp.", | |
| "paragraph": "para.", | |
| "subparagraph": "subpara.", | |
| "part": "pt.", | |
| @@ -114,12 +113,12 @@ var CSL = { | |
| this["collection-title"] = {}; | |
| this["institution-entire"] = {}; | |
| this["institution-part"] = {}; | |
| - this["nickname"] = {}; | |
| - this["number"] = {}; | |
| - this["title"] = {}; | |
| - this["place"] = {}; | |
| - this["hereinafter"] = {}; | |
| - this["classic"] = {}; | |
| + this.nickname = {}; | |
| + this.number = {}; | |
| + this.title = {}; | |
| + this.place = {}; | |
| + this.hereinafter = {}; | |
| + this.classic = {}; | |
| this["container-phrase"] = {}; | |
| this["title-phrase"] = {}; | |
| }, | |
| @@ -196,7 +195,7 @@ var CSL = { | |
| "delimiter" | |
| ], | |
| PARALLEL_MATCH_VARS: ["container-title"], | |
| - PARALLEL_TYPES: ["bill","gazette","legislation","legal_case"], | |
| + PARALLEL_TYPES: ["bill","gazette","legislation","legal_case","treaty"], | |
| PARALLEL_COLLAPSING_MID_VARSET: ["volume", "issue", "container-title", "section", "collection-number"], | |
| LOOSE: 0, | |
| STRICT: 1, | |
| @@ -223,6 +222,7 @@ var CSL = { | |
| "collection-editor", | |
| "composer", | |
| "container-author", | |
| + "director", | |
| "editorial-director", | |
| "interviewer", | |
| "original-author", | |
| @@ -327,7 +327,8 @@ var CSL = { | |
| en: "en_US", | |
| es: "es_ES", | |
| et: "et_EE", | |
| - fa: "fa_FA", | |
| + eu: "eu", | |
| + fa: "fa_IR", | |
| fi: "fi_FI", | |
| fr: "fr_FR", | |
| he: "he_IL", | |
| @@ -340,6 +341,7 @@ var CSL = { | |
| mn: "mn_MN", | |
| nb: "nb_NO", | |
| nl: "nl_NL", | |
| + nn: "nn-NO", | |
| pl: "pl_PL", | |
| pt: "pt_PT", | |
| ro: "ro_RO", | |
| @@ -509,7 +511,9 @@ function DOMParser() { | |
| return Components.classes["@mozilla.org/xmlextras/domparser;1"] | |
| .createInstance(Components.interfaces.nsIDOMParser); | |
| }; | |
| -var CSL_IS_IE; | |
| +if ("undefined" === typeof CSL_IS_IE) { | |
| + var CSL_IS_IE; | |
| +}; | |
| var CSL_CHROME = function () { | |
| if ("undefined" == typeof DOMParser || CSL_IS_IE) { | |
| CSL_IS_IE = true; | |
| @@ -736,7 +740,7 @@ CSL_CHROME.prototype.setAttribute = function (myxml,attr,val) { | |
| if (!myxml.ownerDocument) { | |
| myxml = myxml.firstChild; | |
| } | |
| - if (myxml.setAttribute) { | |
| + if (["function", "unknown"].indexOf(typeof myxml.setAttribute) > -1) { | |
| myxml.setAttribute(attr, val); | |
| } | |
| return false; | |
| @@ -1110,7 +1114,7 @@ CSL.Output.Queue.prototype.append = function (str, tokname, notSerious, ignorePr | |
| 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, ""); | |
| + blob.blobs = blob.blobs.replace(/\.([^a-z]|$)/g, "$1"); | |
| } | |
| this.state.fun.flipflopper.init(str, blob); | |
| this.state.fun.flipflopper.processTags(); | |
| @@ -1155,6 +1159,9 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) { | |
| if (!state.tmp.suppress_decorations) { | |
| for (j = 0, jlen = blobjr.decorations.length; j < jlen; j += 1) { | |
| params = blobjr.decorations[j]; | |
| + if (params[0] === "@showid") { | |
| + continue; | |
| + } | |
| if (state.normalDecorIsOrphan(blobjr, params)) { | |
| continue; | |
| } | |
| @@ -1163,6 +1170,14 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) { | |
| } | |
| if (b && b.length) { | |
| b = txt_esc(blobjr.strings.prefix, state.tmp.nestedBraces) + b + txt_esc(blobjr.strings.suffix, state.tmp.nestedBraces); | |
| + if (state.opt.development_extensions.csl_reverse_lookup_support && !state.tmp.suppress_decorations) { | |
| + for (j = 0, jlen = blobjr.decorations.length; j < jlen; j += 1) { | |
| + params = blobjr.decorations[j]; | |
| + if (params[0] === "@showid") { | |
| + b = state.fun.decorate[params[0]][params[1]](state, b, params[2]); | |
| + } | |
| + } | |
| + } | |
| ret.push(b); | |
| if (state.tmp.count_offset_characters) { | |
| state.tmp.offset_characters += (blen + blobjr.strings.suffix.length + blobjr.strings.prefix.length); | |
| @@ -1199,7 +1214,7 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) { | |
| if (!state.tmp.suppress_decorations) { | |
| for (i = 0, ilen = blob.decorations.length; i < ilen; i += 1) { | |
| params = blob.decorations[i]; | |
| - if (["@bibliography", "@display"].indexOf(params[0]) > -1) { | |
| + if (["@bibliography", "@display", "@showid"].indexOf(params[0]) > -1) { | |
| continue; | |
| } | |
| if (state.normalDecorIsOrphan(blobjr, params)) { | |
| @@ -1221,7 +1236,7 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) { | |
| if (!state.tmp.suppress_decorations) { | |
| for (i = 0, ilen = blob.decorations.length; i < ilen; i += 1) { | |
| params = blob.decorations[i]; | |
| - if (["@bibliography", "@display"].indexOf(params[0]) === -1) { | |
| + if (["@bibliography", "@display", "@showid"].indexOf(params[0]) === -1) { | |
| continue; | |
| } | |
| blobs_start = state.fun.decorate[params[0]][params[1]].call(blob, state, blobs_start, params[2]); | |
| @@ -1312,8 +1327,8 @@ 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 (str && this.state.tmp.strip_periods) { | |
| + str = str.replace(/\.([^a-z]|$)/g, "$1"); | |
| } | |
| if (!state.tmp.suppress_decorations) { | |
| llen = blob.decorations.length; | |
| @@ -2189,7 +2204,7 @@ CSL.DateParser = function () { | |
| }; | |
| CSL.Engine = function (sys, style, lang, forceLang) { | |
| var attrs, langspec, localexml, locale; | |
| - this.processor_version = "1.0.329"; | |
| + this.processor_version = "1.0.338"; | |
| this.csl_version = "1.0"; | |
| this.sys = sys; | |
| this.sys.xml = new CSL.System.Xml.Parsing(); | |
| @@ -2230,7 +2245,7 @@ CSL.Engine = function (sys, style, lang, forceLang) { | |
| this.setCslNodeIds(children[i], nodename); | |
| } | |
| } | |
| - } | |
| + }; | |
| this.setCslNodeIds(this.cslXml, "style"); | |
| } | |
| this.sys.xml.addMissingNameNodes(this.cslXml); | |
| @@ -2540,9 +2555,9 @@ CSL.Engine.prototype.retrieveItem = function (id) { | |
| Item[mm[1]] = {raw:mm[2]}; | |
| } else if (!Item[mm[1]] && CSL.NAME_VARIABLES.indexOf(mm[1]) > -1) { | |
| if (!Item[mm[1]]) { | |
| - Item[mm[1]] = [] | |
| + Item[mm[1]] = []; | |
| } | |
| - var lst = mm[2].split(/\s*\|\|\s*/) | |
| + var lst = mm[2].split(/\s*\|\|\s*/); | |
| if (lst.length === 1) { | |
| Item[mm[1]].push({family:lst[0],isInstitution:true}); | |
| } else if (lst.length === 2) { | |
| @@ -2551,7 +2566,7 @@ CSL.Engine.prototype.retrieveItem = function (id) { | |
| } else if (!Item[mm[1]] || mm[1] === "type") { | |
| Item[mm[1]] = mm[2].replace(/^\s+/, "").replace(/\s+$/, ""); | |
| } | |
| - Item.note.replace(CSL.NOTE_FIELD_REGEXP, "") | |
| + Item.note.replace(CSL.NOTE_FIELD_REGEXP, ""); | |
| } | |
| } | |
| } | |
| @@ -2567,22 +2582,23 @@ CSL.Engine.prototype.retrieveItem = function (id) { | |
| } | |
| } | |
| if (this.opt.development_extensions.static_statute_locator) { | |
| - if (Item.type && ["bill","gazette","legislation"].indexOf(Item.type) > -1) { | |
| + if (Item.type && ["bill","gazette","legislation","treaty"].indexOf(Item.type) > -1) { | |
| + var varname; | |
| var elements = ["type", "title", "jurisdiction", "genre", "volume", "container-title"]; | |
| var legislation_id = []; | |
| - for (var i = 0, ilen = elements.length; i < ilen; i += 1) { | |
| - var varname = elements[i]; | |
| + for (i = 0, ilen = elements.length; i < ilen; i += 1) { | |
| + varname = elements[i]; | |
| if (Item[varname]) { | |
| legislation_id.push(Item[varname]); | |
| } | |
| } | |
| - for (var i = 0, ilen = 2; i < ilen; i += 1) { | |
| - if (["original-date", "issued"].indexOf(varname) > -1) { | |
| - if (Item[varname] && Item[varname].year) { | |
| - value = Item[varname].year; | |
| - legislation_id.push(value); | |
| - break; | |
| - } | |
| + elements = ["original-date", "issued"]; | |
| + for (i = 0, elements.length; i < ilen; i += 1) { | |
| + varname = elements[i]; | |
| + if (Item[varname] && Item[varname].year) { | |
| + var value = Item[varname].year; | |
| + legislation_id.push(value); | |
| + break; | |
| } | |
| } | |
| Item.legislation_id = legislation_id.join("::"); | |
| @@ -2618,7 +2634,7 @@ CSL.Engine.prototype.remapSectionVariable = function (inputList) { | |
| var section_label_count = 0; | |
| var later_label = false; | |
| var value = false; | |
| - if (["bill","gazette","legislation"].indexOf(Item.type) > -1) { | |
| + if (["bill","gazette","legislation","treaty"].indexOf(Item.type) > -1) { | |
| if (!Item.section | |
| && this.opt.development_extensions.clobber_locator_if_no_statute_section) { | |
| item.locator = undefined; | |
| @@ -2712,7 +2728,7 @@ CSL.Engine.prototype.remapSectionVariable = function (inputList) { | |
| } | |
| CSL.Engine.prototype.setNumberLabels = function (Item) { | |
| if (Item.number | |
| - && ["bill", "gazette", "legislation"].indexOf(Item.type) > -1 | |
| + && ["bill", "gazette", "legislation", "treaty"].indexOf(Item.type) > -1 | |
| && this.opt.development_extensions.static_statute_locator | |
| && !this.tmp.shadow_numbers["number"]) { | |
| this.tmp.shadow_numbers["number"] = {}; | |
| @@ -2853,23 +2869,29 @@ CSL.Engine.prototype.setOutputFormat = function (mode) { | |
| }; | |
| CSL.Engine.prototype.setLangTagsForCslSort = function (tags) { | |
| var i, ilen; | |
| - this.opt['locale-sort'] = []; | |
| - for (i = 0, ilen = tags.length; i < ilen; i += 1) { | |
| - this.opt['locale-sort'].push(tags[i]); | |
| + if (tags) { | |
| + this.opt['locale-sort'] = []; | |
| + for (i = 0, ilen = tags.length; i < ilen; i += 1) { | |
| + this.opt['locale-sort'].push(tags[i]); | |
| + } | |
| } | |
| }; | |
| CSL.Engine.prototype.setLangTagsForCslTransliteration = function (tags) { | |
| var i, ilen; | |
| - this.opt['locale-translit'] = []; | |
| - for (i = 0, ilen = tags.length; i < ilen; i += 1) { | |
| - this.opt['locale-translit'].push(tags[i]); | |
| + this.opt['locale-translit'] = []; | |
| + if (tags) { | |
| + for (i = 0, ilen = tags.length; i < ilen; i += 1) { | |
| + this.opt['locale-translit'].push(tags[i]); | |
| + } | |
| } | |
| }; | |
| CSL.Engine.prototype.setLangTagsForCslTranslation = function (tags) { | |
| var i, ilen; | |
| this.opt['locale-translat'] = []; | |
| - for (i = 0, ilen = tags.length; i < ilen; i += 1) { | |
| - this.opt['locale-translat'].push(tags[i]); | |
| + if (tags) { | |
| + for (i = 0, ilen = tags.length; i < ilen; i += 1) { | |
| + this.opt['locale-translat'].push(tags[i]); | |
| + } | |
| } | |
| }; | |
| CSL.Engine.prototype.setLangPrefsForCites = function (params) { | |
| @@ -2955,6 +2977,7 @@ CSL.Engine.Opt = function () { | |
| this.development_extensions.static_statute_locator = false; | |
| this.development_extensions.csl_reverse_lookup_support = false; | |
| this.development_extensions.clobber_locator_if_no_statute_section = false; | |
| + this.development_extensions.wrap_url_and_doi = false; | |
| this.nodenames = []; | |
| this.gender = {}; | |
| this['cite-lang-prefs'] = { | |
| @@ -2963,7 +2986,7 @@ CSL.Engine.Opt = function () { | |
| titles:['orig','translat'], | |
| publishers:['orig'], | |
| places:['orig'] | |
| - } | |
| + }; | |
| }; | |
| CSL.Engine.Tmp = function () { | |
| this.names_max = new CSL.Stack(); | |
| @@ -2989,8 +3012,8 @@ CSL.Engine.Tmp = function () { | |
| this.last_years_used = []; | |
| this.years_used = []; | |
| this.names_used = []; | |
| - this.taintedItemIDs = false; | |
| - this.taintedCitationIDs = false; | |
| + this.taintedItemIDs = {}; | |
| + this.taintedCitationIDs = {}; | |
| this.initialize_with = new CSL.Stack(); | |
| this.disambig_request = false; | |
| this["name-as-sort-order"] = false; | |
| @@ -3170,10 +3193,15 @@ CSL.Engine.prototype.restoreProcessorState = function (citations) { | |
| } | |
| return ret; | |
| }; | |
| -CSL.Engine.prototype.updateItems = function (idList, nosort) { | |
| +CSL.Engine.prototype.updateItems = function (idList, nosort, rerun_ambigs) { | |
| var debug = false; | |
| var oldArea = this.tmp.area; | |
| this.registry.init(idList); | |
| + if (rerun_ambigs) { | |
| + for (var ambig in this.registry.ambigcites) { | |
| + this.registry.ambigsTouched[ambig] = true; | |
| + } | |
| + } | |
| this.registry.dodeletes(this.registry.myhash); | |
| this.registry.doinserts(this.registry.mylist); | |
| this.registry.dorefreshes(); | |
| @@ -3299,13 +3327,15 @@ CSL.Engine.prototype.makeBibliography = function (bibsection) { | |
| ret = CSL.getBibliographyEntries.call(this, bibsection); | |
| entry_ids = ret[0]; | |
| entry_strings = ret[1]; | |
| + var done = ret[2]; | |
| params = { | |
| "maxoffset": 0, | |
| "entryspacing": this.bibliography.opt["entry-spacing"], | |
| "linespacing": this.bibliography.opt["line-spacing"], | |
| "second-field-align": false, | |
| "entry_ids": entry_ids, | |
| - "bibliography_errors": this.tmp.bibliography_errors.slice() | |
| + "bibliography_errors": this.tmp.bibliography_errors.slice(), | |
| + "done": done | |
| }; | |
| if (this.bibliography.opt["second-field-align"]) { | |
| params["second-field-align"] = this.bibliography.opt["second-field-align"]; | |
| @@ -3327,38 +3357,42 @@ CSL.Engine.prototype.makeBibliography = function (bibsection) { | |
| return [params, entry_strings]; | |
| }; | |
| CSL.getBibliographyEntries = function (bibsection) { | |
| - var ret, input, include, anymatch, allmatch, bib_entry, res, len, pos, item, llen, ppos, spec, lllen, pppos, bib_layout, topblobs, all_item_ids, entry_item_ids, debug, collapse_parallel, i, ilen, siblings, skips, sortedItems, eyetem, chr, entry_item_data; | |
| + var ret, input, include, anymatch, allmatch, bib_entry, res, len, pos, item, llen, ppos, spec, lllen, pppos, bib_layout, topblobs, all_item_ids, entry_item_ids, debug, collapse_parallel, i, ilen, siblings, skips, sortedItems, eyetem, chr, entry_item_data, j, jlen, newIDs, originalIDs; | |
| ret = []; | |
| entry_item_data = []; | |
| this.tmp.area = "bibliography"; | |
| this.tmp.last_rendered_name = false; | |
| this.tmp.bibliography_errors = []; | |
| this.tmp.bibliography_pos = 0; | |
| - var originalIDs = this.registry.getSortedIds(); | |
| - var newIDs = []; | |
| - this.registry.generate.items = {}; | |
| - for (var id in this.registry.generate.origIDs) { | |
| - var rule = this.registry.generate.origIDs[id]; | |
| - item = this.retrieveItem(id); | |
| - var clonedItem = {}; | |
| - for (var key in item) { | |
| - clonedItem[key] = item[key]; | |
| - } | |
| - clonedItem.type = rule.to; | |
| - for (i = 0, ilen = rule.triggers.length; i < ilen; i += 1) { | |
| - if (clonedItem[rule.triggers[i]]) { | |
| - delete clonedItem[rule.triggers[i]]; | |
| - } | |
| - } | |
| - var newID = clonedItem.id + ":gen"; | |
| - clonedItem.id = newID; | |
| - this.registry.generate.items[clonedItem.id] = clonedItem; | |
| - newIDs.push(newID); | |
| - } | |
| - if (newIDs.length) { | |
| - this.updateItems(originalIDs.concat(newIDs)); | |
| - } | |
| - input = this.retrieveItems(this.registry.getSortedIds()); | |
| + if (bibsection && bibsection.page_start && bibsection.page_length) { | |
| + input = this.registry.getSortedIds(); | |
| + } else { | |
| + originalIDs = this.registry.getSortedIds(); | |
| + newIDs = []; | |
| + this.registry.generate.items = {}; | |
| + for (var id in this.registry.generate.origIDs) { | |
| + var rule = this.registry.generate.origIDs[id]; | |
| + item = this.retrieveItem(id); | |
| + var clonedItem = {}; | |
| + for (var key in item) { | |
| + clonedItem[key] = item[key]; | |
| + } | |
| + clonedItem.type = rule.to; | |
| + for (i = 0, ilen = rule.triggers.length; i < ilen; i += 1) { | |
| + if (clonedItem[rule.triggers[i]]) { | |
| + delete clonedItem[rule.triggers[i]]; | |
| + } | |
| + } | |
| + var newID = clonedItem.id + ":gen"; | |
| + clonedItem.id = newID; | |
| + this.registry.generate.items[clonedItem.id] = clonedItem; | |
| + newIDs.push(newID); | |
| + } | |
| + if (newIDs.length) { | |
| + this.updateItems(originalIDs.concat(newIDs)); | |
| + } | |
| + input = this.retrieveItems(this.registry.getSortedIds()); | |
| + } | |
| this.tmp.disambig_override = true; | |
| function eval_string(a, b) { | |
| if (a === b) { | |
| @@ -3388,20 +3422,40 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| } | |
| } | |
| skips = {}; | |
| - all_item_ids = []; | |
| - len = input.length; | |
| - for (pos = 0; pos < len; pos += 1) { | |
| - item = input[pos]; | |
| - if (skips[item.id]) { | |
| - continue; | |
| + var page_item_count; | |
| + if (bibsection && bibsection.page_start && bibsection.page_length) { | |
| + page_item_count = 0; | |
| + if (bibsection.page_start !== true) { | |
| + for (i = 0, ilen = input.length; i < ilen; i += 1) { | |
| + skips[input[i]] = true; | |
| + if (bibsection.page_start == input[i]) { | |
| + break; | |
| + } | |
| + } | |
| + } | |
| + } | |
| + var processed_item_ids = []; | |
| + for (i = 0, ilen = input.length; i < ilen; i += 1) { | |
| + if (bibsection && bibsection.page_start && bibsection.page_length) { | |
| + if (skips[input[i]]) { | |
| + continue; | |
| + } | |
| + item = this.retrieveItem(input[i]); | |
| + if (page_item_count === bibsection.page_length) { | |
| + break; | |
| + } | |
| + } else { | |
| + item = input[i]; | |
| + if (skips[item.id]) { | |
| + continue; | |
| + } | |
| } | |
| if (bibsection) { | |
| include = true; | |
| if (bibsection.include) { | |
| include = false; | |
| - llen = bibsection.include.length; | |
| - for (ppos = 0; ppos < llen; ppos += 1) { | |
| - spec = bibsection.include[ppos]; | |
| + for (j = 0, jlen = bibsection.include.length; j < jlen; j += 1) { | |
| + spec = bibsection.include[j]; | |
| if (eval_spec(spec.value, item[spec.field])) { | |
| include = true; | |
| break; | |
| @@ -3409,9 +3463,8 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| } | |
| } else if (bibsection.exclude) { | |
| anymatch = false; | |
| - llen = bibsection.exclude.length; | |
| - for (ppos = 0; ppos < llen; ppos += 1) { | |
| - spec = bibsection.exclude[ppos]; | |
| + for (j = 0, jlen = bibsection.exclude.length; j < jlen; j += 1) { | |
| + spec = bibsection.exclude[j]; | |
| if (eval_spec(spec.value, item[spec.field])) { | |
| anymatch = true; | |
| break; | |
| @@ -3423,9 +3476,8 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| } else if (bibsection.select) { | |
| include = false; | |
| allmatch = true; | |
| - llen = bibsection.select.length; | |
| - for (ppos = 0; ppos < llen; ppos += 1) { | |
| - spec = bibsection.select[ppos]; | |
| + for (j = 0, jlen = bibsection.select.length; j < jlen; j += 1) { | |
| + spec = bibsection.select[j]; | |
| if (!eval_spec(spec.value, item[spec.field])) { | |
| allmatch = false; | |
| } | |
| @@ -3436,9 +3488,8 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| } | |
| if (bibsection.quash) { | |
| allmatch = true; | |
| - llen = bibsection.quash.length; | |
| - for (ppos = 0; ppos < llen; ppos += 1) { | |
| - spec = bibsection.quash[ppos]; | |
| + for (j = 0, jlen = bibsection.quash.length; j < jlen; j += 1) { | |
| + spec = bibsection.quash[j]; | |
| if (!eval_spec(spec.value, item[spec.field])) { | |
| allmatch = false; | |
| } | |
| @@ -3457,7 +3508,8 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| this.output.current.value().item_id = item.id; | |
| sortedItems = [[{id: "" + item.id}, item]]; | |
| entry_item_ids = []; | |
| - if (this.registry.registry[item.id].master) { | |
| + if (this.registry.registry[item.id].master | |
| + && !(bibsection && bibsection.page_start && bibsection.page_length)) { | |
| collapse_parallel = true; | |
| this.parallel.StartCitation(sortedItems); | |
| this.output.queue[0].strings.delimiter = ", "; | |
| @@ -3465,9 +3517,9 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| entry_item_ids.push("" + CSL.getCite.call(this, item)); | |
| skips[item.id] = true; | |
| siblings = this.registry.registry[item.id].siblings; | |
| - for (ppos = 0, llen = siblings.length; ppos < llen; ppos += 1) { | |
| - i = this.registry.registry[item.id].siblings[ppos]; | |
| - eyetem = this.retrieveItem(i); | |
| + for (j = 0, jlen = siblings.length; j < jlen; j += 1) { | |
| + var k = this.registry.registry[item.id].siblings[j]; | |
| + eyetem = this.retrieveItem(k); | |
| entry_item_ids.push("" + CSL.getCite.call(this, eyetem)); | |
| skips[eyetem.id] = true; | |
| } | |
| @@ -3477,10 +3529,13 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| this.parallel.StartCitation(sortedItems); | |
| this.tmp.term_predecessor = false; | |
| entry_item_ids.push("" + CSL.getCite.call(this, item)); | |
| + if (bibsection && bibsection.page_start && bibsection.page_length) { | |
| + page_item_count += 1; | |
| + } | |
| } | |
| entry_item_data.push(""); | |
| this.tmp.bibliography_pos += 1; | |
| - all_item_ids.push(entry_item_ids); | |
| + processed_item_ids.push(entry_item_ids); | |
| this.output.endTag("bib_entry"); | |
| if (this.output.queue[0].blobs.length && this.output.queue[0].blobs[0].blobs.length) { | |
| if (collapse_parallel || !this.output.queue[0].blobs[0].blobs[0].strings) { | |
| @@ -3489,14 +3544,13 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| } else { | |
| topblobs = this.output.queue[0].blobs[0].blobs; | |
| } | |
| - llen = topblobs.length - 1; | |
| - for (ppos = llen; ppos > -1; ppos += -1) { | |
| - if (topblobs[ppos].blobs && topblobs[ppos].blobs.length !== 0) { | |
| + for (j = topblobs.length - 1; j > -1; j += -1) { | |
| + if (topblobs[j].blobs && topblobs[j].blobs.length !== 0) { | |
| chr = this.bibliography.opt.layout_suffix.slice(0, 1); | |
| - if (chr && topblobs[ppos].strings.suffix.slice(-1) === chr) { | |
| - topblobs[ppos].strings.suffix = topblobs[ppos].strings.suffix.slice(0, -1); | |
| + if (chr && topblobs[j].strings.suffix.slice(-1) === chr) { | |
| + topblobs[j].strings.suffix = topblobs[j].strings.suffix.slice(0, -1); | |
| } | |
| - topblobs[ppos].strings.suffix += this.bibliography.opt.layout_suffix; | |
| + topblobs[j].strings.suffix += this.bibliography.opt.layout_suffix; | |
| break; | |
| } | |
| } | |
| @@ -3510,11 +3564,20 @@ CSL.getBibliographyEntries = function (bibsection) { | |
| } | |
| ret.push(res); | |
| } | |
| - if (newIDs.length) { | |
| - this.updateItems(originalIDs); | |
| + var done = false; | |
| + if (bibsection && bibsection.page_start && bibsection.page_length) { | |
| + var last_expected_id = input.slice(-1)[0]; | |
| + var last_seen_id = processed_item_ids.slice(-1)[0]; | |
| + if (!last_expected_id || !last_seen_id || last_expected_id == last_seen_id) { | |
| + done = true; | |
| + } | |
| + } else { | |
| + if (newIDs.length) { | |
| + this.updateItems(originalIDs); | |
| + } | |
| } | |
| this.tmp.disambig_override = false; | |
| - return [all_item_ids, ret]; | |
| + return [processed_item_ids, ret, done]; | |
| }; | |
| CSL.Engine.prototype.previewCitationCluster = function (citation, citationsPre, citationsPost, newMode) { | |
| var oldMode = this.opt.mode; | |
| @@ -3533,11 +3596,10 @@ CSL.Engine.prototype.appendCitationCluster = function (citation) { | |
| return this.processCitationCluster(citation, citationsPre, [])[1]; | |
| }; | |
| CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, citationsPost, flag) { | |
| - var c, i, ilen, j, jlen, k, klen, n, nlen, key, Item, item, noteCitations, textCitations; | |
| + var c, i, ilen, j, jlen, k, klen, n, nlen, key, Item, item, noteCitations, textCitations, m, citationsInNote; | |
| this.debug = false; | |
| this.tmp.citation_errors = []; | |
| var return_data = {"bibchange": false}; | |
| - this.registry.return_data = return_data; | |
| this.setCitationId(citation); | |
| var oldCitationList; | |
| var oldItemList; | |
| @@ -3568,12 +3630,11 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| } | |
| } | |
| } | |
| - this.tmp.taintedItemIDs = {}; | |
| this.tmp.taintedCitationIDs = {}; | |
| var sortedItems = []; | |
| for (i = 0, ilen = citation.citationItems.length; i < ilen; i += 1) { | |
| - var item = {}; | |
| - for (var key in citation.citationItems[i]) { | |
| + item = {}; | |
| + for (key in citation.citationItems[i]) { | |
| item[key] = citation.citationItems[i][key]; | |
| } | |
| Item = this.retrieveItem("" + item.id); | |
| @@ -3586,7 +3647,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| var raw_locator = item.locator; | |
| item.locator = raw_locator.slice(0, idx); | |
| raw_locator = raw_locator.slice(idx + 1); | |
| - var m = raw_locator.match(/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*/); | |
| + m = raw_locator.match(/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*/); | |
| if (m) { | |
| item["locator-date"] = this.fun.dateparser.parse(m[1]); | |
| raw_locator = raw_locator.slice(m[1].length); | |
| @@ -3596,8 +3657,8 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| } | |
| } | |
| if (this.opt.development_extensions.locator_label_parse) { | |
| - if (item.locator && ["bill","gazette","legislation"].indexOf(Item.type) === -1 && (!item.label || item.label === 'page')) { | |
| - var m = CSL.LOCATOR_LABELS_REGEXP.exec(item.locator); | |
| + if (item.locator && ["bill","gazette","legislation","treaty"].indexOf(Item.type) === -1 && (!item.label || item.label === 'page')) { | |
| + m = CSL.LOCATOR_LABELS_REGEXP.exec(item.locator); | |
| if (m) { | |
| item.label = CSL.LOCATOR_LABELS_MAP[m[2]]; | |
| item.locator = m[3]; | |
| @@ -3626,7 +3687,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| if (this.opt.update_mode === CSL.POSITION) { | |
| textCitations = []; | |
| noteCitations = []; | |
| - var citationsInNote = {}; | |
| + citationsInNote = {}; | |
| } | |
| var update_items = []; | |
| for (i = 0, ilen = citationByIndex.length; i < ilen; i += 1) { | |
| @@ -3693,12 +3754,16 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| var last_ref = {}; | |
| for (j = 0, jlen = citations.length; j < jlen; j += 1) { | |
| var onecitation = citations[j]; | |
| + if (!citations[j].properties.noteIndex) { | |
| + citations[j].properties.noteIndex = 0; | |
| + } | |
| + citations[j].properties.noteIndex = parseInt(citations[j].properties.noteIndex, 10); | |
| if (j > 0 && citations[j - 1].properties.noteIndex > citations[j].properties.noteIndex) { | |
| citationsInNote = {}; | |
| first_ref = {}; | |
| last_ref = {}; | |
| } | |
| - for (var k = 0, klen = onecitation.sortedItems.length; k < klen; k += 1) { | |
| + for (k = 0, klen = onecitation.sortedItems.length; k < klen; k += 1) { | |
| if (!this.registry.registry[onecitation.sortedItems[k][1].id].parallel) { | |
| if (!citationsInNote[onecitation.properties.noteIndex]) { | |
| citationsInNote[onecitation.properties.noteIndex] = 1; | |
| @@ -3720,7 +3785,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| if (onecitation.sortedItems[k - 1][0].legislation_id) { | |
| incitationid = onecitation.sortedItems[k - 1][0].legislation_id; | |
| } else { | |
| - incitationid = onecitation.sortedItems[k - 1][1].id | |
| + incitationid = onecitation.sortedItems[k - 1][1].id; | |
| } | |
| } | |
| if (flag === CSL.PREVIEW) { | |
| @@ -3740,6 +3805,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| oldvalue["near-note"] = item[1]["near-note"]; | |
| item[1]["first-reference-note-number"] = 0; | |
| item[1]["near-note"] = false; | |
| + var oldlastid; | |
| if ("undefined" === typeof first_ref[myid]) { | |
| first_ref[myid] = onecitation.properties.noteIndex; | |
| last_ref[myid] = onecitation.properties.noteIndex; | |
| @@ -3748,7 +3814,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| var ibidme = false; | |
| var suprame = false; | |
| if (j > 0) { | |
| - var oldlastid = citations[j - 1].sortedItems.slice(-1)[0][1].id; | |
| + oldlastid = citations[j - 1].sortedItems.slice(-1)[0][1].id; | |
| if (citations[j - 1].sortedItems[0].slice(-1)[0].legislation_id) { | |
| oldlastid = citations[j - 1].sortedItems[0].slice(-1)[0].legislation_id; | |
| } | |
| @@ -3761,7 +3827,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| oldid = citations[j - 1].sortedItems[0][0].legislation_id; | |
| } | |
| if ((oldid == myid && citations[j - 1].properties.noteIndex >= (citations[j].properties.noteIndex - 1)) || citations[j - 1].sortedItems[0][1].id == this.registry.registry[item[1].id].parallel) { | |
| - if (citationsInNote[citations[j - 1].properties.noteIndex] == 1 || citations[j - 1].properties.noteIndex == 0) { | |
| + if (citationsInNote[citations[j - 1].properties.noteIndex] === 1 || citations[j - 1].properties.noteIndex === 0) { | |
| useme = true; | |
| } | |
| } | |
| @@ -3778,7 +3844,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| } | |
| } else if (k > 0 && incitationid == myid) { | |
| ibidme = true; | |
| - } else if (k == 0 && citations[j - 1].properties.noteIndex == citations[j].properties.noteIndex | |
| + } else if (k === 0 && citations[j - 1].properties.noteIndex == citations[j].properties.noteIndex | |
| && citations[j - 1].sortedItems.length | |
| && oldlastid == myid) { | |
| ibidme = true; | |
| @@ -3903,23 +3969,20 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, | |
| } else { | |
| var obj; | |
| for (key in this.tmp.taintedCitationIDs) { | |
| - if (this.tmp.taintedCitationIDs.hasOwnProperty(key)) { | |
| - if (key == citation.citationID) { | |
| - continue; | |
| - } | |
| - var mycitation = this.registry.citationreg.citationById[key]; | |
| - this.tmp.citation_pos = mycitation.properties.index; | |
| - this.tmp.citation_note_index = mycitation.properties.noteIndex; | |
| - this.tmp.citation_id = "" + mycitation.citationID; | |
| - obj = []; | |
| - obj.push(mycitation.properties.index); | |
| - obj.push(this.process_CitationCluster.call(this, mycitation.sortedItems, mycitation.citationID)); | |
| - ret.push(obj); | |
| - this.tmp.citation_pos += 1; | |
| + if (key == citation.citationID) { | |
| + continue; | |
| } | |
| - } | |
| - this.tmp.taintedItemIDs = false; | |
| - this.tmp.taintedCitationIDs = false; | |
| + var mycitation = this.registry.citationreg.citationById[key]; | |
| + this.tmp.citation_pos = mycitation.properties.index; | |
| + this.tmp.citation_note_index = mycitation.properties.noteIndex; | |
| + this.tmp.citation_id = "" + mycitation.citationID; | |
| + obj = []; | |
| + obj.push(mycitation.properties.index); | |
| + obj.push(this.process_CitationCluster.call(this, mycitation.sortedItems, mycitation.citationID)); | |
| + ret.push(obj); | |
| + } | |
| + this.tmp.taintedItemIDs = {}; | |
| + this.tmp.taintedCitationIDs = {}; | |
| this.tmp.citation_pos = citation.properties.index; | |
| this.tmp.citation_note_index = citation.properties.noteIndex; | |
| this.tmp.citation_id = "" + citation.citationID; | |
| @@ -3957,7 +4020,7 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) { | |
| } | |
| Item = this.retrieveItem("" + item.id); | |
| if (this.opt.development_extensions.locator_label_parse) { | |
| - if (item.locator && ["bill","gazette","legislation"].indexOf(Item.type) === -1 && (!item.label || item.label === 'page')) { | |
| + if (item.locator && ["bill","gazette","legislation","treaty"].indexOf(Item.type) === -1 && (!item.label || item.label === 'page')) { | |
| var m = CSL.LOCATOR_LABELS_REGEXP.exec(item.locator); | |
| if (m) { | |
| item.label = CSL.LOCATOR_LABELS_MAP[m[2]]; | |
| @@ -3971,7 +4034,7 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) { | |
| this.remapSectionVariable(inputList); | |
| if (inputList && inputList.length > 1 && this.citation_sort.tokens.length > 0) { | |
| len = inputList.length; | |
| - for (var pos = 0; pos < len; pos += 1) { | |
| + for (pos = 0; pos < len; pos += 1) { | |
| inputList[pos][1].sortkeys = CSL.getSortKeys.call(this, inputList[pos][0], "citation_sort"); | |
| } | |
| inputList.sort(this.citation.srt.compareCompositeKeys); | |
| @@ -4044,6 +4107,7 @@ CSL.getCitationCluster = function (inputList, citationID) { | |
| var lastTitle = false; | |
| var lastPosition = false; | |
| var lastID = false; | |
| + var lst = []; | |
| for (var i=0, ilen = inputList.length; i < ilen; i += 1) { | |
| var type = inputList[i][0].type; | |
| var title = inputList[i][0].title; | |
| @@ -4051,7 +4115,7 @@ CSL.getCitationCluster = function (inputList, citationID) { | |
| var id = inputList[i][0].id; | |
| if (title && type === "legal_case" && id !== lastID && position) { | |
| if (title !== lastTitle || parasets.length === 0) { | |
| - var lst = []; | |
| + lst = []; | |
| parasets.push(lst); | |
| } | |
| lst.push(inputList[i][1]); | |
| @@ -4060,8 +4124,8 @@ CSL.getCitationCluster = function (inputList, citationID) { | |
| lastPosition = position; | |
| lastID = id; | |
| } | |
| - for (var i=0, ilen=parasets.length; i < ilen; i += 1) { | |
| - var lst = parasets[i]; | |
| + for (i=0, ilen=parasets.length; i < ilen; i += 1) { | |
| + lst = parasets[i]; | |
| if (lst.length < 2) { | |
| continue; | |
| } | |
| @@ -4198,7 +4262,7 @@ CSL.getCitationCluster = function (inputList, citationID) { | |
| if (tmpstr && tmpstr.slice(0, 1) === ",") { | |
| objects.push(tmpstr); | |
| } else if ("string" == typeof objects.slice(-1)[0] && objects.slice(-1)[0].slice(-1) === ",") { | |
| - objects.push(" " + tmpstr) | |
| + objects.push(" " + tmpstr); | |
| } else if (tmpstr) { | |
| objects.push(txt_esc(this.tmp.splice_delimiter) + tmpstr); | |
| } | |
| @@ -4345,7 +4409,7 @@ CSL.citeEnd = function (Item, item) { | |
| buf.push(this.tmp.original_date.list.pop()); | |
| } | |
| this.tmp.original_date.list.pop(); | |
| - for (var i = buf.length - 1; i > -1; i += -1) { | |
| + for (i = buf.length - 1; i > -1; i += -1) { | |
| this.tmp.original_date.list.push(buf.pop()); | |
| } | |
| this.parallel.cite["original-date"] = false; | |
| @@ -4695,7 +4759,7 @@ CSL.Node.date = { | |
| && "" + Item["collection-number"] === "" + state.tmp.date_object.year | |
| && this.dateparts.length === 1 | |
| && this.dateparts[0] === "year") { | |
| - for (key in state.tmp.date_object) { | |
| + for (var key in state.tmp.date_object) { | |
| if (state.tmp.date_object.hasOwnProperty(key)) { | |
| if (key.slice(0, 4) === "year") { | |
| state.tmp.original_date = {}; | |
| @@ -5067,9 +5131,10 @@ CSL.Node.group = { | |
| if (!state.tmp.just_looking && "undefined" !== typeof flag[6]) { | |
| var parallel_condition_object = { | |
| blobs: blobs, | |
| - pos: pos, | |
| - condition: flag[6] | |
| - } | |
| + conditions: flag[6], | |
| + id: Item.id, | |
| + pos: pos | |
| + }; | |
| state.parallel.parallel_conditional_blobs_list.push(parallel_condition_object); | |
| } | |
| } else { | |
| @@ -5153,6 +5218,8 @@ CSL.Node.institution = { | |
| this.and_term = state.getTerm("and", "long", 0); | |
| } else if ("symbol" === this.strings.and) { | |
| this.and_term = "&"; | |
| + } else if ("none" === this.strings.and) { | |
| + this.and_term = this.strings.delimiter; | |
| } | |
| if ("undefined" === typeof this.and_term && state.build.and_term) { | |
| this.and_term = state.getTerm("and", "long", 0); | |
| @@ -5176,7 +5243,7 @@ CSL.Node.institution = { | |
| this.and_prefix_multiple = " "; | |
| } | |
| } | |
| - func = function (state, Item) { | |
| + var func = function (state, Item) { | |
| this.and = {}; | |
| if ("undefined" !== typeof this.and_term) { | |
| state.output.append(this.and_term, "empty", true); | |
| @@ -5255,6 +5322,9 @@ CSL.Node.key = { | |
| sort_direction.push(1); | |
| } | |
| state[state.build.area].opt.sort_directions.push(sort_direction); | |
| + if (CSL.DATE_VARIABLES.indexOf(this.variables[0]) > -1) { | |
| + state.build.date_key = true; | |
| + } | |
| func = function (state, Item) { | |
| state.tmp.sort_key_flag = true; | |
| if (this.strings["et-al-min"]) { | |
| @@ -5357,6 +5427,21 @@ CSL.Node.key = { | |
| state.tmp.value = []; | |
| }; | |
| end_key.execs.push(func); | |
| + if (state.build.date_key) { | |
| + if (state.build.area === "citation_sort") { | |
| + state[state.build.area].opt.sort_directions.push([-1,1]); | |
| + func = function (state, Item) { | |
| + var year_suffix = state.registry.registry[Item.id].disambig.year_suffix; | |
| + if (!year_suffix) { | |
| + year_suffix = 0; | |
| + } | |
| + var key = CSL.Util.padding("" + year_suffix); | |
| + state[state.tmp.area].keys.push(key); | |
| + } | |
| + end_key.execs.push(func); | |
| + } | |
| + state.build.date_key = false; | |
| + } | |
| func = function (state, Item) { | |
| state.tmp["et-al-min"] = undefined; | |
| state.tmp["et-al-use-first"] = undefined; | |
| @@ -5378,9 +5463,14 @@ CSL.Node.label = { | |
| var func = function (state, Item, item) { | |
| var termtxt = CSL.evaluateLabel(this, state, Item, item); | |
| if (item && this.strings.term === "locator") { | |
| + state.parallel.StartVariable("label"); | |
| + state.parallel.AppendToVariable(item.label); | |
| item.section_form_override = this.strings.form; | |
| } | |
| state.output.append(termtxt, this); | |
| + if (item && this.strings.term === "locator") { | |
| + state.parallel.CloseVariable(); | |
| + } | |
| }; | |
| this.execs.push(func); | |
| } else { | |
| @@ -5438,7 +5528,7 @@ CSL.Node.layout = { | |
| state.tmp.term_predecessor = false; | |
| ignorePredecessor = true; | |
| } | |
| - prefix = (item.prefix + sp).replace(/\s+/g, " ") | |
| + prefix = (item.prefix + sp).replace(/\s+/g, " "); | |
| state.output.append(prefix, this, false, ignorePredecessor); | |
| } | |
| }; | |
| @@ -5552,6 +5642,7 @@ CSL.NameOutput = function(state, Item, item, variables) { | |
| this.Item = Item; | |
| this.item = item; | |
| this.nameset_base = 0; | |
| + this.etal_spec = []; | |
| this._first_creator_variable = false; | |
| this._please_chop = false; | |
| }; | |
| @@ -5598,10 +5689,10 @@ CSL.NameOutput.prototype.outputNames = function () { | |
| var i, ilen; | |
| var variables = this.variables; | |
| if (this.institution.and) { | |
| - if (!this.institution.and.single.blobs && !this.institution.and.single.blobs.length) { | |
| + if (!this.institution.and.single.blobs || !this.institution.and.single.blobs.length) { | |
| this.institution.and.single.blobs = this.name.and.single.blobs; | |
| } | |
| - if (!this.institution.and.single.blobs && !this.institution.and.multiple.blobs.length) { | |
| + if (!this.institution.and.multiple.blobs || !this.institution.and.multiple.blobs.length) { | |
| this.institution.and.multiple.blobs = this.name.and.multiple.blobs; | |
| } | |
| } | |
| @@ -6040,7 +6131,7 @@ CSL.NameOutput.prototype._checkNickname = function (name) { | |
| } | |
| } | |
| return name; | |
| -} | |
| +}; | |
| CSL.NameOutput.prototype.joinPersons = function (blobs, pos) { | |
| var ret; | |
| if (this.etal_spec[pos] === 1) { | |
| @@ -6335,6 +6426,9 @@ CSL.NameOutput.prototype._imposeNameConstraints = function (lst, count, key, pos | |
| } else { | |
| lst[key] = display_names.slice(0, discretionary_names_length); | |
| } | |
| + if (!lst[key].length) { | |
| + this.etal_spec.push(0); | |
| + } | |
| } | |
| this.state.tmp.disambig_settings.names[pos] = lst[key].length; | |
| }; | |
| @@ -7092,9 +7186,6 @@ CSL.NameOutput.prototype._trimInstitution = function (subunits, v, i) { | |
| }; | |
| CSL.NameOutput.prototype.setEtAlParameters = function () { | |
| var i, ilen, j, jlen; | |
| - if (!this.etal_spec) { | |
| - this.etal_spec = []; | |
| - } | |
| for (i = 0, ilen = this.variables.length; i < ilen; i += 1) { | |
| var v = this.variables[i]; | |
| if (this.freeters[v].length) { | |
| @@ -7178,9 +7269,9 @@ CSL.evaluateLabel = function (node, state, Item, item) { | |
| }; | |
| CSL.evaluateStringPluralism = function (str) { | |
| if (str) { | |
| - var m = str.match(/(?:[0-9],\s*[0-9]|\s+and\s+|&|([0-9]+)\s*[\-\u2013]\s*([0-9]+))/) | |
| - if (m && (!m[1] || parseInt(m[1]) < parseInt(m[2]))) { | |
| - return 1 | |
| + var m = str.match(/(?:[0-9],\s*[0-9]|\s+and\s+|&|([0-9]+)\s*[\-\u2013]\s*([0-9]+))/); | |
| + if (m && (!m[1] || parseInt(m[1], 10) < parseInt(m[2], 10))) { | |
| + return 1; | |
| } | |
| } | |
| return 0; | |
| @@ -7330,13 +7421,6 @@ CSL.dateAsSortKey = function (state, Item, isMacro) { | |
| state.output.append(CSL.Util.Dates[e]["numeric-leading-zeros"](state, value), macroFlag); | |
| } | |
| } | |
| - if (state.registry.registry[Item.id] && state.registry.registry[Item.id].disambig.year_suffix) { | |
| - num = state.registry.registry[Item.id].disambig.year_suffix.toString(); | |
| - num = CSL.Util.padding(num); | |
| - } else { | |
| - num = CSL.Util.padding("0"); | |
| - } | |
| - state.output.append("S"+num, macroFlag); | |
| }; | |
| CSL.Engine.prototype.dateParseArray = function (date_obj) { | |
| var ret, field, dpos, ppos, dp, exts, llen, pos, len, pppos, lllen; | |
| @@ -7618,13 +7702,18 @@ CSL.Node.number = { | |
| this.splice_prefix = state[state.build.area].opt.layout_delimiter; | |
| } | |
| func = function (state, Item, item) { | |
| + var i, ilen, newlst, lst; | |
| if (this.variables.length === 0) { | |
| return; | |
| } | |
| var varname, num, number, m, j, jlen; | |
| varname = this.variables[0]; | |
| state.parallel.StartVariable(this.variables[0]); | |
| - state.parallel.AppendToVariable(Item[this.variables[0]]); | |
| + if (this.variables[0] === "locator") { | |
| + state.parallel.AppendToVariable(Item.section); | |
| + } else { | |
| + state.parallel.AppendToVariable(Item[this.variables[0]]); | |
| + } | |
| var rex = new RegExp("(?:&|, | and |" + state.getTerm("page-range-delimiter") + ")"); | |
| if (varname === 'collection-number' && Item.type === 'legal_case') { | |
| state.tmp.renders_collection_number = true; | |
| @@ -7642,17 +7731,17 @@ CSL.Node.number = { | |
| } else if (varname === "locator" | |
| && item.locator) { | |
| item.locator = item.locator.replace(/([^\\])\s*-\s*/, "$1" + state.getTerm("page-range-delimiter")); | |
| - var m = item.locator.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); | |
| + m = item.locator.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); | |
| if (m) { | |
| - var lst = item.locator.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX); | |
| - for (var i = 0, ilen = lst.length; i < ilen; i += 1) { | |
| + lst = item.locator.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX); | |
| + for (i = 0, ilen = lst.length; i < ilen; i += 1) { | |
| lst[i] = state.fun.page_mangler(lst[i]); | |
| } | |
| - var newlst = [lst[0]]; | |
| + newlst = [lst[0]]; | |
| if (!this.strings.label_form_override && state.tmp.group_context.value()[5]) { | |
| form = state.tmp.group_context.value()[5]; | |
| } | |
| - for (var i = 1, ilen = lst.length; i < ilen; i += 1) { | |
| + for (i = 1, ilen = lst.length; i < ilen; i += 1) { | |
| var subplural = 0; | |
| if (lst[i].match(rex)) { | |
| subplural = 1; | |
| @@ -7686,31 +7775,31 @@ CSL.Node.number = { | |
| } | |
| var values = state.tmp.shadow_numbers[varname].values; | |
| var blob; | |
| - var newstr = "" | |
| + var newstr = ""; | |
| var rangeType = "page"; | |
| - if (["bill","gazette","legislation","legal_case"].indexOf(Item.type) > -1 | |
| + if (["bill","gazette","legislation","legal_case","treaty"].indexOf(Item.type) > -1 | |
| && varname === "collection-number") { | |
| rangeType = "year"; | |
| } | |
| if (((varname === "number" | |
| - && ["bill","gazette","legislation"].indexOf(Item.type) > -1) | |
| + && ["bill","gazette","legislation","treaty"].indexOf(Item.type) > -1) | |
| || state.opt[rangeType + "-range-format"]) | |
| && !this.strings.prefix && !this.strings.suffix | |
| && !this.strings.form) { | |
| - for (var i = 0, ilen = values.length; i < ilen; i += 1) { | |
| + for (i = 0, ilen = values.length; i < ilen; i += 1) { | |
| newstr += values[i][1]; | |
| } | |
| } | |
| - if (newstr && !newstr.match(/^[-.\u20130-9]+$/)) { | |
| + if (newstr && !newstr.match(/^[\-.\u20130-9]+$/)) { | |
| if (varname === "number" | |
| - && ["bill","gazette","legislation"].indexOf(Item.type) > -1) { | |
| + && ["bill","gazette","legislation","treaty"].indexOf(Item.type) > -1) { | |
| var firstword = newstr.split(/\s/)[0]; | |
| if (firstword) { | |
| - var newlst = []; | |
| - var m = newstr.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); | |
| + newlst = []; | |
| + m = newstr.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); | |
| if (m) { | |
| - var lst = newstr.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX); | |
| - for (var i = 1, ilen = lst.length; i < ilen; i += 1) { | |
| + lst = newstr.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX); | |
| + for (i = 1, ilen = lst.length; i < ilen; i += 1) { | |
| newlst.push(state.getTerm(CSL.STATUTE_SUBDIV_STRINGS[m[i - 1].replace(/^\s+/, "")], this.strings.label_form_override)); | |
| newlst.push(lst[i].replace(/^\s+/, "")); | |
| } | |
| @@ -7722,8 +7811,8 @@ CSL.Node.number = { | |
| } else { | |
| if (values.length) { | |
| state.output.openLevel("empty"); | |
| - for (var i = 0, ilen = values.length; i < ilen; i += 1) { | |
| - var blob = new CSL[values[i][0]](values[i][1], values[i][2], Item.id); | |
| + for (i = 0, ilen = values.length; i < ilen; i += 1) { | |
| + blob = new CSL[values[i][0]](values[i][1], values[i][2], Item.id); | |
| if (i > 0) { | |
| blob.strings.prefix = blob.strings.prefix.replace(/^\s*/, ""); | |
| } | |
| @@ -7823,7 +7912,11 @@ CSL.Node.text = { | |
| if (!state.tmp.just_looking) { | |
| if (item && item["author-only"]) { | |
| state.tmp.element_trace.replace("do-not-suppress-me"); | |
| - term = CSL.Output.Formatters["capitalize-first"](state, state.getTerm("reference", "long", "singular")); | |
| + var reference_term = state.getTerm("reference", "long", "singular"); | |
| + if ("undefined" === typeof reference_term) { | |
| + reference_term = "reference"; | |
| + } | |
| + term = CSL.Output.Formatters["capitalize-first"](state, reference_term); | |
| state.output.append(term + " "); | |
| state.tmp.last_element_trace = true; | |
| } | |
| @@ -7926,7 +8019,7 @@ CSL.Node.text = { | |
| state.build.form = false; | |
| state.build.plural = false; | |
| } else if (this.variables_real.length) { | |
| - func = function (state, Item) { | |
| + func = function (state, Item, item) { | |
| var parallel_variable = this.variables[0]; | |
| if (parallel_variable === "title" && form === "short") { | |
| parallel_variable = "shortTitle"; | |
| @@ -7964,6 +8057,9 @@ CSL.Node.text = { | |
| value = value.replace(/([^\\])--*/g,"$1"+state.getTerm("page-range-delimiter")); | |
| value = value.replace(/\\-/g,"-"); | |
| state.output.append(value, this, false, false, true); | |
| + if (this.variables[0] === "locator-revision") { | |
| + state.tmp.done_vars.push("locator-revision"); | |
| + } | |
| } | |
| }; | |
| } else if (this.variables_real[0] === "page-first") { | |
| @@ -8005,13 +8101,18 @@ CSL.Node.text = { | |
| state.output.append(value, this); | |
| } | |
| } | |
| - } | |
| - } else if (this.variables_real[0] === "URL") { | |
| + }; | |
| + } else if (["URL", "DOI"].indexOf(this.variables_real[0]) > -1) { | |
| func = function (state, Item) { | |
| var value; | |
| if (this.variables[0]) { | |
| value = state.getVariable(Item, this.variables[0], form); | |
| if (value) { | |
| + if (state.opt.development_extensions.wrap_url_and_doi) { | |
| + if (!this.decorations.length || this.decorations[0][0] !== "@" + this.variables[0]) { | |
| + this.decorations = [["@" + this.variables[0], "true"]].concat(this.decorations); | |
| + } | |
| + } | |
| state.output.append(value, this, false, false, true); | |
| } | |
| } | |
| @@ -8062,14 +8163,18 @@ CSL.Node.text = { | |
| CSL.Attributes = {}; | |
| CSL.Attributes["@cslid"] = function (state, arg) { | |
| this.cslid = parseInt(arg, 10); | |
| -} | |
| +}; | |
| CSL.Attributes["@is-parallel"] = function (state, arg) { | |
| - if ("true" === arg) { | |
| - this.strings.set_parallel_condition = true; | |
| - } else { | |
| - this.strings.set_parallel_condition = false; | |
| + var values = arg.split(" "); | |
| + for (var i = 0, ilen = values.length; i < ilen; i += 1) { | |
| + if (values[i] === "true") { | |
| + values[i] = true; | |
| + } else if (values[i] === "false") { | |
| + values[i] = false; | |
| + } | |
| } | |
| -} | |
| + this.strings.set_parallel_condition = values; | |
| +}; | |
| CSL.Attributes["@is-plural"] = function (state, arg) { | |
| var func = function (state, Item, item) { | |
| var nameList = Item[arg]; | |
| @@ -8096,15 +8201,15 @@ CSL.Attributes["@is-plural"] = function (state, arg) { | |
| } | |
| } | |
| return ret; | |
| - } | |
| + }; | |
| this.tests.push(func); | |
| -} | |
| +}; | |
| 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; | |
| + subjurisdictions = Item.jurisdiction.split(";").length; | |
| } | |
| if (subjurisdictions) { | |
| subjurisdictions += -1; | |
| @@ -8116,10 +8221,10 @@ CSL.Attributes["@subjurisdictions"] = function (state, arg) { | |
| 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) { | |
| var trydates = arg.split(/\s+/); | |
| var func = function (state, Item, item) { | |
| @@ -8127,15 +8232,15 @@ CSL.Attributes["@has-year-only"] = function (state, arg) { | |
| for (var i = 0, ilen = trydates.length; i < ilen; i += 1) { | |
| var trydate = Item[trydates[i]]; | |
| if (!trydate || trydate.month || trydate.season) { | |
| - ret.push(false) | |
| + ret.push(false); | |
| } else { | |
| - ret.push(true) | |
| + ret.push(true); | |
| } | |
| } | |
| return ret; | |
| }; | |
| this.tests.push(func); | |
| -} | |
| +}; | |
| CSL.Attributes["@has-month-or-season-only"] = function (state, arg) { | |
| var trydates = arg.split(/\s+/); | |
| var func = function (state, Item, item) { | |
| @@ -8143,15 +8248,15 @@ CSL.Attributes["@has-month-or-season-only"] = function (state, arg) { | |
| for (var i = 0, ilen = trydates.length; i < ilen; i += 1) { | |
| var trydate = Item[trydates[i]]; | |
| if (!trydate || (!trydate.month && !trydate.season) || trydate.day) { | |
| - ret.push(false) | |
| + ret.push(false); | |
| } else { | |
| - ret.push(true) | |
| + ret.push(true); | |
| } | |
| } | |
| return ret; | |
| }; | |
| this.tests.push(func); | |
| -} | |
| +}; | |
| CSL.Attributes["@has-day-only"] = function (state, arg) { | |
| var trydates = arg.split(/\s+/); | |
| var func = function (state, Item, item) { | |
| @@ -8159,18 +8264,18 @@ CSL.Attributes["@has-day-only"] = function (state, arg) { | |
| for (var i = 0, ilen = trydates.length; i < ilen; i += 1) { | |
| var trydate = Item[trydates[i]]; | |
| if (!trydate || !trydate.day) { | |
| - ret.push(false) | |
| + ret.push(false); | |
| } else { | |
| - ret.push(true) | |
| + ret.push(true); | |
| } | |
| } | |
| return ret; | |
| }; | |
| this.tests.push(func); | |
| -} | |
| +}; | |
| CSL.Attributes["@part-separator"] = function (state, arg) { | |
| this.strings["part-separator"] = arg; | |
| -} | |
| +}; | |
| CSL.Attributes["@context"] = function (state, arg) { | |
| var func = function (state, Item) { | |
| var area = state.tmp.area.slice(0, arg.length); | |
| @@ -8281,7 +8386,7 @@ CSL.Attributes["@variable"] = function (state, arg) { | |
| if (variable === "authority" | |
| && "string" === typeof Item[variable] | |
| && "names" === this.name) { | |
| - Item[variable] = [{family:Item[variable],isInstitution:true}] | |
| + Item[variable] = [{family:Item[variable],isInstitution:true}]; | |
| } | |
| if (this.strings.form === "short" && !Item[variable]) { | |
| if (variable === "title") { | |
| @@ -8293,8 +8398,7 @@ CSL.Attributes["@variable"] = function (state, arg) { | |
| if (variable === "year-suffix") { | |
| output = true; | |
| break; | |
| - } | |
| - if (CSL.DATE_VARIABLES.indexOf(variable) > -1) { | |
| + } else if (CSL.DATE_VARIABLES.indexOf(variable) > -1) { | |
| if (state.opt.development_extensions.locator_date_and_revision && "locator-date" === variable) { | |
| output = true; | |
| break; | |
| @@ -8375,7 +8479,7 @@ CSL.Attributes["@variable"] = function (state, arg) { | |
| var hereinafter_info = state.transform.getHereinafter(myitem); | |
| state.transform.loadAbbreviation(hereinafter_info[0], "hereinafter", hereinafter_info[1]); | |
| if (state.transform.abbrevs[hereinafter_info[0]].hereinafter[hereinafter_info[1]]) { | |
| - x = true | |
| + x = true; | |
| } | |
| } else if (myitem[variable]) { | |
| if ("number" === typeof myitem[variable] || "string" === typeof myitem[variable]) { | |
| @@ -8547,10 +8651,14 @@ CSL.Attributes["@is-numeric"] = function (state, arg) { | |
| state.processNumber(false, Item, variables[pos], Item.type); | |
| } | |
| } | |
| + var myitem = Item; | |
| + if (["locator-revision"].indexOf(variables[pos]) > -1) { | |
| + myitem = item; | |
| + } | |
| if (!state.tmp.shadow_numbers[variables[pos]].numeric | |
| - && !(variables[pos] === 'title' | |
| - && Item[variables[pos]] | |
| - && Item[variables[pos]].slice(-1) === "" + parseInt(Item[variables[pos]].slice(-1)))) { | |
| + && !(['title', 'locator-revision'].indexOf(variables[pos]) > -1 | |
| + && myitem[variables[pos]] | |
| + && myitem[variables[pos]].slice(-1) === "" + parseInt(myitem[variables[pos]].slice(-1), 10))) { | |
| numeric = false; | |
| break; | |
| } | |
| @@ -8626,12 +8734,12 @@ CSL.Attributes["@page"] = function (state, arg) { | |
| var ret = []; | |
| var label; | |
| state.processNumber(false, Item, "page", Item.type); | |
| - if (!state.tmp.shadow_numbers["page"].label) { | |
| + if (!state.tmp.shadow_numbers.page.label) { | |
| label = "page"; | |
| - } else if (state.tmp.shadow_numbers["page"].label === "sub verbo") { | |
| + } else if (state.tmp.shadow_numbers.page.label === "sub verbo") { | |
| label = "sub-verbo"; | |
| } else { | |
| - label = state.tmp.shadow_numbers["page"].label; | |
| + label = state.tmp.shadow_numbers.page.label; | |
| } | |
| for (var i = 0, ilen = trylabels.length; i < ilen; i += 1) { | |
| if (trylabels[i] === label) { | |
| @@ -8654,12 +8762,12 @@ CSL.Attributes["@number"] = function (state, arg) { | |
| var ret = []; | |
| var label; | |
| state.processNumber(false, Item, "number", Item.type); | |
| - if (!state.tmp.shadow_numbers["number"].label) { | |
| + if (!state.tmp.shadow_numbers.number.label) { | |
| label = "number"; | |
| - } else if (state.tmp.shadow_numbers["number"].label === "sub verbo") { | |
| + } else if (state.tmp.shadow_numbers.number.label === "sub verbo") { | |
| label = "sub-verbo"; | |
| } else { | |
| - label = state.tmp.shadow_numbers["number"].label; | |
| + label = state.tmp.shadow_numbers.number.label; | |
| } | |
| for (var i = 0, ilen = trylabels.length; i < ilen; i += 1) { | |
| if (trylabels[i] === label) { | |
| @@ -8692,7 +8800,7 @@ CSL.Attributes["@position"] = function (state, arg) { | |
| state.opt.update_mode = CSL.POSITION; | |
| if ("near-note" === arg) { | |
| var near_note_func = function (state, Item, item) { | |
| - if (item && item["position"] === CSL.POSITION_SUBSEQUENT && item["near-note"]) { | |
| + if (item && item.position === CSL.POSITION_SUBSEQUENT && item["near-note"]) { | |
| return true; | |
| } | |
| return false; | |
| @@ -8734,7 +8842,7 @@ CSL.Attributes["@position"] = function (state, arg) { | |
| this.tests.push(func); | |
| } | |
| } | |
| -} | |
| +}; | |
| CSL.Attributes["@disambiguate"] = function (state, arg) { | |
| if (this.tokentype === CSL.START && ["if", "else-if"].indexOf(this.name) > -1) { | |
| if (arg === "true") { | |
| @@ -8967,10 +9075,10 @@ CSL.Attributes["@use-first"] = function (state, arg) { | |
| }; | |
| CSL.Attributes["@stop-last"] = function (state, arg) { | |
| this.strings["stop-last"] = parseInt(arg, 10) * -1; | |
| -} | |
| +}; | |
| CSL.Attributes["@oops"] = function (state, arg) { | |
| this.strings.oops = arg; | |
| -} | |
| +}; | |
| CSL.Attributes["@use-last"] = function (state, arg) { | |
| this.strings["use-last"] = parseInt(arg, 10); | |
| }; | |
| @@ -9354,7 +9462,7 @@ CSL.Transform = function (state) { | |
| hereinafter_metadata.push("type:" + Item.type); | |
| } | |
| var date_segment = Item.issued | |
| - if (["bill","gazette","legislation","legal_case"].indexOf(Item.type) > -1) { | |
| + if (["bill","gazette","legislation","legal_case","treaty"].indexOf(Item.type) > -1) { | |
| date_segment = Item["original-date"]; | |
| } | |
| if (date_segment) { | |
| @@ -9406,7 +9514,8 @@ CSL.Parallel = function (state) { | |
| this.try_cite = true; | |
| this.use_parallels = true; | |
| this.midVars = ["section", "volume", "container-title", "collection-number", "issue", "page", "page-first", "number"]; | |
| - this.ignoreVars = ["locator", "first-reference-note-number"]; | |
| + this.ignoreVarsOther = ["first-reference-note-number", "locator", "label"]; | |
| + this.ignoreVarsOrders = ["first-reference-note-number"]; | |
| }; | |
| CSL.Parallel.prototype.isMid = function (variable) { | |
| return (this.midVars.indexOf(variable) > -1); | |
| @@ -9431,6 +9540,11 @@ CSL.Parallel.prototype.StartCitation = function (sortedItems, out) { | |
| }; | |
| CSL.Parallel.prototype.StartCite = function (Item, item, prevItemID) { | |
| var position, len, pos, x, curr, master, last_id, prev_locator, curr_locator, is_master, parallel; | |
| + if (["treaty"].indexOf(Item.type) > -1) { | |
| + this.ignoreVars = this.ignoreVarsOrders; | |
| + } else { | |
| + this.ignoreVars = this.ignoreVarsOther; | |
| + } | |
| if (this.use_parallels) { | |
| if (this.sets.value().length && this.sets.value()[0].itemId == Item.id) { | |
| this.ComposeSet(); | |
| @@ -9447,7 +9561,14 @@ CSL.Parallel.prototype.StartCite = function (Item, item, prevItemID) { | |
| break; | |
| } | |
| } | |
| - if (!has_required_var || CSL.PARALLEL_TYPES.indexOf(Item.type) === -1) { | |
| + var title_ok = true; | |
| + var last_cite = this.sets.value().slice(-1)[0]; | |
| + if (last_cite && (last_cite.Item.title || Item.title)) { | |
| + if (last_cite.Item.title !== Item.title) { | |
| + title_ok = false; | |
| + } | |
| + } | |
| + if (!title_ok || !has_required_var || CSL.PARALLEL_TYPES.indexOf(Item.type) === -1) { | |
| this.try_cite = true; | |
| if (this.in_series) { | |
| this.in_series = false; | |
| @@ -9587,7 +9708,8 @@ CSL.Parallel.prototype.CloseVariable = function () { | |
| } | |
| } else if (this.target === "back") { | |
| if (prev[this.variable]) { | |
| - if (this.data.value !== prev[this.variable].value && this.sets.value().slice(-1)[0].back_forceme.indexOf(this.variable) === -1) { | |
| + if (this.data.value !== prev[this.variable].value | |
| + && this.sets.value().slice(-1)[0].back_forceme.indexOf(this.variable) === -1) { | |
| this.in_series = false; | |
| } | |
| } | |
| @@ -9667,16 +9789,13 @@ CSL.Parallel.prototype.CloseCite = function () { | |
| CSL.Parallel.prototype.ComposeSet = function (next_output_in_progress) { | |
| var cite, pos, master, len; | |
| if (this.use_parallels) { | |
| - if (this.sets.value().length === 0) { | |
| - this.purgeGroupsIfParallel(false); | |
| - } else if (this.sets.value().length === 1) { | |
| + var lengthCheck = this.sets.value().length; | |
| + if (this.sets.value().length === 1) { | |
| if (!this.in_series) { | |
| this.sets.value().pop(); | |
| this.delim_counter += 1; | |
| } | |
| - this.purgeGroupsIfParallel(false); | |
| } else { | |
| - this.purgeGroupsIfParallel(true); | |
| len = this.sets.value().length; | |
| for (pos = 0; pos < len; pos += 1) { | |
| cite = this.sets.value()[pos]; | |
| @@ -9713,6 +9832,11 @@ CSL.Parallel.prototype.ComposeSet = function (next_output_in_progress) { | |
| } | |
| this.sets.push([]); | |
| } | |
| + if (lengthCheck < 2) { | |
| + this.purgeGroupsIfParallel(false); | |
| + } else { | |
| + this.purgeGroupsIfParallel(true); | |
| + } | |
| this.in_series = true; | |
| } | |
| }; | |
| @@ -9769,11 +9893,21 @@ CSL.Parallel.prototype.purgeVariableBlobs = function (cite, varnames) { | |
| } | |
| } | |
| }; | |
| -CSL.Parallel.prototype.purgeGroupsIfParallel = function (opposite_condition) { | |
| - var condition = !opposite_condition; | |
| +CSL.Parallel.prototype.purgeGroupsIfParallel = function (original_condition) { | |
| for (var i = this.parallel_conditional_blobs_list.length - 1; i > -1; i += -1) { | |
| var obj = this.parallel_conditional_blobs_list[i]; | |
| - if (obj.condition === condition) { | |
| + var purgeme = true; | |
| + for (var j = 0, jlen = obj.conditions.length; j < jlen; j += 1) { | |
| + if (!(!obj.conditions[j] === !!original_condition | |
| + || ("master" === obj.conditions[j] | |
| + && !this.state.registry.registry[obj.id].master) | |
| + || ("servant" === obj.conditions[j] | |
| + && !this.state.registry.registry[obj.id].parallel))) { | |
| + var purgeme = false; | |
| + break; | |
| + } | |
| + } | |
| + if (purgeme) { | |
| var buffer = []; | |
| while (obj.blobs.length > obj.pos) { | |
| buffer.push(obj.blobs.pop()); | |
| @@ -9794,7 +9928,7 @@ CSL.Token = function (name, tokentype) { | |
| this.strings.delimiter = undefined; | |
| this.strings.prefix = ""; | |
| this.strings.suffix = ""; | |
| - this.decorations = false; | |
| + this.decorations = []; | |
| this.variables = []; | |
| this.execs = []; | |
| this.tokentype = tokentype; | |
| @@ -9954,7 +10088,8 @@ CSL.NumericBlob.prototype.checkLast = function (last) { | |
| return false; | |
| }; | |
| CSL.Util.fixDateNode = function (parent, pos, node) { | |
| - var form, variable, datexml, subnode, partname, attr, val, prefix, suffix, children, key, subchildren, kkey, display; | |
| + var form, variable, datexml, subnode, partname, attr, val, prefix, suffix, children, key, subchildren, kkey, display, cslid; | |
| + this.state.build.date_key = true; | |
| form = this.sys.xml.getAttributeValue(node, "form"); | |
| var lingo = this.sys.xml.getAttributeValue(node, "lingo"); | |
| if (!this.state.getDate(form)) { | |
| @@ -9965,10 +10100,12 @@ CSL.Util.fixDateNode = function (parent, pos, node) { | |
| prefix = this.sys.xml.getAttributeValue(node, "prefix"); | |
| suffix = this.sys.xml.getAttributeValue(node, "suffix"); | |
| display = this.sys.xml.getAttributeValue(node, "display"); | |
| + cslid = this.sys.xml.getAttributeValue(node, "cslid"); | |
| datexml = this.sys.xml.nodeCopy(this.state.getDate(form)); | |
| this.sys.xml.setAttribute(datexml, 'lingo', this.state.opt.lang); | |
| this.sys.xml.setAttribute(datexml, 'form', form); | |
| this.sys.xml.setAttribute(datexml, 'date-parts', dateparts); | |
| + this.sys.xml.setAttribute(datexml, "cslid", cslid); | |
| this.sys.xml.setAttribute(datexml, 'variable', variable); | |
| if (prefix) { | |
| this.sys.xml.setAttribute(datexml, "prefix", prefix); | |
| @@ -10048,7 +10185,7 @@ CSL.Util.Names.initializeWith = function (state, name, terminator, normalizeOnly | |
| namelist = namelist.replace(/\-/g, " "); | |
| } | |
| namelist = namelist.replace(/\s*\-\s*/g, "-").replace(/\s+/g, " "); | |
| - namelist = namelist.replace(/-([a-z])/g, "\u2013$1") | |
| + namelist = namelist.replace(/-([a-z])/g, "\u2013$1"); | |
| mm = namelist.match(/[\-\s]+/g); | |
| lst = namelist.split(/[\-\s]+/); | |
| if (lst.length === 0) { | |
| @@ -10080,7 +10217,7 @@ CSL.Util.Names.initializeWith = function (state, name, terminator, normalizeOnly | |
| } else { | |
| ret = CSL.Util.Names.doInitialize(state, lst, terminator); | |
| } | |
| - ret = ret.replace(/\u2013([a-z])/g, "-$1") | |
| + ret = ret.replace(/\u2013([a-z])/g, "-$1"); | |
| return ret; | |
| }; | |
| CSL.Util.Names.doNormalize = function (state, namelist, terminator, mode) { | |
| @@ -10636,11 +10773,11 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable, type) | |
| this.tmp.shadow_numbers[variable].plural = 1; | |
| } | |
| if ("locator" === variable | |
| - && ["bill","gazette","legislation"].indexOf(type) > -1) { | |
| + && ["bill","gazette","legislation","treaty"].indexOf(type) > -1) { | |
| num = num.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX)[0]; | |
| } | |
| var rangeType = "page"; | |
| - if (["bill","gazette","legislation","legal_case"].indexOf(type) > -1 | |
| + if (["bill","gazette","legislation","legal_case","treaty"].indexOf(type) > -1 | |
| && variable === "collection-number") { | |
| rangeType = "year"; | |
| } | |
| @@ -10649,7 +10786,9 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable, type) | |
| if (m){ | |
| this.tmp.shadow_numbers[variable].label = CSL.STATUTE_SUBDIV_STRINGS[m[0]]; | |
| var mm = num.match(/[^ ]+\s+(.*)/); | |
| - num = mm[1]; | |
| + if (mm) { | |
| + num = mm[1]; | |
| + } | |
| } | |
| } | |
| var lst = num.split(/(?:,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/); | |
| @@ -11000,15 +11139,16 @@ CSL.Util.FlipFlopper.prototype.init = function (str, blob) { | |
| this.blobstack = new CSL.Stack(this.blob); | |
| }; | |
| CSL.Util.FlipFlopper.prototype._normalizeString = function (str) { | |
| + var i, ilen; | |
| if (str.indexOf(this.quotechars[0]) > -1) { | |
| - for (var i = 0, ilen = 2; i < ilen; i += 1) { | |
| + for (i = 0, ilen = 2; i < ilen; i += 1) { | |
| if (this.quotechars[i + 2]) { | |
| str = str.replace(this.quotechars[i + 2], this.quotechars[0]); | |
| } | |
| } | |
| } | |
| if (str.indexOf(this.quotechars[1]) > -1) { | |
| - for (var i = 0, ilen = 2; i < ilen; i += 1) { | |
| + for (i = 0, ilen = 2; i < ilen; i += 1) { | |
| if (this.quotechars[i + 4]) { | |
| if (i === 0) { | |
| str = str.replace(this.quotechars[i + 4], " " + this.quotechars[1]); | |
| @@ -11457,6 +11597,12 @@ CSL.Output.Formats.prototype.html = { | |
| }, | |
| "@showid/true": function (state, str, cslid) { | |
| return "<span class=\"" + state.opt.nodenames[cslid] + "\" cslid=\"" + cslid + "\">" + str + "</span>"; | |
| + }, | |
| + "@URL/true": function (state, str) { | |
| + return "<a href=\"" + str + "\">" + str + "</a>"; | |
| + }, | |
| + "@DOI/true": function (state, str) { | |
| + return "<a href=\"http://dx.doi.org/" + str + "\">" + str + "</a>"; | |
| } | |
| }; | |
| CSL.Output.Formats.prototype.text = { | |
| @@ -11511,6 +11657,12 @@ CSL.Output.Formats.prototype.text = { | |
| }, | |
| "@display/indent": function (state, str) { | |
| return "\n "+str; | |
| + }, | |
| + "@url/true": function (state, str) { | |
| + return str; | |
| + }, | |
| + "@doi/true": function (state, str) { | |
| + return str; | |
| } | |
| }; | |
| CSL.Output.Formats.prototype.rtf = { | |
| @@ -11571,6 +11723,12 @@ CSL.Output.Formats.prototype.rtf = { | |
| }, | |
| "@display/indent": function (state, str) { | |
| return "\n\\tab "+str; | |
| + }, | |
| + "@url/true": function (state, str) { | |
| + return str; | |
| + }, | |
| + "@doi/true": function (state, str) { | |
| + return str; | |
| } | |
| }; | |
| CSL.Output.Formats = new CSL.Output.Formats(); | |
| @@ -11617,6 +11775,7 @@ CSL.Registry.prototype.init = function (myitems, uncited_flag) { | |
| var i, ilen; | |
| this.oldseq = {}; | |
| var tmphash = {}; | |
| + myitems.reverse(); | |
| for (i = myitems.length - 1; i > -1; i += -1) { | |
| if (tmphash[myitems[i]]) { | |
| myitems = myitems.slice(0, i).concat(myitems.slice(i + 1)); | |
| @@ -11624,6 +11783,7 @@ CSL.Registry.prototype.init = function (myitems, uncited_flag) { | |
| tmphash[myitems[i]] = true; | |
| } | |
| } | |
| + myitems.reverse(); | |
| if (uncited_flag && this.mylist && this.mylist.length) { | |
| this.uncited = myitems; | |
| for (i = 0, ilen = myitems.length; i < ilen; i += 1) { | |
| @@ -11642,6 +11802,7 @@ CSL.Registry.prototype.init = function (myitems, uncited_flag) { | |
| } | |
| this.refreshes = {}; | |
| this.touched = {}; | |
| + this.ambigsTouched = {}; | |
| }; | |
| CSL.Registry.prototype.dodeletes = function (myhash) { | |
| var otheritems, key, ambig, pos, len, items, kkey, mypos, id; | |
| @@ -11650,15 +11811,13 @@ CSL.Registry.prototype.dodeletes = function (myhash) { | |
| myhash[myhash] = true; | |
| } | |
| for (key in this.registry) { | |
| - if (this.registry.hasOwnProperty(key) && !myhash[key]) { | |
| + if (!myhash[key]) { | |
| if (this.registry[key].uncited) { | |
| continue; | |
| } | |
| otheritems = this.namereg.delitems(key); | |
| for (kkey in otheritems) { | |
| - if (otheritems.hasOwnProperty(kkey)) { | |
| - this.refreshes[kkey] = true; | |
| - } | |
| + this.refreshes[kkey] = true; | |
| } | |
| ambig = this.registry[key].ambig; | |
| mypos = this.ambigcites[ambig].indexOf(key); | |
| @@ -11705,6 +11864,7 @@ CSL.Registry.prototype.doinserts = function (mylist) { | |
| } | |
| } | |
| akey = CSL.getAmbiguousCite.call(this.state, Item); | |
| + this.ambigsTouched[akey] = true; | |
| if (!Item.legislation_id) { | |
| this.akeys[akey] = true; | |
| } | |
| @@ -11755,35 +11915,30 @@ CSL.Registry.prototype.rebuildlist = function () { | |
| CSL.Registry.prototype.dorefreshes = function () { | |
| var key, regtoken, Item, old_akey, akey, abase; | |
| for (key in this.refreshes) { | |
| - if (this.refreshes.hasOwnProperty(key)) { | |
| - regtoken = this.registry[key]; | |
| - delete this.registry[key]; | |
| - if (!regtoken) { | |
| - continue; | |
| - } | |
| - regtoken.disambig = undefined; | |
| - regtoken.sortkeys = undefined; | |
| - regtoken.ambig = undefined; | |
| - Item = this.state.retrieveItem(key); | |
| - var akey = regtoken.ambig; | |
| - if ("undefined" === typeof akey) { | |
| - akey = CSL.getAmbiguousCite.call(this.state, Item); | |
| - this.state.tmp.taintedItemIDs[key] = true; | |
| - } | |
| - this.registry[key] = regtoken; | |
| - abase = CSL.getAmbigConfig.call(this.state); | |
| - this.registerAmbigToken(akey, key, abase); | |
| - if (!Item.legislation_id) { | |
| - this.akeys[akey] = true; | |
| - } | |
| - this.touched[key] = true; | |
| + regtoken = this.registry[key]; | |
| + if (!regtoken) { | |
| + continue; | |
| + } | |
| + regtoken.sortkeys = undefined; | |
| + Item = this.state.retrieveItem(key); | |
| + var akey = regtoken.ambig; | |
| + if ("undefined" === typeof akey) { | |
| + akey = CSL.getAmbiguousCite.call(this.state, Item); | |
| } | |
| + this.state.tmp.taintedItemIDs[key] = true; | |
| + abase = CSL.getAmbigConfig.call(this.state); | |
| + this.registerAmbigToken(akey, key, abase); | |
| + this.ambigsTouched[akey] = true; | |
| + if (!Item.legislation_id) { | |
| + this.akeys[akey] = true; | |
| + } | |
| + this.touched[key] = true; | |
| } | |
| }; | |
| CSL.Registry.prototype.setdisambigs = function () { | |
| var akey, leftovers, key, pos, len, id; | |
| this.leftovers = []; | |
| - for (akey in this.akeys) { | |
| + for (akey in this.ambigsTouched) { | |
| this.state.disambiguate.run(akey); | |
| } | |
| this.akeys = {}; | |
| @@ -11797,7 +11952,12 @@ CSL.Registry.prototype.renumber = function () { | |
| for (pos = 0; pos < len; pos += 1) { | |
| item = this.reflist[pos]; | |
| item.seq = (pos + 1); | |
| - if (this.state.tmp.taintedItemIDs && item.seq != this.oldseq[item.id]) { | |
| + var hasTaints = false; | |
| + for (var key in this.state.tmp.taintedItemIDs) { | |
| + hasTaints = true; | |
| + break; | |
| + } | |
| + if (hasTaints && item.seq != this.oldseq[item.id]) { | |
| if (this.state.opt.update_mode === CSL.NUMERIC) { | |
| this.state.tmp.taintedItemIDs[item.id] = true; | |
| } | |
| @@ -11813,11 +11973,12 @@ CSL.Registry.prototype.renumber = function () { | |
| }; | |
| CSL.Registry.prototype.setsortkeys = function () { | |
| var key; | |
| - for (key in this.touched) { | |
| - if (this.touched.hasOwnProperty(key)) { | |
| - this.registry[key].sortkeys = CSL.getSortKeys.call(this.state, this.state.retrieveItem(key), "bibliography_sort"); | |
| - } | |
| - } | |
| + for (var i = 0, ilen = this.mylist.length; i < ilen; i += 1) { | |
| + var key = this.mylist[i]; | |
| + if (this.touched[key] || this.state.tmp.taintedItemIDs[key]) { | |
| + this.registry[key].sortkeys = CSL.getSortKeys.call(this.state, this.state.retrieveItem(key), "bibliography_sort"); | |
| + } | |
| + } | |
| }; | |
| CSL.Registry.prototype.sorttokens = function () { | |
| this.reflist.sort(this.sorter.compareKeys); | |
| @@ -11910,7 +12071,7 @@ CSL.getSortKeys = function (Item, key_type) { | |
| return this[key_type].keys; | |
| }; | |
| CSL.Registry.NameReg = function (state) { | |
| - var pkey, ikey, skey, floor, ceiling, dagopt, gdropt, ret, pos, items, strip_periods, set_keys, evalname, delitems, addname, key, myitems; | |
| + var pkey, ikey, skey, floor, ceiling, dagopt, gdropt, ret, pos, items, strip_periods, set_keys, evalname, delitems, addname, key, myitems, i, ilen; | |
| this.state = state; | |
| this.namereg = {}; | |
| this.nameind = {}; | |
| @@ -11983,67 +12144,6 @@ CSL.Registry.NameReg = function (state) { | |
| param = 0; | |
| } | |
| } | |
| - if (param === 0) { | |
| - pos = this.namereg[pkey].ikey[ikey].items.indexOf("" + item_id); | |
| - items = this.namereg[pkey].ikey[ikey].items; | |
| - if (pos > -1) { | |
| - items = items.slice(0, pos).concat(items.slice(pos + 1)); | |
| - } | |
| - for (pos = 0, len = items.length; pos < len; pos += 1) { | |
| - this.state.tmp.taintedItemIDs[items[pos]] = true; | |
| - } | |
| - pos = this.namereg[pkey].ikey[ikey].skey[skey].items.indexOf("" + item_id); | |
| - items = this.namereg[pkey].ikey[ikey].skey[skey].items; | |
| - if (pos > -1) { | |
| - items = items.slice(0, pos).concat(items.slice(pos + 1)); | |
| - } | |
| - for (pos = 0, len = items.length; pos < len; pos += 1) { | |
| - this.state.tmp.taintedItemIDs[items[pos]] = true; | |
| - } | |
| - if (this.namereg[pkey].items.indexOf("" + item_id) === -1) { | |
| - this.namereg[pkey].items.push("" + item_id); | |
| - } | |
| - } else if (param === 1) { | |
| - pos = this.namereg[pkey].items.indexOf("" + item_id); | |
| - items = this.namereg[pkey].items; | |
| - if (pos > -1) { | |
| - items = items.slice(0, pos).concat(items.slice(pos + 1)); | |
| - } | |
| - for (pos = 0, len = items.length; pos < len; pos += 1) { | |
| - this.state.tmp.taintedItemIDs[items[pos]] = true; | |
| - } | |
| - pos = this.namereg[pkey].ikey[ikey].skey[skey].items.indexOf("" + item_id); | |
| - items = this.namereg[pkey].ikey[ikey].skey[skey].items; | |
| - if (pos > -1) { | |
| - items = items.slice(0, pos).concat(items.slice(pos + 1)); | |
| - } | |
| - for (pos = 0, len = items.length; pos < len; pos += 1) { | |
| - this.state.tmp.taintedItemIDs[items[pos]] = true; | |
| - } | |
| - if (this.namereg[pkey].ikey[ikey].items.indexOf("" + item_id) === -1) { | |
| - this.namereg[pkey].ikey[ikey].items.push("" + item_id); | |
| - } | |
| - } else if (param === 2) { | |
| - pos = this.namereg[pkey].items.indexOf("" + item_id); | |
| - items = this.namereg[pkey].items; | |
| - if (pos > -1) { | |
| - items = items.slice(0, pos).concat(items.slice(pos + 1)); | |
| - } | |
| - for (pos = 0, len = items.length; pos < len; pos += 1) { | |
| - this.state.tmp.taintedItemIDs[items[pos]] = true; | |
| - } | |
| - pos = this.namereg[pkey].ikey[ikey].items.indexOf("" + item_id); | |
| - items = this.namereg[pkey].ikey[ikey].items; | |
| - if (pos > -1) { | |
| - items = items.slice(0, pos).concat(items.slice(pos + 1)); | |
| - } | |
| - for (pos = 0, len = items.length; pos < len; pos += 1) { | |
| - this.state.tmp.taintedItemIDs[items[pos]] = true; | |
| - } | |
| - if (this.namereg[pkey].ikey[ikey].skey[skey].items.indexOf("" + item_id) === -1) { | |
| - this.namereg[pkey].ikey[ikey].skey[skey].items.push("" + item_id); | |
| - } | |
| - } | |
| if (!state.registry.registry[item_id]) { | |
| if (form == "short") { | |
| return 0; | |
| @@ -12055,7 +12155,7 @@ CSL.Registry.NameReg = function (state) { | |
| } | |
| }; | |
| delitems = function (ids) { | |
| - var i, item, pos, len, posA, posB, id, fullkey, llen, ppos, otherid; | |
| + var item, pos, len, posA, posB, id, fullkey, llen, ppos, otherid; | |
| if ("string" === typeof ids || "number" === typeof ids) { | |
| ids = ["" + ids]; | |
| } | |
| @@ -12082,12 +12182,14 @@ CSL.Registry.NameReg = function (state) { | |
| if (posB > -1) { | |
| this.namereg[pkey].ikey[ikey].skey[skey].items = myitems.slice(0, posB).concat(myitems.slice([(posB + 1)])); | |
| } | |
| - if (this.namereg[pkey].ikey[ikey].skey[skey].items.length === 1) { | |
| - this.namereg[pkey].ikey[ikey].items.push(this.namereg[pkey].ikey[ikey].skey[skey].items[0]); | |
| - this.namereg[pkey].ikey[ikey].skey[skey].items = []; | |
| - } | |
| - for (ppos = 0, llen = this.namereg[pkey].ikey[ikey].skey[skey].items.length; ppos < llen; ppos += 1) { | |
| - ret[this.namereg[pkey].ikey[ikey].items[ppos]] = true; | |
| + if (this.namereg[pkey].ikey[ikey].skey[skey].items.length === 0) { | |
| + delete this.namereg[pkey].ikey[ikey].skey[skey]; | |
| + this.namereg[pkey].ikey[ikey].count += -1; | |
| + if (this.namereg[pkey].ikey[ikey].count < 2) { | |
| + for (i = 0, ilen = this.namereg[pkey].ikey[ikey].items.length; i < ilen; i += 1) { | |
| + state.tmp.taintedItemIDs[this.namereg[pkey].ikey[ikey].items[i]] = true; | |
| + } | |
| + } | |
| } | |
| } | |
| if (ikey && this.namereg[pkey].ikey[ikey]) { | |
| @@ -12096,12 +12198,14 @@ CSL.Registry.NameReg = function (state) { | |
| items = this.namereg[pkey].ikey[ikey].items.slice(); | |
| this.namereg[pkey].ikey[ikey].items = items.slice(0, posB).concat(items.slice([posB + 1])); | |
| } | |
| - if (this.namereg[pkey].ikey[ikey].items.length === 1) { | |
| - this.namereg[pkey].items.push(this.namereg[pkey].ikey[ikey].items[0]); | |
| - this.namereg[pkey].ikey[ikey].items = []; | |
| - } | |
| - for (ppos = 0, llen = this.namereg[pkey].ikey[ikey].items.length; ppos < llen; ppos += 1) { | |
| - ret[this.namereg[pkey].ikey[ikey].items[ppos]] = true; | |
| + if (this.namereg[pkey].ikey[ikey].items.length === 0) { | |
| + delete this.namereg[pkey].ikey[ikey]; | |
| + this.namereg[pkey].count += -1; | |
| + if (this.namereg[pkey].count < 2) { | |
| + for (i = 0, ilen = this.namereg[pkey].items.length; i < ilen; i += 1) { | |
| + state.tmp.taintedItemIDs[this.namereg[pkey].items[i]] = true; | |
| + } | |
| + } | |
| } | |
| } | |
| if (pkey) { | |
| @@ -12110,9 +12214,6 @@ CSL.Registry.NameReg = function (state) { | |
| items = this.namereg[pkey].items.slice(); | |
| this.namereg[pkey].items = items.slice(0, posB).concat(items.slice([posB + 1], items.length)); | |
| } | |
| - for (ppos = 0, llen = this.namereg[pkey].items.length; ppos < llen; ppos += 1) { | |
| - ret[this.namereg[pkey].items[ppos]] = true; | |
| - } | |
| if (this.namereg[pkey].items.length < 2) { | |
| delete this.namereg[pkey]; | |
| } | |
| @@ -12126,6 +12227,7 @@ CSL.Registry.NameReg = function (state) { | |
| return ret; | |
| }; | |
| addname = function (item_id, nameobj, pos) { | |
| + var i, ilen; | |
| var res = state.nameOutput.getName(nameobj, "locale-translit", true); | |
| nameobj = res.name; | |
| if (state.opt["givenname-disambiguation-rule"] | |
| @@ -12139,7 +12241,9 @@ CSL.Registry.NameReg = function (state) { | |
| this.namereg[pkey] = {}; | |
| this.namereg[pkey].count = 0; | |
| this.namereg[pkey].ikey = {}; | |
| - this.namereg[pkey].items = []; | |
| + this.namereg[pkey].items = [item_id]; | |
| + } else if (this.namereg[pkey].items.indexOf(item_id) === -1) { | |
| + this.namereg[pkey].items.push(item_id); | |
| } | |
| } | |
| if (pkey && ikey) { | |
| @@ -12147,15 +12251,29 @@ CSL.Registry.NameReg = function (state) { | |
| this.namereg[pkey].ikey[ikey] = {}; | |
| this.namereg[pkey].ikey[ikey].count = 0; | |
| this.namereg[pkey].ikey[ikey].skey = {}; | |
| - this.namereg[pkey].ikey[ikey].items = []; | |
| + this.namereg[pkey].ikey[ikey].items = [item_id]; | |
| this.namereg[pkey].count += 1; | |
| + if (this.namereg[pkey].count === 2) { | |
| + for (i = 0, ilen = this.namereg[pkey].items.length; i < ilen; i += 1) { | |
| + state.tmp.taintedItemIDs[this.namereg[pkey].items[i]] = true; | |
| + } | |
| + } | |
| + } else if (this.namereg[pkey].ikey[ikey].items.indexOf(item_id) === -1) { | |
| + this.namereg[pkey].ikey[ikey].items.push(item_id); | |
| } | |
| } | |
| if (pkey && ikey && skey) { | |
| if ("undefined" === typeof this.namereg[pkey].ikey[ikey].skey[skey]) { | |
| this.namereg[pkey].ikey[ikey].skey[skey] = {}; | |
| - this.namereg[pkey].ikey[ikey].skey[skey].items = []; | |
| + this.namereg[pkey].ikey[ikey].skey[skey].items = [item_id]; | |
| this.namereg[pkey].ikey[ikey].count += 1; | |
| + if (this.namereg[pkey].ikey[ikey].count === 2) { | |
| + for (i = 0, ilen = this.namereg[pkey].ikey[ikey].items.length; i < ilen; i += 1) { | |
| + state.tmp.taintedItemIDs[this.namereg[pkey].ikey[ikey].items[i]] = true; | |
| + } | |
| + } | |
| + } else if (this.namereg[pkey].ikey[ikey].skey[skey].items.indexOf(item_id) === -1) { | |
| + this.namereg[pkey].ikey[ikey].skey[skey].items.push(item_id); | |
| } | |
| } | |
| if ("undefined" === typeof this.nameind[item_id]) { | |
| @@ -12183,26 +12301,28 @@ CSL.Disambiguation.prototype.run = function(akey) { | |
| if (!this.modes.length) { | |
| return; | |
| } | |
| - this.initVars(akey); | |
| - this.runDisambig(); | |
| + if (this.initVars(akey)) { | |
| + this.runDisambig(); | |
| + } | |
| }; | |
| CSL.Disambiguation.prototype.runDisambig = function () { | |
| var pos, len, ppos, llen, pppos, lllen, ismax; | |
| this.initGivens = true; | |
| - for (pos = 0; pos < this.lists.length; pos += 1) { | |
| + while (this.lists.length) { | |
| this.gnameset = 0; | |
| this.gname = 0; | |
| this.clashes = [1, 0]; | |
| - while(this.lists[pos][1].length) { | |
| - this.listpos = pos; | |
| + while(this.lists[0][1].length) { | |
| + this.listpos = 0; | |
| if (!this.base) { | |
| - this.base = this.lists[pos][0]; | |
| + this.base = this.lists[0][0]; | |
| } | |
| var names_used = []; | |
| - var ismax = this.incrementDisambig(); | |
| - this.scanItems(this.lists[pos]); | |
| + ismax = this.incrementDisambig(); | |
| + this.scanItems(this.lists[0]); | |
| this.evalScan(ismax); | |
| } | |
| + this.lists = this.lists.slice(1); | |
| } | |
| }; | |
| CSL.Disambiguation.prototype.scanItems = function (list) { | |
| @@ -12238,7 +12358,7 @@ CSL.Disambiguation.prototype.evalScan = function (maxed) { | |
| } | |
| }; | |
| CSL.Disambiguation.prototype.disNames = function (ismax) { | |
| - var pos, len, mybase; | |
| + var pos, len, mybase, i, ilen; | |
| if (this.clashes[1] === 0 && this.nonpartners.length === 1) { | |
| this.captureStepToBase(); | |
| this.state.registry.registerAmbigToken(this.akey, "" + this.nonpartners[0].id, this.betterbase); | |
| @@ -12258,13 +12378,13 @@ CSL.Disambiguation.prototype.disNames = function (ismax) { | |
| } else if (this.clashes[1] < this.clashes[0]) { | |
| this.captureStepToBase(); | |
| this.lists[this.listpos] = [this.betterbase, this.partners]; | |
| - this.lists.push([this.betterbase, this.nonpartners]) | |
| + this.lists.push([this.betterbase, this.nonpartners]); | |
| } else { | |
| if (ismax) { | |
| this.lists[this.listpos] = [this.betterbase, this.nonpartners]; | |
| this.lists.push([this.betterbase, this.partners]); | |
| if (this.modeindex === this.modes.length - 1) { | |
| - for (var i = 0, ilen = this.partners.length; i < ilen; i += 1) { | |
| + for (i = 0, ilen = this.partners.length; i < ilen; i += 1) { | |
| this.state.registry.registerAmbigToken(this.akey, "" + this.partners[i].id, this.betterbase); | |
| } | |
| this.lists[this.listpos] = [this.betterbase, []]; | |
| @@ -12297,10 +12417,16 @@ CSL.Disambiguation.prototype.disYears = function () { | |
| tokens = []; | |
| var base = this.lists[this.listpos][0]; | |
| if (this.clashes[1]) { | |
| - for (pos = 0, len = this.lists[this.listpos][1].length; pos < len; pos += 1) { | |
| - token = this.registry[this.lists[this.listpos][1][pos].id]; | |
| - tokens.push(token); | |
| - } | |
| + for (var i = 0, ilen = this.state.registry.mylist.length; i < ilen; i += 1) { | |
| + var origid = this.state.registry.mylist[i]; | |
| + for (var j = 0, jlen = this.lists[this.listpos][1].length; j < jlen; j += 1) { | |
| + var token = this.lists[this.listpos][1][j]; | |
| + if (token.id == origid) { | |
| + tokens.push(this.registry[token.id]); | |
| + break; | |
| + } | |
| + } | |
| + } | |
| } | |
| tokens.sort(this.state.registry.sorter.compareKeys); | |
| for (pos = 0, len = tokens.length; pos < len; pos += 1) { | |
| @@ -12319,9 +12445,9 @@ CSL.Disambiguation.prototype.incrementDisambig = function () { | |
| this.initGivens = false; | |
| return false; | |
| } | |
| - maxed = false; | |
| - increment_names = true; | |
| - increment_givens = true; | |
| + var maxed = false; | |
| + var increment_names = true; | |
| + var increment_givens = true; | |
| if ("disNames" === this.modes[this.modeindex]) { | |
| increment_names = false; | |
| if ("number" !== typeof this.givensMax) { | |
| @@ -12335,7 +12461,7 @@ CSL.Disambiguation.prototype.incrementDisambig = function () { | |
| if (this.base.givens[this.gnameset][this.gname] < this.givensMax) { | |
| this.base.givens[this.gnameset][this.gname] += 1; | |
| } else { | |
| - var increment_names = true; | |
| + increment_names = true; | |
| } | |
| } | |
| if ("number" === typeof this.namesMax && increment_names) { | |
| @@ -12344,7 +12470,7 @@ CSL.Disambiguation.prototype.incrementDisambig = function () { | |
| this.base.names[this.gnameset] += 1; | |
| this.gname += 1; | |
| } else { | |
| - var increment_namesets = true; | |
| + increment_namesets = true; | |
| } | |
| } | |
| if ("number" === typeof this.namesetsMax && increment_namesets) { | |
| @@ -12375,6 +12501,9 @@ CSL.Disambiguation.prototype.initVars = function (akey) { | |
| this.maxNamesByItemId = {}; | |
| myItemBundles = []; | |
| myIds = this.ambigcites[akey]; | |
| + if (!myIds || !myIds.length) { | |
| + return false; | |
| + } | |
| var Item = false; | |
| var myItem = this.state.retrieveItem("" + myIds[0]); | |
| this.getCiteData(myItem); | |
| @@ -12414,7 +12543,7 @@ CSL.Disambiguation.prototype.initVars = function (akey) { | |
| } | |
| this.modeindex = 0; | |
| this.namesMax = this.maxNamesByItemId[this.Item.id][0]; | |
| - for (var i = 0, ilen = this.base.givens.length; i < ilen; i += 1) { | |
| + for (i = 0, ilen = this.base.givens.length; i < ilen; i += 1) { | |
| for (var j = 0, jlen = this.namesMax; j < jlen; j += 1) { | |
| if (!this.base.givens[i][j]) { | |
| this.base.givens[i][j] = 0; | |
| @@ -12429,6 +12558,7 @@ CSL.Disambiguation.prototype.initVars = function (akey) { | |
| if (this.state.opt["givenname-disambiguation-rule"] === "by-cite") { | |
| this.givensMax = 2; | |
| } | |
| + return true; | |
| }; | |
| CSL.Disambiguation.prototype.configModes = function () { | |
| var dagopt, gdropt; | |
| diff --git a/chrome/content/zotero/xpcom/integration.js b/chrome/content/zotero/xpcom/integration.js | |
| index 5817131..a6aa764 100644 | |
| --- a/chrome/content/zotero/xpcom/integration.js | |
| +++ b/chrome/content/zotero/xpcom/integration.js | |
| @@ -1006,7 +1006,7 @@ Zotero.Integration.Document.prototype.addBibliography = function() { | |
| field = fieldGetter.addField(); | |
| field.setCode("BIBL"); | |
| fieldGetter.updateSession(function() { | |
| - fieldGetter.updateDocument(FORCE_CITATIONS_FALSE, true, false, function() { | |
| + fieldGetter.updateDocument(FORCE_CITATIONS_REGENERATE, true, false, function() { | |
| Zotero.Integration.complete(me._doc); | |
| }); | |
| }); | |
| @@ -1039,7 +1039,7 @@ Zotero.Integration.Document.prototype.editBibliography = function(callback) { | |
| fieldGetter.updateSession(function() { | |
| me._session.editBibliography(me._doc, function() { | |
| me._doc.activate(); | |
| - fieldGetter.updateDocument(FORCE_CITATIONS_FALSE, true, false, function() { | |
| + fieldGetter.updateDocument(FORCE_CITATIONS_REGENERATE, true, false, function() { | |
| Zotero.Integration.complete(me._doc); | |
| }); | |
| }); | |
| @@ -1450,7 +1450,6 @@ Zotero.Integration.Fields.prototype.updateSession = function(callback, errorCall | |
| // if we are reloading this session, assume no item IDs to be updated except for edited items | |
| if(me._session.reload) { | |
| - //this._session.restoreProcessorState(); TODO doesn't appear to be working properly | |
| me._session.updateUpdateIndices(); | |
| Zotero.pumpGenerator(me._session.updateCitations(function(deleteCitations) { | |
| me._deleteFields = me._deleteFields.concat([i for(i in deleteCitations)]); | |
| @@ -1460,7 +1459,7 @@ Zotero.Integration.Fields.prototype.updateSession = function(callback, errorCall | |
| me._session.bibliographyHasChanged = false; | |
| delete me._session.reload; | |
| if(callback) callback(me._session); | |
| - })); | |
| + }, FORCE_CITATIONS_REGENERATE)); | |
| } else { | |
| if(callback) callback(me._session); | |
| } | |
| @@ -1545,10 +1544,12 @@ Zotero.Integration.Fields.prototype.updateDocument = function(forceCitations, fo | |
| try { | |
| this._session.updateUpdateIndices(forceCitations); | |
| var me = this; | |
| + | |
| var deleteCitations = Zotero.pumpGenerator(this._session.updateCitations(function(deleteCitations) { | |
| Zotero.pumpGenerator(me._updateDocument(forceCitations, forceBibliography, | |
| - ignoreCitationChanges, deleteCitations, callback)); | |
| - })); | |
| + ignoreCitationChanges, deleteCitations, callback)); | |
| + }, forceCitations)); | |
| + | |
| } catch(e) { | |
| Zotero.Integration.handleError(e, this._doc); | |
| } | |
| @@ -1564,6 +1565,11 @@ Zotero.Integration.Fields.prototype.updateDocument = function(forceCitations, fo | |
| Zotero.Integration.Fields.prototype._updateDocument = function(forceCitations, forceBibliography, | |
| ignoreCitationChanges, deleteCitations, callback) { | |
| try { | |
| + | |
| + Zotero.Integration.displayDialog(this._doc, | |
| + 'chrome://zotero/content/integration/progressMeter.xul', 'alwaysRaised', false, true); | |
| + | |
| + | |
| // update citations | |
| this._deleteFields = this._deleteFields.concat([i for(i in deleteCitations)]); | |
| @@ -1718,6 +1724,17 @@ Zotero.Integration.Fields.prototype._updateDocument = function(forceCitations, f | |
| Zotero.Integration.Fields.prototype.addEditCitation = function(field, callback) { | |
| var newField, citation, fieldIndex, session = this._session, me = this, loadFirst; | |
| + // Zotero.UnresponsiveScriptIndicator seems built to enable timeout | |
| + // whenever requested, without regard to nesting level. We need the | |
| + // disable to stick throughout the operation, so setting explicit | |
| + // timeout value here at the top level of this potentially long-running | |
| + // function. | |
| + | |
| + var prefService = Components.classes["@mozilla.org/preferences-service;1"]. | |
| + getService(Components.interfaces.nsIPrefBranch); | |
| + var scriptTimeoutPreference = prefService.getIntPref("dom.max_chrome_script_run_time"); | |
| + prefService.setIntPref("dom.max_chrome_script_run_time", 0); | |
| + | |
| // if there's already a citation, make sure we have item IDs in addition to keys | |
| if(field) { | |
| try { | |
| @@ -1784,6 +1801,7 @@ Zotero.Integration.Fields.prototype.addEditCitation = function(field, callback) | |
| Zotero.Integration.displayDialog(this._doc, | |
| 'chrome://zotero/content/integration/quickFormat.xul', mode, io, true); | |
| } | |
| + prefService.setIntPref("dom.max_chrome_script_run_time", scriptTimeoutPreference); | |
| } | |
| /** | |
| @@ -1918,10 +1936,15 @@ Zotero.Integration.CitationEditInterface.prototype = { | |
| } | |
| if(this.citation.citationItems.length) { | |
| - // Citation | |
| + | |
| this._runWhenSessionUpdated(function() { | |
| + | |
| + // Citation | |
| + me._session.newCitation = me.citation; | |
| + | |
| me._session.addCitation(me._fieldIndex, me._field.getNoteIndex(), me.citation); | |
| me._session.updateIndices[me._fieldIndex] = true; | |
| + me._session.citationIndex = me._fieldIndex; | |
| if(!me._session.bibliographyHasChanged) { | |
| var citationItems = me.citation.citationItems; | |
| @@ -2601,26 +2624,27 @@ Zotero.Integration.Session.prototype._getPrePost = function(index) { | |
| /** | |
| * Returns a formatted citation | |
| */ | |
| -Zotero.Integration.Session.prototype.formatCitation = function(index, citation) { | |
| +Zotero.Integration.Session.prototype.formatCitation = function(index, citation, forceCitations) { | |
| if(!this.citationText[index]) { | |
| var citationsPre, citationsPost, citationIndices; | |
| - [citationsPre, citationsPost, citationIndices] = this._getPrePost(index); | |
| + [citationsPre, citationsPost, citationIndices] = this._getPrePost(this.citationIndex); | |
| if(Zotero.Debug.enabled) { | |
| Zotero.debug("Integration: style.processCitationCluster("+citation.toSource()+", "+citationsPre.toSource()+", "+citationsPost.toSource()); | |
| } | |
| - var newCitations = this.style.processCitationCluster(citation, citationsPre, citationsPost); | |
| + // Always assume all items registered. | |
| + var newCitations = this.style.processCitationCluster(citation, citationsPre, citationsPost, 2); | |
| + // Use processor targets. | |
| for each(var newCitation in newCitations[1]) { | |
| this.citationText[citationIndices[newCitation[0]]] = newCitation[1]; | |
| this.updateIndices[citationIndices[newCitation[0]]] = true; | |
| } | |
| - return newCitations.bibchange; | |
| } | |
| } | |
| /** | |
| * Updates the list of citations to be serialized to the document | |
| */ | |
| -Zotero.Integration.Session.prototype.updateCitations = function(callback) { | |
| +Zotero.Integration.Session.prototype.updateCitations = function(callback, forceCitations) { | |
| try { | |
| /*var allUpdatesForced = false; | |
| var forcedUpdates = {}; | |
| @@ -2652,31 +2676,77 @@ Zotero.Integration.Session.prototype.updateCitations = function(callback) { | |
| Zotero.debug("Integration: Indices of updated citations"); | |
| Zotero.debug([key for(key in this.updateIndices)]); | |
| } | |
| - | |
| + | |
| var deleteCitations = {}; | |
| - for each(var indexList in [this.newIndices, this.updateIndices]) { | |
| - for(var index in indexList) { | |
| + | |
| + // We don't rely on these coming in | |
| + this.updateIndices = {}; | |
| + this.newIndices = {}; | |
| + | |
| + if (forceCitations === FORCE_CITATIONS_RESET_TEXT || forceCitations === FORCE_CITATIONS_REGENERATE) { | |
| + var items = []; | |
| + var indexCount = 0; | |
| + var allCitationIndices = []; | |
| + this.style.registry.citationreg.citationByIndex = []; | |
| + for (var i = 0, ilen = this.citationsByIndex.length; i < ilen; i += 1) { | |
| + if ("undefined" === typeof this.citationsByIndex[i]) { | |
| + continue; | |
| + } | |
| + if (this.citationsByIndex[i].properties.delete) { | |
| + continue; | |
| + } | |
| + this.citationsByIndex[i].sortedItems = []; | |
| + for (var j = 0, jlen = this.citationsByIndex[i].citationItems.length; j < jlen; j += 1) { | |
| + var item = this.citationsByIndex[i].citationItems[j]; | |
| + items.push(this.citationsByIndex[i].citationItems[j].id); | |
| + var Item = this.style.retrieveItem(item.id); | |
| + this.citationsByIndex[i].sortedItems.push([Item,item]); | |
| + } | |
| + this.style.registry.citationreg.citationById[this.citationsByIndex[i].citationID] = this.citationsByIndex[i]; | |
| + this.style.registry.citationreg.citationByIndex.push(this.citationsByIndex[i]); | |
| + allCitationIndices[i] = indexCount; | |
| + indexCount += 1; | |
| + } | |
| + // Always rerun ambigs on refresh | |
| + this.style.updateItems(items, false, true); | |
| + for (var i = 0, ilen = this.citationsByIndex.length; i < ilen; i += 1) { | |
| + if ("undefined" === typeof this.citationsByIndex[i]) { | |
| + continue; | |
| + } | |
| + if (this.citationsByIndex[i].properties.delete) { | |
| + deleteCitations[i] = true; | |
| + continue; | |
| + } | |
| + var str = this.style.makeCitationCluster(this.citationsByIndex[i].citationItems); | |
| + if (!this.citationsByIndex[i].properties.dontUpdate) { | |
| + this.citationText[i] = str; | |
| + this.updateIndices[i] = true; | |
| + } | |
| + } | |
| + } else { | |
| + // This branch assumes new citation, but it is not yet present in citationsByIndex. | |
| + // Insert it. | |
| + this.citationsByIndex[this.citationIndex] = this.newCitation; | |
| + var items = []; | |
| + for (var i = 0, ilen = this.citationsByIndex.length; i < ilen; i += 1) { | |
| + if (this.citationsByIndex[i].properties.delete) { | |
| + continue; | |
| + } | |
| + for (var j = 0, jlen = this.citationsByIndex[i].citationItems.length; j < jlen; j += 1) { | |
| + items.push(this.citationsByIndex[i].citationItems[j].id); | |
| + } | |
| + } | |
| + this.style.updateItems(items); | |
| + for each(var index in [this.citationIndex]) { | |
| index = parseInt(index); | |
| - | |
| var citation = this.citationsByIndex[index]; | |
| if(citation.properties.delete) { | |
| deleteCitations[index] = true; | |
| continue; | |
| } | |
| - if(this.formatCitation(index, citation)) { | |
| - this.bibliographyHasChanged = true; | |
| - } | |
| - this.citeprocCitationIDs[citation.citationID] = true; | |
| - delete this.newIndices[index]; | |
| - yield true; | |
| + var res = this.formatCitation(index, citation, forceCitations); | |
| } | |
| } | |
| - | |
| - /*if(allUpdatesForced) { | |
| - this.newIndices = {}; | |
| - this.updateIndices = {}; | |
| - }*/ | |
| - | |
| callback(deleteCitations); | |
| } catch(e) { | |
| Zotero.Integration.handleError(e, this._doc); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment