mirror of
https://github.com/zotero/zotero.git
synced 2026-10-04 02:31:47 +00:00
Update to citeproc-js 1.0.277 and switch to DOM XML, because Firefox's E4X support gets more unstable as time goes on
This commit is contained in:
parent
a78cd2cf18
commit
2ae1b75d62
1 changed files with 384 additions and 186 deletions
|
|
@ -126,7 +126,7 @@ var CSL = {
|
|||
MARK_TRAILING_NAMES: true,
|
||||
POSITION_TEST_VARS: ["position", "first-reference-note-number", "near-note"],
|
||||
AREAS: ["citation", "citation_sort", "bibliography", "bibliography_sort"],
|
||||
MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","edition","genre","title-short"],
|
||||
MULTI_FIELDS: ["event", "publisher", "publisher-place", "event-place", "title", "container-title", "collection-title", "authority","edition","genre","title-short","subjurisdiction","medium"],
|
||||
CITE_FIELDS: ["first-reference-note-number", "locator", "locator-revision"],
|
||||
MINIMAL_NAME_FIELDS: ["literal", "family"],
|
||||
SWAPPING_PUNCTUATION: [".", "!", "?", ":",","],
|
||||
|
|
@ -463,217 +463,361 @@ CSL.debug = function (str) {
|
|||
CSL.error = function (str) {
|
||||
Zotero.debug("CSL error: " + str);
|
||||
};
|
||||
var CSL_E4X = function () {};
|
||||
CSL_E4X.prototype.clean = function (xml) {
|
||||
function DOMParser() {
|
||||
return Components.classes["@mozilla.org/xmlextras/domparser;1"]
|
||||
.createInstance(Components.interfaces.nsIDOMParser);
|
||||
};
|
||||
var CSL_IS_IE;
|
||||
var CSL_CHROME = function () {
|
||||
if ("undefined" == typeof DOMParser || CSL_IS_IE) {
|
||||
CSL_IS_IE = true;
|
||||
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;
|
||||
}
|
||||
};
|
||||
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_CHROME.prototype.clean = function (xml) {
|
||||
xml = xml.replace(/<\?[^?]+\?>/g, "");
|
||||
xml = xml.replace(/<![^>]+>/g, "");
|
||||
xml = xml.replace(/^\s+/g, "");
|
||||
xml = xml.replace(/\s+$/g, "");
|
||||
xml = xml.replace(/^\s+/, "");
|
||||
xml = xml.replace(/\s+$/, "");
|
||||
xml = xml.replace(/^\n*/, "");
|
||||
return xml;
|
||||
};
|
||||
CSL_E4X.prototype.getStyleId = function (myxml) {
|
||||
CSL_CHROME.prototype.getStyleId = function (myxml) {
|
||||
var text = "";
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
var node = myxml..id;
|
||||
if (node && node.length()) {
|
||||
text = node[0].toString();
|
||||
var node = myxml.getElementsByTagName("id");
|
||||
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_E4X.prototype.children = function (myxml) {
|
||||
return myxml.children();
|
||||
CSL_CHROME.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_E4X.prototype.nodename = function (myxml) {
|
||||
var ret = myxml.localName();
|
||||
CSL_CHROME.prototype.nodename = function (myxml) {
|
||||
var ret = myxml.nodeName;
|
||||
return ret;
|
||||
};
|
||||
CSL_E4X.prototype.attributes = function (myxml) {
|
||||
var ret, attrs, attr, key, xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
CSL_CHROME.prototype.attributes = function (myxml) {
|
||||
var ret, attrs, attr, key, xml, pos, len;
|
||||
ret = new Object();
|
||||
attrs = myxml.attributes();
|
||||
for each (attr in attrs) {
|
||||
key = "@" + attr.localName();
|
||||
if (key.slice(0,5) == "@e4x_") {
|
||||
continue;
|
||||
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;
|
||||
}
|
||||
ret[key] = attr.toString();
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
CSL_E4X.prototype.content = function (myxml) {
|
||||
return myxml.toString();
|
||||
CSL_CHROME.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_E4X.prototype.namespace = {
|
||||
CSL_CHROME.prototype.namespace = {
|
||||
"xml":"http://www.w3.org/XML/1998/namespace"
|
||||
}
|
||||
CSL_E4X.prototype.numberofnodes = function (myxml) {
|
||||
return myxml.length();
|
||||
CSL_CHROME.prototype.numberofnodes = function (myxml) {
|
||||
if (myxml) {
|
||||
return myxml.length;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
CSL_E4X.prototype.getAttributeName = function (attr) {
|
||||
var ret = attr.localName();
|
||||
CSL_CHROME.prototype.getAttributeName = function (attr) {
|
||||
var ret = attr.name;
|
||||
return ret;
|
||||
}
|
||||
CSL_E4X.prototype.getAttributeValue = function (myxml,name,namespace) {
|
||||
var xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
if (namespace) {
|
||||
var ns = new Namespace(this.namespace[namespace]);
|
||||
var ret = myxml.@ns::[name].toString();
|
||||
CSL_CHROME.prototype.getAttributeValue = function (myxml,name,namespace) {
|
||||
var ret = "";
|
||||
if (myxml && this.hasAttributes(myxml) && myxml.getAttribute(name)) {
|
||||
ret = myxml.getAttribute(name);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
CSL_CHROME.prototype.getNodeValue = function (myxml,name) {
|
||||
var ret = "";
|
||||
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;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (name) {
|
||||
var ret = myxml.attribute(name).toString();
|
||||
ret = myxml;
|
||||
}
|
||||
if (ret && ret.childNodes && (ret.childNodes.length == 0 || (ret.childNodes.length == 1 && ret.firstChild.nodeName == "#text"))) {
|
||||
if ("undefined" != typeof ret.textContent) {
|
||||
ret = ret.textContent;
|
||||
} else if ("undefined" != typeof ret.innerText) {
|
||||
ret = ret.innerText;
|
||||
} else {
|
||||
var ret = myxml.toString();
|
||||
ret = ret.text;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
CSL_E4X.prototype.getNodeValue = function (myxml,name) {
|
||||
var xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
if (name){
|
||||
return myxml[name].toString();
|
||||
} else {
|
||||
return myxml.toString();
|
||||
CSL_CHROME.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_E4X.prototype.setAttributeOnNodeIdentifiedByNameAttribute = function (myxml,nodename,attrname,attr,val) {
|
||||
var xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
if (attr[0] != '@'){
|
||||
attr = '@'+attr;
|
||||
CSL_CHROME.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]);
|
||||
}
|
||||
}
|
||||
myxml[nodename].(@name == attrname)[0][attr] = val;
|
||||
}
|
||||
CSL_E4X.prototype.deleteNodeByNameAttribute = function (myxml,val) {
|
||||
delete myxml.*.(@name==val)[0];
|
||||
CSL_CHROME.prototype.deleteAttribute = function (myxml,attr) {
|
||||
myxml.removeAttribute(attr);
|
||||
}
|
||||
CSL_E4X.prototype.deleteAttribute = function (myxml,attr) {
|
||||
delete myxml["@"+attr];
|
||||
CSL_CHROME.prototype.setAttribute = function (myxml,attr,val) {
|
||||
var attribute;
|
||||
if (!myxml.ownerDocument) {
|
||||
myxml = myxml.firstChild;
|
||||
}
|
||||
attribute = myxml.ownerDocument.createAttribute(attr);
|
||||
myxml.setAttribute(attr, val);
|
||||
return false;
|
||||
}
|
||||
CSL_E4X.prototype.setAttribute = function (myxml,attr,val) {
|
||||
myxml['@'+attr] = val;
|
||||
CSL_CHROME.prototype.nodeCopy = function (myxml) {
|
||||
var cloned_node = myxml.cloneNode(true);
|
||||
return cloned_node;
|
||||
}
|
||||
CSL_E4X.prototype.nodeCopy = function (myxml) {
|
||||
return myxml.copy();
|
||||
}
|
||||
CSL_E4X.prototype.getNodesByName = function (myxml,name,nameattrval) {
|
||||
var xml, ret;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
ret = myxml.descendants(name);
|
||||
if (nameattrval){
|
||||
ret = ret.(@name == nameattrval);
|
||||
CSL_CHROME.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_E4X.prototype.nodeNameIs = function (myxml,name) {
|
||||
var xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
if (myxml.localName() && myxml.localName().toString() == name){
|
||||
CSL_CHROME.prototype.nodeNameIs = function (myxml,name) {
|
||||
if (name == myxml.nodeName) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
CSL_E4X.prototype.makeXml = function (myxml) {
|
||||
var xml;
|
||||
XML.ignoreComments = true;
|
||||
XML.ignoreProcessingInstructions = true;
|
||||
XML.ignoreWhitespace = true;
|
||||
XML.prettyPrinting = true;
|
||||
XML.prettyIndent = 2;
|
||||
if ("xml" == typeof myxml){
|
||||
myxml = myxml.toXMLString();
|
||||
};
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
xml = new Namespace("http://www.w3.org/XML/1998/namespace");
|
||||
if (myxml){
|
||||
myxml = myxml.replace(/\s*<\?[^>]*\?>\s*\n*/g, "");
|
||||
myxml = new XML(myxml);
|
||||
} else {
|
||||
myxml = new XML();
|
||||
CSL_CHROME.prototype.makeXml = function (myxml) {
|
||||
var ret, topnode;
|
||||
if (!myxml) {
|
||||
myxml = "<docco><bogus/></docco>";
|
||||
}
|
||||
return myxml;
|
||||
myxml = myxml.replace(/\s*<\?[^>]*\?>\s*\n*/g, "");
|
||||
var nodetree = this.parser.parseFromString(myxml, "application/xml");
|
||||
return nodetree.firstChild;
|
||||
};
|
||||
CSL_E4X.prototype.insertChildNodeAfter = function (parent,node,pos,datexml) {
|
||||
CSL_CHROME.prototype.insertChildNodeAfter = function (parent,node,pos,datexml) {
|
||||
var myxml, xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
myxml = XML(datexml.toXMLString());
|
||||
parent.insertChildAfter(node,myxml);
|
||||
delete parent.*[pos];
|
||||
return parent;
|
||||
};
|
||||
CSL_E4X.prototype.insertPublisherAndPlace = function(myxml) {
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
for each (var node in myxml..group) {
|
||||
if (node.children().length() === 2) {
|
||||
var twovars = [];
|
||||
for each (var child in node.children()) {
|
||||
if (child.children().length() === 0
|
||||
) {
|
||||
twovars.push(child.@variable.toString());
|
||||
if (child.@suffix.toString()
|
||||
|| child.@prefix.toString()) {
|
||||
twovars = [];
|
||||
break;
|
||||
}
|
||||
}
|
||||
myxml = this.importNode(node.ownerDocument, datexml);
|
||||
parent.replaceChild(myxml, node);
|
||||
return parent;
|
||||
};
|
||||
CSL_CHROME.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);
|
||||
if (node.childNodes.length === 2) {
|
||||
var twovars = [];
|
||||
for (var j = 0, jlen = 2; j < jlen; j += 1) {
|
||||
var child = node.childNodes.item(j);
|
||||
if (child.childNodes.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["@has-publisher-and-publisher-place"] = "true";
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
CSL_E4X.prototype.addMissingNameNodes = function(myxml) {
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
for each (node in myxml..names) {
|
||||
if ("xml" == typeof node && node.parent().localName() !== "substitute" && node.elements("name").length() === 0) {
|
||||
var name = <name/>;
|
||||
node.appendChild(name);
|
||||
if (twovars.indexOf("publisher") > -1 && twovars.indexOf("publisher-place") > -1) {
|
||||
node.setAttribute('has-publisher-and-publisher-place', true);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
CSL_E4X.prototype.addInstitutionNodes = function(myxml) {
|
||||
var institution_long, institution_short, name_part, children, node, xml;
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
for each (node in myxml..names) {
|
||||
if ("xml" == typeof node && node.elements("name").length() > 0) {
|
||||
if (node.institution.length() === 0) {
|
||||
institution_long = <institution
|
||||
institution-parts="long"
|
||||
substitute-use-first="1"
|
||||
use-last="1"/>
|
||||
institution_part = <institution-part name="long"/>;
|
||||
node.name += institution_long;
|
||||
node.institution.@delimiter = node.name.@delimiter.toString();
|
||||
if (node.name.@and.toString()) {
|
||||
node.institution.@and = "text";
|
||||
CSL_CHROME.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)
|
||||
&& names.parentNode.tagName.toLowerCase() !== "substitute") {
|
||||
var doc = names.ownerDocument;
|
||||
var name = doc.createElement("name");
|
||||
names.appendChild(name);
|
||||
}
|
||||
}
|
||||
};
|
||||
CSL_CHROME.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);
|
||||
}
|
||||
node.institution[0].appendChild(institution_part);
|
||||
for each (var attr in CSL.INSTITUTION_KEYS) {
|
||||
if (node.name.@[attr].toString()) {
|
||||
node.institution['institution-part'][0].@[attr] = node.name.@[attr].toString();
|
||||
}
|
||||
}
|
||||
for each (var namepartnode in node.name['name-part']) {
|
||||
if (namepartnode.@name.toString() === 'family') {
|
||||
for each (var attr in CSL.INSTITUTION_KEYS) {
|
||||
if (namepartnode.@[attr].toString()) {
|
||||
node.institution['institution-part'][0].@[attr] = namepartnode.@[attr].toString();
|
||||
}
|
||||
}
|
||||
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_E4X.prototype.flagDateMacros = function(myxml) {
|
||||
default xml namespace = "http://purl.org/net/xbiblio/csl"; with({});
|
||||
for each (node in myxml..macro) {
|
||||
if (node..date.length()) {
|
||||
node.@['macro-has-date'] = 'true';
|
||||
CSL_CHROME.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');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -1989,7 +2133,7 @@ CSL.DateParser = function () {
|
|||
};
|
||||
CSL.Engine = function (sys, style, lang, forceLang) {
|
||||
var attrs, langspec, localexml, locale;
|
||||
this.processor_version = "1.0.272";
|
||||
this.processor_version = "1.0.277";
|
||||
this.csl_version = "1.0";
|
||||
this.sys = sys;
|
||||
this.sys.xml = new CSL.System.Xml.Parsing();
|
||||
|
|
@ -2309,18 +2453,34 @@ CSL.Engine.prototype.retrieveItem = function (id) {
|
|||
if (this.opt.development_extensions.field_hack && Item.note) {
|
||||
m = Item.note.match(CSL.NOTE_FIELDS_REGEXP);
|
||||
if (m) {
|
||||
var names = {};
|
||||
for (pos = 0, len = m.length; pos < len; pos += 1) {
|
||||
mm = m[pos].match(CSL.NOTE_FIELD_REGEXP);
|
||||
if (!Item[mm[1]] || true) {
|
||||
if (CSL.DATE_VARIABLES.indexOf(mm[1]) > -1) {
|
||||
Item[mm[1]] = {raw:mm[2]};
|
||||
} else {
|
||||
Item[mm[1]] = mm[2].replace(/^\s+/, "").replace(/\s+$/, "");
|
||||
if (!Item[mm[1]] && CSL.DATE_VARIABLES.indexOf(mm[1]) > -1) {
|
||||
Item[mm[1]] = {raw:mm[2]};
|
||||
} else if (!Item[mm[1]] && CSL.NAME_VARIABLES.indexOf(mm[1]) > -1) {
|
||||
if (!Item[mm[1]]) {
|
||||
Item[mm[1]] = []
|
||||
}
|
||||
var lst = mm[2].split(/\s*\|\|\s*/)
|
||||
if (lst.length === 1) {
|
||||
Item[mm[1]].push({family:lst[0],isInstitution:true});
|
||||
} else if (lst.length === 2) {
|
||||
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, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.opt.development_extensions.jurisdiction_subfield && Item.jurisdiction) {
|
||||
var subjurisdictions = Item.jurisdiction.split(";");
|
||||
if (subjurisdictions.length > 1) {
|
||||
Item.subjurisdiction = subjurisdictions.slice(0,2).join(";");
|
||||
}
|
||||
}
|
||||
for (var i = 1, ilen = CSL.DATE_VARIABLES.length; i < ilen; i += 1) {
|
||||
var dateobj = Item[CSL.DATE_VARIABLES[i]];
|
||||
if (dateobj) {
|
||||
|
|
@ -2547,6 +2707,7 @@ CSL.Engine.Opt = function () {
|
|||
this.development_extensions.clean_up_csl_flaws = true;
|
||||
this.development_extensions.flip_parentheses_to_braces = true;
|
||||
this.development_extensions.parse_section_variable = true;
|
||||
this.development_extensions.jurisdiction_subfield = true;
|
||||
this.gender = {};
|
||||
this['cite-lang-prefs'] = {
|
||||
persons:['orig'],
|
||||
|
|
@ -3315,7 +3476,7 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
|
|||
var items = citations[(j - 1)].sortedItems;
|
||||
var useme = false;
|
||||
if ((citations[(j - 1)].sortedItems[0][1].id == item[1].id && citations[j - 1].properties.noteIndex >= (citations[j].properties.noteIndex - 1)) || citations[(j - 1)].sortedItems[0][1].id == this.registry.registry[item[1].id].parallel) {
|
||||
if (citationsInNote[citations[j - 1].properties.noteIndex] === 1) {
|
||||
if (citationsInNote[citations[j - 1].properties.noteIndex] === 1 || citations[j - 1].properties.noteIndex === 0) {
|
||||
useme = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -6630,11 +6791,13 @@ CSL.evaluateLabel = function (node, state, Item, item) {
|
|||
return CSL.castLabel(state, node, myterm, plural);
|
||||
};
|
||||
CSL.evaluateStringPluralism = function (str) {
|
||||
if (str && str.match(/(?:[0-9],\s*[0-9]|\s+and\s+|&|[0-9]\s*[\-\u2013]\s*[0-9])/)) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
if (str) {
|
||||
var m = str.match(/(?:[0-9],\s*[0-9]|\s+and\s+|&|([0-9]+)\s*[\-\u2013]\s*([0-9]+))/)
|
||||
if (m && (!m[1] || parseInt(m[1]) < parseInt(m[2]))) {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
CSL.castLabel = function (state, node, term, plural, mode) {
|
||||
var ret = state.getTerm(term, node.strings.form, plural, false, mode);
|
||||
|
|
@ -7091,7 +7254,6 @@ CSL.Node.number = {
|
|||
for (var i = 0, ilen = values.length; i < ilen; i += 1) {
|
||||
newstr += values[i][1];
|
||||
}
|
||||
newstr = state.fun.page_mangler(newstr);
|
||||
}
|
||||
if (newstr && !newstr.match(/^[-.\u20130-9]+$/)) {
|
||||
state.output.append(newstr, this);
|
||||
|
|
@ -7339,6 +7501,12 @@ CSL.Node.text = {
|
|||
if (item && item[this.variables[0]]) {
|
||||
var locator = "" + item[this.variables[0]];
|
||||
locator = locator.replace(/--*/g,"\u2013");
|
||||
var m = locator.match(/^([0-9]+)\s*\u2013\s*([0-9]+)$/)
|
||||
if (m) {
|
||||
if (parseInt(m[1]) >= parseInt(m[2])) {
|
||||
locator = m[1] + "-" + m[2];
|
||||
}
|
||||
}
|
||||
state.output.append(locator, this, false, false, true);
|
||||
}
|
||||
};
|
||||
|
|
@ -7375,8 +7543,8 @@ CSL.Node.text = {
|
|||
};
|
||||
} else if (this.variables_real[0] === "hereinafter") {
|
||||
func = function (state, Item) {
|
||||
var hereinafter_key = state.transform.getHereinafter(Item);
|
||||
var value = state.transform.abbrevs["default"].hereinafter[hereinafter_key];
|
||||
var hereinafter_info = state.transform.getHereinafter(Item);
|
||||
var value = state.transform.abbrevs[hereinafter_info[0]].hereinafter[hereinafter_info[1]];
|
||||
if (value) {
|
||||
state.tmp.group_context.value()[2] = true;
|
||||
state.output.append(value, this);
|
||||
|
|
@ -7399,6 +7567,7 @@ CSL.Node.text = {
|
|||
if (value) {
|
||||
if ((Item.type === "bill" || Item.type === "legislation")
|
||||
&& state.opt.development_extensions.parse_section_variable) {
|
||||
value = "" + value;
|
||||
var m = value.match(CSL.STATUTE_SUBDIV_GROUPED_REGEX);
|
||||
if (m) {
|
||||
var splt = value.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX);
|
||||
|
|
@ -7605,8 +7774,8 @@ CSL.Attributes["@variable"] = function (state, arg) {
|
|||
this.variables.push(variables[pos]);
|
||||
}
|
||||
if ("hereinafter" === variables[pos] && state.sys.getAbbreviation) {
|
||||
var hereinafter_key = state.transform.getHereinafter(Item);
|
||||
state.transform.loadAbbreviation("default", "hereinafter", hereinafter_key);
|
||||
var hereinafter_info = state.transform.getHereinafter(Item);
|
||||
state.transform.loadAbbreviation(hereinafter_info[0], "hereinafter", hereinafter_info[1]);
|
||||
}
|
||||
if (state.tmp.can_block_substitute) {
|
||||
state.tmp.done_vars.push(variables[pos]);
|
||||
|
|
@ -7712,9 +7881,9 @@ CSL.Attributes["@variable"] = function (state, arg) {
|
|||
myitem = item;
|
||||
}
|
||||
if (variable === "hereinafter" && state.sys.getAbbreviation) {
|
||||
var hereinafter_key = state.transform.getHereinafter(myitem);
|
||||
state.transform.loadAbbreviation("default", "hereinafter", hereinafter_key);
|
||||
if (state.transform.abbrevs["default"].hereinafter[hereinafter_key]) {
|
||||
var hereinafter_info = state.transform.getHereinafter(myitem);
|
||||
state.transform.loadAbbreviation(hereinafter_info[0], "hereinafter", hereinafter_info[1]);
|
||||
if (state.transform.abbrevs[hereinafter_info[0]].hereinafter[hereinafter_info[1]]) {
|
||||
x = true
|
||||
}
|
||||
} else if (myitem[variable]) {
|
||||
|
|
@ -7887,7 +8056,10 @@ CSL.Attributes["@is-numeric"] = function (state, arg) {
|
|||
state.processNumber(false, Item, variables[pos]);
|
||||
}
|
||||
}
|
||||
if (!state.tmp.shadow_numbers[variables[pos]].numeric) {
|
||||
if (!state.tmp.shadow_numbers[variables[pos]].numeric
|
||||
&& !(variables[pos] === 'title'
|
||||
&& Item[variables[pos]]
|
||||
&& Item[variables[pos]].slice(-1) === "" + parseInt(Item[variables[pos]].slice(-1)))) {
|
||||
numeric = false;
|
||||
break;
|
||||
}
|
||||
|
|
@ -8405,13 +8577,13 @@ CSL.Transform = function (state) {
|
|||
if (!myabbrev_family) {
|
||||
return basevalue;
|
||||
}
|
||||
if (["publisher-place", "event-place"].indexOf(myabbrev_family) > -1) {
|
||||
if (["publisher-place", "event-place", "subjurisdiction"].indexOf(myabbrev_family) > -1) {
|
||||
myabbrev_family = "place";
|
||||
}
|
||||
if (["publisher", "authority"].indexOf(myabbrev_family) > -1) {
|
||||
myabbrev_family = "institution-part";
|
||||
}
|
||||
if (["genre", "event"].indexOf(myabbrev_family) > -1) {
|
||||
if (["genre", "event", "medium"].indexOf(myabbrev_family) > -1) {
|
||||
myabbrev_family = "title";
|
||||
}
|
||||
if (["title-short"].indexOf(myabbrev_family) > -1) {
|
||||
|
|
@ -8667,15 +8839,16 @@ CSL.Transform = function (state) {
|
|||
hereinafter_metadata.push("date:" + date);
|
||||
}
|
||||
}
|
||||
var jurisdiction = "default";
|
||||
if (Item.jurisdiction) {
|
||||
hereinafter_metadata.push("jurisdiction:" + Item.jurisdiction);
|
||||
jurisdiction = Item.jurisdiction;
|
||||
}
|
||||
hereinafter_metadata = hereinafter_metadata.join(", ");
|
||||
if (hereinafter_metadata) {
|
||||
hereinafter_metadata = " [" + hereinafter_metadata + "]";
|
||||
}
|
||||
var hereinafter_key = hereinafter_author_title.join(", ") + hereinafter_metadata;
|
||||
return hereinafter_key;
|
||||
return [jurisdiction, hereinafter_key];
|
||||
}
|
||||
this.getHereinafter = getHereinafter;
|
||||
};
|
||||
|
|
@ -9787,11 +9960,11 @@ CSL.Util.Ordinalizer.prototype.format = function (num, gender) {
|
|||
str = num.toString();
|
||||
if ((num / 10) % 10 === 1 || (num > 10 && num < 20)) {
|
||||
str += this.suffixes[gender][3];
|
||||
} else if (num % 10 === 1) {
|
||||
} else if (num % 10 === 1 && num % 100 !== 11) {
|
||||
str += this.suffixes[gender][0];
|
||||
} else if (num % 10 === 2) {
|
||||
} else if (num % 10 === 2 && num % 100 !== 12) {
|
||||
str += this.suffixes[gender][1];
|
||||
} else if (num % 10 === 3) {
|
||||
} else if (num % 10 === 3 && num % 100 !== 13) {
|
||||
str += this.suffixes[gender][2];
|
||||
} else {
|
||||
str += this.suffixes[gender][3];
|
||||
|
|
@ -9847,7 +10020,9 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
|
|||
if (num.slice(0, 1) === '"' && num.slice(-1) === '"') {
|
||||
num = num.slice(1, -1);
|
||||
}
|
||||
num = num.replace(/\s*\-\s*/, "\u2013", "g");
|
||||
if (num.indexOf("&") > -1 || num.indexOf("--") > -1) {
|
||||
this.tmp.shadow_numbers[variable].plural = 1;
|
||||
}
|
||||
if (this.variable === "page-first") {
|
||||
m = num.split(/\s*(?:&|,|-)\s*/);
|
||||
if (m) {
|
||||
|
|
@ -9857,8 +10032,8 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
|
|||
}
|
||||
}
|
||||
}
|
||||
var lst = num.split(/(?:,\s+|\s*[\-\u2013]\s*|\s*&\s*)/);
|
||||
var m = num.match(/(,\s+|\s*[\-\u2013]\s*|\s*&\s*)/g);
|
||||
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]);
|
||||
|
|
@ -9872,7 +10047,30 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
|
|||
if (odd) {
|
||||
if (elements[i]) {
|
||||
if (elements[i].match(/[0-9]/)) {
|
||||
count = count + 1;
|
||||
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(/[0-9]+$/)
|
||||
&& elements[i].match(/^[0-9]+/)
|
||||
&& parseInt(elements[i - 2]) < parseInt(elements[i].replace(/[^0-9].*/,""))) {
|
||||
var start = this.tmp.shadow_numbers[variable].values.slice(-2);
|
||||
middle[0][1] = "\u2013";
|
||||
if (this.opt["page-range-format"] ) {
|
||||
var newstr = this.fun.page_mangler(start[0][1] +"-"+elements[i]);
|
||||
newstr = newstr.split(/\u2013/);
|
||||
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 {
|
||||
count = count + 1;
|
||||
}
|
||||
}
|
||||
var subelements = elements[i].split(/\s+/);
|
||||
for (var j = 0, jlen = subelements.length; j < jlen; j += 1) {
|
||||
|
|
@ -9917,7 +10115,7 @@ CSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {
|
|||
this.tmp.shadow_numbers[variable].numeric = true;
|
||||
} else {
|
||||
this.tmp.shadow_numbers[variable].numeric = numeric;
|
||||
}
|
||||
}
|
||||
if (count > 1) {
|
||||
this.tmp.shadow_numbers[variable].plural = 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue