diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index d858ce096d..a809285172 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -154,6 +154,21 @@ toolbar:not([id="nav-bar"]) #zotero-toolbar-buttons separator { /* End toolbar buttons */ +/* + Override selected, unfocused tree row highlight color, which is too similar to the alternating + row color by default +*/ +#zotero-collections-tree treechildren::-moz-tree-row(selected), +#zotero-items-tree treechildren::-moz-tree-row(selected) { + background-color: #D4D4D4; +} + +#zotero-collections-tree treechildren::-moz-tree-row(selected, focus), +#zotero-items-tree treechildren::-moz-tree-row(selected, focus) { + background-color: Highlight; +} + + @media (min-resolution: 1.5dppx) { #zotero-tb-sync > .toolbarbutton-icon { width: 20px; diff --git a/chrome/content/zotero/locale/csl b/chrome/content/zotero/locale/csl index 891f504dd5..1e9140c53f 160000 --- a/chrome/content/zotero/locale/csl +++ b/chrome/content/zotero/locale/csl @@ -1 +1 @@ -Subproject commit 891f504dd5db78e30abd36d49d4996005a3180a1 +Subproject commit 1e9140c53f38e07f59718d11a6d4f2d09d7c5c8e diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js index d865a2deb6..1f9b52d8c7 100644 --- a/chrome/content/zotero/xpcom/citeproc.js +++ b/chrome/content/zotero/xpcom/citeproc.js @@ -80,13 +80,13 @@ if (!Array.indexOf) { }; } var CSL = { - PROCESSOR_VERSION: "1.1.60", + PROCESSOR_VERSION: "1.1.71", CONDITION_LEVEL_TOP: 1, CONDITION_LEVEL_BOTTOM: 2, PLAIN_HYPHEN_REGEX: /(?:[^\\]-|\u2013)/, LOCATOR_LABELS_REGEXP: new RegExp("^((art|ch|subch|col|fig|l|n|no|op|p|pp|para|subpara|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\\.)\\s+(.*)"), - STATUTE_SUBDIV_GROUPED_REGEX: /((?:^| )(?:art|ch|subch|p|pp|para|subpara|pt|r|sec|subsec|sch|tit)\.)/g, - STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:art|ch|subch|p|pp|para|subpara|pt|r|sec|subsec|sch|tit)\.)/, + STATUTE_SUBDIV_GROUPED_REGEX: /((?:^| )(?:art|bk|ch|subch|col|fig|fol|l|n|no|op|p|pp|para|subpara|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/g, + STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:art|bk|ch|subch|col|fig|fol|l|n|no|op|p|pp|para|subpara|pt|r|sec|subsec|sv|sch|tit|vrs|vol)\. *)/, STATUTE_SUBDIV_STRINGS: { "art.": "article", "bk.": "book", @@ -194,7 +194,7 @@ var CSL = { ], checkNestedBraceOpen: new RegExp(".*\\("), checkNestedBraceClose: new RegExp(".*\\)"), - MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","edition","genre","title-short","medium","jurisdiction","archive","archive-place"], + MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","genre","title-short","medium","jurisdiction","archive","archive-place"], LangPrefsMap: { "title":"titles", "title-short":"titles", @@ -360,16 +360,61 @@ var CSL = { "available-date", "submitted" ], - TAG_ESCAPE: function (str) { + TAG_ESCAPE: function (str, stopWords) { var mx, lst, len, pos, m, buf1, buf2, idx, ret, myret; - mx = str.match(/((?:\"|\')|(?:(?:).*?(?:<\/span>|<\/?(?:i|sc|b)>)))/g); - lst = str.split(/(?:(?:\"|\')|(?:(?:).*?(?:<\/span>|<\/?(?:i|sc|b)>)))/g); - myret = [lst[0]]; - for (pos = 1, len = lst.length; pos < len; pos += 1) { - myret.push(mx[pos - 1]); - myret.push(lst[pos]); + if (!stopWords) { + stopWords = []; } - lst = myret.slice(); + var pairs = { + "": "", + "": "" + }; + var stack = []; + str = str.replace(/()/g, "$1 $2$3"); + var m1match = str.match(/((?: \"| \'|\" |\'[-.,;\?:]|\[|\]|\(|\)||<\/span>|<\/?(?:i|sc|b)>))/g); + if (!m1match) { + return [str]; + } + var m1split = str.split(/(?: \"| \'|\" |\'[-.,;\?:]|\[|\]|\(|\)||<\/span>|<\/?(?:i|sc|b)>)/g); + outer: for (var i=0,ilen=m1match.length; i -1) { + if (!m1split[i-1].match(/[:\?\!]\s*$/)) { + m1match[i-1] = m1match[i-1] + mFirstWord[1]; + m1split[i] = mFirstWord[3]; + } + } + } + continue; + } + if (stack.length) { + for (var j=stack.length-1; j>-1; j--) { + var stackObj = stack.slice(j)[0]; + if (m1match[i] === pairs[stackObj.tag]) { + stack = stack.slice(0, j+1); + var startPos = stack[j].pos; + for (var k=stack[j].pos+1; k lst[i].length || abbrevlen > this.msets[j][k].length) { + for (var k=0,klen=this.monthAbbrevs[j].length; k lst[i].length || abbrevLength > this.monthSets[j][k].length) { CSL.debug("unable to disambiguate month string in date parser: "+lst[i]); break; } else { - abbrevlen += 1; + abbrevLength += 1; } } - insert = abbrevlen; - extend[j][k] = abbrevlen; + insert = abbrevLength; + extendedSets[j][k] = abbrevLength; } } } - for (jkey in extend) { - if (extend.hasOwnProperty(jkey)) { - for (kkey in extend[jkey]) { - if (extend[jkey].hasOwnProperty(kkey)) { - abbrevlen = extend[jkey][kkey]; - jkey = parseInt(jkey, 10); - kkey = parseInt(kkey, 10); - this.mabbrevs[jkey][kkey] = this.msets[jkey][kkey].slice(0, abbrevlen); - } - } + for (var jKey in extendedSets) { + for (kKey in extendedSets[jKey]) { + abbrevLength = extendedSets[jKey][kKey]; + jKey = parseInt(jKey, 10); + kKey = parseInt(kKey, 10); + this.monthAbbrevs[jKey][kKey] = this.monthSets[jKey][kKey].slice(0, abbrevLength); } } } if (!skip) { - this.msets[i].push(lst[i]); - this.mabbrevs[i].push(lst[i].slice(0, insert)); + this.monthSets[i].push(lst[i]); + this.monthAbbrevs[i].push(lst[i].slice(0, insert)); } } - this.mrexes = []; - for (i = 0, ilen = this.mabbrevs.length; i < ilen; i += 1) { - this.mrexes.push(new RegExp("(?:" + this.mabbrevs[i].join("|") + ")")); + this.monthRexes = []; + this.monthRexStrs = []; + for (var i=0,ilen=this.monthAbbrevs.length; i 12) { + ret[("month" + suff)] = "" + lst[this.dayGuess]; + ret[("day" + suff)] = "" + lst[this.monthGuess]; + } else { + ret[("month" + suff)] = "" + lst[this.monthGuess]; + ret[("day" + suff)] = "" + lst[this.dayGuess]; + } + } + }; + this.parseDateToObject = function (txt) { + var orig = txt; + var slashPos = -1; + var dashPos = -1; + var lst; + if (txt) { + txt = "" + txt; + txt = txt.replace(/\s*[0-9]{2}:[0-9]{2}(?::[0-9]+)/,""); + var m = txt.match(kanjiMonthDay); + if (m) { + txt = txt.replace(/\s+/, "", "g"); + txt = txt.replace(kanjiYear, ""); + txt = txt.replace(kanjiMonthDay, "-"); + txt = txt.replace(kanjiRange, "/"); + txt = txt.replace(/\-\//g, "/"); + txt = txt.replace(/-$/g,""); + var slst = txt.split(epochSplitter); + lst = []; + var mm = txt.match(epochMatcher); + if (mm) { + var mmx = []; + for (var i=0,ilen=mm.length; i -1 && dash > -1) { - slashcount = txt.split("/"); - if (slashcount.length > 3) { - range_delim = "-"; - date_delim = "/"; - lst = txt.split(rexslashdash); + if (slashPos > -1 && dashPos > -1) { + var slashCount = txt.split("/"); + if (slashCount.length > 3) { + rangeDelim = "-"; + txt = txt.replace(/\_/g, "-"); + dateDelim = "/"; + lst = txt.split(rexSlashDash); } else { - range_delim = "/"; - date_delim = "-"; - lst = txt.split(rexdashslash); + rangeDelim = "/"; + txt = txt.replace(/\_/g, "/"); + dateDelim = "-"; + lst = txt.split(rexDashSlash); } } else { - txt = txt.replace("/", "-"); - range_delim = "-"; - date_delim = "-"; - lst = txt.split(rexdash); + txt = txt.replace(/\//g, "-"); + txt = txt.replace(/\_/g, "-"); + rangeDelim = "-"; + dateDelim = "-"; + lst = txt.split(rexDash); } - ret = []; - len = lst.length; - for (pos = 0; pos < len; pos += 1) { - item = lst[pos]; - m = item.match(/^\s*([\-\/]|[a-zA-Z]+|[\-~?0-9]+)\s*$/); + var ret = []; + for (var i=0,ilen=lst.length; i -1) { - delims.push([0, delim_pos]); - delims.push([(delim_pos + 1), ret.length]); - isrange = true; + var delimPos = ret.indexOf(rangeDelim); + var delims = []; + var isRange = false; + if (delimPos > -1) { + delims.push([0, delimPos]); + delims.push([(delimPos + 1), ret.length]); + isRange = true; } else { delims.push([0, ret.length]); } - suff = ""; - for (i = 0, ilen = delims.length; i < ilen; i += 1) { + var suff = ""; + for (var i=0,ilen=delims.length; i -1) { - this.parseNumericDate(thedate, date_delim, suff, element); + outer: + for (var j=0,jlen=date.length; j -1) { + this._parseNumericDate(thedate, dateDelim, suff, element); continue; } if (element.match(/[0-9]{4}/)) { thedate[("year" + suff)] = element.replace(/^0*/, ""); continue; } - breakme = false; - for (k = 0, klen = this.mrexes.length; k < klen; k += 1) { - if (element.toLocaleLowerCase().match(this.mrexes[k])) { + for (var k=0,klen=this.monthRexes.length; k 12) { - ret[("month" + suff)] = "" + lst[this.dayguess]; - ret[("day" + suff)] = "" + lst[this.monthguess]; - } else { - ret[("month" + suff)] = "" + lst[this.monthguess]; - ret[("day" + suff)] = "" + lst[this.dayguess]; - } - } - }; + this.parseDateToArray = function(txt) { + return this.convertDateObjectToArray(this.parseDateToObject(txt)); + } + this.parseDateToString = function(txt) { + return this.convertDateObjectToString(this.parseDateToObject(txt)); + } + this.parse = function(txt) { + return this.parseDateToObject(txt); + } + this.setOrderMonthDay(); + this.resetDateParserMonths(); }; CSL.Engine = function (sys, style, lang, forceLang) { var attrs, langspec, localexml, locale; @@ -1423,7 +1467,6 @@ CSL.Engine = function (sys, style, lang, forceLang) { this.opt.development_extensions.static_statute_locator = true; this.opt.development_extensions.handle_parallel_articles = true; this.opt.development_extensions.main_title_from_short_title = true; - this.opt.development_extensions.strict_page_numbers = true; this.opt.development_extensions.rtl_support = true; this.opt.development_extensions.expect_and_symbol_form = true; this.opt.development_extensions.require_explicit_legal_case_title_short = true; @@ -1477,7 +1520,7 @@ CSL.Engine = function (sys, style, lang, forceLang) { this.configureTokenLists(); this.disambiguate = new CSL.Disambiguation(this); this.splice_delimiter = false; - this.fun.dateparser = new CSL.DateParser(); + this.fun.dateparser = CSL.DateParser; this.fun.flipflopper = new CSL.Util.FlipFlopper(this); this.setCloseQuotesArray(); this.fun.ordinalizer.init(this); @@ -1798,20 +1841,25 @@ CSL.Engine.prototype.retrieveItem = function (id) { if (!Item[mm[1]] && CSL.DATE_VARIABLES.indexOf(mm[1]) > -1) { 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]] = []; + if (!names[mm[1]]) { + names[mm[1]] = []; } var lst = mm[2].split(/\s*\|\|\s*/); if (lst.length === 1) { - Item[mm[1]].push({family:lst[0],isInstitution:true}); + names[mm[1]].push({family:lst[0],isInstitution:true}); } else if (lst.length === 2) { - Item[mm[1]].push({family:lst[0],given:lst[1]}); + var name = {family:lst[0],given:lst[1]}; + CSL.parseParticles(name); + names[mm[1]].push(name); } } else if (!Item[mm[1]] || mm[1] === "type") { Item[mm[1]] = mm[2].replace(/^\s+/, "").replace(/\s+$/, ""); } Item.note.replace(CSL.NOTE_FIELD_REGEXP, ""); } + for (var key in names) { + Item[key] = names[key]; + } } } for (var i = 1, ilen = CSL.DATE_VARIABLES.length; i < ilen; i += 1) { @@ -1819,7 +1867,7 @@ CSL.Engine.prototype.retrieveItem = function (id) { if (dateobj) { if (this.opt.development_extensions.raw_date_parsing) { if (dateobj.raw) { - dateobj = this.fun.dateparser.parse(dateobj.raw); + dateobj = this.fun.dateparser.parseDateToObject(dateobj.raw); } } Item[CSL.DATE_VARIABLES[i]] = this.dateParseArray(dateobj); @@ -1852,25 +1900,29 @@ CSL.Engine.prototype.retrieveItem = function (id) { Item["title-short"] = Item.shortTitle; } if (this.opt.development_extensions.main_title_from_short_title) { - Item["title-main"] = Item.title; - Item["title-sub"] = false; - if (Item.title && Item['title-short']) { - var shortTitle = Item['title-short']; - offset = shortTitle.length; - if (Item.title.slice(0,offset) === shortTitle && Item.title.slice(offset).match(/^\s*:/)) { - Item["title-main"] = Item.title.slice(0,offset).replace(/\s+$/,""); - Item["title-sub"] = Item.title.slice(offset).replace(/^\s*:\s*/,""); - if (this.opt.development_extensions.uppercase_subtitles && Item["title-sub"]) { - var subtitle = Item["title-sub"] - for (var i=0,ilen=subtitle.length;i -1) { - item.force_pluralism = 0; - if (!item.label) { - item.label = "page" - } - var loci = ["section","","",""]; - var split; - if (this.opt.development_extensions.static_statute_locator && Item.section) { - splt = Item.section.replace(/^\s+/,"").replace(/\s+$/, "").split(/\s+/); - if (CSL.STATUTE_SUBDIV_STRINGS[splt[0]]) { - loci[0] = " " + splt[0] + " "; - loci[1] = splt.slice(1).join(" "); - } else { - loci[0] = " sec. "; - loci[1] = splt.slice(0).join(" "); - } - } else { - if (this.opt.development_extensions.clobber_locator_if_no_statute_section) { - item.locator = undefined; - item.label = undefined; - } - } if (item.locator) { - var splt = item.locator.replace(/^\s+/,"").replace(/\s+$/, "").split(/\s+/); - if (CSL.STATUTE_SUBDIV_STRINGS[splt[0]]) { - loci[2] = " " + splt[0] + " "; - loci[3] = splt.slice(1).join(" "); - } else if (item.label) { - loci[2] = " " + CSL.STATUTE_SUBDIV_STRINGS_REVERSE[item.label] + " "; - loci[3] = splt.slice(0).join(" "); - } else { - loci[3] = splt.join(" ") - } - if (loci[3] && loci[3].slice(0,1) === "&") { - loci[3] = " " + loci[3]; - } - } - if (!loci[2]) { - loci[2] = loci[0]; - } - if (loci[3]) { - if (loci[3].match(/^[^0-9a-zA-Z]/)) { - var loclst = loci[3].split(/\s+/); - if (loci[0] === loci[2] && loclst[1] && !CSL.STATUTE_SUBDIV_STRINGS[loclst[1].replace(/\s+/, "").replace(/\s+/, "")]) { - item.force_pluralism = 1; + item.locator = item.locator.trim(); + var m = item.locator.match(CSL.STATUTE_SUBDIV_PLAIN_REGEX); + if (!m) { + if (item.label) { + item.locator = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[item.label] + " " + item.locator; + } else { + item.locator = "p. " + item.locator; } - loci[2] = ""; } - } else { - loci[2] = ""; } - if (!loci[1]) { - loci[0] = ""; + var sectionMasterLabel = null; + if (Item.section) { + Item.section = Item.section.trim(); + var m = Item.section.match(CSL.STATUTE_SUBDIV_PLAIN_REGEX); + if (!m) { + Item.section = "sec. " + Item.section; + sectionMasterLabel = "sec."; + } else { + sectionMasterLabel = m[0].trim(); + } } - var value = loci.join(""); - value = value.replace(/^\s+/,"").replace(/\s+$/, ""); - if (value) { - splt = value.split(/\s+/); - if (CSL.STATUTE_SUBDIV_STRINGS[splt[0]]) { - var has_other = false; - for (var j = splt.length - 2; j > 0; j += -2) { - if (splt[j] === splt[0]) { - item.force_pluralism = 1; - splt = splt.slice(0,j).concat(splt.slice(j + 1)); + if (Item.section) { + if (!item.locator) { + item.locator = Item.section; + } else { + var m = item.locator.match(/^([^ ]*)\s*(.*)/); + var space = " "; + if (m) { + if (m[1] === "p." && sectionMasterLabel !== "p.") { + item.locator = m[2]; } + if (["[", "(", ".", ",", ";", ":", "?"].indexOf(item.locator.slice(0, 1)) > -1) { + space = ""; + } + } else { + space = ""; } - item.label = CSL.STATUTE_SUBDIV_STRINGS[splt[0]]; - item.locator = splt.slice(1).join(" "); - if (item.force_pluralism === 0) { - delete item.force_pluralism; - } - } else { - item.locator = splt.slice(0).join(" "); + item.locator = Item.section + space + item.locator; } } + item.label = ""; } } } CSL.Engine.prototype.setNumberLabels = function (Item) { - if (Item.number + if (Item.number && ["bill", "gazette", "legislation","regulation","treaty"].indexOf(Item.type) > -1 && this.opt.development_extensions.static_statute_locator && !this.tmp.shadow_numbers["number"]) { @@ -2679,10 +2698,20 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) { } } } - if (blob && (blob.decorations.length || blob.strings.suffix || blob.strings.prefix)) { + if (blob && (blob.decorations.length || blob.strings.suffix)) { span_split = ret.length; + } else if (blob && blob.strings.prefix) { + for (var i=0,ilen=ret.length;i 0; pos += -1) { if (blobs[pos].checkLast) { - if (doit && blobs[pos].checkLast(blobs[pos - 1])) { - doit = false; - } + if (doit && blobs[pos].checkLast(blobs[pos - 1])) { + doit = false; + } } else { - doit = true; + doit = true; } } len = blobs.length; @@ -2800,8 +2831,18 @@ CSL.Output.Queue.prototype.renderBlobs = function (blobs, delim, in_cite, parent if (state.tmp.count_offset_characters) { state.tmp.offset_characters += (use_delim.length); } + } else if (in_cite) { + if (ret) { + ret = [ret, blob]; + } else { + ret = [blob]; + } } else if (blob.status !== CSL.SUPPRESS) { - str = blob.formatter.format(blob.num, blob.gender); + if (blob.particle) { + str = blob.particle + blob.num; + } else { + str = blob.formatter.format(blob.num, blob.gender); + } var strlen = str.replace(/<[^>]*>/g, "").length; this.append(str, "empty", true); var str_blob = this.pop(); @@ -2831,7 +2872,11 @@ CSL.Output.Queue.prototype.renderBlobs = function (blobs, delim, in_cite, parent } else if (blob.status === CSL.SUCCESSOR) { addme = txt_esc(blob.successor_prefix); } else if (blob.status === CSL.START) { - addme = ""; + if (pos > 0) { + addme = txt_esc(blob.splice_prefix); + } else { + addme = ""; + } } else if (blob.status === CSL.SEEN) { addme = txt_esc(blob.splice_prefix); } @@ -2980,9 +3025,10 @@ CSL.Output.Queue.adjust = function (punctInQuote) { } } } - if ("object" !== typeof blob.blobs) return false; - if (blobHasDescendantQuotes(blob.blobs[blob.blobs.length-1])) return true; - return false; + if ("object" !== typeof blob.blobs) { + return false + }; + return blobHasDescendantQuotes(blob.blobs[blob.blobs.length-1]); } function blobHasDescendantMergingPunctuation(parentChar,blob) { var childChar = blob.strings.suffix.slice(-1); @@ -3166,7 +3212,7 @@ CSL.Output.Queue.adjust = function (punctInQuote) { break; } } - if (!someChildrenAreNumbers) { + if (true || !someChildrenAreNumbers) { if (parentStrings.delimiter && PUNCT[parentStrings.delimiter.slice(0, 1)]) { var delimChar = parentStrings.delimiter.slice(0, 1); for (var i=parent.blobs.length-2;i>-1;i--) { @@ -3446,7 +3492,6 @@ CSL.Engine.Opt = function () { this.development_extensions.normalize_lang_keys_to_lowercase = false; this.development_extensions.strict_text_case_locales = false; this.development_extensions.rtl_support = false; - this.development_extensions.strict_page_numbers = false; this.development_extensions.expect_and_symbol_form = false; this.development_extensions.require_explicit_legal_case_title_short = false; this.development_extensions.spoof_institutional_affiliations = false; @@ -3655,7 +3700,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, raw_locator = raw_locator.slice(idx + 1); m = raw_locator.match(/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*/); if (m) { - item["locator-date"] = this.fun.dateparser.parse(m[1]); + item["locator-date"] = this.fun.dateparser.parseDateToObject(m[1]); raw_locator = raw_locator.slice(m[1].length); } item["locator-extra"] = raw_locator.replace(/^\s+/, "").replace(/\s+$/, ""); @@ -3670,8 +3715,11 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, if (item.locator && ["bill","gazette","legislation","regulation","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]; + var tryLabel = CSL.LOCATOR_LABELS_MAP[m[2]]; + if (this.getTerm(tryLabel)) { + item.label = tryLabel; + item.locator = m[3]; + } } } } @@ -4076,8 +4124,11 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) { if (item.locator && ["bill","gazette","legislation","regulation","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]]; - item.locator = m[3]; + var tryLabel = CSL.LOCATOR_LABELS_MAP[m[2]]; + if (this.getTerm(tryLabel)) { + item.label = tryLabel; + item.locator = m[3]; + } } } } @@ -4100,7 +4151,7 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) { str = CSL.getCitationCluster.call(this, inputList); return str; }; -CSL.getAmbiguousCite = function (Item, disambig, visualForm) { +CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) { var use_parallels, ret; var oldTermSiblingLayer = this.tmp.group_context.value().slice(); if (disambig) { @@ -4109,8 +4160,13 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm) { this.tmp.disambig_request = false; } var itemSupp = { - position: 1 + position: 1, + "near-note": true }; + if (item) { + itemSupp.locator = item.locator; + itemSupp.label = item.label; + } if (this.registry.registry[Item.id] && this.registry.citationreg.citationsByItemId && this.registry.citationreg.citationsByItemId[Item.id] @@ -4124,7 +4180,7 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm) { this.parallel.use_parallels = (this.parallel.use_parallels === true || this.parallel.use_parallels === null) ? null : false; this.tmp.suppress_decorations = true; this.tmp.just_looking = true; - CSL.getCite.call(this, Item, itemSupp); + CSL.getCite.call(this, Item, itemSupp, null, false); for (var i=0,ilen=this.output.queue.length;i 0) { - CSL.getCite.call(this, Item, item, "" + inputList[(pos - 1)][0].id); + CSL.getCite.call(this, Item, item, "" + inputList[(pos - 1)][0].id, true); } else { this.tmp.term_predecessor = false; - CSL.getCite.call(this, Item, item); + CSL.getCite.call(this, Item, item, null, true); } if (!this.tmp.cite_renders_content) { error_object = { @@ -4261,11 +4325,11 @@ CSL.getCitationCluster = function (inputList, citationID) { } if (pos > 0) { preceding_item = inputList[pos - 1][1]; - var precedingEndsInPeriod = preceding_item.suffix && preceding_item.suffix.slice(-1) === "."; - var currentStartsWithPeriod = !preceding_item.suffix && item.prefix && item.prefix.slice(0, 1) === "."; - if (precedingEndsInPeriod || currentStartsWithPeriod) { + var precedingEndsInPeriodOrComma = preceding_item.suffix && [".", ","].indexOf(preceding_item.suffix.slice(-1)) > -1; + var currentStartsWithPeriodOrComma = !preceding_item.suffix && item.prefix && [".", ","].indexOf(item.prefix.slice(0, 1)) > -1; + if (precedingEndsInPeriodOrComma || currentStartsWithPeriodOrComma) { var spaceidx = params.splice_delimiter.indexOf(" "); - if (spaceidx > -1 && !currentStartsWithPeriod) { + if (spaceidx > -1 && !currentStartsWithPeriodOrComma) { params.splice_delimiter = params.splice_delimiter.slice(spaceidx); } else { params.splice_delimiter = ""; @@ -4325,6 +4389,7 @@ CSL.getCitationCluster = function (inputList, citationID) { } } for (pos = 0, len = myblobs.length; pos < len; pos += 1) { + var buffer = []; this.output.queue = [myblobs[pos]]; this.tmp.suppress_decorations = myparams[pos].suppress_decorations; this.tmp.splice_delimiter = myparams[pos].splice_delimiter; @@ -4348,41 +4413,58 @@ CSL.getCitationCluster = function (inputList, citationID) { composite.push(preStr + errStr + sufStr); } } - if (objects.length && "string" === typeof composite[0]) { + if (buffer.length && "string" === typeof composite[0]) { composite.reverse(); var tmpstr = composite.pop(); 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); + buffer.push(tmpstr); + } else if ("string" == typeof buffer.slice(-1)[0] && buffer.slice(-1)[0].slice(-1) === ",") { + buffer.push(" " + tmpstr); } else if (tmpstr) { - objects.push(txt_esc(this.tmp.splice_delimiter) + tmpstr); + buffer.push(txt_esc(this.tmp.splice_delimiter) + tmpstr); } } else { composite.reverse(); compie = composite.pop(); if ("undefined" !== typeof compie) { - if (objects.length && "string" === typeof objects[objects.length - 1]) { - objects[objects.length - 1] += compie.successor_prefix; + if (buffer.length && "string" === typeof buffer[buffer.length - 1]) { + buffer[buffer.length - 1] += compie.successor_prefix; } - objects.push(compie); + buffer.push(compie); } } llen = composite.length; for (ppos = 0; ppos < llen; ppos += 1) { obj = composite[ppos]; if ("string" === typeof obj) { - objects.push(txt_esc(this.tmp.splice_delimiter) + obj); + buffer.push(txt_esc(this.tmp.splice_delimiter) + obj); continue; } compie = composite.pop(); if ("undefined" !== typeof compie) { - objects.push(compie); + buffer.push(compie); } } - if (objects.length === 0 && !inputList[pos][1]["suppress-author"]) { + if (buffer.length === 0 && !inputList[pos][1]["suppress-author"]) { empties += 1; } + if (buffer.length > 1 && typeof buffer[0] !== "string") { + buffer = [this.output.renderBlobs(buffer)]; + } + if (buffer.length) { + if ("string" === typeof buffer[0]) { + if (pos > 0) { + buffer[0] = this.tmp.splice_delimiter + buffer[0]; + } + } else { + if (pos > 0) { + buffer[0].splice_prefix = this.tmp.splice_delimiter; + } else { + buffer[0].splice_prefix = ""; + } + } + } + objects = objects.concat(buffer); } result += this.output.renderBlobs(objects); if (result) { @@ -4394,18 +4476,20 @@ CSL.getCitationCluster = function (inputList, citationID) { if (params[1] === "normal") { continue; } - result = this.fun.decorate[params[0]][params[1]](this, result); + if (!item || !item["author-only"]) { + result = this.fun.decorate[params[0]][params[1]](this, result); + } } } } this.tmp.suppress_decorations = false; return result; }; -CSL.getCite = function (Item, item, prevItemID) { +CSL.getCite = function (Item, item, prevItemID, blockShadowNumberReset) { var next, error_object; this.tmp.cite_renders_content = false; this.parallel.StartCite(Item, item, prevItemID); - CSL.citeStart.call(this, Item, item); + CSL.citeStart.call(this, Item, item, blockShadowNumberReset); next = 0; this.nameOutput = new CSL.NameOutput(this, Item, item); while (next < this[this.tmp.area].tokens.length) { @@ -4425,7 +4509,10 @@ CSL.getCite = function (Item, item, prevItemID) { } return "" + Item.id; }; -CSL.citeStart = function (Item, item) { +CSL.citeStart = function (Item, item, blockShadowNumberReset) { + if (!blockShadowNumberReset) { + this.tmp.shadow_numbers = {}; + } this.tmp.disambiguate_count = 0; this.tmp.disambiguate_maxMax = 0; this.tmp.same_author_as_previous_cite = false; @@ -4481,8 +4568,6 @@ CSL.citeStart = function (Item, item) { if (!this.tmp.just_looking && item && !item.position && this.registry.registry[Item.id]) { this.tmp.disambig_restore = CSL.cloneAmbigConfig(this.registry.registry[Item.id].disambig); } - this.tmp.shadow_numbers = {}; - this.setNumberLabels(Item); this.tmp.first_name_string = false; this.tmp.authority_stop_last = 0; if (this.opt.development_extensions.flip_parentheses_to_braces && item && item.prefix) { @@ -4772,7 +4857,7 @@ CSL.getBibliographyEntries = function (bibsection) { this.output.adjust.downward(this.output.queue[j],true); this.output.adjust.fix(this.output.queue[j]); } - res = this.output.string(this, this.output.queue)[0]; + res = this.output.string(this, this.output.queue); if (!res) { res = "\n[CSL STYLE ERROR: reference with no printed form.]\n"; } @@ -5158,9 +5243,18 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) { } if (this.sys.xml.numberofnodes(this.sys.xml.getNodesByName(term, 'multiple'))) { target[form][0] = this.sys.xml.getNodeValue(term, 'single'); + if (target[form][0].indexOf("%s") > -1) { + this.opt.hasPlaceholderTerm = true; + } target[form][1] = this.sys.xml.getNodeValue(term, 'multiple'); + if (target[form][1].indexOf("%s") > -1) { + this.opt.hasPlaceholderTerm = true; + } } else { target[form] = this.sys.xml.getNodeValue(term); + if (target[form].indexOf("%s") > -1) { + this.opt.hasPlaceholderTerm = true; + } } } if (ordinals101_toggle) { @@ -5646,7 +5740,7 @@ CSL.Node["date-part"] = { if (state.registry.registry[Item.id] && state.registry.registry[Item.id].disambig.year_suffix !== false && !state.tmp.has_done_year_suffix) { state.tmp.has_done_year_suffix = true; num = parseInt(state.registry.registry[Item.id].disambig.year_suffix, 10); - number = new CSL.NumericBlob(num, this, Item.id); + number = new CSL.NumericBlob(false, num, this, Item.id); this.successor_prefix = state[state.build.area].opt.layout_delimiter; this.splice_prefix = state[state.build.area].opt.layout_delimiter; formatter = new CSL.Util.Suffixator(CSL.SUFFIX_CHARS); @@ -6243,7 +6337,6 @@ CSL.Node.label = { if (this.strings.term) { var plural = false; if (!this.strings.form) { - this.strings.form = "long"; } var func = function (state, Item, item) { var termtxt = CSL.evaluateLabel(this, state, Item, item); @@ -6257,7 +6350,9 @@ CSL.Node.label = { flag[0] = true; state.tmp.group_context.replace(flag); } - state.output.append(termtxt, this); + if (termtxt.indexOf("%s") === -1) { + state.output.append(termtxt, this); + } if (item && this.strings.term === "locator") { state.parallel.CloseVariable(); } @@ -7810,11 +7905,11 @@ CSL.NameOutput.prototype._renderOnePersonalName = function (value, pos, i, j) { } else if (this.state.tmp.sort_key_flag) { if (this.state.opt["demote-non-dropping-particle"] === "never") { first = this._join([non_dropping_particle, family, dropping_particle], " "); - merged = this._join([first, given], " "); + merged = this._join([first, given], "0"); blob = this._join([merged, suffix], " "); } else { second = this._join([given, dropping_particle, non_dropping_particle], " "); - merged = this._join([family, second], " "); + merged = this._join([family, second], "0"); blob = this._join([merged, suffix], " "); } } else if (this.name.strings["name-as-sort-order"] === "all" || (this.name.strings["name-as-sort-order"] === "first" && i === 0 && (j === 0 || "undefined" === typeof j))) { @@ -8424,29 +8519,17 @@ CSL.evaluateLabel = function (node, state, Item, item) { myterm = node.strings.term; } var plural = node.strings.plural; - if (item && "locator" === node.strings.term && "number" === typeof item.force_pluralism) { - plural = item.force_pluralism; - } else if ("number" !== typeof plural) { - if ("locator" === node.strings.term) { - if (item && item.locator) { - if (state.opt.development_extensions.locator_parsing_for_plurals) { - if (!state.tmp.shadow_numbers.locator) { - state.processNumber(false, item, "locator", Item.type); - } - plural = state.tmp.shadow_numbers.locator.plural; - } else { - plural = CSL.evaluateStringPluralism(item.locator); - } - } - } else if (["page", "page-first", "number"].indexOf(node.variables[0]) > -1) { - state.processNumber(false, Item, myterm, Item.type); - plural = state.tmp.shadow_numbers[myterm].plural; - myterm = state.tmp.shadow_numbers[myterm].label; - } else { - if (!state.tmp.shadow_numbers[myterm]) { - state.processNumber(false, Item, myterm, Item.type); - } - plural = state.tmp.shadow_numbers[myterm].plural; + if ("number" !== typeof plural) { + var theItem = node.strings.term === "locator" ? item : Item; + state.processNumber(false, theItem, node.strings.term, Item.type); + plural = state.tmp.shadow_numbers[node.strings.term].plural; + if (!state.tmp.shadow_numbers[node.strings.term].labelForm + && !state.tmp.shadow_numbers[node.strings.term].labelDecorations) { + state.tmp.shadow_numbers[node.strings.term].labelForm = node.strings.form; + state.tmp.shadow_numbers[node.strings.term].labelDecorations = node.decorations.slice(); + } + if (["locator", "number", "page"].indexOf(node.strings.term) > -1 && state.tmp.shadow_numbers[node.strings.term].label) { + myterm = state.tmp.shadow_numbers[node.strings.term].label; } if (node.decorations && (state.opt.development_extensions.csl_reverse_lookup_support || state.sys.csl_reverse_lookup_support)) { node.decorations.reverse(); @@ -8456,15 +8539,6 @@ CSL.evaluateLabel = function (node, state, Item, item) { } return CSL.castLabel(state, node, myterm, plural, CSL.TOLERANT); }; -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], 10) < parseInt(m[2], 10))) { - return 1; - } - } - return 0; -}; CSL.castLabel = function (state, node, term, plural, mode) { var label_form = node.strings.form; if (state.tmp.group_context.value()[5]) { @@ -8789,110 +8863,18 @@ CSL.Node.number = { if (this.strings.label_form_override) { form = this.strings.label_form_override; } - if (varname === "locator" - && item.locator) { - item.locator = item.locator.replace(/([^\\])\s*-\s*/, "$1" + state.getTerm("page-range-delimiter")); - m = item.locator.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); - if (m) { - 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]); - } - newlst = [lst[0]]; - if (!this.strings.label_form_override && state.tmp.group_context.value()[5]) { - form = state.tmp.group_context.value()[5]; - } - for (i = 1, ilen = lst.length; i < ilen; i += 1) { - var subplural = 0; - if (lst[i].match(rex)) { - subplural = 1; - } - var term = CSL.STATUTE_SUBDIV_STRINGS[m[i - 1].replace(/^\s*/,"")]; - var myform = form; - if (item.section_label_count > i && item.section_form_override) { - myform = item.section_form_override; - } - newlst.push(state.getTerm(term, myform, subplural)); - newlst.push(lst[i].replace(/^\s*/,"")); - } - value = newlst.join(" "); - value = value.replace(/\\/, "", "g"); - state.output.append(value, this); - } else { - value = state.fun.page_mangler(item.locator); - value = value.replace(/\\/, "", "g"); - state.output.append(value, this); - } - } else { - var node = this; - if (!state.tmp.shadow_numbers[varname] - || (state.tmp.shadow_numbers[varname].values.length - && state.tmp.shadow_numbers[varname].values[0][2] === false)) { - if (varname === "locator") { - state.processNumber(node, item, varname, Item.type); - } else { - state.processNumber(node, Item, varname, Item.type); - } - } - var values = state.tmp.shadow_numbers[varname].values; - var blob; - var newstr = ""; - var rangeType = "page"; - if (["bill","gazette","legal_case","legislation","regulation","treaty"].indexOf(Item.type) > -1 - && varname === "collection-number") { - rangeType = "year"; - } - if (((varname === "number" - && ["bill","gazette","legislation","regulation","treaty"].indexOf(Item.type) > -1) - || state.opt[rangeType + "-range-format"]) - && !this.strings.prefix && !this.strings.suffix - && !this.strings.form) { - for (i = 0, ilen = values.length; i < ilen; i += 1) { - newstr += values[i][1]; - } - } - if (newstr && !newstr.match(/^[\-.\u20130-9]+$/)) { - if (varname === "number" - && ["bill","gazette","legislation","regulation","treaty"].indexOf(Item.type) > -1) { - var firstword = newstr.split(/\s/)[0]; - if (firstword) { - newlst = []; - m = newstr.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); - if (m) { - 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+/, "")); - } - newstr = newlst.join(" "); - } - } - } - state.output.append(newstr, this); - } else { - if (values.length) { - state.output.openLevel("empty"); - 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*/, ""); - } - if (i < values.length - 1) { - blob.strings.suffix = blob.strings.suffix.replace(/\s*$/, ""); - } - if ("undefined" === typeof blob.gender) { - blob.gender = state.locale[state.opt.lang]["noun-genders"][varname]; - } - state.output.append(blob, "literal", false, false, true); - } - state.output.closeLevel("empty"); - } - } - } + var node = this; if (varname === "locator") { - state.tmp.done_vars.push("locator"); + state.processNumber(node, item, varname, Item.type); + } else { + state.processNumber(node, Item, varname, Item.type); } + CSL.Util.outputNumericField(state, varname, Item.id); state.parallel.CloseVariable("number"); + if (["locator", "locator-extra"].indexOf(this.variables_real[0]) > -1 + && !state.tmp.just_looking) { + state.tmp.done_vars.push(this.variables_real[0]); + } }; this.execs.push(func); target.push(this); @@ -9032,7 +9014,7 @@ CSL.Node.text = { if (state.opt.citation_number_slug) { state.output.append(state.opt.citation_number_slug, this); } else { - number = new CSL.NumericBlob(num, this, Item.id); + number = new CSL.NumericBlob(false, num, this, Item.id); state.output.append(number, "literal"); } } @@ -9050,7 +9032,7 @@ CSL.Node.text = { func = function (state, Item) { if (state.registry.registry[Item.id] && state.registry.registry[Item.id].disambig.year_suffix !== false && !state.tmp.just_looking) { num = parseInt(state.registry.registry[Item.id].disambig.year_suffix, 10); - number = new CSL.NumericBlob(num, this, Item.id); + number = new CSL.NumericBlob(false, num, this, Item.id); formatter = new CSL.Util.Suffixator(CSL.SUFFIX_CHARS); number.setFormatter(formatter); state.output.append(number, "literal"); @@ -9159,44 +9141,20 @@ CSL.Node.text = { if (CSL.CITE_FIELDS.indexOf(this.variables_real[0]) > -1) { func = function (state, Item, item) { if (item && item[this.variables[0]]) { - var value = "" + item[this.variables[0]]; - value = value.replace(/([^\\])--*/g,"$1"+state.getTerm("page-range-delimiter")); - value = value.replace(/\\-/g,"-"); + state.processNumber(this, item, this.variables[0], Item.type); + CSL.Util.outputNumericField(state, this.variables[0], Item.id); state.output.append(value, this, false, false, true); - if (this.variables[0] === "locator-extra") { - state.tmp.done_vars.push("locator-extra"); - } - } - }; - } else if (this.variables_real[0] === "page-first") { - func = function (state, Item) { - var idx, value; - value = state.getVariable(Item, "page-first", form); - if (value) { - value = value.replace("\\", ""); - state.output.append(value, this, false, false, true); - } - }; - } else if (this.variables_real[0] === "page") { - func = function (state, Item) { - var value = state.getVariable(Item, "page", form); - if (value) { - value = ""+value; - value = value.replace(/([^\\])--*/g,"$1"+state.getTerm("page-range-delimiter")); - value = value.replace(/\\-/g,"-"); - value = state.fun.page_mangler(value); - state.output.append(value, this, false, false, true); - } - }; - } else if (this.variables_real[0] === "volume") { - func = function (state, Item) { - if (this.variables[0]) { - var value = state.getVariable(Item, this.variables[0], form); - if (value) { - state.output.append(value, this); + if (["locator", "locator-extra"].indexOf(this.variables_real[0]) > -1 + && !state.tmp.just_looking) { + state.tmp.done_vars.push(this.variables_real[0]); } } }; + } else if (["page", "page-first", "chapter-number", "collection-number", "edition", "issue", "number", "number-of-pages", "number-of-volumes", "volume"].indexOf(this.variables_real[0]) > -1) { + func = function(state, Item) { + state.processNumber(this, Item, this.variables[0], Item.type); + CSL.Util.outputNumericField(state, this.variables[0], Item.id); + } } else if (["URL", "DOI"].indexOf(this.variables_real[0]) > -1) { func = function (state, Item) { var value; @@ -9355,13 +9313,8 @@ CSL.Attributes["@locator"] = function (state, arg) { var maketest = function (trylabel) { return function(Item, item) { var label; - if ("undefined" === typeof item || !item.label) { - label = "page"; - } else if (item.label === "sub verbo") { - label = "sub-verbo"; - } else { - label = item.label; - } + state.processNumber(false, item, "locator"); + label = state.tmp.shadow_numbers.locator.label; if (trylabel === label) { return true; } else { @@ -11310,10 +11263,11 @@ CSL.Blob.prototype.push = function (blob) { this.blobs.push(blob); } }; -CSL.NumericBlob = function (num, mother_token, id) { +CSL.NumericBlob = function (particle, num, mother_token, id) { this.id = id; this.alldecor = []; this.num = num; + this.particle = particle; this.blobs = num.toString(); this.status = CSL.START; this.strings = {}; @@ -11365,8 +11319,8 @@ CSL.NumericBlob.prototype.checkNext = function (next,start) { if (this.status === CSL.SUCCESSOR_OF_SUCCESSOR) { this.status = CSL.END; } - if ("object" === typeof next) { - next.status = CSL.SEEN; + if ("object" === typeof next) { + next.status = CSL.SEEN; } } else { // next number is in the sequence if (this.status === CSL.START || this.status === CSL.SEEN) { @@ -11474,7 +11428,7 @@ CSL.dateAsSortKey = function (state, Item, isMacro) { this.dateparts = ["year", "month", "day"]; } if (dp.raw) { - dp = state.fun.dateparser.parse(dp.raw); + dp = state.fun.dateparser.parseDateToArray(dp.raw); } else if (dp["date-parts"]) { dp = state.dateParseArray(dp); } @@ -12290,176 +12244,477 @@ CSL.Util.Suffixator.prototype.format = function (N) { return key; }; CSL.Engine.prototype.processNumber = function (node, ItemObject, variable, type) { - var num, m, i, ilen, j, jlen; + var val, m, i, ilen, j, jlen; var debug = false; - if (this.tmp.shadow_numbers[variable]) { - if (this.tmp.shadow_numbers[variable].numeric) { - for (var i = 0, ilen = this.tmp.shadow_numbers[variable].values.length; i < ilen; i += 2) { - this.tmp.shadow_numbers[variable].values[i][2] = node; + var me = this; + function normalizeFieldValue(str, defaultLabel) { + var m = str.match(/^([^ ]+)/); + if (m && !CSL.STATUTE_SUBDIV_STRINGS[m[1]]) { + var embeddedLabel = null; + if (variable === "locator" ) { + if (ItemObject.label) { + embeddedLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[ItemObject.label]; + } else { + embeddedLabel = "p."; + } + } else { + embeddedLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable]; + } + if (embeddedLabel) { + str = embeddedLabel + " " + str; } } + return str; + } + function composeNumberInfo(origLabel, label, val, joiningSuffix) { + joiningSuffix = joiningSuffix ? joiningSuffix : ""; + var info = {}; + if (!label && !CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable]) { + label = "var:"+variable; + } + if (label) { + var m = label.match(/(\s*)([^\s]*)(\s*)/); + info.label = m[2]; + info.origLabel = origLabel; + info.labelSuffix = m[3] ? m[3] : ""; + info.plural = 0; + info.labelVisibility = false; + } + var m = val.match(/^([a-zA-Z]0*)([0-9]+(?:[a-zA-Z]*|[-,a-zA-Z]+))$/); + if (m) { + info.particle = m[1]; + info.value = m[2]; + } else { + info.particle = ""; + info.value = val; + } + info.joiningSuffix = joiningSuffix.replace(/\s*-\s*/, "-"); + return info; + }; + function fixupSubsections(elems) { + for (var i=elems.length-2;i>-1;i-=2) { + if (elems[i] === "-" + && elems[i-1].match(/^(?:(?:[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|[a-z][a-z][a-z][a-z])\. *)*[0-9]+[,a-zA-Z]+$/) + && elems[i+1].match(/^[,a-zA-Z]+$/)) { + elems[i-1] = elems.slice(i-1,i+2).join(""); + elems = elems.slice(0,i).concat(elems.slice(i+2)); + } + } + return elems; + } + function parseString(str, defaultLabel) { + defaultLabel = defaultLabel ? defaultLabel : ""; + str = normalizeFieldValue(str, defaultLabel); + var elems = []; + var m = str.match(/(,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/g); + if (m) { + var lst = str.split(/(?:,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/); + for (var i=0,ilen=lst.length-1; i 1 ? m[j-1] : ""; + var str = lst[j] ? lst[j].trim() : ""; + if (j === (lst.length-1)) { + values.push(composeNumberInfo(origLabel, label, str, elems[i+1])); + } else { + values.push(composeNumberInfo(origLabel, label, str)); + } + } + } + } else { + values.push(composeNumberInfo(origLabel, label, elems[i], elems[i+1])); + } + } + return values; + } + function setSpaces(values) { + for (var i=0,ilen=values.length-1;i0 && val.match(/^[ivxlcmIVXLCM]+$/) && values[i-1].value.match(/^[ivxlcmIVXLCM]+$/)) { + isCollapsible = true; + } + for (var j=currentLabelInfo.pos,jlen=values.length; j 1 && isCollapsible) { + values[j].plural = 1; + } + values[j].numeric = currentLabelInfo.numeric; + values[j].collapsible = currentLabelInfo.collapsible; + } + currentLabelInfo.label = values[i].label; + currentLabelInfo.count = 1; + currentLabelInfo.pos = i; + currentLabelInfo.numeric = true; + currentLabelInfo.collapsible = true; + } + function setPluralsAndNumerics(values) { + var currentLabelInfo = { + label: null, + count: 1, + numeric: true, + collapsible: true, + pos: 0 + } + var masterLabel = values.length ? values[0].label : null; + for (var i=0,ilen=values.length;i 1) { + values[0].plural = 1; + } + } + for (var i=0,ilen=values.length;i-1;j--) { + if (masterNode.decorations[j][0] === "@quotes") { + masterStyling.decorations = masterStyling.decorations.concat(masterNode.decorations.slice(j, j+1)); + masterNode.decorations = masterNode.decorations.slice(0, j).concat(masterNode.decorations.slice(j+1)) + } + } + masterStyling.strings.prefix = masterNode.strings.prefix; + masterNode.strings.prefix = ""; + masterStyling.strings.suffix = masterNode.strings.suffix; + masterNode.strings.suffix = ""; + } + var masterLabel = values.length ? values[0].label : null; + if (values.length) { + for (var i=0,ilen=values.length; i -1) { + rangeDelimiter = me.getTerm("page-range-delimiter") + if (!rangeDelimiter) { + rangeDelimiter = "\u2013"; + } + } + if (variable === "collection-number") { + rangeDelimiter = me.getTerm("year-range-delimiter"); + if (!rangeDelimiter) { + rangeDelimiter = "\u2013"; + } + } + } + } + return rangeDelimiter; + } + function checkPage(variable, val) { + return variable === "page" + || (variable === "locator" && (["p.", "para.", "ch."].indexOf(val.label) > -1)); + } + function manglePageNumbers(values, i, currentInfo) { + if (i<1) return; + if (currentInfo.count !== 2) { + return; + } + if (values[i-1].particle !== values[i].particle) { + return; + } + if (values[i-1].joiningSuffix !== "-") { + currentInfo.count = 1; + return; + } + if (!me.opt["page-range-format"] && parseInt(values[i-1].value, 10) > parseInt(values[i].value, 10)) { + values[i-1].joiningSuffix = fixupRangeDelimiter(variable, values[i], values[i-1].joiningSuffix, true); + return; + } + var val = values[i]; + var isPage = checkPage(variable, val); + if (isPage) { + var str = values[i-1].particle + values[i-1].value + " - " + values[i].particle + values[i].value; + str = me.fun.page_mangler(str); + } else { + str = values[i-1].value + stripHyphenBackslash(values[i-1].joiningSuffix) + values[i].value; + } + var m = str.match(/^([a-zA-Z]?0*)([0-9]+)(\s*[^0-9]+\s*)([-,a-zA-Z]?0*)([0-9]+)$/); + if (m) { + var rangeDelimiter = m[3]; + rangeDelimiter = fixupRangeDelimiter(variable, val, rangeDelimiter, values[i].numeric); + values[i-1].particle = m[1]; + values[i-1].value = m[2]; + values[i-1].joiningSuffix = rangeDelimiter; + values[i].particle = m[4]; + values[i].value = m[5]; + } + currentInfo.count = 0; + } + function fixRanges(values) { + if (!node) return; + if (["page", "page-first", "chapter-number", "collection-number", "edition", "issue", "number", "number-of-pages", "number-of-volumes", "volume", "locator"].indexOf(variable) === -1) return; + var currentInfo = { + count: 0, + label: null, + lastHadRangeDelimiter: false + } + for (var i=0,ilen=values.length; i -1) { - var m = num.match(/[^0-9]*([0-9]+).*/); - if (m) { - this.tmp.shadow_numbers[variable].numeric = true; - if (m[1] !== "1") { - this.tmp.shadow_numbers[variable].plural = 1; - } - } - } - if ("locator" === variable - && ["bill","gazette","legislation","regulation","treaty"].indexOf(type) > -1) { - num = num.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX)[0]; - } - var rangeType = "page"; - if (["bill","gazette","legislation","legal_case","regulation","treaty"].indexOf(type) > -1 - && variable === "collection-number") { - rangeType = "year"; - } - if (["page", "page-first", "number"].indexOf(variable) > -1) { - var m = num.split(" ")[0].match(CSL.STATUTE_SUBDIV_GROUPED_REGEX); - if (m){ - if (this.opt.development_extensions.static_statute_locator) { - this.tmp.shadow_numbers[variable].label = CSL.STATUTE_SUBDIV_STRINGS[m[0]]; - } - var mm = num.match(/[^ ]+\s+(.*)/); - if (mm) { - num = mm[1]; - } - } - } - var lst = num.split(/(?:,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/); - var m = num.match(/(,\s+|\s*\\*[\-\u2013]+\s*|\s*&\s*)/g); - var elements = []; - for (var i = 0, ilen = lst.length - 1; i < ilen; i += 1) { - elements.push(lst[i]); - elements.push(m[i]); - } - elements.push(lst[lst.length - 1]); - var count = 0; - var numeric = true; - for (var i = 0, ilen = elements.length; i < ilen; i += 1) { - var odd = ((i%2) === 0); - if (odd) { - if (elements[i]) { - if (elements[i].match(/(?:[0-9]|[xivcmlXIVCML])/)) { - if (elements[i - 1] && elements[i - 1].match(/^\s*\\*[\-\u2013]+\s*$/)) { - var middle = this.tmp.shadow_numbers[variable].values.slice(-1); - if (middle[0][1].indexOf("\\") == -1) { - if (elements[i - 2] && ("" + elements[i - 2]).match(/(:?[a-zA-Z]*[0-9]+$|^[ivxlcmIVXLCM]+$)/) - && elements[i].match(/(?:^[a-zA-Z]*[0-9]+|^[ivxlcmIVXLCM]+$)/)) { - var start = this.tmp.shadow_numbers[variable].values.slice(-2); - middle[0][1] = this.getTerm(rangeType + "-range-delimiter"); - if (this.opt[rangeType + "-range-format"] ) { - var newstr = this.fun[rangeType + "_mangler"](start[0][1] +"-"+elements[i]); - newstr = newstr.split(this.getTerm(rangeType + "-range-delimiter")); - elements[i] = newstr[1]; - } - count = count + 1; - } - if (middle[0][1].indexOf("--") > -1) { - middle[0][1] = middle[0][1].replace(/--*/, "\u2013"); - } - } else { - middle[0][1] = middle[0][1].replace(/\\/, "", "g"); - } - } else if (elements[i].indexOf(" ") === -1) { - count = count + 1; - } - } - var subelements = elements[i].split(/\s+/); - for (var j = 0, jlen = subelements.length; j < jlen; j += 1) { - if (this.opt.development_extensions.strict_page_numbers - && variable === "page" - && !subelements[j].match(/^-*[0-9]/)) { - numeric = false; - } else if (!subelements[j].match(/[-0-9]/)) { - numeric = false; - } - } - if (elements[i].match(/^[1-9][0-9]*$/)) { - elements[i] = parseInt(elements[i], 10); - if (node && "undefined" === typeof node.gender) { - node.gender = this.locale[this.opt.lang]["noun-genders"][variable]; - if (!node.gender) { - node.gender = ""; - } - } - this.tmp.shadow_numbers[variable].values.push(["NumericBlob", elements[i], node]); - } else { - var str = elements[i]; - this.tmp.shadow_numbers[variable].values.push(["Blob", str, node]); - } - } - } else { - if (elements[i]) { - this.tmp.shadow_numbers[variable].values.push(["Blob", elements[i], undefined]); - } - } - }; - if (this.opt.development_extensions.strict_page_numbers && variable === "page") { - if (num.indexOf(" ") === -1 && num.match(/^-*[0-9]/)) { - this.tmp.shadow_numbers[variable].numeric = true; - } else { - this.tmp.shadow_numbers[variable].numeric = numeric; - } - } else { - if (num.indexOf(" ") === -1 && num.match(/[0-9]/)) { - this.tmp.shadow_numbers[variable].numeric = true; - } else { - this.tmp.shadow_numbers[variable].numeric = numeric; - } - } - if (!this.tmp.shadow_numbers[variable].numeric) { - this.transform.loadAbbreviation(ItemObject.jurisdiction, "number", num); - } - if (count > 1) { - this.tmp.shadow_numbers[variable].plural = 1; - } - if (ItemObject.force_pluralism === 1) { - this.tmp.shadow_numbers[variable].plural = 1; - } else if (ItemObject.force_pluralism === 0) { - this.tmp.shadow_numbers[variable].plural = 0; + if (node) { + fixRanges(values); + this.tmp.shadow_numbers[variable].masterStyling = setStyling(values) } + setVariableParams(this.tmp.shadow_numbers[variable], values); } }; +CSL.Util.outputNumericField = function(state, varname, itemID) { + state.output.openLevel(state.tmp.shadow_numbers[varname].masterStyling); + var nums = state.tmp.shadow_numbers[varname].values; + var masterLabel = nums.length ? nums[0].label : null; + var labelForm = state.tmp.shadow_numbers[varname].labelForm; + var embeddedLabelForm; + if (labelForm) { + embeddedLabelForm = labelForm + } else { + embeddedLabelForm = "short"; + } + var labelDecorations = state.tmp.shadow_numbers[varname].labelDecorations; + var lastLabelName = null; + for (var i=0,ilen=nums.length;i 0 && labelPlaceholderPos < (label.length-2)) { + numStyling.strings.prefix += label.slice(0,labelPlaceholderPos); + numStyling.strings.suffix = label.slice(labelPlaceholderPos+2) + numStyling.strings.suffix; + } else if (num.labelVisibility) { + if (!label) { + label = num.label; + labelName = num.label; + } + if (labelPlaceholderPos > 0) { + var prefixLabelStyling = new CSL.Token(); + prefixLabelStyling.decorations = labelDecorations; + state.output.append(label.slice(0,labelPlaceholderPos), prefixLabelStyling); + } else if (labelPlaceholderPos === (label.length-2) || labelPlaceholderPos === -1) { + state.output.append(label+num.labelSuffix, "empty"); + } + } + if (num.collapsible) { + var blob = new CSL.NumericBlob(num.particle, parseInt(num.value, 10), numStyling, itemID); + if ("undefined" === typeof blob.gender) { + blob.gender = state.locale[state.opt.lang]["noun-genders"][varname]; + } + state.output.append(blob, "literal"); + } else { + state.output.append(num.particle + num.value, numStyling) + } + if (labelPlaceholderPos === 0 && labelPlaceholderPos < (label.length-2)) { + if (lastLabelName === null) { + lastLabelName = labelName; + } + if (labelName !== lastLabelName || i === (nums.length-1)) { + var suffixLabelStyling = new CSL.Token(); + suffixLabelStyling.decorations = labelDecorations; + state.output.append(label.slice(labelPlaceholderPos+2), suffixLabelStyling); + } + } + lastLabelName === labelName; + } + state.output.closeLevel(); +} CSL.Util.PageRangeMangler = {}; CSL.Util.PageRangeMangler.getFunction = function (state, rangeType) { var rangerex, pos, len, stringify, listify, expand, minimize, minimize_internal, chicago, lst, m, b, e, ret, begin, end, ret_func, ppos, llen; @@ -12583,7 +12838,7 @@ CSL.Util.PageRangeMangler.getFunction = function (state, rangeType) { } if (!state.opt[rangeType + "-range-format"]) { ret_func = function (str) { - return str; + return sniff(str, stringify); }; } else if (state.opt[rangeType + "-range-format"] === "expanded") { ret_func = function (str) { @@ -13024,10 +13279,10 @@ CSL.Output.Formatters.title = function (state, string) { if (!string) { return ""; } - var doppel = CSL.Output.Formatters.doppelString(string, CSL.TAG_ESCAPE); - function capitalise (word) { - var m = word.match(/([:?!]+\s+|-|^)([a-zA-Z])(.*)/); - if (m) { + var doppel = CSL.Output.Formatters.doppelString(string, CSL.TAG_ESCAPE, SKIP_WORDS); + function capitalise (word, force) { + var m = word.match(/([:?!]+\s+|-|^)((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))(.*)/); + if (m && !(m[2].match(/^[\u0370-\u03FF]$/) && !m[3])) { return m[1] + m[2].toUpperCase() + m[3]; } return word; @@ -13079,10 +13334,10 @@ CSL.Output.Formatters.title = function (state, string) { var ret = CSL.Output.Formatters.undoppelString(doppel); return ret; }; -CSL.Output.Formatters.doppelString = function (string, rex) { +CSL.Output.Formatters.doppelString = function (string, rex, stopWords) { var ret, pos, len; ret = {}; - ret.array = rex(string); + ret.array = rex(string, stopWords); ret.string = ""; for (var i=0,ilen=ret.array.length; i" + str + ""; - } else if ("string" === typeof str) { + } else if (this.params && "string" === typeof str) { var prePunct = ""; if (str) { var m = str.match(CSL.VARIABLE_WRAPPER_PREPUNCT_REX); diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js index 680394f69f..ced95a6827 100644 --- a/chrome/content/zotero/xpcom/collectionTreeView.js +++ b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -1810,6 +1810,18 @@ Zotero.CollectionTreeView.prototype.drop = Zotero.Promise.coroutine(function* (r if (!addItems[parentID]) { addItems[parentID] = []; } + + // If source item is a top-level non-regular item (which can exist in a + // collection) but target item is a child item (which can't), add + // target item's parent to collection instead + if (!item.isRegularItem()) { + let targetItem = yield Zotero.Items.getAsync(id); + let targetItemParentID = targetItem.parentItemID; + if (targetItemParentID) { + id = targetItemParentID; + } + } + addItems[parentID].push(id); } } diff --git a/chrome/content/zotero/xpcom/server_connector.js b/chrome/content/zotero/xpcom/server_connector.js index ed0a211693..ec90743a5f 100644 --- a/chrome/content/zotero/xpcom/server_connector.js +++ b/chrome/content/zotero/xpcom/server_connector.js @@ -410,55 +410,84 @@ Zotero.Server.Connector.SaveSnapshot.prototype = { */ "init":function(url, data, sendResponseCallback) { Zotero.Server.Connector.Data[data["url"]] = ""+data["html"]+""; - Zotero.HTTP.processDocuments(["zotero://connector/"+encodeURIComponent(data["url"])], - function(doc) { - delete Zotero.Server.Connector.Data[data["url"]]; - - // figure out where to save - var libraryID = null; - var collectionID = null; - var zp = Zotero.getActiveZoteroPane(); - try { - var libraryID = zp.getSelectedLibraryID(); - var collection = zp.getSelectedCollection(); - } catch(e) {} - - try { - // create new webpage item - var item = new Zotero.Item("webpage"); - item.libraryID = libraryID; - item.setField("title", doc.title); - item.setField("url", data.url); - item.setField("accessDate", "CURRENT_TIMESTAMP"); - var itemID = item.save(); - if(collection) collection.addItem(itemID); + + // figure out where to save + var libraryID = null; + var collectionID = null; + var zp = Zotero.getActiveZoteroPane(); + try { + var libraryID = zp.getSelectedLibraryID(); + var collection = zp.getSelectedCollection(); + } catch(e) {} + + // determine whether snapshot can be saved + var filesEditable; + if (libraryID) { + let group = Zotero.Groups.getByLibraryID(libraryID); + filesEditable = group.filesEditable; + } + else { + filesEditable = true; + } + + var cookieSandbox = new Zotero.CookieSandbox(null, data["url"], data["cookie"], url.userAgent); + + if (data.pdf && filesEditable) { + delete Zotero.Server.Connector.Data[data.url]; + + try { + // TODO: Async + Zotero.Attachments.importFromURL( + data.url, + null, + null, + null, + collection ? [collection.id] : null, + "application/pdf", + libraryID, + function () { + sendResponseCallback(201); + }, + cookieSandbox + ); + } + catch (e) { + sendResponseCallback(500); + throw e; + } + } + else { + Zotero.HTTP.processDocuments(["zotero://connector/"+encodeURIComponent(data["url"])], + function(doc) { + delete Zotero.Server.Connector.Data[data["url"]]; - // determine whether snapshot can be saved - var filesEditable; - if (libraryID) { - var group = Zotero.Groups.getByLibraryID(libraryID); - filesEditable = group.filesEditable; - } else { - filesEditable = true; + try { + // create new webpage item + var item = new Zotero.Item("webpage"); + item.libraryID = libraryID; + item.setField("title", doc.title); + item.setField("url", data.url); + item.setField("accessDate", "CURRENT_TIMESTAMP"); + var itemID = item.save(); + if(collection) collection.addItem(itemID); + + // save snapshot + if (filesEditable && !data.skipSnapshot) { + // TODO: async + Zotero.Attachments.importFromDocument({ + document: doc, + parentItemID: itemID + }); + } + + sendResponseCallback(201); + } catch(e) { + sendResponseCallback(500); + throw e; } - - // save snapshot - if (filesEditable && !data.skipSnapshot) { - // TODO: async - Zotero.Attachments.importFromDocument({ - document: doc, - parentItemID: itemID - }); - } - - sendResponseCallback(201); - } catch(e) { - sendResponseCallback(500); - throw e; - } - }, - null, null, false, - new Zotero.CookieSandbox(null, data["url"], data["cookie"], url.userAgent)); + }, + null, null, false, cookieSandbox); + } } } diff --git a/chrome/content/zotero/xpcom/sync/syncLocal.js b/chrome/content/zotero/xpcom/sync/syncLocal.js index 09457c70a9..997f026c79 100644 --- a/chrome/content/zotero/xpcom/sync/syncLocal.js +++ b/chrome/content/zotero/xpcom/sync/syncLocal.js @@ -89,9 +89,9 @@ Zotero.Sync.Data.Local = { * @return {nsILoginInfo|false} */ _getAPIKeyLoginInfo: function () { - var loginManager = Components.classes["@mozilla.org/login-manager;1"] - .getService(Components.interfaces.nsILoginManager); try { + var loginManager = Components.classes["@mozilla.org/login-manager;1"] + .getService(Components.interfaces.nsILoginManager); var logins = loginManager.findLogins( {}, this._loginManagerHost, diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index f776bb4b23..13a00d08b1 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -2667,6 +2667,9 @@ Zotero.DragDrop = { var files = []; for (var i=0; i - + @@ -145,7 +145,7 @@ - + @@ -162,7 +162,7 @@ - + @@ -203,6 +203,6 @@ - - + + diff --git a/chrome/locale/gl-ES/zotero/zotero.dtd b/chrome/locale/gl-ES/zotero/zotero.dtd index d21a3498a1..e1241473e6 100644 --- a/chrome/locale/gl-ES/zotero/zotero.dtd +++ b/chrome/locale/gl-ES/zotero/zotero.dtd @@ -6,8 +6,8 @@ - - + + @@ -125,9 +125,9 @@ - - - + + + @@ -165,7 +165,7 @@ - + diff --git a/chrome/locale/gl-ES/zotero/zotero.properties b/chrome/locale/gl-ES/zotero/zotero.properties index 8cb34827fc..0cff772aec 100644 --- a/chrome/locale/gl-ES/zotero/zotero.properties +++ b/chrome/locale/gl-ES/zotero/zotero.properties @@ -55,7 +55,7 @@ general.numMore=%S máis... general.openPreferences=Abrir as preferencias general.keys.ctrlShift=Ctrl+Shift+ general.keys.cmdShift=Cmd+Shift+ -general.dontShowAgain=Don’t Show Again +general.dontShowAgain=Non o volver a mostrar general.operationInProgress=Está en marcha unha operación Zotero general.operationInProgress.waitUntilFinished=Agarde ata que teña acabado. @@ -133,9 +133,9 @@ startupError.closeFirefox=Se Firefox está aberto co engadido de Zotero, pécheo startupError.databaseCannotBeOpened=Non pode abrirse a base de datos Zotero. startupError.checkPermissions=Asegúrese de ter permisos de lectura e escritura para todos os ficheiros no directorio de datos Zotero. startupError.zoteroVersionIsOlder=Esta versión do Zotero é máis vella que a versión utilizada por última vez coa súa base de datos. -startupError.incompatibleDBVersion=This %1$S database requires %1$S %2$S or later. +startupError.incompatibleDBVersion=Esta base de datos %1$S precisa de %1$S %2$S ou posteriores. startupError.zoteroVersionIsOlder.current=Versión actual: %S -startupError.zoteroVersionIsOlder.upgrade=Please upgrade to the latest version from %S. +startupError.zoteroVersionIsOlder.upgrade=Actualice da %S á nova versión startupError.databaseUpgradeError=Erro de actualización da base de datos date.relative.secondsAgo.one=1 segundo atrás @@ -209,8 +209,8 @@ pane.items.delete.multiple=Seguro que quere eliminar os elementos seleccionados? pane.items.remove.title=Eliminar da colección pane.items.remove=Seguro que queres eliminar o elemento escollido desta colección? pane.items.remove.multiple=Seguro que queres eliminar os elementos escollidos desta colección? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.menu.remove=Eliminar o elemento da colección... +pane.items.menu.remove.multiple=Eliminar os elementos da colección... pane.items.menu.moveToTrash=Mover os elementos ao lixo... pane.items.menu.moveToTrash.multiple=Mover os elementos ao lixo... pane.items.menu.export=Exportar o elemento seleccionado @@ -485,8 +485,8 @@ save.error.cannotAddFilesToCollection=Non pode engadir ficheiros á colección q ingester.saveToZotero=Gardar en Zotero ingester.saveToZoteroUsing=Gardar en Zotero empregando «%S» -ingester.saveToZoteroAsWebPageWithSnapshot=Save to Zotero as Web Page (with snapshot) -ingester.saveToZoteroAsWebPageWithoutSnapshot=Save to Zotero as Web Page (without snapshot) +ingester.saveToZoteroAsWebPageWithSnapshot=Gardar en Zotero como páxina web (con imaxe) +ingester.saveToZoteroAsWebPageWithoutSnapshot=Gardar en Zotero como páxina web (sen imaxe) ingester.scraping=Gardando o elemento... ingester.scrapingTo=Gardando en ingester.scrapeComplete=Gardouse o elemento @@ -572,11 +572,11 @@ zotero.preferences.export.quickCopy.citationInstructions=Para os estilos de bibl zotero.preferences.wordProcessors.installationSuccess=A instalación levouse a cabo correctamente. zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… +zotero.preferences.wordProcessors.installed=O engadido %S xa está instalado. +zotero.preferences.wordProcessors.notInstalled=O engadido %S agora mesmo non está instalado. +zotero.preferences.wordProcessors.install=Instalar o engadido %S +zotero.preferences.wordProcessors.reinstall=Reinstalar o engadido %S +zotero.preferences.wordProcessors.installing=Instalando %S zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. @@ -694,7 +694,7 @@ citation.locator.opus=Opus citation.locator.paragraph=Parágrafo citation.locator.part=Parte citation.locator.section=Sección -citation.locator.subverbo=Sub verbo +citation.locator.subverbo=Sub voce (s/v) citation.locator.volume=Volume citation.locator.verse=Verso @@ -758,7 +758,7 @@ integration.missingItem.multiple=Xa non existe na súa base de datos Zotero elem integration.missingItem.description=Facendo clic en «Non» borra os códigos de campo para as citas que conteñen este elemento, mantendo o texto das citas, mais borrándoo da súa bibliografía. integration.removeCodesWarning=Eliminar os códigos de campo impide que Zotero actualice as citas e bibliografías neste documento. Seguro que quere continuar? integration.upgradeWarning=O seu documento ten que ser actualizado permanentemente para que se poida traballar con Zotero 2.1 ou posteriores. É recomendable que faga unha copia de seguridade antes de continuar. Seguro que quere continuar? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=O seu documento creouse cunha versión de Zotero máis recente (a %1$S) que a súa actual (%2$S). Actualice Zotero á nova versión antes de editar este documento. integration.corruptField=O código de campo de Zotero correspondente a esta cita, e que lle di a Zotero a que elemento representa esta cita na súa biblioteca, corrompeuse. Gustaríalle volver a seleccionar o elemento? integration.corruptField.description=Facendo clic en «Non» bórranse os códigos de campo para as citas que conteñen este elemento, mantendo o texto das citas, mais potencialmente pode borralo da súa bibliografía. integration.corruptBibliography=O código de campo Zotero da súa bibliografía está corrompido. Debe borrar Zotero este código de campo e xerar unha nova bibliografía? @@ -790,8 +790,8 @@ sync.removeGroupsAndSync=Borrar o grupo e a sincronización sync.localObject=Obxecto local sync.remoteObject=Obxecto remoto sync.mergedObject=Obxecto unido -sync.merge.resolveAllLocal=Use the local version for all remaining conflicts -sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts +sync.merge.resolveAllLocal=Empregar a versión local para o resto de conflictos +sync.merge.resolveAllRemote=Empregar a versión remota para o resto de conflictos sync.error.usernameNotSet=Nome de usuario sen definir @@ -803,7 +803,7 @@ sync.error.enterPassword=Introduza un contrasinal. sync.error.loginManagerInaccessible=Zotero non pode acceder á información de acceso. sync.error.checkMasterPassword=Se está a usar un contrasinal maestro en %S, comprobe que o introduciu correctamente. sync.error.corruptedLoginManager=This could also be due to a corrupted %1$S logins database. To check, close %1$S, remove cert8.db, key3.db, and logins.json from your %1$S profile directory, and re-enter your Zotero login information in the Sync pane of the Zotero preferences. -sync.error.loginManagerCorrupted1=Zotero cannot access your login information, possibly due to a corrupted %S logins database. +sync.error.loginManagerCorrupted1=Zotero non é quen de acceder á súa información de acceso. É seguramente por %S accesos unha base de datos de rexistro. sync.error.loginManagerCorrupted2=Close %1$S, remove cert8.db, key3.db, and logins.json from your %2$S profile directory, and re-enter your Zotero login information in the Sync pane of the Zotero preferences. sync.error.syncInProgress=Xa se está executando unha sincronización. sync.error.syncInProgress.wait=Espere até que a sincronización anterior se complete ou reinicie %S. @@ -966,7 +966,7 @@ file.accessError.message.windows=Comprobe que o ficheiro non está a ser usado a file.accessError.message.other=Compribe que o ficheiro non está a ser usado agora e que ten permisos de escritura. file.accessError.restart=Reiniciar o computador ou desactivar as aplicacións de seguridade poderían tamén axudar. file.accessError.showParentDir=Mostrar o cartafol parental -file.error.cannotAddShortcut=Shortcut files cannot be added directly. Please select the original file. +file.error.cannotAddShortcut=Os atallos non se poden engadir directamente. Seleccione o ficheiro orixinal. lookup.failure.title=Fallou a busca lookup.failure.description=Zotero non atopou un rexistro para o identificador especificado. Verifique o identificador e ténteo de novo. @@ -1007,7 +1007,7 @@ firstRunGuidance.quickFormat=Teclee un título ou autor para buscar unha referen firstRunGuidance.quickFormatMac=Teclee un título de autor para facer unha busca dunha referencia.\n\nDespois de ter feito a selección prema na burbulla ou prema Cmd-\↓ para engadir os números de páxina, prefixos ou sufixos. Igualmente, pode incluír un número de páxina co seus termos de busca empregados e engadilo directamente.\n\nPode ademais editar citas directamente desde o procesador de documentos de textos. firstRunGuidance.toolbarButton.new=Click the ‘Z’ button to open Zotero, or use the %S keyboard shortcut. firstRunGuidance.toolbarButton.upgrade=A icona de Zotero pódese atopar na barra de ferramentas do Firefox. Preme na icona de Zotero para abrilo ou usa o atallo de teclado %S. -firstRunGuidance.saveButton=Click this button to save any web page to your Zotero library. On some pages, Zotero will be able to save full details, including author and date. +firstRunGuidance.saveButton=Preme este botón para gardar calquera páxina web na librería de Zotero. Zotero pode gardar a información completa dalgunhas páxinas, como data e autor. styles.bibliography=Bibliografía styles.editor.save=Gardar o estilo de citas diff --git a/chrome/locale/nl-NL/zotero/zotero.properties b/chrome/locale/nl-NL/zotero/zotero.properties index 428a49a230..7eb807cdcc 100644 --- a/chrome/locale/nl-NL/zotero/zotero.properties +++ b/chrome/locale/nl-NL/zotero/zotero.properties @@ -1005,7 +1005,7 @@ connector.loadInProgress=Zotero Stand-alone was gestart maar is niet beschikbaar firstRunGuidance.authorMenu=Zotero ondersteund ook redacteuren en vertalers. U kunt een auteur veranderen in een redacteur of vertaler via dit menu. firstRunGuidance.quickFormat=Type een titel of auteur in om een verwijzing op te zoeken.\n\nNadat u uw selectie heeft gemaakt, klik op de ballon of druk op Ctrl-↓ om pagina-nummers, voorvoegsels en achtervoegsels toe te voegen. U kunt ook het pagina-nummer toevoegen aan uw zoektermen om het zo automatisch toe te voegen.\n\nU kunt verwijzingen direct aanpassen in het document van de tekstverwerker. firstRunGuidance.quickFormatMac=Type een titel of auteur in om een verwijzing op te zoeken.\n\nNadat u uw selectie heeft gemaakt, klik op de ballon of druk op Cmd-↓ om pagina-nummers, voorvoegsels en achtervoegsels toe te voegen. U kunt ook het pagina-nummer toevoegen aan uw zoektermen om het zo automatisch toe te voegen.\n\nU kunt verwijzingen direct aanpassen in het document van de tekstverwerker. -firstRunGuidance.toolbarButton.new=Klik hier om Zotero te openen, of gebruik de sneltoets %S op het toetsenbord. +firstRunGuidance.toolbarButton.new=Click the ‘Z’ button to open Zotero, or use the %S keyboard shortcut. firstRunGuidance.toolbarButton.upgrade=Het Zotero-icoon kan nu gevonden worden in de Firefox-toolbar. Klik op het icoon om Zotero te openen, of gebruik de sneltoets %S op het toetsenbord. firstRunGuidance.saveButton=Click this button to save any web page to your Zotero library. On some pages, Zotero will be able to save full details, including author and date. diff --git a/chrome/locale/pl-PL/zotero/zotero.properties b/chrome/locale/pl-PL/zotero/zotero.properties index 31e660422a..6076afe75c 100644 --- a/chrome/locale/pl-PL/zotero/zotero.properties +++ b/chrome/locale/pl-PL/zotero/zotero.properties @@ -116,7 +116,7 @@ dataDir.selectedDirEmpty.title=Katalog jest pusty dataDir.selectedDirEmpty.text=Wybrany katalog jest pusty. Aby przenieść istniejący katalog danych Zotero, należy ręcznie przenieść pliki z istniejącego katalogu danych do nowej lokalizacji po zamknięciu %1$S. dataDir.selectedDirEmpty.useNewDir=Użyć nowego katalogu? dataDir.moveFilesToNewLocation=Upewnij się, że pliki z twojego istniejącego katalogu danych Zotero zostały przeniesione w nowe miejsce, zanim ponownie otworzysz %1$S. -dataDir.incompatibleDbVersion.title=Niepasująca wersja bazy danych +dataDir.incompatibleDbVersion.title=Niezgodna wersja bazy danych dataDir.incompatibleDbVersion.text=Aktualnie wybrany katalog danych nie jest zgodny z Zotero Standalone, ponieważ może on współdzielić bazy danych tylko z Zotero dla Firefoksa 2.1b3 lub nowszym.\n\nProszę najpierw uaktualnić Zotero dla Firefoksa do najnowszej wersji lub wybrać inny katalog danych do użycia z Zotero Standalone. dataDir.standaloneMigration.title=Znaleziono istniejącą bibliotekę Zotero dataDir.standaloneMigration.description=Wygląda na to, że pierwszy raz używasz %1$S. Czy chcesz aby %1$S zaimportował ustawienia z %2$S i użył twojego istniejącego katalogu danych? @@ -275,7 +275,7 @@ pane.item.attachments.count.singular=%S załącznik pane.item.attachments.count.plural=%S załączniki(ów) pane.item.attachments.select=Wybierz plik pane.item.attachments.PDF.installTools.title=Program PDF Tools nie jest zainstalowany -pane.item.attachments.PDF.installTools.text=Aby używać tej funkcji, musisz najpierw zainstalować narzędzia PDF w zakładce Wyszukiwanie w ustawieniach Zotero. +pane.item.attachments.PDF.installTools.text=Aby używać tej funkcji, musisz najpierw zainstalować narzędzia PDF w panelu Wyszukiwanie w ustawieniach Zotero. pane.item.attachments.filename=Nazwa pliku pane.item.noteEditor.clickHere=kliknij tutaj pane.item.tags.count.zero=%S etykiet: @@ -508,9 +508,9 @@ ingester.lookup.error=W trakcie wyszukiwania tego elementu wystąpił błąd. db.dbCorrupted=Baza danych Zotero "%S" jest prawdopodobnie uszkodzona. db.dbCorrupted.restart=Proszę uruchomić ponownie %S, aby spróbować odzyskać danych z ostatniej kopi zapasowej. -db.dbCorruptedNoBackup=Baza danych Zotero "%S" jest prawdopodobnie uszkodzona i niemożliwe jest automatyczne odzyskiwanie z kopii zapasowej.\n\nUtworzono nowy plik bazy danych. Uszkodzony plik został zapisany w katalogu Zotero. +db.dbCorruptedNoBackup=Baza danych Zotero "%S" jest prawdopodobnie uszkodzona i niemożliwe jest jej automatyczne odzyskiwanie z kopii zapasowej.\n\nUtworzono nowy plik bazy danych. Uszkodzony plik został zapisany w katalogu Zotero. db.dbRestored=Baza danych Zotero "%1$S" jest prawdopodobnie uszkodzona.\n\nDane zostały odtworzone z ostatniej kopii zapasowej utworzonej\n%2$S o godz. %3$S. Uszkodzony plik został zapisany w katalogu Zotero. -db.dbRestoreFailed=Baza danych Zotero "%S" jest prawdopodobnie uszkodzona.\n\nPróba odtworzenia danych z ostatniej utworzonej kopii zapasowej nie powiodła się.\nUtworzono nowy plik bazy danych. Uszkodzony plik został zapisany w katalogu Zotero. +db.dbRestoreFailed=Baza danych Zotero "%S" jest prawdopodobnie uszkodzona.\n\nPróba jej odtworzenia danych z ostatniej utworzonej kopii zapasowej nie powiodła się.\nUtworzono nowy plik bazy danych. Uszkodzony plik został zapisany w katalogu Zotero. db.integrityCheck.passed=Baza danych nie zawiera błędów. db.integrityCheck.failed=Baza danych Zotero zawiera błędy. @@ -750,7 +750,7 @@ integration.error.notInCitation=Należy umieścić kursor w cytowaniu Zotero, ab integration.error.noBibliography=Bieżący styl bibliograficzny nie definiuje bibliografii. Jeśli chcesz dodać bibliografię wybierz proszę inny styl. integration.error.deletePipe=Nie można było utworzyć potoku używanego przez przez Zotero do komunikacji z edytorem tekstu. Czy chcesz, aby Zotero spróbowało usunąć ten błąd? Zostaniesz poproszony o swoje hasło. integration.error.invalidStyle=Styl, który wybrałeś, wydaje się być niepoprawny. Jeżeli utworzyłeś go samodzielnie, upewnij się, że jest on poprawny, korzystając ze strony http://zotero.org/support/dev/citation_styles. Możesz również spróbować wybrać inny styl. -integration.error.fieldTypeMismatch=Zotero nie może zaktualizować tego dokumentu, ponieważ został on utworzony przy pomocy edytora tekstu niekompatybilnego z użytym sposobem kodowania pól. Aby dokument był kompatybilny zarówno z Wordem, jak i OpenOffice.org/LibreOffice/NeoOffice, otwórz dokument w edytorze tekstu, w którym został on utworzony, i zmień w Preferencjach dokumentu Zotero typ pól na Zakładki. +integration.error.fieldTypeMismatch=Zotero nie może zaktualizować tego dokumentu, ponieważ został on utworzony przy pomocy edytora tekstu niezgodnego z użytym sposobem kodowania pól. Aby dokument był zgodny zarówno z Wordem, jak i OpenOffice.org/LibreOffice/NeoOffice, otwórz dokument w edytorze tekstu, w którym został on utworzony, i zmień w Preferencjach dokumentu Zotero typ pól na Zakładki. integration.replace=Czy zamienić to pole Zotero? integration.missingItem.single=Ten element już nie istnieje w twojej bazie danych Zotero. Czy chcesz wybrać element zastępczy? @@ -802,9 +802,9 @@ sync.error.invalidLogin.text=Serwer synchronizacji Zotero nie zaakceptował twoj sync.error.enterPassword=Proszę podać hasło. sync.error.loginManagerInaccessible=Zotero nie może uzyskać dostępu do twoich danych logowania. sync.error.checkMasterPassword=Jeśli używasz hasła głównego w %S upewnij się, że zostało ono wprowadzone poprawnie. -sync.error.corruptedLoginManager=This could also be due to a corrupted %1$S logins database. To check, close %1$S, remove cert8.db, key3.db, and logins.json from your %1$S profile directory, and re-enter your Zotero login information in the Sync pane of the Zotero preferences. +sync.error.corruptedLoginManager=Może to być spowodowane także przez uszkodzoną bazę danych logowania %1$S. Aby to sprawdzić, zamknij %1$S, usuń pliki cert8.db, key3.db i logins.json ze swojego katalogu profilu %1$S, a następnie ponownie wprowadź swoje dane logowania Zotero w panelu Synchronizacja w ustawieniach Zotero. sync.error.loginManagerCorrupted1=Zotero nie może uzyskać dostępu do twoich informacji logowania z powodu uszkodzonej bazy danych logowania %S. -sync.error.loginManagerCorrupted2=Zamknij %1$S, usuń pliki cert8.db, key3.db oraz logins.json ze swojego katalogu profilu %2$S, a następnie ponownie wprowadź swoje dane logowania Zotero w zakładce Synchronizacja w ustawieniach Zotero. +sync.error.loginManagerCorrupted2=Zamknij %1$S, usuń pliki cert8.db, key3.db oraz logins.json ze swojego katalogu profilu %2$S, a następnie ponownie wprowadź swoje dane logowania Zotero w panelu Synchronizacja w ustawieniach Zotero. sync.error.syncInProgress=Synchronizacja jest aktualnie w trakcie. sync.error.syncInProgress.wait=Poczekaj na zakończenie poprzedniej synchronizacji albo uruchom ponownie %S. sync.error.writeAccessLost=Nie masz już uprawnień zapisu do grupy Zotero "%S", a więc dodane lub edytowane elementy nie mogą zostać zsynchronizowane z serwerem. @@ -821,7 +821,7 @@ sync.error.invalidCharsFilename=Nazwa pliku "%S" zawiera nieprawidłowe znaki.\n sync.lastSyncWithDifferentAccount=Ta baza danych Zotero była ostatnio synchronizowana z innego konta zotero.org (%1$S) niż obecnie używane (%2$S). sync.localDataWillBeCombined=Jeśli będziesz kontynuować, lokalne dane Zotero zostaną połączone z danymi z konta "%S" przechowywanymi na serwerze. sync.localGroupsWillBeRemoved1=Grupy lokalne, również te ze zmienionymi elementami, będą także usunięte. -sync.avoidCombiningData=Aby zapobiec połączeniu lub utracie danych, przywróć konto "%S" lub użyj opcji Przywróć w zakładce Synchronizacja w ustawieniach Zotero. +sync.avoidCombiningData=Aby zapobiec połączeniu lub utracie danych, przywróć konto "%S" lub użyj opcji Przywróć w panelu Synchronizacja w ustawieniach Zotero. sync.localGroupsWillBeRemoved2=Jeśli będziesz kontynuować, grupy lokalne, również te ze zmienionymi elementami, będą usunięte i zastąpione grupami z konta "%1$S".\n\nAby zapobiec utracie zmian w grupach, upewnij się że dokonana została najpierw synchronizacja z kontem "%2$S" zanim dokonasz synchronizacji z kontem "%1$S". sync.conflict.autoChange.alert=Od czasu ostatniej synchronizacji jeden lub więcej lokalnie usuniętych elementów "%S" Zotero zostało zdalnie zmodyfikowanych. diff --git a/chrome/locale/pt-BR/zotero/preferences.dtd b/chrome/locale/pt-BR/zotero/preferences.dtd index 51dc12d2ab..7ff8de0195 100644 --- a/chrome/locale/pt-BR/zotero/preferences.dtd +++ b/chrome/locale/pt-BR/zotero/preferences.dtd @@ -140,13 +140,13 @@ - - + + - - + + - + @@ -154,10 +154,10 @@ - - - - + + + + @@ -165,12 +165,12 @@ - + - + - + @@ -180,26 +180,26 @@ - + - - + + - + - + - - - - + + + + - + diff --git a/chrome/locale/pt-BR/zotero/searchbox.dtd b/chrome/locale/pt-BR/zotero/searchbox.dtd index 59259374db..afe83dc811 100644 --- a/chrome/locale/pt-BR/zotero/searchbox.dtd +++ b/chrome/locale/pt-BR/zotero/searchbox.dtd @@ -3,12 +3,12 @@ - - - + + + - + diff --git a/chrome/locale/pt-BR/zotero/timeline.properties b/chrome/locale/pt-BR/zotero/timeline.properties index 04ab23391c..1dcfc1de2e 100644 --- a/chrome/locale/pt-BR/zotero/timeline.properties +++ b/chrome/locale/pt-BR/zotero/timeline.properties @@ -1,4 +1,4 @@ -general.title=Linha do tempo Zotero +general.title=Linha de tempo do Zotero general.filter=Filtro: general.highlight=Destaque: general.clearAll=Limpar tudo diff --git a/chrome/locale/pt-BR/zotero/zotero.dtd b/chrome/locale/pt-BR/zotero/zotero.dtd index 72f8d35c2d..992dd7bdf0 100644 --- a/chrome/locale/pt-BR/zotero/zotero.dtd +++ b/chrome/locale/pt-BR/zotero/zotero.dtd @@ -14,7 +14,7 @@ - + @@ -31,30 +31,30 @@ - + - + - + - + - + - + @@ -73,7 +73,7 @@ - + @@ -84,7 +84,7 @@ - + @@ -105,20 +105,20 @@ - + - + - + - + @@ -130,41 +130,41 @@ - + - + - + - - - - + + + + - - + + - + - + - + - + - + - - + + @@ -175,9 +175,9 @@ - + - + @@ -186,14 +186,14 @@ - + - + - + - + @@ -202,91 +202,91 @@ - - - - + + + + - - + + - + - - + + - - + + - + - + - + - + - - - + + + - - + + - + - + - - - - + + + + - + - + - + - + - - + + - + - + - - + + - - + + - - - + + + - + diff --git a/chrome/locale/pt-BR/zotero/zotero.properties b/chrome/locale/pt-BR/zotero/zotero.properties index a4b63dde64..a814833ee3 100644 --- a/chrome/locale/pt-BR/zotero/zotero.properties +++ b/chrome/locale/pt-BR/zotero/zotero.properties @@ -68,7 +68,7 @@ punctuation.ellipsis=... install.quickStartGuide=Guia de Início Rápido do Zotero install.quickStartGuide.message.welcome=Bem-vindo(a) ao Zotero! -install.quickStartGuide.message.view=Veja o Guia rápido para aprender a como começar a coletar, gerenciar, citar e partilhar suas fontes de pesquisa. +install.quickStartGuide.message.view=Veja o Guia de Início Rápido para aprender a coletar, gerenciar, citar e partilhar suas fontes de pesquisa. install.quickStartGuide.message.thanks=Obrigado por instalar Zotero. upgrade.failed.title=A atualização falhou diff --git a/chrome/skin/default/zotero/treeitem-attachment-pdf@2x.png b/chrome/skin/default/zotero/treeitem-attachment-pdf@2x.png new file mode 100644 index 0000000000..899804924f Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-attachment-pdf@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-webpage-gray.png b/chrome/skin/default/zotero/treeitem-webpage-gray.png new file mode 100644 index 0000000000..0c2275ee34 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-webpage-gray.png differ diff --git a/chrome/skin/default/zotero/treeitem-webpage-gray@2x.png b/chrome/skin/default/zotero/treeitem-webpage-gray@2x.png new file mode 100644 index 0000000000..5bf886120a Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-webpage-gray@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-webpage-gray@48px.png b/chrome/skin/default/zotero/treeitem-webpage-gray@48px.png new file mode 100644 index 0000000000..1a09ec289b Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-webpage-gray@48px.png differ diff --git a/chrome/skin/default/zotero/treeitem-webpage@48px.png b/chrome/skin/default/zotero/treeitem-webpage@48px.png new file mode 100644 index 0000000000..2103d144af Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-webpage@48px.png differ diff --git a/resource/schema/renamed-styles.json b/resource/schema/renamed-styles.json index 75fe540a88..1f53813098 100644 --- a/resource/schema/renamed-styles.json +++ b/resource/schema/renamed-styles.json @@ -56,6 +56,7 @@ "ceylon-medical-journal": "the-ceylon-medical-journal", "chemical-hazards-in-industry": "royal-society-of-chemistry", "chicago-note": "chicago-note-bibliography", + "chinese-journal-of-geochemistry": "acta-geochimica", "chronic-diseases-in-canada": "chronic-diseases-and-injuries-in-canada", "college-of-physicians-and-surgeons-pakistan": "journal-of-the-college-of-physicians-and-surgeons-pakistan", "combination-products-in-therapy": "springer-vancouver-brackets", @@ -269,6 +270,7 @@ "giornale-italiano-di-health-technology-assessment": "springer-vancouver-brackets", "gost-r-7-0-5-2008-csl-1-0": "gost-r-7-0-5-2008", "graefes-archive-and-experimental-ophthalmology": "graefes-archive-for-clinical-and-experimental-ophthalmology", + "gruppendynamik-und-organisationsberatung": "gruppe-interaktion-organisation-zeitschrift-fur-angewandte-organisationspsychologie", "harvard-anglia-ruskin": "harvard-anglia-ruskin-university", "harvard-oxford-brookes-university": "harvard-cite-them-right", "harvard-sheffield": "harvard-the-university-of-sheffield-town-and-regional-planning", @@ -401,9 +403,11 @@ "nlm": "national-library-of-medicine", "nonlinear-biomedical-physics": "biomed-central", "north-west-university-harvard": "harvard-north-west-university", + "nrl-advances": "springer-basic-brackets", "open-network-biology": "biomed-central", "ophthalmic-surgery-lasers-and-imaging": "ophthalmic-surgery-lasers-and-imaging-retina", "optical-society-of-america": "the-optical-society", + "organic-and-medicinal-chemistry-letters": "chemistry-central-journal", "oxford-brookes-university-faculty-of-health-and-life-sciences": "harvard-oxford-brookes-university-faculty-of-health-and-life-sciences", "oxford-university-new-south-wales": "oxford-the-university-of-new-south-wales", "pedobiologia-international-journal-of-soil-biology": "pedobiologia-journal-of-soil-ecology", @@ -418,6 +422,7 @@ "progrcs-en-urologie-fmc": "progres-en-urologie", "quaderni-avogadro-colloquia": "quaderni-degli-avogadro-colloquia", "queensland-lawyer": "the-queensland-lawyer", + "rare-cancers-and-therapy": "oncology-and-therapy", "review-of-financial-studies": "the-review-of-financial-studies", "revista-brasileira-de-botanica": "brazilian-journal-of-botany", "rockefeller-university-press": "the-rockefeller-university-press", @@ -458,6 +463,7 @@ "university-of-melbourne": "harvard-the-university-of-melbourne", "uqam-universite-du-quebec-a-montreal": "universite-du-quebec-a-montreal", "user-modeling-and-useradapted-interaction": "user-modeling-and-user-adapted-interaction", + "water-quality-exposure-and-health": "exposure-and-health", "wceam2010": "world-congress-on-engineering-asset-management", "wirtschaftsinformatik": "springer-basic-author-date", "world-health-organization-journals": "world-health-organization", diff --git a/resource/schema/repotime.txt b/resource/schema/repotime.txt index da0a79b211..8a55891ee0 100644 --- a/resource/schema/repotime.txt +++ b/resource/schema/repotime.txt @@ -1 +1 @@ -2015-12-08 12:45:00 +2016-02-27 22:00:00 diff --git a/styles b/styles index ae6a29dcc9..b864314ae1 160000 --- a/styles +++ b/styles @@ -1 +1 @@ -Subproject commit ae6a29dcc9123352644b1a591b8b458ca761c2c7 +Subproject commit b864314ae1f12fc432c1d4f72b5e5fd0ce7beae7 diff --git a/translators b/translators index 7916f48624..442a7a17c4 160000 --- a/translators +++ b/translators @@ -1 +1 @@ -Subproject commit 7916f486246e40577b7a5e82bde673234db42905 +Subproject commit 442a7a17c4ecfb549ae48034dec768991b8be1e8