commit e3d03ca3800d12aea0265d28ba8f4fb539bb809f
parent 0184101ed0bf552de61db1fc67bea5984d53359e
Author: Dan Stillman <dstillman@zotero.org>
Date: Mon, 7 Mar 2016 22:20:57 -0500
Revert "Update citeproc-js to 1.1.74"
This reverts commit 52980133b01efcde6ecbf9273c58e71e9be5bdd6.
Diffstat:
1 file changed, 1015 insertions(+), 2110 deletions(-)
diff --git a/chrome/content/zotero/xpcom/citeproc.js b/chrome/content/zotero/xpcom/citeproc.js
@@ -1,28 +1,72 @@
/*
- * /**
- * Copyright (c) 2009-2016 Frank Bennett
+ * Copyright (c) 2009-2014 Frank G. Bennett
*
- * This program is free software: you can redistribute it and/or
- * modify it under EITHER
+ * Unless otherwise indicated, the files in this repository are subject
+ * to the Common Public Attribution License Version 1.0 (the “License”);
+ * you may not use this file except in compliance with the License. You
+ * may obtain a copy of the License at:
*
- * * the terms of the Common Public Attribution License (CPAL) as
- * published by the Open Source Initiative, either version 1 of
- * the CPAL, or (at your option) any later version; OR
+ * http://bitbucket.org/fbennett/citeproc-js/src/tip/LICENSE.
*
- * * the terms of the GNU Affero General Public License (AGPL)
- * as published by the Free Software Foundation, either version
- * 3 of the AGPL, or (at your option) any later version.
+ * (See also the note on attribution information below)
*
- * This program 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.
+ * The License is based on the Mozilla Public License Version 1.1 but
+ * Sections 1.13, 14 and 15 have been added to cover use of software over a
+ * computer network and provide for limited attribution for the
+ * Original Developer. In addition, Exhibit A has been modified to be
+ * consistent with Exhibit B.
*
- * You should have received copies of the Common Public Attribution
- * License and of the GNU Affero General Public License along with
- * this program. If not, see <https://opensource.org/licenses/> or
- * <http://www.gnu.org/licenses/> respectively.
- * */
+ * Software distributed under the License is distributed on an “AS IS”
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is the citation formatting software known as
+ * "citeproc-js" (an implementation of the Citation Style Language
+ * [CSL]), including the original test fixtures and software located
+ * under the ./tests subdirectory of the distribution archive.
+ *
+ * The Original Developer is not the Initial Developer and is
+ * __________. If left blank, the Original Developer is the Initial
+ * Developer.
+ *
+ * The Initial Developer of the Original Code is Frank Bennett. All
+ * portions of the code written by Frank Bennett are Copyright (c)
+ * 2009-2014 Frank Bennett.
+ *
+ * ***
+ *
+ * Alternatively, the files in this repository may be used under the
+ * terms of the GNU Affero General Public License (the [AGPLv3] License),
+ * in which case the provisions of [AGPLv3] License are applicable
+ * instead of those above. If you wish to allow use of your version of
+ * this file only under the terms of the [AGPLv3] License and not to
+ * allow others to use your version of this file under the CPAL, indicate
+ * your decision by deleting the provisions above and replace them with
+ * the notice and other provisions required by the [AGPLv3] License. If
+ * you do not delete the provisions above, a recipient may use your
+ * version of this file under either the CPAL or the [AGPLv3] License.
+ *
+ * ***
+ *
+ * Attribution Information (CPAL)
+ *
+ * Attribution Copyright Notice: [no separate attribution copyright notice is required]
+ *
+ * Attribution Phrase: "Citations by CSL (citeproc-js)"
+ *
+ * Attribution URL: http://citationstyles.org/
+ *
+ * Graphic Image: [there is no requirement to display a Graphic Image]
+ *
+ * Display of Attribution Information is REQUIRED in Larger Works which
+ * are defined in the CPAL as a work which combines Covered Code or
+ * portions thereof with code not governed by the terms of the CPAL.
+ *
+ * Display of Attribution Information is also REQUIRED on Associated
+ * Websites.
+ *
+ * [ citeproc-js license :: version 1.1 :: 2012.06.30 ]
*/
if (!Array.indexOf) {
Array.prototype.indexOf = function (obj) {
@@ -36,13 +80,13 @@ if (!Array.indexOf) {
};
}
var CSL = {
- PROCESSOR_VERSION: "1.1.74",
+ PROCESSOR_VERSION: "1.1.60",
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|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_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_STRINGS: {
"art.": "article",
"bk.": "book",
@@ -148,35 +192,9 @@ var CSL = {
["(", "["],
[")", "]"]
],
- checkNestedBrace: function(state) {
- if (state.opt.xclass === "note") {
- this.depth = 0;
- this.update = function(str) {
- var str = str ? str : '';
- var lst = str.split(/([\(\)])/);
- for (var i=1,ilen=lst.length;i<ilen;i += 2) {
- if (lst[i] === '(') {
- if (1 === (this.depth % 2)) {
- lst[i] = '['
- }
- this.depth += 1;
- } else if (lst[i] === ')') {
- if (0 === (this.depth % 2)) {
- lst[i] = ']'
- }
- this.depth -= 1;
- }
- }
- var ret = lst.join("");
- return ret;
- }
- } else {
- this.update = function(str) {
- return str;
- }
- };
- },
- MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","genre","title-short","medium","jurisdiction","archive","archive-place"],
+ 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"],
LangPrefsMap: {
"title":"titles",
"title-short":"titles",
@@ -342,61 +360,16 @@ var CSL = {
"available-date",
"submitted"
],
- TAG_ESCAPE: function (str, stopWords) {
+ TAG_ESCAPE: function (str) {
var mx, lst, len, pos, m, buf1, buf2, idx, ret, myret;
- if (!stopWords) {
- stopWords = [];
- }
- var pairs = {
- "<span class=\"nocase\">": "</span>",
- "<span class=\"nodecor\">": "</span>"
- };
- var stack = [];
- str = str.replace(/(<span)\s+(class=\"no(?:case|decor)\")\s*(>)/g, "$1 $2$3");
- var m1match = str.match(/((?: \"| \'|\" |\'[-.,;\?:]|\[|\]|\(|\)|<span class=\"no(?:case|decor)\">|<\/span>|<\/?(?:i|sc|b)>))/g);
- if (!m1match) {
- return [str];
- }
- var m1split = str.split(/(?: \"| \'|\" |\'[-.,;\?:]|\[|\]|\(|\)|<span class=\"no(?:case|decor)\">|<\/span>|<\/?(?:i|sc|b)>)/g);
- outer: for (var i=0,ilen=m1match.length; i<ilen; i++) {
- if (pairs[m1match[i]]) {
- stack.push({
- tag: m1match[i],
- pos: i
- });
- var mFirstWord = m1split[i].match(/^(\s*([^' ]+[']?))(.*)/);
- if (mFirstWord) {
- if (stopWords.indexOf(mFirstWord[2]) > -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<i+1; k++) {
- m1match[k] = m1split[k] + m1match[k];
- m1split[k] = "";
- }
- stack.pop();
- break;
- }
- }
- }
- }
- myret = [m1split[0]];
- for (pos = 1, len = m1split.length; pos < len; pos += 1) {
- myret.push(m1match[pos - 1]);
- myret.push(m1split[pos]);
- }
- var lst = myret.slice();
+ mx = str.match(/((?:\"|\')|(?:(?:<span\s+class=\"no(?:case|decor)\">).*?(?:<\/span>|<\/?(?:i|sc|b)>)))/g);
+ lst = str.split(/(?:(?:\"|\')|(?:(?:<span\s+class=\"no(?:case|decor)\">).*?(?:<\/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]);
+ }
+ lst = myret.slice();
return lst;
},
TAG_USEALL: function (str) {
@@ -686,916 +659,20 @@ if ("object" === typeof console && "function" === typeof console.log) {
throw "CSL error: " + str;
};
}
-CSL.XmlJSON = function (dataObj) {
- this.dataObj = dataObj;
- this.institution = {
- name:"institution",
- attrs:{
- "institution-parts":"long",
- "delimiter":", ",
- "substitute-use-first":"1",
- "use-last":"1"
- },
- children:[
- {
- name:"institution-part",
- attrs:{
- name:"long"
- },
- children:[]
- }
- ]
- };
-};
-CSL.XmlJSON.prototype.clean = function (json) {
- return json;
-};
-CSL.XmlJSON.prototype.getStyleId = function (myjson, styleName) {
- var tagName = 'id';
- if (styleName) {
- tagName = 'title';
- }
- return myjson.attrs[tagName];
-};
-CSL.XmlJSON.prototype.children = function (myjson) {
- if (myjson && myjson.children.length) {
- return myjson.children.slice();
- } else {
- return false;
- }
-};
-CSL.XmlJSON.prototype.nodename = function (myjson) {
- return myjson.name;
-};
-CSL.XmlJSON.prototype.attributes = function (myjson) {
- var ret = {};
- for (var attrname in myjson.attrs) {
- ret["@"+attrname] = myjson.attrs[attrname];
- }
- return ret;
-};
-CSL.XmlJSON.prototype.content = function (myjson) {
- var ret = "";
- if (!myjson || !myjson.children) {
- return ret;
- }
- for (var i=0, ilen=myjson.children.length; i < ilen; i += 1) {
- if ("string" === typeof myjson.children[i]) {
- ret += myjson.children[i];
- }
- }
- return ret;
-};
-CSL.XmlJSON.prototype.namespace = {}
-CSL.XmlJSON.prototype.numberofnodes = function (myjson) {
- if (myjson && "number" == typeof myjson.length) {
- return myjson.length;
- } else {
- return 0;
- }
-};
-CSL.XmlJSON.prototype.getAttributeValue = function (myjson,name,namespace) {
- var ret = "";
- if (namespace) {
- name = namespace+":"+name;
- }
- if (myjson) {
- if (myjson.attrs) {
- if (myjson.attrs[name]) {
- ret = myjson.attrs[name];
- } else {
- ret = "";
- }
- }
- }
- return ret;
-}
-CSL.XmlJSON.prototype.getNodeValue = function (myjson,name) {
- var ret = "";
- if (name){
- for (var i=0, ilen=myjson.children.length; i < ilen; i += 1) {
- if (myjson.children[i].name === name) {
- if (myjson.children[i].children.length) {
- ret = myjson.children[i];
- } else {
- ret = "";
- }
- }
- }
- } else if (myjson) {
- ret = myjson;
- }
- if (ret && ret.children && ret.children.length == 1 && "string" === typeof ret.children[0]) {
- ret = ret.children[0];
- }
- return ret;
-}
-CSL.XmlJSON.prototype.setAttributeOnNodeIdentifiedByNameAttribute = function (myjson,nodename,partname,attrname,val) {
- var pos, len, xml, nodes, node;
- if (attrname.slice(0,1) === '@'){
- attrname = attrname.slice(1);
- }
- for (var i=0,ilen=myjson.children.length; i<ilen; i += 1) {
- if (myjson.children[i].name === nodename && myjson.children[i].attrs.name === partname) {
- myjson.children[i].attrs[attrname] = val;
- }
- }
-}
-CSL.XmlJSON.prototype.deleteNodeByNameAttribute = function (myjson,val) {
- var i, ilen;
- for (i = 0, ilen = myjson.children.length; i < ilen; i += 1) {
- if (!myjson.children[i] || "string" === typeof myjson.children[i]) {
- continue;
- }
- if (myjson.children[i].attrs.name == val) {
- myjson.children = myjson.children.slice(0,i).concat(myjson.children.slice(i+1));
- }
- }
-}
-CSL.XmlJSON.prototype.deleteAttribute = function (myjson,attrname) {
- var i, ilen;
- if ("undefined" !== typeof myjson.attrs[attrname]) {
- myjson.attrs.pop(attrname);
- }
-}
-CSL.XmlJSON.prototype.setAttribute = function (myjson,attr,val) {
- myjson.attrs[attr] = val;
- return false;
-}
-CSL.XmlJSON.prototype.nodeCopy = function (myjson,clone) {
- if (!clone) {
- var clone = {};
- }
- if ("object" === typeof clone && "undefined" === typeof clone.length) {
- for (var key in myjson) {
- if ("string" === typeof myjson[key]) {
- clone[key] = myjson[key];
- } else if ("object" === typeof myjson[key]) {
- if ("undefined" === typeof myjson[key].length) {
- clone[key] = this.nodeCopy(myjson[key],{});
- } else {
- clone[key] = this.nodeCopy(myjson[key],[]);
- }
- }
- }
- } else {
- for (var i=0,ilen=myjson.length;i<ilen; i += 1) {
- if ("string" === typeof myjson[i]) {
- clone[i] = myjson[i];
- } else {
- clone[i] = this.nodeCopy(myjson[i],{});
- }
- }
- }
- return clone;
-}
-CSL.XmlJSON.prototype.getNodesByName = function (myjson,name,nameattrval,ret) {
- var nodes, node, pos, len;
- if (!ret) {
- var ret = [];
- }
- if (!myjson || !myjson.children) {
- return ret;
- }
- if (name === myjson.name) {
- if (nameattrval) {
- if (nameattrval === myjson.attrs.name) {
- ret.push(myjson);
- }
- } else {
- ret.push(myjson);
- }
- }
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1){
- if ("object" !== typeof myjson.children[i]) {
- continue;
- }
- this.getNodesByName(myjson.children[i],name,nameattrval,ret);
- }
- return ret;
-}
-CSL.XmlJSON.prototype.nodeNameIs = function (myjson,name) {
- if (name == myjson.name) {
- return true;
- }
- return false;
-}
-CSL.XmlJSON.prototype.makeXml = function (myjson) {
- if ("string" === typeof myjson) {
- if (myjson.slice(0, 1) === "<") {
- myjson = this.jsonStringWalker.walkToObject(myjson);
- } else {
- myjson = JSON.parse(myjson);
- }
- }
- return myjson;
-};
-CSL.XmlJSON.prototype.insertChildNodeAfter = function (parent,node,pos,datejson) {
- for (var i=0,ilen=parent.children.length;i<ilen;i+=1) {
- if (node === parent.children[i]) {
- parent.children = parent.children.slice(0,i).concat([datejson]).concat(parent.children.slice(i+1));
- break;
- }
- }
- return parent;
-};
-CSL.XmlJSON.prototype.insertPublisherAndPlace = function(myjson) {
- if (myjson.name === "group") {
- var useme = true;
- var mustHaves = ["publisher","publisher-place"];
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- var haveVarname = mustHaves.indexOf(myjson.children[i].attrs.variable);
- var isText = myjson.children[i].name === "text";
- if (isText && haveVarname > -1 && !myjson.children[i].attrs.prefix && !myjson.children[i].attrs.suffix) {
- mustHaves = mustHaves.slice(0,haveVarname).concat(mustHaves.slice(haveVarname+1));
- } else {
- useme = false;
- break;
- }
- }
- if (useme && !mustHaves.length) {
- myjson.attrs["has-publisher-and-publisher-place"] = true;
- }
- }
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- if ("object" === typeof myjson.children[i]) {
- this.insertPublisherAndPlace(myjson.children[i]);
- }
- }
-}
-CSL.XmlJSON.prototype.isChildOfSubstitute = function(parents) {
- if (parents.length > 0) {
- var myparents = parents.slice();
- var parent = myparents.pop();
- if (parent === "substitute") {
- return true;
- } else {
- return this.isChildOfSubstitute(myparents);
- }
- }
- return false;
-};
-CSL.XmlJSON.prototype.addMissingNameNodes = function(myjson,parents) {
- if (!parents) {
- parents = [];
- }
- if (myjson.name === "names") {
- if (!this.isChildOfSubstitute(parents)) {
- var addName = true;
- for (var i=0,ilen=myjson.children.length;i<ilen;i++) {
- if (myjson.children[i].name === "name") {
- addName = false;
- break;
- }
- }
- if (addName) {
- myjson.children = [{name:"name",attrs:{},children:[]}].concat(myjson.children);
- }
- }
- }
- parents.push(myjson.name);
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- if ("object" === typeof myjson.children[i]) {
- this.addMissingNameNodes(myjson.children[i],parents);
- }
- }
- parents.pop();
-}
-CSL.XmlJSON.prototype.addInstitutionNodes = function(myjson) {
- var names, thenames, institution, theinstitution, name, thename, xml, pos, len;
- if (myjson.name === "names") {
- var attributes = {};
- var insertPos = -1;
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- if (myjson.children[i].name == "name") {
- for (var key in myjson.children[i].attrs) {
- attributes[key] = myjson.children[i].attrs[key];
- }
- attributes.delimiter = myjson.children[i].attrs.delimiter;
- attributes.and = myjson.children[i].attrs.and;
- insertPos = i;
- for (var k=0,klen=myjson.children[i].children.length;k<klen;k+=1) {
- if (myjson.children[i].children[k].attrs.name !== 'family') {
- continue;
- }
- for (var key in myjson.children[i].children[k].attrs) {
- attributes[key] = myjson.children[i].children[k].attrs[key];
- }
- }
- }
- if (myjson.children[i].name == "institution") {
- insertPos = -1;
- break;
- }
- }
- if (insertPos > -1) {
- var institution = this.nodeCopy(this.institution);
- for (var i=0,ilen = CSL.INSTITUTION_KEYS.length;i<ilen;i+=1) {
- var attrname = CSL.INSTITUTION_KEYS[i];
- if ("undefined" !== typeof attributes[attrname]) {
- institution.children[0].attrs[attrname] = attributes[attrname];
- }
- if (attributes.delimiter) {
- institution.attrs.delimiter = attributes.delimiter;
- }
- if (attributes.and) {
- institution.attrs.and = "text";
- }
- }
- myjson.children = myjson.children.slice(0,insertPos+1).concat([institution]).concat(myjson.children.slice(insertPos+1));
- }
- }
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- if ("string" === typeof myjson.children[i]) {
- continue;
- }
- this.addInstitutionNodes(myjson.children[i]);
- }
-}
-CSL.XmlJSON.prototype.flagDateMacros = function(myjson) {
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- if (myjson.children[i].name === "macro") {
- if (this.inspectDateMacros(myjson.children[i])) {
- myjson.children[i].attrs["macro-has-date"] = "true";
- }
- }
- }
-}
-CSL.XmlJSON.prototype.inspectDateMacros = function(myjson) {
- if (!myjson || !myjson.children) {
- return false;
- }
- if (myjson.name === "date") {
- return true;
- } else {
- for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {
- if (this.inspectDateMacros(myjson.children[i])) {
- return true;
- }
- }
- }
- return false;
-}
-CSL.stripXmlProcessingInstruction = function (xml) {
- if (!xml) {
- return xml;
- }
- xml = xml.replace(/^<\?[^?]+\?>/, "");
- xml = xml.replace(/<!--[^>]+-->/g, "");
- xml = xml.replace(/^\s+/g, "");
- xml = xml.replace(/\s+$/g, "");
- return xml;
-};
-CSL.parseXml = function(str) {
- var _pos = 0;
- var _obj = {children:[]};
- var _stack = [_obj.children];
- function _listifyString(str) {
- str = str.split("\n").join(" ").replace(/>[ ]+</g, "><").replace(/<\!--.*?-->/g, "");
- var lst = str.split("><");
- var stylePos = null;
- for (var i=0,ilen=lst.length;i<ilen;i++) {
- if (i > 0) {
- lst[i] = "<" + lst[i];
- }
- if (i < (lst.length-1)) {
- lst[i] = lst[i] + ">";
- }
- if ("number" != typeof stylePos) {
- if (lst[i].slice(0, 7) === "<style " || lst[i].slice(0, 8) == "<locale ") {
- stylePos = i;
- }
- }
- }
- lst = lst.slice(stylePos);
- for (var i=lst.length-2;i>-1;i--) {
- if (lst[i].slice(1).indexOf("<") === -1) {
- var stub = lst[i].slice(0, 5);
- if (stub === "<term") {
- if (lst[i+1].slice(0, 6) === "</term") {
- lst[i] = lst[i] + lst[i+1];
- lst = lst.slice(0, i+1).concat(lst.slice(i+2));
- }
- } else if (["<sing", "<mult"].indexOf(stub) > -1) {
- if (lst[i].slice(-2) !== "/>" && lst[i+1].slice(0, 1) === "<") {
- lst[i] = lst[i] + lst[i+1];
- lst = lst.slice(0, i+1).concat(lst.slice(i+2));
- }
- }
- }
- }
- return lst;
- }
- function _decodeHtmlEntities(str) {
- return str
- .split("&").join("&")
- .split(""").join("\"")
- .replace(/&#([0-9]{1,6});/gi, function(match, numStr) {
- var num = parseInt(numStr, 10); // read num as normal number
- return String.fromCharCode(num);
- })
- .replace(/&#x([a-f0-9]{1,6});/gi, function(match, numStr){
- var num = parseInt(numStr, 16); // read num as hex
- return String.fromCharCode(num);
- });
- }
- function _getAttributes(elem) {
- var m = elem.match(/([^\"= ]+)=\"[^\"]*\"/g);
- if (m) {
- for (var i=0,ilen=m.length;i<ilen;i++) {
- m[i] = m[i].replace(/=.*/, "");
- }
- }
- return m;
- }
- function _getAttribute(elem, attr) {
- var rex = RegExp('^.*[ ]+' + attr + '=\"([^\"]*)\".*$');
- var m = elem.match(rex);
- return m ? m[1] : null;
- }
- function _getTagName(elem) {
- var rex = RegExp("^<([^ />]+)");
- var m = elem.match(rex);
- return m ? m[1] : null;
- }
- function _castObjectFromOpeningTag(elem) {
- var obj = {};
- obj.name = _getTagName(elem);
- obj.attrs = {};
- var attributes = _getAttributes(elem);
- if (attributes) {
- for (var i=0,ilen=attributes.length;i<ilen;i++) {
- var attr = {
- name: attributes[i],
- value: _getAttribute(elem, attributes[i])
- }
- obj.attrs[attr.name] = _decodeHtmlEntities(attr.value);
- }
- }
- obj.children = [];
- return obj;
- }
- function _extractTextFromCompositeElement(elem) {
- var m = elem.match(/^.*>([^<]*)<.*$/);
- return _decodeHtmlEntities(m[1]);
- }
- function _appendToChildren(obj) {
- _stack.slice(-1)[0].push(obj);
- }
- function _extendStackWithNewChildren(obj) {
- _stack.push(obj.children);
- }
- function processElement(elem) {
- var obj;
- if (elem.slice(1).indexOf('<') > -1) {
- var tag = elem.slice(0, elem.indexOf('>')+1);
- obj = _castObjectFromOpeningTag(tag);
- obj.children = [_extractTextFromCompositeElement(elem)];
- _appendToChildren(obj);
- } else if (elem.slice(-2) === '/>') {
- obj = _castObjectFromOpeningTag(elem);
- if (_getTagName(elem) === 'term') {
- obj.children.push('');
- }
- _appendToChildren(obj);
- } else if (elem.slice(0, 2) === '</') {
- _stack.pop();
- } else {
- obj = _castObjectFromOpeningTag(elem);
- _appendToChildren(obj)
- _extendStackWithNewChildren(obj);
- }
- }
- var lst = _listifyString(str);
- for (var i=0,ilen=lst.length;i<ilen;i++) {
- var elem = lst[i];
- processElement(elem);
- }
- return _obj.children[0];
-}
-CSL.XmlDOM = function (dataObj) {
- this.dataObj = dataObj;
- if ("undefined" == typeof DOMParser) {
- DOMParser = function() {};
- DOMParser.prototype.parseFromString = function(str, contentType) {
- if ("undefined" != typeof ActiveXObject) {
- var xmldata = new ActiveXObject('MSXML.DomDocument');
- xmldata.async = false;
- xmldata.loadXML(str);
- return xmldata;
- } else if ("undefined" != typeof XMLHttpRequest) {
- var xmldata = new XMLHttpRequest;
- if (!contentType) {
- contentType = 'text/xml';
- }
- xmldata.open('GET', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(str), false);
- if(xmldata.overrideMimeType) {
- xmldata.overrideMimeType(contentType);
- }
- xmldata.send(null);
- return xmldata.responseXML;
- } else if ("undefined" != typeof marknote) {
- var parser = new marknote.Parser();
- return parser.parse(str);
- }
- };
- this.hasAttributes = function (node) {
- var ret;
- if (node.attributes && node.attributes.length) {
- ret = true;
- } else {
- ret = false;
- }
- return ret;
- };
- } else {
- this.hasAttributes = function (node) {
- var ret;
- if (node.attributes && node.attributes.length) {
- ret = true;
- } else {
- ret = false;
- }
- return ret;
- };
- }
- this.importNode = function (doc, srcElement) {
- if ("undefined" == typeof doc.importNode) {
- var ret = this._importNode(doc, srcElement, true);
- } else {
- var ret = doc.importNode(srcElement, true);
- }
- return ret;
- };
- this._importNode = function(doc, node, allChildren) {
- switch (node.nodeType) {
- case 1:
- var newNode = doc.createElement(node.nodeName);
- if (node.attributes && node.attributes.length > 0)
- for (var i = 0, il = node.attributes.length; i < il;)
- newNode.setAttribute(node.attributes[i].nodeName, node.getAttribute(node.attributes[i++].nodeName));
- if (allChildren && node.childNodes && node.childNodes.length > 0)
- for (var i = 0, il = node.childNodes.length; i < il;)
- newNode.appendChild(this._importNode(doc, node.childNodes[i++], allChildren));
- return newNode;
- break;
- case 3:
- case 4:
- case 8:
- }
- };
- this.parser = new DOMParser();
- var str = "<docco><institution institution-parts=\"long\" delimiter=\", \" substitute-use-first=\"1\" use-last=\"1\"><institution-part name=\"long\"/></institution></docco>";
- var inst_doc = this.parser.parseFromString(str, "text/xml");
- var inst_node = inst_doc.getElementsByTagName("institution");
- this.institution = inst_node.item(0);
- var inst_part_node = inst_doc.getElementsByTagName("institution-part");
- this.institutionpart = inst_part_node.item(0);
- this.ns = "http://purl.org/net/xbiblio/csl";
-};
-CSL.XmlDOM.prototype.clean = function (xml) {
- xml = xml.replace(/<\?[^?]+\?>/g, "");
- xml = xml.replace(/<![^>]+>/g, "");
- xml = xml.replace(/^\s+/, "");
- xml = xml.replace(/\s+$/, "");
- xml = xml.replace(/^\n*/, "");
- return xml;
-};
-CSL.XmlDOM.prototype.getStyleId = function (myxml, styleName) {
- var text = "";
- var tagName = "id";
- if (styleName) {
- tagName = "title";
- }
- var node = myxml.getElementsByTagName(tagName);
- if (node && node.length) {
- node = node.item(0);
- }
- if (node) {
- text = node.textContent;
- }
- if (!text) {
- text = node.innerText;
- }
- if (!text) {
- text = node.innerHTML;
- }
- return text;
-};
-CSL.XmlDOM.prototype.children = function (myxml) {
- var children, pos, len, ret;
- if (myxml) {
- ret = [];
- children = myxml.childNodes;
- for (pos = 0, len = children.length; pos < len; pos += 1) {
- if (children[pos].nodeName != "#text") {
- ret.push(children[pos]);
- }
- }
- return ret;
- } else {
- return [];
- }
-};
-CSL.XmlDOM.prototype.nodename = function (myxml) {
- var ret = myxml.nodeName;
- return ret;
-};
-CSL.XmlDOM.prototype.attributes = function (myxml) {
- var ret, attrs, attr, key, xml, pos, len;
- ret = new Object();
- if (myxml && this.hasAttributes(myxml)) {
- attrs = myxml.attributes;
- for (pos = 0, len=attrs.length; pos < len; pos += 1) {
- attr = attrs[pos];
- ret["@" + attr.name] = attr.value;
- }
- }
- return ret;
-};
-CSL.XmlDOM.prototype.content = function (myxml) {
- var ret;
- if ("undefined" != typeof myxml.textContent) {
- ret = myxml.textContent;
- } else if ("undefined" != typeof myxml.innerText) {
- ret = myxml.innerText;
- } else {
- ret = myxml.txt;
- }
- return ret;
-};
-CSL.XmlDOM.prototype.namespace = {
- "xml":"http://www.w3.org/XML/1998/namespace"
-}
-CSL.XmlDOM.prototype.numberofnodes = function (myxml) {
- if (myxml) {
- return myxml.length;
- } else {
- return 0;
- }
-};
-CSL.XmlDOM.prototype.getAttributeName = function (attr) {
- var ret = attr.name;
- return ret;
-}
-CSL.XmlDOM.prototype.getAttributeValue = function (myxml,name,namespace) {
- var ret = "";
- if (namespace) {
- name = namespace+":"+name;
- }
- if (myxml && this.hasAttributes(myxml) && myxml.getAttribute(name)) {
- ret = myxml.getAttribute(name);
- }
- return ret;
-}
-CSL.XmlDOM.prototype.getNodeValue = function (myxml,name) {
- var ret = null;
- if (name){
- var vals = myxml.getElementsByTagName(name);
- if (vals.length > 0) {
- if ("undefined" != typeof vals[0].textContent) {
- ret = vals[0].textContent;
- } else if ("undefined" != typeof vals[0].innerText) {
- ret = vals[0].innerText;
- } else {
- ret = vals[0].text;
- }
- }
- }
- if (ret === null && myxml && myxml.childNodes && (myxml.childNodes.length == 0 || (myxml.childNodes.length == 1 && myxml.firstChild.nodeName == "#text"))) {
- if ("undefined" != typeof myxml.textContent) {
- ret = myxml.textContent;
- } else if ("undefined" != typeof myxml.innerText) {
- ret = myxml.innerText;
- } else {
- ret = myxml.text;
- }
- }
- if (ret === null) {
- ret = myxml;
- }
- return ret;
-}
-CSL.XmlDOM.prototype.setAttributeOnNodeIdentifiedByNameAttribute = function (myxml,nodename,partname,attrname,val) {
- var pos, len, xml, nodes, node;
- if (attrname.slice(0,1) === '@'){
- attrname = attrname.slice(1);
- }
- nodes = myxml.getElementsByTagName(nodename);
- for (pos = 0, len = nodes.length; pos < len; pos += 1) {
- node = nodes[pos];
- if (node.getAttribute("name") != partname) {
- continue;
- }
- node.setAttribute(attrname, val);
- }
-}
-CSL.XmlDOM.prototype.deleteNodeByNameAttribute = function (myxml,val) {
- var pos, len, node, nodes;
- nodes = myxml.childNodes;
- for (pos = 0, len = nodes.length; pos < len; pos += 1) {
- node = nodes[pos];
- if (!node || node.nodeType == node.TEXT_NODE) {
- continue;
- }
- if (this.hasAttributes(node) && node.getAttribute("name") == val) {
- myxml.removeChild(nodes[pos]);
- }
- }
-}
-CSL.XmlDOM.prototype.deleteAttribute = function (myxml,attr) {
- myxml.removeAttribute(attr);
-}
-CSL.XmlDOM.prototype.setAttribute = function (myxml,attr,val) {
- if (!myxml.ownerDocument) {
- myxml = myxml.firstChild;
- }
- if (["function", "unknown"].indexOf(typeof myxml.setAttribute) > -1) {
- myxml.setAttribute(attr, val);
- }
- return false;
-}
-CSL.XmlDOM.prototype.nodeCopy = function (myxml) {
- var cloned_node = myxml.cloneNode(true);
- return cloned_node;
-}
-CSL.XmlDOM.prototype.getNodesByName = function (myxml,name,nameattrval) {
- var ret, nodes, node, pos, len;
- ret = [];
- nodes = myxml.getElementsByTagName(name);
- for (pos = 0, len = nodes.length; pos < len; pos += 1) {
- node = nodes.item(pos);
- if (nameattrval && !(this.hasAttributes(node) && node.getAttribute("name") == nameattrval)) {
- continue;
- }
- ret.push(node);
- }
- return ret;
-}
-CSL.XmlDOM.prototype.nodeNameIs = function (myxml,name) {
- if (name == myxml.nodeName) {
- return true;
- }
- return false;
+var XML_PARSING;
+if ("undefined" !== typeof CSL_IS_NODEJS) {
+ XML_PARSING = CSL_NODEJS;
+} else if ("undefined" !== typeof CSL_E4X) {
+ XML_PARSING = CSL_E4X;
+} else if ("undefined" !== typeof CSL_JSON) {
+ XML_PARSING = CSL_JSON;
+} else {
+ XML_PARSING = CSL_CHROME;
}
-CSL.XmlDOM.prototype.makeXml = function (myxml) {
- var ret, topnode;
- if (!myxml) {
- myxml = "<docco><bogus/></docco>";
- }
- myxml = myxml.replace(/\s*<\?[^>]*\?>\s*\n*/g, "");
- var nodetree = this.parser.parseFromString(myxml, "application/xml");
- return nodetree.firstChild;
-};
-CSL.XmlDOM.prototype.insertChildNodeAfter = function (parent,node,pos,datexml) {
- var myxml, xml;
- myxml = this.importNode(node.ownerDocument, datexml);
- parent.replaceChild(myxml, node);
- return parent;
-};
-CSL.XmlDOM.prototype.insertPublisherAndPlace = function(myxml) {
- var group = myxml.getElementsByTagName("group");
- for (var i = 0, ilen = group.length; i < ilen; i += 1) {
- var node = group.item(i);
- var skippers = [];
- for (var j = 0, jlen = node.childNodes.length; j < jlen; j += 1) {
- if (node.childNodes.item(j).nodeType !== 1) {
- skippers.push(j);
- }
- }
- if (node.childNodes.length - skippers.length === 2) {
- var twovars = [];
- for (var j = 0, jlen = 2; j < jlen; j += 1) {
- if (skippers.indexOf(j) > -1) {
- continue;
- }
- var child = node.childNodes.item(j);
- var subskippers = [];
- for (var k = 0, klen = child.childNodes.length; k < klen; k += 1) {
- if (child.childNodes.item(k).nodeType !== 1) {
- subskippers.push(k);
- }
- }
- if (child.childNodes.length - subskippers.length === 0) {
- twovars.push(child.getAttribute('variable'));
- if (child.getAttribute('suffix')
- || child.getAttribute('prefix')) {
- twovars = [];
- break;
- }
- }
- }
- if (twovars.indexOf("publisher") > -1 && twovars.indexOf("publisher-place") > -1) {
- node.setAttribute('has-publisher-and-publisher-place', true);
- }
- }
- }
-};
-CSL.XmlDOM.prototype.isChildOfSubstitute = function(node) {
- if (node.parentNode) {
- if (node.parentNode.tagName.toLowerCase() === "substitute") {
- return true;
- } else {
- return this.isChildOfSubstitute(node.parentNode);
- }
- }
- return false;
-};
-CSL.XmlDOM.prototype.addMissingNameNodes = function(myxml) {
- var nameslist = myxml.getElementsByTagName("names");
- for (var i = 0, ilen = nameslist.length; i < ilen; i += 1) {
- var names = nameslist.item(i);
- var namelist = names.getElementsByTagName("name");
- if ((!namelist || namelist.length === 0)
- && !this.isChildOfSubstitute(names)) {
- var doc = names.ownerDocument;
- var name = doc.createElement("name");
- names.appendChild(name);
- }
- }
-};
-CSL.XmlDOM.prototype.addInstitutionNodes = function(myxml) {
- var names, thenames, institution, theinstitution, name, thename, xml, pos, len;
- names = myxml.getElementsByTagName("names");
- for (pos = 0, len = names.length; pos < len; pos += 1) {
- thenames = names.item(pos);
- name = thenames.getElementsByTagName("name");
- if (name.length == 0) {
- continue;
- }
- institution = thenames.getElementsByTagName("institution");
- if (institution.length == 0) {
- theinstitution = this.importNode(myxml.ownerDocument, this.institution);
- theinstitutionpart = theinstitution.getElementsByTagName("institution-part").item(0);
- thename = name.item(0);
- thenames.insertBefore(theinstitution, thename.nextSibling);
- for (var j = 0, jlen = CSL.INSTITUTION_KEYS.length; j < jlen; j += 1) {
- var attrname = CSL.INSTITUTION_KEYS[j];
- var attrval = thename.getAttribute(attrname);
- if (attrval) {
- theinstitutionpart.setAttribute(attrname, attrval);
- }
- }
- var nameparts = thename.getElementsByTagName("name-part");
- for (var j = 0, jlen = nameparts.length; j < jlen; j += 1) {
- if ('family' === nameparts[j].getAttribute('name')) {
- for (var k = 0, klen = CSL.INSTITUTION_KEYS.length; k < klen; k += 1) {
- var attrname = CSL.INSTITUTION_KEYS[k];
- var attrval = nameparts[j].getAttribute(attrname);
- if (attrval) {
- theinstitutionpart.setAttribute(attrname, attrval);
- }
- }
- }
- }
- }
- }
-};
-CSL.XmlDOM.prototype.flagDateMacros = function(myxml) {
- var pos, len, thenode, thedate;
- nodes = myxml.getElementsByTagName("macro");
- for (pos = 0, len = nodes.length; pos < len; pos += 1) {
- thenode = nodes.item(pos);
- thedate = thenode.getElementsByTagName("date");
- if (thedate.length) {
- thenode.setAttribute('macro-has-date', 'true');
- }
- }
+CSL.System = {};
+CSL.System.Xml = {
+ "Parsing": XML_PARSING
};
-if ("undefined" !== typeof XML) {
- try {
- } catch (e) {
- throw "OOPS: "+e;
- }
-}
-CSL.setupXml = function(xmlObject) {
- var dataObj = {};
- var parser = null;
- if ("undefined" !== typeof xmlObject) {
- if ("string" === typeof xmlObject) {
- xmlObject = xmlObject.replace("^\uFEFF", "")
- .replace(/^\s+/, "");
- if (xmlObject.slice(0, 1) === "<") {
- dataObj = CSL.parseXml(xmlObject);
- } else {
- dataObj = JSON.parse(xmlObject);
- }
- parser = new CSL.XmlJSON(dataObj);
- } else if ("undefined" !== typeof xmlObject.getAttribute) {
- parser = new CSL.XmlDOM(xmlObject);
- } else if ("undefined" !== typeof xmlObject.toXMLString) {
- parser = new CSL.XmlE4X(xmlObject);
- } else {
- parser = new CSL.XmlJSON(xmlObject);
- }
- } else {
- print("OUCH!");
- }
- if (!parser) {
- throw "citeproc-js error: unable to parse style or locale object";
- }
- return parser;
-}
CSL.getSortCompare = function (default_locale) {
if (CSL.stringCompare) {
return CSL.stringCompare;
@@ -1703,7 +780,7 @@ CSL.getMinVal = function () {
};
CSL.tokenExec = function (token, Item, item) {
var next, maybenext, exec, debug;
- debug = true;
+ debug = false;
next = token.next;
maybenext = false;
var record = function (result) {
@@ -1734,10 +811,10 @@ CSL.expandMacro = function (macro_key_token, target) {
macro_key_token = new CSL.Token("group", CSL.START);
var hasDate = false;
var macroid = false;
- macro_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, 'macro', mkey);
+ macro_nodes = this.sys.xml.getNodesByName(this.cslXml, 'macro', mkey);
if (macro_nodes.length) {
- macroid = this.cslXml.getAttributeValue(macro_nodes[0],'cslid');
- hasDate = this.cslXml.getAttributeValue(macro_nodes[0], "macro-has-date");
+ macroid = this.sys.xml.getAttributeValue(macro_nodes[0],'cslid');
+ hasDate = this.sys.xml.getAttributeValue(macro_nodes[0], "macro-has-date");
}
if (hasDate) {
mkey = mkey + "@" + this.build.current_default_locale;
@@ -1760,7 +837,7 @@ CSL.expandMacro = function (macro_key_token, target) {
this.opt.update_mode = CSL.POSITION;
}
CSL.Node.group.build.call(macro_key_token, this, target);
- if (!this.cslXml.getNodeValue(macro_nodes)) {
+ if (!this.sys.xml.getNodeValue(macro_nodes)) {
throw "CSL style error: undefined macro \"" + mkey + "\"";
}
var mytarget = CSL.getMacroTarget.call(this, mkey);
@@ -1816,7 +893,7 @@ CSL.runAltMacro = function (state, alt_macro, Item, item) {
flag[1] = false;
var mytarget = CSL.getMacroTarget.call(state, alt_macro);
if (mytarget) {
- var macro_nodes = state.cslXml.getNodesByName(state.cslXml.dataObj, 'macro', alt_macro);
+ var macro_nodes = state.sys.xml.getNodesByName(state.cslXml, 'macro', alt_macro);
CSL.buildMacro.call(state, mytarget, macro_nodes);
CSL.configureMacro.call(state, mytarget);
}
@@ -1843,22 +920,22 @@ CSL.configureMacro = function (mytarget) {
}
CSL.XmlToToken = function (state, tokentype, explicitTarget) {
var name, txt, attrfuncs, attributes, decorations, token, key, target;
- name = state.cslXml.nodename(this);
+ name = state.sys.xml.nodename(this);
if (state.build.skip && state.build.skip !== name) {
return;
}
if (!name) {
- txt = state.cslXml.content(this);
+ txt = state.sys.xml.content(this);
if (txt) {
state.build.text = txt;
}
return;
}
- if (!CSL.Node[state.cslXml.nodename(this)]) {
+ if (!CSL.Node[state.sys.xml.nodename(this)]) {
throw "Undefined node name \"" + name + "\".";
}
attrfuncs = [];
- attributes = state.cslXml.attributes(this);
+ attributes = state.sys.xml.attributes(this);
decorations = CSL.setDecorations.call(this, state, attributes);
token = new CSL.Token(name, tokentype);
if (tokentype !== CSL.END || name === "if" || name === "else-if" || name === "layout") {
@@ -1892,68 +969,83 @@ CSL.XmlToToken = function (state, tokentype, explicitTarget) {
}
CSL.Node[name].build.call(token, state, target);
};
-CSL.DateParser = new function () {
- var epochPairs = [
+CSL.DateParser = function () {
+ var jiy_list, jiy, jiysplitter, jy, jmd, jr, pos, key, val, yearlast, yearfirst, number, rangesep, fuzzychar, chars, rex, rexdash, rexdashslash, rexslashdash, seasonstrs, seasonrexes, seasonstr, monthstrs, monthstr, mrexes, seasonrex, len, jiymatchstring, jiymatcher;
+ jiy_list = [
["\u660E\u6CBB", 1867],
["\u5927\u6B63", 1911],
["\u662D\u548C", 1925],
["\u5E73\u6210", 1988]
];
- var epochYearByName = {};
- for (var i=0,ilen=epochPairs.length; i<ilen; i++) {
- var key = epochPairs[i][0];
- var val = epochPairs[i][1];
- epochYearByName[key] = val;
- }
- var epochMatchStrings = [];
- for (var i=0,ilen=epochPairs.length; i<ilen; i++) {
- var val = epochPairs[i][0];
- epochMatchStrings.push(val);
- }
- var epochMatchString = epochMatchStrings.join("|");
- var epochSplitter = new RegExp("(?:" + epochMatchString + ")(?:[0-9]+)");
- var epochMatcher = new RegExp("(?:" + epochMatchString + ")(?:[0-9]+)", "g");
- var kanjiMonthDay = /(\u6708|\u5E74)/g;
- var kanjiYear = /\u65E5/g;
- var kanjiRange = /\u301c/g;
- var yearLast = "(?:[?0-9]{1,2}%%NUMD%%){0,2}[?0-9]{4}(?![0-9])";
- var yearFirst = "[?0-9]{4}(?:%%NUMD%%[?0-9]{1,2}){0,2}(?![0-9])";
- var numberVal = "[?0-9]{1,3}";
- var rangeSeparator = "[%%DATED%%]";
- var fuzzyChar = "[?~]";
- var chars = "[^\-\/\~\?0-9]+";
- var rexString = "(" + yearFirst + "|" + yearLast + "|" + numberVal + "|" + rangeSeparator + "|" + fuzzyChar + "|" + chars + ")";
- var rexDash = new RegExp(rexString.replace(/%%NUMD%%/g, "-").replace(/%%DATED%%/g, "-"));
- var rexDashSlash = new RegExp(rexString.replace(/%%NUMD%%/g, "-").replace(/%%DATED%%/g, "\/"));
- var rexSlashDash = new RegExp(rexString.replace(/%%NUMD%%/g, "\/").replace(/%%DATED%%/g, "-"));
- var monthString = "january february march april may june july august september october november december spring summer fall winter spring summer";
- this.monthStrings = monthString.split(" ");
+ jiy = {};
+ len = jiy_list.length;
+ for (pos = 0; pos < len; pos += 1) {
+ key = jiy_list[pos][0];
+ val = jiy_list[pos][1];
+ jiy[key] = val;
+ }
+ jiymatchstring = [];
+ for (pos = 0; pos < len; pos += 1) {
+ val = jiy_list[pos][0];
+ jiymatchstring.push(val);
+ }
+ jiymatchstring = jiymatchstring.join("|");
+ jiysplitter = "(?:" + jiymatchstring + ")(?:[0-9]+)";
+ jiysplitter = new RegExp(jiysplitter);
+ jiymatcher = "(?:" + jiymatchstring + ")(?:[0-9]+)";
+ jiymatcher = new RegExp(jiymatcher, "g");
+ jmd = /(\u6708|\u5E74)/g;
+ jy = /\u65E5/g;
+ jr = /\u301c/g;
+ yearlast = "(?:[?0-9]{1,2}%%NUMD%%){0,2}[?0-9]{4}(?![0-9])";
+ yearfirst = "[?0-9]{4}(?:%%NUMD%%[?0-9]{1,2}){0,2}(?![0-9])";
+ number = "[?0-9]{1,3}";
+ rangesep = "[%%DATED%%]";
+ fuzzychar = "[?~]";
+ chars = "[a-zA-Z]+";
+ rex = "(" + yearfirst + "|" + yearlast + "|" + number + "|" + rangesep + "|" + fuzzychar + "|" + chars + ")";
+ rexdash = new RegExp(rex.replace(/%%NUMD%%/g, "-").replace(/%%DATED%%/g, "-"));
+ rexdashslash = new RegExp(rex.replace(/%%NUMD%%/g, "-").replace(/%%DATED%%/g, "\/"));
+ rexslashdash = new RegExp(rex.replace(/%%NUMD%%/g, "\/").replace(/%%DATED%%/g, "-"));
+ seasonstrs = [];
+ seasonrexes = [];
+ len = seasonstrs.length;
+ for (pos = 0; pos < len; pos += 1) {
+ seasonrex = new RegExp(seasonstrs[pos] + ".*");
+ seasonrexes.push(seasonrex);
+ }
+ this.mstrings = "january february march april may june july august september october november december spring summer fall winter spring summer";
+ this.mstrings = this.mstrings.split(" ");
this.setOrderDayMonth = function() {
- this.monthGuess = 1;
- this.dayGuess = 0;
+ this.monthguess = 1;
+ this.dayguess = 0;
};
this.setOrderMonthDay = function() {
- this.monthGuess = 0;
- this.dayGuess = 1;
+ this.monthguess = 0;
+ this.dayguess = 1;
};
- this.resetDateParserMonths = function() {
- this.monthSets = [];
- for (var i=0,ilen=this.monthStrings.length; i<ilen; i++) {
- this.monthSets.push([this.monthStrings[i]]);
+ this.setOrderMonthDay();
+ this.resetMonths = function() {
+ var i, ilen, j, jlen;
+ this.msets = [];
+ for (i = 0, ilen = this.mstrings.length; i < ilen; i += 1) {
+ this.msets.push([this.mstrings[i]]);
}
- this.monthAbbrevs = [];
- for (var i=0,ilen=this.monthSets.length; i<ilen; i++) {
- this.monthAbbrevs.push([]);
- for (var j=0,jlen=this.monthSets[i].length; j<jlen; j++) {
- this.monthAbbrevs[i].push(this.monthSets[i][0].slice(0, 3));
+ this.mabbrevs = [];
+ for (i = 0, ilen = this.msets.length; i < ilen; i += 1) {
+ this.mabbrevs.push([]);
+ for (j = 0, jlen = this.msets[i].length; j < jlen; j += 1) {
+ this.mabbrevs[i].push(this.msets[i][0].slice(0, 3));
}
}
- this.monthRexes = [];
- for (var i=0,ilen=this.monthAbbrevs.length; i<ilen; i++) {
- this.monthRexes.push(new RegExp("(?:" + this.monthAbbrevs[i].join("|") + ")"));
+ this.mrexes = [];
+ for (i = 0, ilen = this.mabbrevs.length; i < ilen; i += 1) {
+ this.mrexes.push(new RegExp("(?:" + this.mabbrevs[i].join("|") + ")"));
}
};
- this.addDateParserMonths = function(lst) {
+ this.resetMonths();
+ this.addMonths = function(lst) {
+ var i, ilen, j, jlen, k, klen, jkey, kkey;
if ("string" === typeof lst) {
lst = lst.split(/\s+/);
}
@@ -1961,259 +1053,198 @@ CSL.DateParser = new function () {
CSL.debug("month [+season] list of "+lst.length+", expected 12 or 16. Ignoring.");
return;
}
- var otherMatch = [];
- var thisMatch = [];
- for (var i=0,ilen=lst.length; i<ilen; i++) {
- var abbrevLength = null;
+ var othermatch = [];
+ var thismatch = [];
+ for (i = 0, ilen = lst.length; i < ilen; i += 1) {
+ var abbrevlen = false;
var skip = false;
var insert = 3;
- var extendedSets = {};
- for (var j=0,jlen=this.monthAbbrevs.length; j<jlen; j++) {
- extendedSets[j] = {};
+ var extend = {};
+ for (j = 0, jlen = this.mabbrevs.length; j < jlen; j += 1) {
+ extend[j] = {};
if (j === i) {
- for (var k=0,klen=this.monthAbbrevs[i].length; k<klen; k++) {
- if (this.monthAbbrevs[i][k] === lst[i].slice(0, this.monthAbbrevs[i][k].length)) {
+ for (k = 0, klen = this.mabbrevs[i].length; k < klen; k += 1) {
+ if (this.mabbrevs[i][k] === lst[i].slice(0, this.mabbrevs[i][k].length)) {
skip = true;
break;
}
}
} else {
- for (var k=0,klen=this.monthAbbrevs[j].length; k<klen; k++) {
- abbrevLength = this.monthAbbrevs[j][k].length;
- if (this.monthAbbrevs[j][k] === lst[i].slice(0, abbrevLength)) {
- while (this.monthSets[j][k].slice(0, abbrevLength) === lst[i].slice(0, abbrevLength)) {
- if (abbrevLength > lst[i].length || abbrevLength > this.monthSets[j][k].length) {
+ for (k = 0, klen = this.mabbrevs[j].length; k < klen; k += 1) {
+ abbrevlen = this.mabbrevs[j][k].length;
+ if (this.mabbrevs[j][k] === lst[i].slice(0, abbrevlen)) {
+ while (this.msets[j][k].slice(0, abbrevlen) === lst[i].slice(0, abbrevlen)) {
+ if (abbrevlen > lst[i].length || abbrevlen > this.msets[j][k].length) {
CSL.debug("unable to disambiguate month string in date parser: "+lst[i]);
break;
} else {
- abbrevLength += 1;
+ abbrevlen += 1;
}
}
- insert = abbrevLength;
- extendedSets[j][k] = abbrevLength;
+ insert = abbrevlen;
+ extend[j][k] = 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);
+ 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);
+ }
+ }
}
}
}
if (!skip) {
- this.monthSets[i].push(lst[i]);
- this.monthAbbrevs[i].push(lst[i].slice(0, insert));
+ this.msets[i].push(lst[i]);
+ this.mabbrevs[i].push(lst[i].slice(0, insert));
}
}
- this.monthRexes = [];
- this.monthRexStrs = [];
- for (var i=0,ilen=this.monthAbbrevs.length; i<ilen; i++) {
- this.monthRexes.push(new RegExp("^(?:" + this.monthAbbrevs[i].join("|") + ")"));
- this.monthRexStrs.push("^(?:" + this.monthAbbrevs[i].join("|") + ")");
- }
- if (this.monthAbbrevs.length === 18) {
- for (var i=12,ilen=14; i<ilen; i++) {
- this.monthRexes[i+4] = new RegExp("^(?:" + this.monthAbbrevs[i].join("|") + ")");
- this.monthRexStrs[i+4] = "^(?:" + this.monthAbbrevs[i].join("|") + ")";
- }
+ this.mrexes = [];
+ for (i = 0, ilen = this.mabbrevs.length; i < ilen; i += 1) {
+ this.mrexes.push(new RegExp("(?:" + this.mabbrevs[i].join("|") + ")"));
}
};
- this.convertDateObjectToArray = function (thedate) {
- thedate["date-parts"] = [];
- thedate["date-parts"].push([]);
- var slicelen = 0;
- for (var i=0,ilen=3; i<ilen; i++) {
- var part = ["year", "month", "day"][i];
- if (!thedate[part]) {
- break;
- }
- slicelen += 1;
- thedate["date-parts"][0].push(thedate[part]);
- delete thedate[part];
- }
- thedate["date-parts"].push([]);
- for (var i=0, ilen=slicelen; i<ilen; i++) {
- part = ["year_end", "month_end", "day_end"][i];
- if (!thedate[part]) {
- break;
- }
- thedate["date-parts"][1].push(thedate[part]);
- delete thedate[part];
- }
- if (thedate["date-parts"][0].length !== thedate["date-parts"][1].length) {
- thedate["date-parts"].pop();
- }
- return thedate;
- };
- this.convertDateObjectToString = function(thedate) {
- var ret = [];
- for (var i = 0, ilen = 3; i < ilen; i += 1) {
- if (thedate[DATE_PARTS_ALL[i]]) {
- ret.push(thedate[DATE_PARTS_ALL[i]]);
- } else {
- break;
- }
- }
- return ret.join("-");
- }
- this._parseNumericDate = function (ret, delim, suff, txt) {
- if (!suff) suff = "";
- var lst = txt.split(delim);
- for (var i=0, ilen=lst.length; i<ilen; i++) {
- if (lst[i].length === 4) {
- ret[("year" + suff)] = lst[i].replace(/^0*/, "");
- if (!i) {
- lst = lst.slice(1);
- } else {
- lst = lst.slice(0, i);
+ this.parse = function (txt) {
+ var slash, dash, lst, l, m, number, note, thedate, slashcount, range_delim, date_delim, ret, delim_pos, delims, isrange, suff, date, breakme, item, delim, element, mm, slst, mmpos, i, ilen, j, jlen, k, klen;
+ if (txt) {
+ txt = "" + txt;
+ txt = txt.replace(/\s*[0-9]{2}:[0-9]{2}(?::[0-9]+)/,"");
+ m = txt.match(jmd);
+ if (m) {
+ txt = txt.replace(/\s+/, "", "g");
+ txt = txt.replace(jy, "");
+ txt = txt.replace(jmd, "-");
+ txt = txt.replace(jr, "/");
+ txt = txt.replace(/\-\//g, "/");
+ txt = txt.replace(/-$/g,"");
+ slst = txt.split(jiysplitter);
+ lst = [];
+ mm = txt.match(jiymatcher);
+ if (mm) {
+ var mmx = [];
+ for (pos = 0, len = mm.length; pos < len; pos += 1) {
+ mmx = mmx.concat(mm[pos].match(/([^0-9]+)([0-9]+)/).slice(1));
+ }
+ for (pos = 0, len = slst.length; pos < len; pos += 1) {
+ lst.push(slst[pos]);
+ if (pos !== (len - 1)) {
+ mmpos = (pos * 2);
+ lst.push(mmx[mmpos]);
+ lst.push(mmx[mmpos + 1]);
+ }
}
- break;
- }
- }
- for (var i=0,ilen=lst.length; i<ilen; i++) {
- lst[i] = parseInt(lst[i], 10);
- }
- if (lst.length === 1 || (lst.length === 2 && !lst[1])) {
- ret[("month" + suff)] = "" + lst[0];
- } else if (lst.length === 2) {
- if (lst[this.monthGuess] > 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];
+ lst = slst;
}
- }
- };
- 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<ilen; i++) {
- mmx = mmx.concat(mm[i].match(/([^0-9]+)([0-9]+)/).slice(1));
- }
- for (var i=0,ilen=slst.length; i<ilen; i++) {
- lst.push(slst[i]);
- if (i !== (len - 1)) {
- var mmpos = (pos * 2);
- lst.push(mmx[mmpos]);
- lst.push(mmx[mmpos + 1]);
- }
- }
- } else {
- lst = slst;
- }
- for (var i=1,ilen=lst.length; i<ilen; i+=3) {
- lst[i + 1] = jiy[lst[i]] + parseInt(lst[i + 1], 10);
- lst[i] = "";
- }
- txt = lst.join("");
- txt = txt.replace(/\s*-\s*$/, "").replace(/\s*-\s*\//, "/");
- txt = txt.replace(/\.\s*$/, "");
- txt = txt.replace(/\.(?! )/, "");
- slashPos = txt.indexOf("/");
- dashPos = txt.indexOf("-");
+ l = lst.length;
+ for (pos = 1; pos < l; pos += 3) {
+ lst[pos + 1] = jiy[lst[pos]] + parseInt(lst[pos + 1], 10);
+ lst[pos] = "";
}
+ txt = lst.join("");
+ txt = txt.replace(/\s*-\s*$/, "").replace(/\s*-\s*\//, "/");
+ txt = txt.replace(/\.\s*$/, "");
+ txt = txt.replace(/\.(?! )/, "");
+ slash = txt.indexOf("/");
+ dash = txt.indexOf("-");
}
+ }
txt = txt.replace(/([A-Za-z])\./g, "$1");
- var number = "";
- var note = "";
- var thedate = {};
- var rangeDelim;
- var dateDelim;
+ number = "";
+ note = "";
+ thedate = {};
if (txt.slice(0, 1) === "\"" && txt.slice(-1) === "\"") {
thedate.literal = txt.slice(1, -1);
return thedate;
}
- if (slashPos > -1 && dashPos > -1) {
- var slashCount = txt.split("/");
- if (slashCount.length > 3) {
- rangeDelim = "-";
- txt = txt.replace(/\_/g, "-");
- dateDelim = "/";
- lst = txt.split(rexSlashDash);
+ if (slash > -1 && dash > -1) {
+ slashcount = txt.split("/");
+ if (slashcount.length > 3) {
+ range_delim = "-";
+ date_delim = "/";
+ lst = txt.split(rexslashdash);
} else {
- rangeDelim = "/";
- txt = txt.replace(/\_/g, "/");
- dateDelim = "-";
- lst = txt.split(rexDashSlash);
+ range_delim = "/";
+ date_delim = "-";
+ lst = txt.split(rexdashslash);
}
} else {
- txt = txt.replace(/\//g, "-");
- txt = txt.replace(/\_/g, "-");
- rangeDelim = "-";
- dateDelim = "-";
- lst = txt.split(rexDash);
- }
- var ret = [];
- for (var i=0,ilen=lst.length; i<ilen; i++) {
- var m = lst[i].match(/^\s*([\-\/]|[^\-\/\~\?0-9]+|[\-~?0-9]+)\s*$/);
+ txt = txt.replace("/", "-");
+ range_delim = "-";
+ date_delim = "-";
+ 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*$/);
if (m) {
ret.push(m[1]);
}
}
- 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;
+ delim_pos = ret.indexOf(range_delim);
+ delims = [];
+ isrange = false;
+ if (delim_pos > -1) {
+ delims.push([0, delim_pos]);
+ delims.push([(delim_pos + 1), ret.length]);
+ isrange = true;
} else {
delims.push([0, ret.length]);
}
- var suff = "";
- for (var i=0,ilen=delims.length; i<ilen; i++) {
+ suff = "";
+ for (i = 0, ilen = delims.length; i < ilen; i += 1) {
delim = delims[i];
date = ret.slice(delim[0], delim[1]);
- outer:
- for (var j=0,jlen=date.length; j<jlen; j++) {
- var element = date[j];
- if (element.indexOf(dateDelim) > -1) {
- this._parseNumericDate(thedate, dateDelim, suff, element);
+ for (j = 0, jlen = date.length; j < jlen; j += 1) {
+ element = date[j];
+ if (element.indexOf(date_delim) > -1) {
+ this.parseNumericDate(thedate, date_delim, suff, element);
continue;
}
if (element.match(/[0-9]{4}/)) {
thedate[("year" + suff)] = element.replace(/^0*/, "");
continue;
}
- for (var k=0,klen=this.monthRexes.length; k<klen; k++) {
- if (element.toLocaleLowerCase().match(this.monthRexes[k])) {
+ breakme = false;
+ for (k = 0, klen = this.mrexes.length; k < klen; k += 1) {
+ if (element.toLocaleLowerCase().match(this.mrexes[k])) {
thedate[("month" + suff)] = "" + (parseInt(k, 10) + 1);
- continue outer;
+ breakme = true;
+ break;
+ }
+ if (breakme) {
+ continue;
+ }
+ if (element.match(/^[0-9]+$/)) {
+ number = parseInt(element, 10);
+ }
+ if (element.toLocaleLowerCase().match(/^bc/) && number) {
+ thedate[("year" + suff)] = "" + (number * -1);
+ number = "";
+ continue;
+ }
+ if (element.toLocaleLowerCase().match(/^ad/) && number) {
+ thedate[("year" + suff)] = "" + number;
+ number = "";
+ continue;
}
}
- if (element.match(/^[0-9]+$/)) {
- number = element;
- }
- if (element.toLocaleLowerCase().match(/^bc/) && number) {
- thedate[("year" + suff)] = "" + (number * -1);
- number = "";
- continue;
+ breakme = false;
+ for (k = 0, klen = seasonrexes.length; k < klen; k += 1) {
+ if (element.toLocaleLowerCase().match(seasonrexes[k])) {
+ thedate[("season" + suff)] = "" + (parseInt(k, 10) + 1);
+ breakme = true;
+ break;
+ }
}
- if (element.toLocaleLowerCase().match(/^ad/) && number) {
- thedate[("year" + suff)] = "" + number;
- number = "";
+ if (breakme) {
continue;
}
if (element === "~" || element === "?" || element === "c" || element.match(/^cir/)) {
@@ -2235,9 +1266,9 @@ CSL.DateParser = new function () {
}
suff = "_end";
}
- if (isRange) {
- for (var j=0,jlen=CSL.DATE_PARTS_ALL.length; j<jlen; j++) {
- var item = CSL.DATE_PARTS_ALL[j];
+ if (isrange) {
+ for (j = 0, jlen = CSL.DATE_PARTS_ALL.length; j < jlen; j += 1) {
+ item = CSL.DATE_PARTS_ALL[j];
if (thedate[item] && !thedate[(item + "_end")]) {
thedate[(item + "_end")] = thedate[item];
} else if (!thedate[item] && thedate[(item + "_end")]) {
@@ -2245,29 +1276,76 @@ CSL.DateParser = new function () {
}
}
}
- if (!thedate.year || (thedate.year && thedate.day && !thedate.month)) {
- thedate = { "literal": orig };
+ if (!thedate.year) {
+ thedate = { "literal": txt };
}
- var parts = ["year", "month", "day", "year_end", "month_end", "day_end"];
- for (var i=0,ilen=parts.length; i<ilen; i++) {
- var part = parts[i];
- if ("string" === typeof thedate[part] && thedate[part].match(/^[0-9]+$/)) {
- thedate[part] = parseInt(thedate[part], 10);
- }
+ if (this.use_array) {
+ this.toArray(thedate);
}
return thedate;
};
- 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();
+ this.returnAsArray = function () {
+ this.use_array = true;
+ };
+ this.returnAsKeys = function () {
+ this.use_array = false;
+ };
+ this.toArray = function (thedate) {
+ var i, ilen, part;
+ thedate["date-parts"] = [];
+ thedate["date-parts"].push([]);
+ var slicelen = 0;
+ for (i = 0, ilen = 3; i < ilen; i += 1) {
+ part = ["year", "month", "day"][i];
+ if (!thedate[part]) {
+ break;
+ }
+ slicelen += 1;
+ thedate["date-parts"][0].push(thedate[part]);
+ delete thedate[part];
+ }
+ thedate["date-parts"].push([]);
+ for (i = 0, ilen = slicelen; i < ilen; i += 1) {
+ part = ["year_end", "month_end", "day_end"][i];
+ if (!thedate[part]) {
+ break;
+ }
+ thedate["date-parts"][1].push(thedate[part]);
+ delete thedate[part];
+ }
+ if (thedate["date-parts"][0].length !== thedate["date-parts"][1].length) {
+ thedate["date-parts"].pop();
+ }
+ };
+ this.parseNumericDate = function (ret, delim, suff, txt) {
+ var lst, i, ilen;
+ lst = txt.split(delim);
+ for (i = 0, ilen = lst.length; i < ilen; i += 1) {
+ if (lst[i].length === 4) {
+ ret[("year" + suff)] = lst[i].replace(/^0*/, "");
+ if (!i) {
+ lst = lst.slice(1);
+ } else {
+ lst = lst.slice(0, i);
+ }
+ break;
+ }
+ }
+ for (i = 0, ilen = lst.length; i < ilen; i += 1) {
+ lst[i] = parseInt(lst[i], 10);
+ }
+ if (lst.length === 1 || (lst.length === 2 && !lst[1])) {
+ ret[("month" + suff)] = "" + lst[0];
+ } else if (lst.length === 2) {
+ if (lst[this.monthguess] > 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];
+ }
+ }
+ };
};
CSL.Engine = function (sys, style, lang, forceLang) {
var attrs, langspec, localexml, locale;
@@ -2277,6 +1355,10 @@ CSL.Engine = function (sys, style, lang, forceLang) {
if (sys.variableWrapper) {
CSL.VARIABLE_WRAPPER_PREPUNCT_REX = new RegExp('^([' + [" "].concat(CSL.SWAPPING_PUNCTUATION).join("") + ']*)(.*)');
}
+ this.sys.xml = new CSL.System.Xml.Parsing();
+ if ("undefined" === typeof CSL_JSON && "string" !== typeof style) {
+ style = "";
+ }
if (CSL.retrieveStyleModule) {
this.sys.retrieveStyleModule = CSL.retrieveStyleModule;
}
@@ -2303,44 +1385,45 @@ CSL.Engine = function (sys, style, lang, forceLang) {
this.bibliography = new CSL.Engine.Bibliography();
this.output = new CSL.Output.Queue(this);
this.dateput = new CSL.Output.Queue(this);
- this.cslXml = CSL.setupXml(style);
+ this.cslXml = this.sys.xml.makeXml(style);
if (this.opt.development_extensions.csl_reverse_lookup_support || this.sys.csl_reverse_lookup_support) {
this.build.cslNodeId = 0;
this.setCslNodeIds = function(myxml, nodename) {
- var children = this.cslXml.children(myxml);
- this.cslXml.setAttribute(myxml, 'cslid', this.build.cslNodeId);
+ var children = this.sys.xml.children(myxml);
+ this.sys.xml.setAttribute(myxml, 'cslid', this.build.cslNodeId);
this.opt.nodenames.push(nodename);
this.build.cslNodeId += 1;
- for (var i = 0, ilen = this.cslXml.numberofnodes(children); i < ilen; i += 1) {
- nodename = this.cslXml.nodename(children[i]);
+ for (var i = 0, ilen = this.sys.xml.numberofnodes(children); i < ilen; i += 1) {
+ nodename = this.sys.xml.nodename(children[i]);
if (nodename) {
this.setCslNodeIds(children[i], nodename);
}
}
};
- this.setCslNodeIds(this.cslXml.dataObj, "style");
+ this.setCslNodeIds(this.cslXml, "style");
}
- this.cslXml.addMissingNameNodes(this.cslXml.dataObj);
- this.cslXml.addInstitutionNodes(this.cslXml.dataObj);
- this.cslXml.insertPublisherAndPlace(this.cslXml.dataObj);
- this.cslXml.flagDateMacros(this.cslXml.dataObj);
- attrs = this.cslXml.attributes(this.cslXml.dataObj);
+ this.sys.xml.addMissingNameNodes(this.cslXml);
+ this.sys.xml.addInstitutionNodes(this.cslXml);
+ this.sys.xml.insertPublisherAndPlace(this.cslXml);
+ this.sys.xml.flagDateMacros(this.cslXml);
+ attrs = this.sys.xml.attributes(this.cslXml);
if ("undefined" === typeof attrs["@sort-separator"]) {
- this.cslXml.setAttribute(this.cslXml.dataObj, "sort-separator", ", ");
+ this.sys.xml.setAttribute(this.cslXml, "sort-separator", ", ");
}
this.opt["initialize-with-hyphen"] = true;
this.setStyleAttributes();
- this.opt.xclass = this.cslXml.getAttributeValue(this.cslXml.dataObj, "class");
+ this.opt.xclass = sys.xml.getAttributeValue(this.cslXml, "class");
this.opt.class = this.opt.xclass;
- this.opt.styleID = this.cslXml.getStyleId(this.cslXml.dataObj);
+ this.opt.styleID = this.sys.xml.getStyleId(this.cslXml);
if (CSL.setSuppressedJurisdictions) {
CSL.setSuppressedJurisdictions(this.opt.styleID, this.opt.suppressedJurisdictions);
}
- this.opt.styleName = this.cslXml.getStyleId(this.cslXml.dataObj, true);
+ this.opt.styleName = this.sys.xml.getStyleId(this.cslXml, true);
if (this.opt.version.slice(0,4) === "1.1m") {
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;
@@ -2385,16 +1468,16 @@ CSL.Engine = function (sys, style, lang, forceLang) {
this.registry = new CSL.Registry(this);
this.macros = {};
this.build.area = "citation";
- var area_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, this.build.area);
+ var area_nodes = this.sys.xml.getNodesByName(this.cslXml, this.build.area);
this.buildTokenLists(area_nodes, this[this.build.area].tokens);
this.build.area = "bibliography";
- var area_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, this.build.area);
+ var area_nodes = this.sys.xml.getNodesByName(this.cslXml, this.build.area);
this.buildTokenLists(area_nodes, this[this.build.area].tokens);
this.juris = {};
this.configureTokenLists();
this.disambiguate = new CSL.Disambiguation(this);
this.splice_delimiter = false;
- this.fun.dateparser = CSL.DateParser;
+ this.fun.dateparser = new CSL.DateParser();
this.fun.flipflopper = new CSL.Util.FlipFlopper(this);
this.setCloseQuotesArray();
this.fun.ordinalizer.init(this);
@@ -2424,17 +1507,17 @@ CSL.makeBuilder = function (me, target) {
};
function buildStyle (node) {
var starttag, origparent;
- if (me.cslXml.numberofnodes(me.cslXml.children(node))) {
+ if (me.sys.xml.numberofnodes(me.sys.xml.children(node))) {
origparent = node;
enterFunc(origparent);
- for (var i=0;i<me.cslXml.numberofnodes(me.cslXml.children(origparent));i+=1) {
- node = me.cslXml.children(origparent)[i];
- if (me.cslXml.nodename(node) === null) {
+ for (var i=0;i<me.sys.xml.numberofnodes(me.sys.xml.children(origparent));i+=1) {
+ node = me.sys.xml.children(origparent)[i];
+ if (me.sys.xml.nodename(node) === null) {
continue;
}
- if (me.cslXml.nodename(node) === "date") {
+ if (me.sys.xml.nodename(node) === "date") {
CSL.Util.fixDateNode.call(me, origparent, i, node)
- node = me.cslXml.children(origparent)[i];
+ node = me.sys.xml.children(origparent)[i];
}
buildStyle(node, enterFunc, leaveFunc, singletonFunc);
}
@@ -2446,7 +1529,7 @@ CSL.makeBuilder = function (me, target) {
return buildStyle;
};
CSL.Engine.prototype.buildTokenLists = function (area_nodes, target) {
- if (!this.cslXml.getNodeValue(area_nodes)) return;
+ if (!this.sys.xml.getNodeValue(area_nodes)) return;
var builder = CSL.makeBuilder(this, target);
var mynode;
if ("undefined" === typeof area_nodes.length) {
@@ -2458,9 +1541,16 @@ CSL.Engine.prototype.buildTokenLists = function (area_nodes, target) {
};
CSL.Engine.prototype.setStyleAttributes = function () {
var dummy, attr, key, attributes, attrname;
- var dummy = {};
- dummy.name = this.cslXml.nodename(this.cslXml.dataObj);
- attributes = this.cslXml.attributes(this.cslXml.dataObj);
+ dummy = {};
+ var cslXml = this.cslXml;
+ var tagName = this.cslXml.tagName ? ("" + this.cslXml.tagName).toLowerCase() : "";
+ if (tagName !== 'style' && tagName !== 'cslstyle') {
+ if (this.cslXml.getElementsByTagName) {
+ var cslXml = this.cslXml.getElementsByTagName('style')[0];
+ }
+ }
+ dummy.name = this.sys.xml.nodename(cslXml);
+ attributes = this.sys.xml.attributes(cslXml);
for (attrname in attributes) {
if (attributes.hasOwnProperty(attrname)) {
CSL.Attributes[attrname].call(dummy, this, attributes[attrname]);
@@ -2708,25 +1798,20 @@ 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 (!names[mm[1]]) {
- names[mm[1]] = [];
+ if (!Item[mm[1]]) {
+ Item[mm[1]] = [];
}
var lst = mm[2].split(/\s*\|\|\s*/);
if (lst.length === 1) {
- names[mm[1]].push({family:lst[0],isInstitution:true});
+ Item[mm[1]].push({family:lst[0],isInstitution:true});
} else if (lst.length === 2) {
- var name = {family:lst[0],given:lst[1]};
- CSL.parseParticles(name);
- names[mm[1]].push(name);
+ Item[mm[1]].push({family:lst[0],given:lst[1]});
}
} 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) {
@@ -2734,7 +1819,7 @@ CSL.Engine.prototype.retrieveItem = function (id) {
if (dateobj) {
if (this.opt.development_extensions.raw_date_parsing) {
if (dateobj.raw) {
- dateobj = this.fun.dateparser.parseDateToObject(dateobj.raw);
+ dateobj = this.fun.dateparser.parse(dateobj.raw);
}
}
Item[CSL.DATE_VARIABLES[i]] = this.dateParseArray(dateobj);
@@ -2767,29 +1852,25 @@ CSL.Engine.prototype.retrieveItem = function (id) {
Item["title-short"] = Item.shortTitle;
}
if (this.opt.development_extensions.main_title_from_short_title) {
- var segments = ["", "container-"];
- for (var i=0,ilen=segments.length;i<ilen;i++) {
- var seg = segments[i];
- Item[seg + "title-main"] = Item[seg + "title"];
- Item[seg + "title-sub"] = false;
- if (Item[seg + "title"] && Item[seg + "title-short"]) {
- var shortTitle = Item[seg + "title-short"];
- offset = shortTitle.length;
- if (Item[seg + "title"].slice(0,offset) === shortTitle && Item[seg + "title"].slice(offset).match(/^\s*:/)) {
- Item[seg + "title-main"] = Item[seg + "title"].slice(0,offset).replace(/\s+$/,"");
- Item[seg + "title-sub"] = Item[seg + "title"].slice(offset).replace(/^\s*:\s*/,"");
- if (this.opt.development_extensions.uppercase_subtitles && Item[seg + "title-sub"]) {
- var subtitle = Item[seg + "title-sub"]
- for (var j=0,jlen=subtitle.length;j<jlen;j++) {
- if (subtitle.charAt(j).toLowerCase() !== subtitle.charAt(j).toUpperCase()) {
- Item[seg + "title-sub"] = subtitle.slice(0,j) + subtitle.charAt(j).toUpperCase() + subtitle.slice(j+1);
- break
- }
+ 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<ilen;i++) {
+ if (subtitle.charAt(i).toLowerCase() !== subtitle.charAt(i).toUpperCase()) {
+ Item["title-sub"] = subtitle.slice(0,i) + subtitle.charAt(i).toUpperCase() + subtitle.slice(i+1);
+ break
}
}
- var mainPlusJoinOffset = offset + Item[seg + "title"].length - Item[seg + "title-main"].length - Item[seg + "title-sub"].length;
- Item[seg + "title"] = Item[seg + "title"].slice(0,mainPlusJoinOffset) + Item[seg + "title-sub"];
}
+ var mainPlusJoinOffset = offset + Item.title.length - Item["title-main"].length - Item["title-sub"].length;
+ Item.title = Item.title.slice(0,mainPlusJoinOffset) + Item["title-sub"];
}
}
}
@@ -2811,9 +1892,7 @@ CSL.Engine.prototype.retrieveItem = function (id) {
}
}
}
- if (!Item["container-title-short"]) {
- Item["container-title-short"] = Item.journalAbbreviation;
- }
+ Item["container-title-short"] = Item.journalAbbreviation;
if (Item["container-title"] && this.sys.getAbbreviation) {
var jurisdiction = this.transform.loadAbbreviation(Item.jurisdiction, "container-title", Item["container-title"]);
if (this.transform.abbrevs[jurisdiction]["container-title"]) {
@@ -2849,54 +1928,89 @@ CSL.Engine.prototype.remapSectionVariable = function (inputList) {
for (var i = 0, ilen = inputList.length; i < ilen; i += 1) {
var Item = inputList[i][0];
var item = inputList[i][1];
+ var section_label_count = 0;
+ var later_label = false;
+ var value = false;
if (["bill","gazette","legislation","regulation","treaty"].indexOf(Item.type) > -1) {
- if (item.locator) {
- 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;
- }
+ 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;
}
}
- 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.";
+ 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 {
- sectionMasterLabel = m[0].trim();
+ loci[3] = splt.join(" ")
+ }
+ if (loci[3] && loci[3].slice(0,1) === "&") {
+ loci[3] = " " + loci[3];
}
}
- 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 = "";
+ 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;
+ }
+ loci[2] = "";
+ }
+ } else {
+ loci[2] = "";
+ }
+ if (!loci[1]) {
+ loci[0] = "";
+ }
+ 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));
}
- } else {
- space = "";
}
- item.locator = Item.section + space + item.locator;
+ 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.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"]) {
@@ -2906,7 +2020,7 @@ CSL.Engine.prototype.setNumberLabels = function (Item) {
this.tmp.shadow_numbers["number"].numeric = false;
this.tmp.shadow_numbers["number"].label = false;
var value = "" + Item.number;
- value = value.split("\\").join("");
+ value = value.replace("\\", "", "g");
var firstword = value.split(/\s+/)[0];
var firstlabel = CSL.STATUTE_SUBDIV_STRINGS[firstword];
if (firstlabel) {
@@ -3358,10 +2472,13 @@ CSL.Output.Queue.prototype.openLevel = function (token, ephemeral) {
}
blob = new CSL.Blob(undefined, this.formats.value()[token], token);
}
- curr = this.current.value();
- if (!this.state.tmp.just_looking && this.checkNestedBrace) {
- blob.strings.prefix = this.checkNestedBrace.update(blob.strings.prefix);
+ if (this.nestedBraces) {
+ blob.strings.prefix = blob.strings.prefix.replace(this.nestedBraces[0][0], this.nestedBraces[0][1]);
+ blob.strings.prefix = blob.strings.prefix.replace(this.nestedBraces[1][0], this.nestedBraces[1][1]);
+ blob.strings.suffix = blob.strings.suffix.replace(this.nestedBraces[0][0], this.nestedBraces[0][1]);
+ blob.strings.suffix = blob.strings.suffix.replace(this.nestedBraces[1][0], this.nestedBraces[1][1]);
}
+ curr = this.current.value();
curr.push(blob);
this.current.push(blob);
};
@@ -3369,10 +2486,7 @@ CSL.Output.Queue.prototype.closeLevel = function (name) {
if (name && name !== this.current.value().levelname) {
CSL.error("Level mismatch error: wanted " + name + " but found " + this.current.value().levelname);
}
- var blob = this.current.pop();
- if (!this.state.tmp.just_looking && this.checkNestedBrace) {
- blob.strings.suffix = this.checkNestedBrace.update(blob.strings.suffix);
- }
+ this.current.pop();
};
CSL.Output.Queue.prototype.append = function (str, tokname, notSerious, ignorePredecessor, noStripPeriods) {
var token, blob, curr;
@@ -3430,6 +2544,12 @@ CSL.Output.Queue.prototype.append = function (str, tokname, notSerious, ignorePr
}
}
blob = new CSL.Blob(str, token);
+ if (this.nestedBraces) {
+ blob.strings.prefix = blob.strings.prefix.replace(this.nestedBraces[0][0], this.nestedBraces[0][1]);
+ blob.strings.prefix = blob.strings.prefix.replace(this.nestedBraces[1][0], this.nestedBraces[1][1]);
+ blob.strings.suffix = blob.strings.suffix.replace(this.nestedBraces[0][0], this.nestedBraces[0][1]);
+ blob.strings.suffix = blob.strings.suffix.replace(this.nestedBraces[1][0], this.nestedBraces[1][1]);
+ }
curr = this.current.value();
if ("undefined" === typeof curr && this.current.mystack.length === 0) {
this.current.mystack.push([]);
@@ -3516,7 +2636,7 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
}
}
if (b && b.length) {
- b = txt_esc(blobjr.strings.prefix) + b + txt_esc(blobjr.strings.suffix);
+ 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.sys.csl_reverse_lookup_support) && !state.tmp.suppress_decorations) {
for (j = 0, jlen = blobjr.decorations.length; j < jlen; j += 1) {
params = blobjr.decorations[j];
@@ -3559,20 +2679,10 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
}
}
}
- if (blob && (blob.decorations.length || blob.strings.suffix)) {
+ if (blob && (blob.decorations.length || blob.strings.suffix || blob.strings.prefix)) {
span_split = ret.length;
- } else if (blob && blob.strings.prefix) {
- for (var i=0,ilen=ret.length;i<ilen;i++) {
- if ("undefined" !== typeof ret[i].num) {
- span_split = i;
- if (i === 0) {
- ret[i].strings.prefix = blob.strings.prefix + ret[i].strings.prefix;
- }
- break;
- }
- }
}
- var blobs_start = state.output.renderBlobs(ret.slice(0, span_split), blob_delimiter, false, blob);
+ var blobs_start = state.output.renderBlobs(ret.slice(0, span_split), blob_delimiter, true, blob);
if (blobs_start && blob && (blob.decorations.length || blob.strings.suffix || blob.strings.prefix)) {
if (!state.tmp.suppress_decorations) {
for (i = 0, ilen = blob.decorations.length; i < ilen; i += 1) {
@@ -3592,7 +2702,7 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
use_suffix = blob.strings.suffix;
if (b && b.length) {
use_prefix = blob.strings.prefix;
- b = txt_esc(use_prefix) + b + txt_esc(use_suffix);
+ b = txt_esc(use_prefix, state.tmp.nestedBraces) + b + txt_esc(use_suffix, state.tmp.nestedBraces);
if (state.tmp.count_offset_characters) {
state.tmp.offset_characters += (use_prefix.length + use_suffix.length);
}
@@ -3623,7 +2733,7 @@ CSL.Output.Queue.prototype.string = function (state, myblobs, blob) {
this.current.mystack = [];
this.current.mystack.push(this.queue);
if (state.tmp.suppress_decorations) {
- ret = state.output.renderBlobs(ret, undefined, false);
+ ret = state.output.renderBlobs(ret, undefined, true);
}
} else if ("boolean" === typeof blob) {
ret = state.output.renderBlobs(ret, undefined, true);
@@ -3662,9 +2772,7 @@ CSL.Output.Queue.prototype.renderBlobs = function (blobs, delim, in_cite, parent
var start = true;
for (pos = 0; pos < len; pos += 1) {
if (blobs[pos].checkNext) {
- blobs[pos].checkNext(blobs[pos + 1],start);
- start = false;
- } else if (blobs[pos+1] && blobs[pos+1].splice_prefix) {
+ blobs[pos].checkNext(blobs[(pos + 1)],start);
start = false;
} else {
start = true;
@@ -3673,11 +2781,11 @@ CSL.Output.Queue.prototype.renderBlobs = function (blobs, delim, in_cite, parent
var doit = true;
for (pos = blobs.length - 1; pos > 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;
@@ -3692,18 +2800,8 @@ 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) {
- if (blob.particle) {
- str = blob.particle + blob.num;
- } else {
- str = blob.formatter.format(blob.num, blob.gender);
- }
+ str = blob.formatter.format(blob.num, blob.gender);
var strlen = str.replace(/<[^>]*>/g, "").length;
this.append(str, "empty", true);
var str_blob = this.pop();
@@ -3733,11 +2831,7 @@ 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) {
- if (pos > 0) {
- addme = txt_esc(blob.splice_prefix);
- } else {
- addme = "";
- }
+ addme = "";
} else if (blob.status === CSL.SEEN) {
addme = txt_esc(blob.splice_prefix);
}
@@ -3886,10 +2980,9 @@ CSL.Output.Queue.adjust = function (punctInQuote) {
}
}
}
- if ("object" !== typeof blob.blobs) {
- return false
- };
- return blobHasDescendantQuotes(blob.blobs[blob.blobs.length-1]);
+ if ("object" !== typeof blob.blobs) return false;
+ if (blobHasDescendantQuotes(blob.blobs[blob.blobs.length-1])) return true;
+ return false;
}
function blobHasDescendantMergingPunctuation(parentChar,blob) {
var childChar = blob.strings.suffix.slice(-1);
@@ -4073,7 +3166,7 @@ CSL.Output.Queue.adjust = function (punctInQuote) {
break;
}
}
- if (true || !someChildrenAreNumbers) {
+ if (!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--) {
@@ -4353,6 +3446,7 @@ 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;
@@ -4561,7 +3655,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.parseDateToObject(m[1]);
+ item["locator-date"] = this.fun.dateparser.parse(m[1]);
raw_locator = raw_locator.slice(m[1].length);
}
item["locator-extra"] = raw_locator.replace(/^\s+/, "").replace(/\s+$/, "");
@@ -4576,11 +3670,8 @@ 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) {
- var tryLabel = CSL.LOCATOR_LABELS_MAP[m[2]];
- if (this.getTerm(tryLabel)) {
- item.label = tryLabel;
- item.locator = m[3];
- }
+ item.label = CSL.LOCATOR_LABELS_MAP[m[2]];
+ item.locator = m[3];
}
}
}
@@ -4985,11 +4076,8 @@ 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) {
- var tryLabel = CSL.LOCATOR_LABELS_MAP[m[2]];
- if (this.getTerm(tryLabel)) {
- item.label = tryLabel;
- item.locator = m[3];
- }
+ item.label = CSL.LOCATOR_LABELS_MAP[m[2]];
+ item.locator = m[3];
}
}
}
@@ -5012,7 +4100,7 @@ CSL.Engine.prototype.makeCitationCluster = function (rawList) {
str = CSL.getCitationCluster.call(this, inputList);
return str;
};
-CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {
+CSL.getAmbiguousCite = function (Item, disambig, visualForm) {
var use_parallels, ret;
var oldTermSiblingLayer = this.tmp.group_context.value().slice();
if (disambig) {
@@ -5021,13 +4109,8 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {
this.tmp.disambig_request = false;
}
var itemSupp = {
- position: 1,
- "near-note": true
+ position: 1
};
- 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]
@@ -5041,7 +4124,7 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {
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, null, false);
+ CSL.getCite.call(this, Item, itemSupp);
for (var i=0,ilen=this.output.queue.length;i<ilen;i+=1) {
CSL.Output.Queue.purgeEmptyBlobs(this.output.queue[i]);
}
@@ -5063,22 +4146,25 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {
CSL.getSpliceDelimiter = function (last_collapsed, pos) {
if (last_collapsed && ! this.tmp.have_collapsed && "string" === typeof this.citation.opt["after-collapse-delimiter"]) {
this.tmp.splice_delimiter = this.citation.opt["after-collapse-delimiter"];
- } else if (this.tmp.use_cite_group_delimiter) {
- this.tmp.splice_delimiter = this.citation.opt.cite_group_delimiter;
} else if (this.tmp.have_collapsed && this.opt.xclass === "in-text" && this.opt.update_mode !== CSL.NUMERIC) {
this.tmp.splice_delimiter = ", ";
+ } else if (this.tmp.use_cite_group_delimiter) {
+ this.tmp.splice_delimiter = this.citation.opt.cite_group_delimiter;
} else if (this.tmp.cite_locales[pos - 1]) {
var alt_affixes = this.tmp.cite_affixes[this.tmp.area][this.tmp.cite_locales[pos - 1]];
if (alt_affixes && alt_affixes.delimiter) {
this.tmp.splice_delimiter = alt_affixes.delimiter;
}
}
+ if (!this.tmp.splice_delimiter) {
+ this.tmp.splice_delimiter = "";
+ }
return this.tmp.splice_delimiter;
};
CSL.getCitationCluster = function (inputList, citationID) {
var result, objects, myparams, len, pos, item, last_collapsed, params, empties, composite, compie, myblobs, Item, llen, ppos, obj, preceding_item, txt_esc, error_object;
- inputList = inputList ? inputList : [];
this.tmp.last_primary_names_string = false;
+ this.tmp.nestedBraces = false;
txt_esc = CSL.getSafeEscape(this);
this.tmp.area = "citation";
result = "";
@@ -5088,8 +4174,6 @@ CSL.getCitationCluster = function (inputList, citationID) {
this.tmp.last_years_used = [];
this.tmp.backref_index = [];
this.tmp.cite_locales = [];
- this.output.checkNestedBrace = new CSL.checkNestedBrace(this);
- var use_layout_prefix = this.output.checkNestedBrace.update(this.citation.opt.layout_prefix);
var suppressTrailingPunctuation = false;
if (this.opt.xclass === "note" && this.citation.opt.suppressTrailingPunctuation) {
suppressTrailingPunctuation = true;
@@ -5151,19 +4235,11 @@ CSL.getCitationCluster = function (inputList, citationID) {
item = inputList[pos][1];
last_collapsed = this.tmp.have_collapsed;
params = {};
- this.tmp.shadow_numbers = {};
- if (!this.tmp.just_looking && this.opt.hasPlaceholderTerm) {
- var output = this.output;
- this.output = new CSL.Output.Queue(this);
- this.output.adjust = new CSL.Output.Queue.adjust();
- CSL.getAmbiguousCite.call(this, Item, null, false, item);
- this.output = output;
- }
if (pos > 0) {
- CSL.getCite.call(this, Item, item, "" + inputList[(pos - 1)][0].id, true);
+ CSL.getCite.call(this, Item, item, "" + inputList[(pos - 1)][0].id);
} else {
this.tmp.term_predecessor = false;
- CSL.getCite.call(this, Item, item, null, true);
+ CSL.getCite.call(this, Item, item);
}
if (!this.tmp.cite_renders_content) {
error_object = {
@@ -5185,11 +4261,11 @@ CSL.getCitationCluster = function (inputList, citationID) {
}
if (pos > 0) {
preceding_item = inputList[pos - 1][1];
- 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 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 spaceidx = params.splice_delimiter.indexOf(" ");
- if (spaceidx > -1 && !currentStartsWithPeriodOrComma) {
+ if (spaceidx > -1 && !currentStartsWithPeriod) {
params.splice_delimiter = params.splice_delimiter.slice(spaceidx);
} else {
params.splice_delimiter = "";
@@ -5225,19 +4301,19 @@ CSL.getCitationCluster = function (inputList, citationID) {
if (CSL.TERMINAL_PUNCTUATION.slice(0, -1).indexOf(delimiter.slice(0, 1)) > -1) {
delimiter = delimiter.slice(0, 1);
}
- suffix = this.output.checkNestedBrace.update(suffix);
+ var use_layout_suffix = suffix;
for (var i=0,ilen=this.output.queue.length;i<ilen;i+=1) {
CSL.Output.Queue.purgeEmptyBlobs(this.output.queue[i]);
}
if (!this.tmp.suppress_decorations && this.output.queue.length) {
if (!(this.opt.development_extensions.apply_citation_wrapper
&& this.sys.wrapCitationEntry
- && !this.tmp.just_looking
+ && !this.tmp.just_looking
&& this.tmp.area === "citation")) {
if (!suppressTrailingPunctuation) {
- this.output.queue[this.output.queue.length - 1].strings.suffix = suffix;
+ this.output.queue[this.output.queue.length - 1].strings.suffix = use_layout_suffix;
}
- this.output.queue[0].strings.prefix = use_layout_prefix;
+ this.output.queue[0].strings.prefix = this.citation.opt.layout_prefix;
}
}
if (this.opt.development_extensions.clean_up_csl_flaws) {
@@ -5249,7 +4325,6 @@ 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;
@@ -5273,64 +4348,45 @@ CSL.getCitationCluster = function (inputList, citationID) {
composite.push(preStr + errStr + sufStr);
}
}
- if (buffer.length && "string" === typeof composite[0]) {
+ if (objects.length && "string" === typeof composite[0]) {
composite.reverse();
var tmpstr = composite.pop();
if (tmpstr && tmpstr.slice(0, 1) === ",") {
- buffer.push(tmpstr);
- } else if ("string" == typeof buffer.slice(-1)[0] && buffer.slice(-1)[0].slice(-1) === ",") {
- buffer.push(" " + tmpstr);
+ objects.push(tmpstr);
+ } else if ("string" == typeof objects.slice(-1)[0] && objects.slice(-1)[0].slice(-1) === ",") {
+ objects.push(" " + tmpstr);
} else if (tmpstr) {
- buffer.push(txt_esc(this.tmp.splice_delimiter) + tmpstr);
+ objects.push(txt_esc(this.tmp.splice_delimiter) + tmpstr);
}
} else {
composite.reverse();
compie = composite.pop();
if ("undefined" !== typeof compie) {
- if (buffer.length && "string" === typeof buffer[buffer.length - 1]) {
- buffer[buffer.length - 1] += compie.successor_prefix;
+ if (objects.length && "string" === typeof objects[objects.length - 1]) {
+ objects[objects.length - 1] += compie.successor_prefix;
}
- buffer.push(compie);
+ objects.push(compie);
}
}
llen = composite.length;
for (ppos = 0; ppos < llen; ppos += 1) {
obj = composite[ppos];
if ("string" === typeof obj) {
- buffer.push(txt_esc(this.tmp.splice_delimiter) + obj);
+ objects.push(txt_esc(this.tmp.splice_delimiter) + obj);
continue;
}
compie = composite.pop();
if ("undefined" !== typeof compie) {
- buffer.push(compie);
+ objects.push(compie);
}
}
- if (buffer.length === 0 && !inputList[pos][1]["suppress-author"]) {
+ if (objects.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) {
- if (((myblobs.length-1) > pos && myparams[pos+1].have_collapsed) && !myparams[pos].have_collapsed) {
- this.tmp.splice_delimiter = myparams[pos-1].splice_delimiter;
- }
- buffer[0] = txt_esc(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) {
+ this.output.nestedBraces = false;
if (!this.tmp.suppress_decorations) {
len = this.citation.opt.layout_decorations.length;
for (pos = 0; pos < len; pos += 1) {
@@ -5338,20 +4394,18 @@ CSL.getCitationCluster = function (inputList, citationID) {
if (params[1] === "normal") {
continue;
}
- if (!item || !item["author-only"]) {
- result = this.fun.decorate[params[0]][params[1]](this, result);
- }
+ result = this.fun.decorate[params[0]][params[1]](this, result);
}
}
}
this.tmp.suppress_decorations = false;
return result;
};
-CSL.getCite = function (Item, item, prevItemID, blockShadowNumberReset) {
+CSL.getCite = function (Item, item, prevItemID) {
var next, error_object;
this.tmp.cite_renders_content = false;
this.parallel.StartCite(Item, item, prevItemID);
- CSL.citeStart.call(this, Item, item, blockShadowNumberReset);
+ CSL.citeStart.call(this, Item, item);
next = 0;
this.nameOutput = new CSL.NameOutput(this, Item, item);
while (next < this[this.tmp.area].tokens.length) {
@@ -5371,10 +4425,7 @@ CSL.getCite = function (Item, item, prevItemID, blockShadowNumberReset) {
}
return "" + Item.id;
};
-CSL.citeStart = function (Item, item, blockShadowNumberReset) {
- if (!blockShadowNumberReset) {
- this.tmp.shadow_numbers = {};
- }
+CSL.citeStart = function (Item, item) {
this.tmp.disambiguate_count = 0;
this.tmp.disambiguate_maxMax = 0;
this.tmp.same_author_as_previous_cite = false;
@@ -5430,8 +4481,25 @@ CSL.citeStart = function (Item, item, blockShadowNumberReset) {
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) {
+ var openBrace = CSL.checkNestedBraceOpen.exec(item.prefix);
+ var closeBrace = CSL.checkNestedBraceClose.exec(item.prefix);
+ if (openBrace) {
+ if (!closeBrace) {
+ this.output.nestedBraces = CSL.NestedBraces;
+ } else if (closeBrace[0].length < openBrace[0].length) {
+ this.output.nestedBraces = CSL.NestedBraces;
+ } else {
+ this.output.nestedBraces = false;
+ }
+ } else if (closeBrace) {
+ this.output.nestedBraces = false;
+ }
+ }
};
CSL.citeEnd = function (Item, item) {
if (this.tmp.disambig_restore) {
@@ -5467,6 +4535,21 @@ CSL.citeEnd = function (Item, item) {
}
this.tmp.issued_date = false;
this.tmp.renders_collection_number = false;
+ if (this.opt.development_extensions.flip_parentheses_to_braces && item && item.suffix) {
+ var openBrace = CSL.checkNestedBraceOpen.exec(item.suffix);
+ var closeBrace = CSL.checkNestedBraceClose.exec(item.suffix);
+ if (closeBrace) {
+ if (!openBrace) {
+ this.output.nestedBraces = false;
+ } else if (openBrace[0].length < closeBrace[0].length) {
+ this.output.nestedBraces = false;
+ } else {
+ this.output.nestedBraces = CSL.NestedBraces;
+ }
+ } else if (openBrace) {
+ this.output.nestedBraces = CSL.NestedBraces;
+ }
+ }
};
CSL.Engine.prototype.makeBibliography = function (bibsection) {
var debug, ret, params, maxoffset, item, len, pos, tok, tokk, tokkk, entry_ids, entry_strings, bibliography_errors;
@@ -5689,7 +4772,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);
+ res = this.output.string(this, this.output.queue)[0];
if (!res) {
res = "\n[CSL STYLE ERROR: reference with no printed form.]\n";
}
@@ -5927,14 +5010,14 @@ CSL.Engine.prototype.localeConfigure = function (langspec, beShy) {
if (beShy && this.locale[langspec.best]) {
return;
}
- localexml = CSL.setupXml(this.sys.retrieveLocale("en-US"));
+ localexml = this.sys.xml.makeXml(this.sys.retrieveLocale("en-US"));
this.localeSet(localexml, "en-US", langspec.best);
if (langspec.best !== "en-US") {
if (langspec.base !== langspec.best) {
- localexml = CSL.setupXml(this.sys.retrieveLocale(langspec.base));
+ localexml = this.sys.xml.makeXml(this.sys.retrieveLocale(langspec.base));
this.localeSet(localexml, langspec.base, langspec.best);
}
- localexml = CSL.setupXml(this.sys.retrieveLocale(langspec.best));
+ localexml = this.sys.xml.makeXml(this.sys.retrieveLocale(langspec.best));
this.localeSet(localexml, langspec.best, langspec.best);
}
this.localeSet(this.cslXml, "", langspec.best);
@@ -5986,51 +5069,51 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {
this.locale[lang_out].ord = {'1.0.1':false,keys:{}};
this.locale[lang_out]["noun-genders"] = {};
}
- locale = myxml.makeXml();
- if (myxml.nodeNameIs(myxml.dataObj, 'locale')) {
- locale = myxml.dataObj;
+ locale = this.sys.xml.makeXml();
+ if (this.sys.xml.nodeNameIs(myxml, 'locale')) {
+ locale = myxml;
} else {
- nodes = myxml.getNodesByName(myxml.dataObj, "locale");
- for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {
+ nodes = this.sys.xml.getNodesByName(myxml, "locale");
+ for (pos = 0, len = this.sys.xml.numberofnodes(nodes); pos < len; pos += 1) {
blob = nodes[pos];
- if (myxml.getAttributeValue(blob, 'lang', 'xml') === lang_in) {
+ if (this.sys.xml.getAttributeValue(blob, 'lang', 'xml') === lang_in) {
locale = blob;
break;
}
}
}
- nodes = myxml.getNodesByName(locale, 'type');
- for (i = 0, ilen = myxml.numberofnodes(nodes); i < ilen; i += 1) {
+ nodes = this.sys.xml.getNodesByName(locale, 'type');
+ for (i = 0, ilen = this.sys.xml.numberofnodes(nodes); i < ilen; i += 1) {
var typenode = nodes[i];
- var type = myxml.getAttributeValue(typenode, 'name');
- var gender = myxml.getAttributeValue(typenode, 'gender');
+ var type = this.sys.xml.getAttributeValue(typenode, 'name');
+ var gender = this.sys.xml.getAttributeValue(typenode, 'gender');
this.opt.gender[type] = gender;
}
- var hasCslOrdinals101 = myxml.getNodesByName(locale, 'term', 'ordinal').length;
+ var hasCslOrdinals101 = this.sys.xml.getNodesByName(locale, 'term', 'ordinal').length;
if (hasCslOrdinals101) {
for (var key in this.locale[lang_out].ord.keys) {
delete this.locale[lang_out].terms[key];
}
this.locale[lang_out].ord = {"1.0.1":false,keys:{}};
}
- nodes = myxml.getNodesByName(locale, 'term');
+ nodes = this.sys.xml.getNodesByName(locale, 'term');
var ordinals101 = {"last-digit":{},"last-two-digits":{},"whole-number":{}};
var ordinals101_toggle = false;
var genderized_terms = {};
- for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {
+ for (pos = 0, len = this.sys.xml.numberofnodes(nodes); pos < len; pos += 1) {
term = nodes[pos];
- termname = myxml.getAttributeValue(term, 'name');
+ termname = this.sys.xml.getAttributeValue(term, 'name');
if (termname === "sub verbo") {
termname = "sub-verbo";
}
if (termname.slice(0,7) === "ordinal") {
- var termstring = myxml.getNodeValue(term);
+ var termstring = this.sys.xml.getNodeValue(term);
if (termname === "ordinal") {
ordinals101_toggle = true;
} else {
- var match = myxml.getAttributeValue(term, 'match');
+ var match = this.sys.xml.getAttributeValue(term, 'match');
var termstub = termname.slice(8);
- var genderform = myxml.getAttributeValue(term, 'gender-form');
+ var genderform = this.sys.xml.getAttributeValue(term, 'gender-form');
if (!genderform) {
genderform = "neuter";
}
@@ -6055,14 +5138,14 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {
}
form = "long";
genderform = false;
- if (myxml.getAttributeValue(term, 'form')) {
- form = myxml.getAttributeValue(term, 'form');
+ if (this.sys.xml.getAttributeValue(term, 'form')) {
+ form = this.sys.xml.getAttributeValue(term, 'form');
}
- if (myxml.getAttributeValue(term, 'gender-form')) {
- genderform = myxml.getAttributeValue(term, 'gender-form');
+ if (this.sys.xml.getAttributeValue(term, 'gender-form')) {
+ genderform = this.sys.xml.getAttributeValue(term, 'gender-form');
}
- if (myxml.getAttributeValue(term, 'gender')) {
- this.locale[lang_out]["noun-genders"][termname] = myxml.getAttributeValue(term, 'gender');
+ if (this.sys.xml.getAttributeValue(term, 'gender')) {
+ this.locale[lang_out]["noun-genders"][termname] = this.sys.xml.getAttributeValue(term, 'gender');
}
if (genderform) {
this.locale[lang_out].terms[termname][genderform] = {};
@@ -6073,20 +5156,11 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {
this.locale[lang_out].terms[termname][form] = [];
target = this.locale[lang_out].terms[termname];
}
- if (myxml.numberofnodes(myxml.getNodesByName(term, 'multiple'))) {
- target[form][0] = myxml.getNodeValue(term, 'single');
- if (target[form][0].indexOf("%s") > -1) {
- this.opt.hasPlaceholderTerm = true;
- }
- target[form][1] = myxml.getNodeValue(term, 'multiple');
- if (target[form][1].indexOf("%s") > -1) {
- this.opt.hasPlaceholderTerm = true;
- }
+ if (this.sys.xml.numberofnodes(this.sys.xml.getNodesByName(term, 'multiple'))) {
+ target[form][0] = this.sys.xml.getNodeValue(term, 'single');
+ target[form][1] = this.sys.xml.getNodeValue(term, 'multiple');
} else {
- target[form] = myxml.getNodeValue(term);
- if (target[form].indexOf("%s") > -1) {
- this.opt.hasPlaceholderTerm = true;
- }
+ target[form] = this.sys.xml.getNodeValue(term);
}
}
if (ordinals101_toggle) {
@@ -6126,11 +5200,11 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {
}
}
}
- nodes = myxml.getNodesByName(locale, 'style-options');
- for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {
+ nodes = this.sys.xml.getNodesByName(locale, 'style-options');
+ for (pos = 0, len = this.sys.xml.numberofnodes(nodes); pos < len; pos += 1) {
if (true) {
styleopts = nodes[pos];
- attributes = myxml.attributes(styleopts);
+ attributes = this.sys.xml.attributes(styleopts);
for (attrname in attributes) {
if (attributes.hasOwnProperty(attrname)) {
if (attrname === "@punctuation-in-quote" || attrname === "@limit-day-ordinals-to-day-1") {
@@ -6145,7 +5219,7 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {
} else if (attrname === "@skip-words") {
var skip_words = attributes[attrname].split(/\s*,\s*/);
this.locale[lang_out].opts[attrname.slice(1)] = skip_words;
- } else if (attrname === "@leading-noise-words") {
+ } else if (attrname === "@leading-noise-words" && lang_in === lang_out) {
var val = attributes[attrname].split(/\s*,\s*/);
this.locale[lang_out].opts["leading-noise-words"] = val;
} else if (attrname === "@name-as-sort-order") {
@@ -6171,11 +5245,11 @@ CSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {
}
}
}
- nodes = myxml.getNodesByName(locale, 'date');
- for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {
+ nodes = this.sys.xml.getNodesByName(locale, 'date');
+ for (pos = 0, len = this.sys.xml.numberofnodes(nodes); pos < len; pos += 1) {
if (true) {
date = nodes[pos];
- this.locale[lang_out].dates[myxml.getAttributeValue(date, "form")] = date;
+ this.locale[lang_out].dates[this.sys.xml.getAttributeValue(date, "form")] = date;
}
}
};
@@ -6572,7 +5646,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(false, num, this, Item.id);
+ number = new CSL.NumericBlob(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);
@@ -6690,10 +5764,10 @@ CSL.Node.group = {
for (var jurisdiction in res) {
var macroCount = 0;
state.juris[jurisdiction] = {};
- var myXml = CSL.setupXml(res[jurisdiction]);
- var myNodes = myXml.getNodesByName(myXml.dataObj, "law-module");
+ var myXml = state.sys.xml.makeXml(res[jurisdiction]);
+ var myNodes = state.sys.xml.getNodesByName(myXml, "law-module");
for (var i=0,ilen=myNodes.length;i<ilen;i++) {
- var myTypes = myXml.getAttributeValue(myNodes[i],"types");
+ var myTypes = state.sys.xml.getAttributeValue(myNodes[i],"types");
if (myTypes) {
state.juris[jurisdiction].types = {};
myTypes = myTypes.split(/\s+/);
@@ -6705,9 +5779,9 @@ CSL.Node.group = {
if (!state.juris[jurisdiction].types) {
state.juris[jurisdiction].types = CSL.MODULE_TYPES;
}
- var myNodes = myXml.getNodesByName(myXml.dataObj, "macro");
+ var myNodes = state.sys.xml.getNodesByName(myXml, "macro");
for (var i=0,ilen=myNodes.length;i<ilen;i++) {
- var myName = myXml.getAttributeValue(myNodes[i], "name");
+ var myName = state.sys.xml.getAttributeValue(myNodes[i], "name");
if (!CSL.MODULE_MACROS[myName]) {
CSL.debug("CSL: skipping non-modular macro name \"" + myName + "\" in module context");
continue;
@@ -7127,7 +6201,6 @@ CSL.Node.key = {
if (state.sys.normalizeUnicode) {
keystring = state.sys.normalizeUnicode(keystring);
}
- keystring = keystring.split(" ").join("");
if ("" === keystring) {
keystring = undefined;
}
@@ -7170,6 +6243,7 @@ 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);
@@ -7183,9 +6257,7 @@ CSL.Node.label = {
flag[0] = true;
state.tmp.group_context.replace(flag);
}
- if (termtxt.indexOf("%s") === -1) {
- state.output.append(termtxt, this);
- }
+ state.output.append(termtxt, this);
if (item && this.strings.term === "locator") {
state.parallel.CloseVariable();
}
@@ -7324,9 +6396,6 @@ CSL.Node.layout = {
ignorePredecessor = true;
}
prefix = (item.prefix + sp).replace(/\s+/g, " ");
- if (!state.tmp.just_looking) {
- prefix = state.output.checkNestedBrace.update(prefix);
- }
state.output.append(prefix, this, false, ignorePredecessor);
}
};
@@ -7412,11 +6481,7 @@ CSL.Node.layout = {
|| ['[','('].indexOf(item.suffix.slice(0,1)) > -1) {
sp = " ";
}
- var suffix = item.suffix;
- if (!state.tmp.just_looking) {
- suffix = state.output.checkNestedBrace.update(suffix);
- }
- state.output.append((sp + suffix), this);
+ state.output.append((sp + item.suffix), this);
}
};
suffix_token.execs.push(func);
@@ -8745,11 +7810,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], "0");
+ merged = this._join([first, given], " ");
blob = this._join([merged, suffix], " ");
} else {
second = this._join([given, dropping_particle, non_dropping_particle], " ");
- merged = this._join([family, second], "0");
+ merged = this._join([family, second], " ");
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))) {
@@ -9359,17 +8424,29 @@ CSL.evaluateLabel = function (node, state, Item, item) {
myterm = node.strings.term;
}
var plural = node.strings.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 (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 (node.decorations && (state.opt.development_extensions.csl_reverse_lookup_support || state.sys.csl_reverse_lookup_support)) {
node.decorations.reverse();
@@ -9379,6 +8456,15 @@ 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]) {
@@ -9703,18 +8789,110 @@ CSL.Node.number = {
if (this.strings.label_form_override) {
form = this.strings.label_form_override;
}
- var node = this;
- if (varname === "locator") {
- state.processNumber(node, item, varname, Item.type);
+ 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 {
- state.processNumber(node, Item, varname, Item.type);
+ 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");
+ }
+ }
}
- 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]);
+ if (varname === "locator") {
+ state.tmp.done_vars.push("locator");
}
+ state.parallel.CloseVariable("number");
};
this.execs.push(func);
target.push(this);
@@ -9854,7 +9032,7 @@ CSL.Node.text = {
if (state.opt.citation_number_slug) {
state.output.append(state.opt.citation_number_slug, this);
} else {
- number = new CSL.NumericBlob(false, num, this, Item.id);
+ number = new CSL.NumericBlob(num, this, Item.id);
state.output.append(number, "literal");
}
}
@@ -9872,7 +9050,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(false, num, this, Item.id);
+ number = new CSL.NumericBlob(num, this, Item.id);
formatter = new CSL.Util.Suffixator(CSL.SUFFIX_CHARS);
number.setFormatter(formatter);
state.output.append(number, "literal");
@@ -9981,20 +9159,44 @@ CSL.Node.text = {
if (CSL.CITE_FIELDS.indexOf(this.variables_real[0]) > -1) {
func = function (state, Item, item) {
if (item && item[this.variables[0]]) {
- state.processNumber(this, item, this.variables[0], Item.type);
- CSL.Util.outputNumericField(state, this.variables[0], Item.id);
+ var value = "" + item[this.variables[0]];
+ value = value.replace(/([^\\])--*/g,"$1"+state.getTerm("page-range-delimiter"));
+ value = value.replace(/\\-/g,"-");
state.output.append(value, this, false, false, true);
- if (["locator", "locator-extra"].indexOf(this.variables_real[0]) > -1
- && !state.tmp.just_looking) {
- state.tmp.done_vars.push(this.variables_real[0]);
+ 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);
}
}
};
- } 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;
@@ -10037,7 +9239,7 @@ CSL.Node.text = {
value = state.getVariable(Item, this.variables[0], form);
if (value) {
value = "" + value;
- value = value.split("\\").join("");
+ value = value.replace("\\", "", "g");
state.output.append(value, this);
}
}
@@ -10153,8 +9355,13 @@ CSL.Attributes["@locator"] = function (state, arg) {
var maketest = function (trylabel) {
return function(Item, item) {
var label;
- state.processNumber(false, item, "locator");
- label = state.tmp.shadow_numbers.locator.label;
+ if ("undefined" === typeof item || !item.label) {
+ label = "page";
+ } else if (item.label === "sub verbo") {
+ label = "sub-verbo";
+ } else {
+ label = item.label;
+ }
if (trylabel === label) {
return true;
} else {
@@ -12103,11 +11310,10 @@ CSL.Blob.prototype.push = function (blob) {
this.blobs.push(blob);
}
};
-CSL.NumericBlob = function (particle, num, mother_token, id) {
+CSL.NumericBlob = function (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 = {};
@@ -12159,8 +11365,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) {
@@ -12186,43 +11392,43 @@ CSL.NumericBlob.prototype.checkLast = function (last) {
CSL.Util.fixDateNode = function (parent, pos, node) {
var form, variable, datexml, subnode, partname, attr, val, prefix, suffix, children, key, subchildren, kkey, display, cslid;
this.build.date_key = true;
- form = this.cslXml.getAttributeValue(node, "form");
+ form = this.sys.xml.getAttributeValue(node, "form");
var lingo;
- if ("accessed" === this.cslXml.getAttributeValue(node, "variable")) {
+ if ("accessed" === this.sys.xml.getAttributeValue(node, "variable")) {
lingo = this.opt["default-locale"][0];
} else {
- lingo = this.cslXml.getAttributeValue(node, "lingo");
+ lingo = this.sys.xml.getAttributeValue(node, "lingo");
}
if (!this.getDate(form)) {
return parent;
}
- var dateparts = this.cslXml.getAttributeValue(node, "date-parts");
- variable = this.cslXml.getAttributeValue(node, "variable");
- prefix = this.cslXml.getAttributeValue(node, "prefix");
- suffix = this.cslXml.getAttributeValue(node, "suffix");
- display = this.cslXml.getAttributeValue(node, "display");
- cslid = this.cslXml.getAttributeValue(node, "cslid");
- datexml = this.cslXml.nodeCopy(this.getDate(form, ("accessed" === variable)));
- this.cslXml.setAttribute(datexml, 'lingo', this.opt.lang);
- this.cslXml.setAttribute(datexml, 'form', form);
- this.cslXml.setAttribute(datexml, 'date-parts', dateparts);
- this.cslXml.setAttribute(datexml, "cslid", cslid);
- this.cslXml.setAttribute(datexml, 'variable', variable);
+ var dateparts = this.sys.xml.getAttributeValue(node, "date-parts");
+ variable = this.sys.xml.getAttributeValue(node, "variable");
+ 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.getDate(form, ("accessed" === variable)));
+ this.sys.xml.setAttribute(datexml, 'lingo', this.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.cslXml.setAttribute(datexml, "prefix", prefix);
+ this.sys.xml.setAttribute(datexml, "prefix", prefix);
}
if (suffix) {
- this.cslXml.setAttribute(datexml, "suffix", suffix);
+ this.sys.xml.setAttribute(datexml, "suffix", suffix);
}
if (display) {
- this.cslXml.setAttribute(datexml, "display", display);
+ this.sys.xml.setAttribute(datexml, "display", display);
}
- children = this.cslXml.children(node);
+ children = this.sys.xml.children(node);
for (key in children) {
subnode = children[key];
- if ("date-part" === this.cslXml.nodename(subnode)) {
- partname = this.cslXml.getAttributeValue(subnode, "name");
- subchildren = this.cslXml.attributes(subnode);
+ if ("date-part" === this.sys.xml.nodename(subnode)) {
+ partname = this.sys.xml.getAttributeValue(subnode, "name");
+ subchildren = this.sys.xml.attributes(subnode);
for (attr in subchildren) {
if (subchildren.hasOwnProperty(attr)) {
if ("@name" === attr) {
@@ -12234,18 +11440,18 @@ CSL.Util.fixDateNode = function (parent, pos, node) {
}
}
val = subchildren[attr];
- this.cslXml.setAttributeOnNodeIdentifiedByNameAttribute(datexml, "date-part", partname, attr, val);
+ this.sys.xml.setAttributeOnNodeIdentifiedByNameAttribute(datexml, "date-part", partname, attr, val);
}
}
}
}
- if ("year" === this.cslXml.getAttributeValue(node, "date-parts")) {
- this.cslXml.deleteNodeByNameAttribute(datexml, 'month');
- this.cslXml.deleteNodeByNameAttribute(datexml, 'day');
- } else if ("year-month" === this.cslXml.getAttributeValue(node, "date-parts")) {
- this.cslXml.deleteNodeByNameAttribute(datexml, 'day');
+ if ("year" === this.sys.xml.getAttributeValue(node, "date-parts")) {
+ this.sys.xml.deleteNodeByNameAttribute(datexml, 'month');
+ this.sys.xml.deleteNodeByNameAttribute(datexml, 'day');
+ } else if ("year-month" === this.sys.xml.getAttributeValue(node, "date-parts")) {
+ this.sys.xml.deleteNodeByNameAttribute(datexml, 'day');
}
- return this.cslXml.insertChildNodeAfter(parent, node, pos, datexml);
+ return this.sys.xml.insertChildNodeAfter(parent, node, pos, datexml);
};
CSL.dateMacroAsSortKey = function (state, Item) {
CSL.dateAsSortKey.call(this, state, Item, true);
@@ -12268,7 +11474,7 @@ CSL.dateAsSortKey = function (state, Item, isMacro) {
this.dateparts = ["year", "month", "day"];
}
if (dp.raw) {
- dp = state.fun.dateparser.parseDateToArray(dp.raw);
+ dp = state.fun.dateparser.parse(dp.raw);
} else if (dp["date-parts"]) {
dp = state.dateParseArray(dp);
}
@@ -13084,477 +12290,176 @@ CSL.Util.Suffixator.prototype.format = function (N) {
return key;
};
CSL.Engine.prototype.processNumber = function (node, ItemObject, variable, type) {
- var val, m, i, ilen, j, jlen;
+ var num, m, i, ilen, j, jlen;
var debug = false;
- 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;
+ 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;
}
}
- return str;
+ return;
}
- 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<ilen; i++) {
- elems.push(lst[i]);
- elems.push(m[i]);
- }
- elems.push(lst[lst.length-1]);
- elems = fixupSubsections(elems);
+ this.tmp.shadow_numbers[variable] = {};
+ this.tmp.shadow_numbers[variable].values = [];
+ this.tmp.shadow_numbers[variable].plural = 0;
+ this.tmp.shadow_numbers[variable].numeric = false;
+ this.tmp.shadow_numbers[variable].label = false;
+ if (!ItemObject) {
+ return;
+ }
+ var languageRole = CSL.LangPrefsMap[variable];
+ if (languageRole) {
+ var localeType = this.opt["cite-lang-prefs"][languageRole][0];
+ num = this.transform.getTextSubField(ItemObject, variable, "locale-"+localeType, true);
+ num = num.name;
+ } else {
+ num = ItemObject[variable];
+ }
+ if (num && this.sys.getAbbreviation) {
+ num = ("" + num).replace(/^\"/, "").replace(/\"$/, "");
+ var jurisdiction = this.transform.loadAbbreviation(ItemObject.jurisdiction, "number", num);
+ if (this.transform.abbrevs[jurisdiction].number[num]) {
+ num = this.transform.abbrevs[jurisdiction].number[num];
} else {
- var elems = [str];
- }
- var values = [];
- var label = defaultLabel;
- var origLabel = "";
- for (var i=0,ilen=elems.length;i<ilen;i += 2) {
- var m = elems[i].match(/((?:^| )(?:[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|[a-z][a-z][a-z][a-z])\. *)/g);
- if (m) {
- var lst = elems[i].split(/(?:(?:^| )(?:[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|[a-z][a-z][a-z][a-z])\. *)/);
- if (i === 0) {
- var slug = m[0].trim();
- if (!CSL.STATUTE_SUBDIV_STRINGS[slug]
- || !me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[slug])
- || (["locator", "number"].indexOf(variable) === -1 && CSL.STATUTE_SUBDIV_STRINGS[slug] !== variable)) {
- m = m.slice(1);
- lst[0] = lst[0] + " " + slug + " " + lst[1];
- lst = lst.slice(0,1).concat(lst.slice(2))
- }
- }
- for (var j=0,jlen=lst.length; j<jlen; j++) {
- if (lst[j] || j === (lst.length-1)) {
- label = m[j-1] ? m[j-1] : label;
- var origLabel = j > 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]));
+ if ("undefined" !== typeof this.transform.abbrevs[jurisdiction].number[num]) {
+ delete this.transform.abbrevs[jurisdiction].number[num];
}
}
- return values;
}
- function setSpaces(values) {
- for (var i=0,ilen=values.length-1;i<ilen;i++) {
- if (!values[i].joiningSuffix && values[i+1].label) {
- values[i].joiningSuffix = " ";
- }
+ if ("undefined" !== typeof num) {
+ if ("number" === typeof num) {
+ num = "" + num;
}
- }
- function fixNumericAndCount(values, i, currentLabelInfo) {
- var master = values[currentLabelInfo.pos];
- var val = values[i].value;
- var isEscapedHyphen = master.joiningSuffix === "\\-";
- if (val.particle && val.particle !== master.particle) {
- currentLabelInfo.collapsible = false;
+ this.tmp.shadow_numbers[variable].label = variable;
+ if (num.slice(0, 1) === '"' && num.slice(-1) === '"') {
+ num = num.slice(1, -1);
}
- var mVal = val.match(/^[0-9]+([-,:a-zA-Z]*)$/);
- var mCurrentLabel = master.value.match(/^[0-9]+([-,:a-zA-Z]*)$/);
- if (!val || !mVal || !mCurrentLabel || isEscapedHyphen) {
- currentLabelInfo.collapsible = false;
- if (!val || !mCurrentLabel) {
- currentLabelInfo.numeric = false;
- }
- if (isEscapedHyphen) {
- currentLabelInfo.count--;
+ if (num && ["number-of-volumes","number-of-pages"].indexOf(variable) > -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 ((mVal && mVal[1]) || (mCurrentLabel && mCurrentLabel[1])) {
- currentLabelInfo.collapsible = false;
+ if ("locator" === variable
+ && ["bill","gazette","legislation","regulation","treaty"].indexOf(type) > -1) {
+ num = num.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX)[0];
}
- var isCollapsible = currentLabelInfo.collapsible;
- if (!isCollapsible && i>0 && val.match(/^[ivxlcmIVXLCM]+$/) && values[i-1].value.match(/^[ivxlcmIVXLCM]+$/)) {
- isCollapsible = true;
+ var rangeType = "page";
+ if (["bill","gazette","legislation","legal_case","regulation","treaty"].indexOf(type) > -1
+ && variable === "collection-number") {
+ rangeType = "year";
}
- for (var j=currentLabelInfo.pos,jlen=values.length; j<jlen; j++) {
- if (currentLabelInfo.count > 1 && isCollapsible) {
- values[j].plural = 1;
+ 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];
+ }
}
- 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 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]);
}
- var masterLabel = values.length ? values[0].label : null;
- for (var i=0,ilen=values.length;i<ilen;i++) {
- if (values[i].label) {
- if (values[i].label === currentLabelInfo.label) {
- currentLabelInfo.count++;
- } else {
- fixNumericAndCount(values, i, currentLabelInfo);
- if (currentLabelInfo.pos === 0) {
- if (variable === "locator" || variable === "number") {
- if (!me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[currentLabelInfo.label]) && currentLabelInfo.label.slice(0, 4) !== "var:") {
- values[currentLabelInfo.pos].labelVisibility = true;
+ 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;
}
- if (["locator", "number"].indexOf(variable) === -1) {
- if (CSL.STATUTE_SUBDIV_STRINGS[currentLabelInfo.label] !== variable && currentLabelInfo.label.slice(0, 4) !== "var:") {
- values[0].labelVisibility = true;
+ }
+ 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 {
- if (values[i-1].label !== values[i].label && currentLabelInfo.label.slice(0, 4) !== "var:") {
- values[currentLabelInfo.pos].labelVisibility = true;
- }
- }
- }
- }
- }
- fixNumericAndCount(values, values.length-1, currentLabelInfo);
- if (values.length && values[0].numeric && variable.slice(0, 10) === "number-of-") {
- if (parseInt(ItemObject[variable], 10) > 1) {
- values[0].plural = 1;
- }
- }
- for (var i=0,ilen=values.length;i<ilen;i++) {
- if (!values[i].numeric) {
- var origLabel = values[i].origLabel ? values[i].origLabel : "";
- values[i].value = (origLabel + values[i].value).trim();
- if (values[i].label !== values[0].label) {
- values[i].label = "";
- }
- }
- }
- }
- function setStyling(values) {
- var masterNode = CSL.Util.cloneToken(node);
- var masterStyling = new CSL.Token();
- if (!me.tmp.just_looking) {
- for (var j=masterNode.decorations.length-1;j>-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<ilen; i++) {
- var val = values[i];
- var newnode = CSL.Util.cloneToken(masterNode);
- newnode.gender = node.gender;
- if (masterLabel === val.label) {
- newnode.formatter = node.formatter;
- }
- if (val.numeric) {
- newnode.successor_prefix = val.successor_prefix;
- }
- newnode.strings.suffix = newnode.strings.suffix + stripHyphenBackslash(val.joiningSuffix);
- val.styling = newnode;
- }
- if (!me.tmp.just_looking) {
- if (values[0].value.slice(0,1) === "\"" && values[values.length-1].value.slice(-1) === "\"") {
- values[0].value = values[0].value.slice(1);
- values[values.length-1].value = values[values.length-1].value.slice(0,-1);
- masterStyling.decorations.push(["@quotes", true]);
- }
- }
- }
- return masterStyling;
- }
- function stripHyphenBackslash(joiningSuffix) {
- return joiningSuffix.replace("\\-", "-");
- }
- function fixupRangeDelimiter(variable, val, rangeDelimiter, isNumeric) {
- var isPage = checkPage(variable, val);
- if (rangeDelimiter === "-") {
- if (isNumeric) {
- if (isPage || (variable === "locator" && val.label === "art.") || ["issue", "volume", "edition", "number"].indexOf(variable) > -1) {
- rangeDelimiter = me.getTerm("page-range-delimiter")
- if (!rangeDelimiter) {
- rangeDelimiter = "\u2013";
+ var str = elements[i];
+ this.tmp.shadow_numbers[variable].values.push(["Blob", str, node]);
}
}
- if (variable === "collection-number") {
- rangeDelimiter = me.getTerm("year-range-delimiter");
- if (!rangeDelimiter) {
- rangeDelimiter = "\u2013";
- }
+ } else {
+ if (elements[i]) {
+ this.tmp.shadow_numbers[variable].values.push(["Blob", elements[i], undefined]);
}
}
- }
- 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<ilen; i++) {
- var val = values[i];
- if (!val.collapsible) {
- currentInfo.count = 0;
- currentInfo.label = null;
- var isNumeric = val.numeric;
- if (i<(values.length-1) && !isNumeric && val.value.match(/^[ivxlcmIVXLCM]+$/) && values[i+1].value.match(/^[ivxlcmIVXLCM]+$/)) {
- isNumeric = true;
- }
- val.joiningSuffix = fixupRangeDelimiter(variable, val, val.joiningSuffix, isNumeric);
- } else if (currentInfo.label === val.label && val.joiningSuffix === "-") {
- currentInfo.count = 1;
- } else if (currentInfo.label === val.label && val.joiningSuffix !== "-") {
- currentInfo.count++;
- if (currentInfo.count === 2) {
- manglePageNumbers(values, i, currentInfo);
- }
- } else if (currentInfo.label !== val.label) {
- currentInfo.label = val.label;
- currentInfo.count = 1;
+ };
+ 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 {
- currentInfo.count = 1;
- currentInfo.label = val.label;
+ this.tmp.shadow_numbers[variable].numeric = numeric;
}
- }
- if (currentInfo.count === 2) {
- manglePageNumbers(values, values.length-1, currentInfo);
- }
- }
- function setVariableParams(obj, values) {
- if (values.length) {
- obj.numeric = values[0].numeric;
- obj.collapsible = values[0].collapsible;
- obj.plural = values[0].plural;
- obj.label = CSL.STATUTE_SUBDIV_STRINGS[values[0].label];
- }
- }
- if (node && this.tmp.shadow_numbers[variable] && this.tmp.shadow_numbers[variable].values.length) {
- var values = this.tmp.shadow_numbers[variable].values;
- fixRanges(values);
- this.tmp.shadow_numbers[variable].masterStyling = setStyling(values);
- return;
- }
- if (!this.tmp.shadow_numbers[variable]) {
- this.tmp.shadow_numbers[variable] = {
- values:[]
- };
- }
- if (!ItemObject) {
- return;
- }
- var languageRole = CSL.LangPrefsMap[variable];
- if (languageRole) {
- var localeType = this.opt["cite-lang-prefs"][languageRole][0];
- val = this.transform.getTextSubField(ItemObject, variable, "locale-"+localeType, true);
- val = val.name;
- } else {
- val = ItemObject[variable];
- }
- if (val && this.sys.getAbbreviation) {
- var jurisdiction = this.transform.loadAbbreviation(ItemObject.jurisdiction, "number", val);
- if (this.transform.abbrevs[jurisdiction].number[val]) {
- val = this.transform.abbrevs[jurisdiction].number[val];
} else {
- if ("undefined" !== typeof this.transform.abbrevs[jurisdiction].number[val]) {
- delete this.transform.abbrevs[jurisdiction].number[val];
+ if (num.indexOf(" ") === -1 && num.match(/[0-9]/)) {
+ this.tmp.shadow_numbers[variable].numeric = true;
+ } else {
+ this.tmp.shadow_numbers[variable].numeric = numeric;
}
}
- }
- if ("undefined" !== typeof val && ("string" === typeof val || "number" === typeof val)) {
- if ("number" === typeof val) {
- val = "" + val;
+ if (!this.tmp.shadow_numbers[variable].numeric) {
+ this.transform.loadAbbreviation(ItemObject.jurisdiction, "number", num);
}
- var defaultLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable];
- if (!this.tmp.shadow_numbers.values) {
- var values = parseString(val, defaultLabel);
- setSpaces(values);
- setPluralsAndNumerics(values);
- this.tmp.shadow_numbers[variable].values = values;
+ if (count > 1) {
+ this.tmp.shadow_numbers[variable].plural = 1;
}
- if (node) {
- fixRanges(values);
- this.tmp.shadow_numbers[variable].masterStyling = setStyling(values)
+ 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;
}
- 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<ilen;i++) {
- var num = nums[i];
- var labelName = CSL.STATUTE_SUBDIV_STRINGS[num.label];
- if (num.label === masterLabel) {
- label = state.getTerm(labelName, labelForm, num.plural);
- } else {
- label = state.getTerm(labelName, embeddedLabelForm, num.plural);
- }
- var labelPlaceholderPos = -1;
- if (label) {
- labelPlaceholderPos = label.indexOf("%s");
- }
- var numStyling = CSL.Util.cloneToken(num.styling);
- numStyling.formatter = num.styling.formatter;
- numStyling.type = num.styling.type;
- numStyling.num = num.styling.num;
- numStyling.gender = num.styling.gender;
- if (labelPlaceholderPos > 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;
@@ -13678,7 +12583,7 @@ CSL.Util.PageRangeMangler.getFunction = function (state, rangeType) {
}
if (!state.opt[rangeType + "-range-format"]) {
ret_func = function (str) {
- return sniff(str, stringify);
+ return str;
};
} else if (state.opt[rangeType + "-range-format"] === "expanded") {
ret_func = function (str) {
@@ -13816,7 +12721,7 @@ CSL.Util.FlipFlopper.prototype._normalizeString = function (str) {
oldStr = str;
for (i = 0, ilen = 2; i < ilen; i += 1) {
if (this.quotechars[i + 2]) {
- str = str.split(this.quotechars[i + 2]).join(this.quotechars[0]);
+ str = str.replace(this.quotechars[i + 2], this.quotechars[0]);
}
}
}
@@ -13828,9 +12733,9 @@ CSL.Util.FlipFlopper.prototype._normalizeString = function (str) {
for (i = 0, ilen = 2; i < ilen; i += 1) {
if (this.quotechars[i + 4]) {
if (i === 0) {
- str = str.split(this.quotechars[i + 4]).join(" " + this.quotechars[1]);
+ str = str.replace(this.quotechars[i + 4], " " + this.quotechars[1]);
} else {
- str = str.split(this.quotechars[i + 4]).join(this.quotechars[1]);
+ str = str.replace(this.quotechars[i + 4], this.quotechars[1]);
}
}
}
@@ -13934,8 +12839,8 @@ CSL.Util.FlipFlopper.prototype.getSplitStrings = function (str) {
}
len = strs.length;
for (pos = 0; pos < len; pos += 2) {
- strs[pos] = strs[pos].split("'").join("\u2019");
- strs[pos] = strs[pos].split(" \u2019").join(" \u2019");
+ strs[pos] = strs[pos].replace("'", "\u2019", "g");
+ strs[pos] = strs[pos].replace(" \u2019", " \u2019", "g");
}
return strs;
};
@@ -14119,10 +13024,10 @@ CSL.Output.Formatters.title = function (state, string) {
if (!string) {
return "";
}
- 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])) {
+ var doppel = CSL.Output.Formatters.doppelString(string, CSL.TAG_ESCAPE);
+ function capitalise (word) {
+ var m = word.match(/([:?!]+\s+|-|^)([a-zA-Z])(.*)/);
+ if (m) {
return m[1] + m[2].toUpperCase() + m[3];
}
return word;
@@ -14174,10 +13079,10 @@ CSL.Output.Formatters.title = function (state, string) {
var ret = CSL.Output.Formatters.undoppelString(doppel);
return ret;
};
-CSL.Output.Formatters.doppelString = function (string, rex, stopWords) {
+CSL.Output.Formatters.doppelString = function (string, rex) {
var ret, pos, len;
ret = {};
- ret.array = rex(string, stopWords);
+ ret.array = rex(string);
ret.string = "";
for (var i=0,ilen=ret.array.length; i<ilen; i += 2) {
if (ret.array[i-1] === "-" && false) {
@@ -14308,7 +13213,7 @@ CSL.Output.Formats.prototype.html = {
if (!state.tmp.just_looking && ! state.tmp.suppress_decorations) {
if (cslid) {
return "<span class=\"" + state.opt.nodenames[cslid] + "\" cslid=\"" + cslid + "\">" + str + "</span>";
- } else if (this.params && "string" === typeof str) {
+ } else if ("string" === typeof str) {
var prePunct = "";
if (str) {
var m = str.match(CSL.VARIABLE_WRAPPER_PREPUNCT_REX);
@@ -14407,14 +13312,14 @@ CSL.Output.Formats.prototype.rtf = {
text = "";
}
return text
- .replace(/([\\{}])/g, "\\$1")
+ .replace(/([\\{}])/g, "\\$1", "g")
.replace(CSL.SUPERSCRIPTS_REGEXP,
function(aChar) {
return "\\super " + CSL.SUPERSCRIPTS[aChar] + "\\nosupersub{}";
})
.replace(/[\u007F-\uFFFF]/g,
function(aChar) { return "\\uc0\\u"+aChar.charCodeAt(0).toString()+"{}"; })
- .split("\t").join("\\tab{}");
+ .replace("\t", "\\tab{}", "g");
},
"@passthrough/true": CSL.Output.Formatters.passthrough,
"@font-style/italic":"{\\i{}%%STRING%%}",
@@ -15132,7 +14037,7 @@ CSL.Disambiguation.prototype.scanItems = function (list) {
this.partners.push(this.Item);
this.nonpartners = [];
var clashes = 0;
- for (var pos = 1, len = list[1].length; pos < len; pos += 1) {
+ for (pos = 1, len = list[1].length; pos < len; pos += 1) {
otherItem = list[1][pos];
var otherItemCite = CSL.getAmbiguousCite.call(this.state, otherItem, this.base, true);
if (this.ItemCite === otherItemCite) {
@@ -15182,7 +14087,7 @@ CSL.Disambiguation.prototype.disNames = function (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, []];
@@ -15245,7 +14150,7 @@ CSL.Disambiguation.prototype.disYears = function () {
}
}
tokens.sort(this.state.registry.sorter.compareKeys);
- for (var pos = 0, len = tokens.length; pos < len; pos += 1) {
+ for (pos = 0, len = tokens.length; pos < len; pos += 1) {
base.year_suffix = ""+pos;
var oldBase = this.state.registry.registry[tokens[pos].id].disambig;
this.state.registry.registerAmbigToken(this.akey, "" + tokens[pos].id, base);
@@ -15332,7 +14237,7 @@ CSL.Disambiguation.prototype.initVars = function (akey) {
this.base = CSL.getAmbigConfig.call(this.state);
if (myIds && myIds.length > 1) {
myItemBundles.push([this.maxNamesByItemId[myItem.id], myItem]);
- for (var i = 1, ilen = myIds.length; i < ilen; i += 1) {
+ for (i = 1, ilen = myIds.length; i < ilen; i += 1) {
myItem = this.state.retrieveItem("" + myIds[i]);
this.getCiteData(myItem, this.base);
myItemBundles.push([this.maxNamesByItemId[myItem.id], myItem]);
@@ -15355,7 +14260,7 @@ CSL.Disambiguation.prototype.initVars = function (akey) {
}
);
myItems = [];
- for (var i = 0, ilen = myItemBundles.length; i < ilen; i += 1) {
+ for (i = 0, ilen = myItemBundles.length; i < ilen; i += 1) {
myItems.push(myItemBundles[i][1]);
}
this.lists.push([this.base, myItems]);