adds short roles to CSL (Ed. instead of Editor)

adds COinS to exported HTML
uses real lists in HTML output
fixes other small citation style issues
This commit is contained in:
Simon Kornblith 2006-08-19 23:14:27 +00:00
parent 89acdf101c
commit 94bd2415da
4 changed files with 228 additions and 235 deletions

View file

@ -53,7 +53,7 @@ CSL = function(csl) {
this._init();
// load localizations
this._terms = this._parseTerms(this._csl.terms);
this._terms = this._parseLocales(this._csl.terms);
// load class defaults
this._class = this._csl["@class"].toString();
@ -130,15 +130,18 @@ CSL.prototype.createBibliography = function(items, format) {
var output = "";
if(format == "HTML") {
var style = "";
if(this._opt.hangingIndent) {
style = "margin-left:0.5in;text-indent:-0.5in;";
if(this._class == "note") {
output += '<ol>\r\n';
} else if(this._opt.hangingIndent) {
output += '<div style="margin-left:0.5in;text-indent:-0.5in;">\r\n';
}
} else if(format == "RTF") {
var index = 0;
output += "{\\rtf\\ansi{\\fonttbl\\f0\\froman Times New Roman;}{\\colortbl;\\red255\\green255\\blue255;}\\pard\\f0";
if(this._opt.hangingIndent) {
output += "\\li720\\fi-720";
}
output += "\r\n";
}
for(var i in items) {
@ -195,27 +198,33 @@ CSL.prototype.createBibliography = function(items, format) {
string = string + this._opt.format.suffix;
}
}
if(this._class == "note") {
// add superscript number for footnotes
string += (parseInt(i)+1).toString()+". ";
}
// add line feeds
if(format == "HTML") {
output += "<p";
var coins = Scholar.OpenURL.createContextObject(item, "1.0");
string += '<span class="Z3988" title="'+coins+'"></span>';
if(style) {
output += ' style="'+style+'"';
if(this._class == "note") {
output += "<li>"+string+"</li>\r\n";
} else {
output += "<p>"+string+"</p>\r\n";
}
output += ">"+string+"</p>";
} else if(format == "RTF") {
if(this._class == "note") {
index++;
output += index+". ";
}
output += string+"\\\r\n\\\r\n";
}
}
if(format == "RTF") {
if(format == "HTML") {
if(this._class == "note") {
output += '</ol>';
} else if(this._opt.hangingIndent) {
output += '</div>';
}
} else if(format == "RTF") {
// drop last 6 characters of output (last two returns)
output = output.substr(0, output.length-6)+"}";
}
@ -304,12 +313,12 @@ CSL.prototype._init = function() {
req.send(null);
// get default terms
var terms = new XML(this._cleanXML(req.responseText));
CSL._defaultTerms = this._parseTerms(terms);
var locales = new XML(this._cleanXML(req.responseText));
CSL._defaultTerms = this._parseLocales(locales);
}
}
CSL.prototype._parseTerms = function(termXML) {
CSL.prototype._parseLocales = function(termXML) {
// return defaults if there are no terms
if(!termXML.length()) {
return (CSL._defaultTerms ? CSL._defaultTerms : {});
@ -328,21 +337,42 @@ CSL.prototype._parseTerms = function(termXML) {
return (CSL._defaultTerms ? CSL._defaultTerms : {});
}
var termArray = new Array();
var termArray = new Object();
termArray["default"] = new Object();
if(CSL._defaultTerms) {
// ugh. copy default array. javascript dumb.
for(var i in CSL._defaultTerms) {
if(typeof(CSL._defaultTerms[i]) == "object") {
termArray[i] = [CSL._defaultTerms[i][0],
CSL._defaultTerms[i][1]];
} else {
termArray[i] = CSL._defaultTerms[i];
termArray[i] = new Object();
for(var j in CSL._defaulTerms[i]) {
if(typeof(CSL._defaultTerms[i]) == "object") {
termArray[i][j] = [CSL._defaultTerms[i][j][0],
CSL._defaultTerms[i][j][1]];
} else {
termArray[i][j] = CSL._defaultTerms[i][j];
}
}
}
}
// loop through terms
for each(var term in locale.term) {
this._parseTerms(locale.term, termArray["default"]);
// loop through term sets
locale._termSets = new Object();
for each(var termSet in locale["term-set"]) {
var name = termSet.@name.toString();
if(!termArray[name]) {
termArray[name] = new Object();
}
this._parseTerms(termSet.term, termArray[name]);
}
return termArray;
}
CSL.prototype._parseTerms = function(terms, termArray) {
for each(var term in terms) {
var name = term.@name.toString();
if(!name) {
throw("citations cannot be generated: no name defined on term in CSL");
@ -370,14 +400,12 @@ CSL.prototype._parseTerms = function(termXML) {
termArray[name] = term.text().toString();
}
}
return termArray;
}
/*
* parses attributes and children for a CSL field
*/
CSL.prototype._parseFieldAttrChildren = function(element, desc) {
CSL.prototype._parseFieldAttrChildren = function(element, desc, ignoreChildren) {
if(!desc) {
var desc = new Object();
}
@ -389,43 +417,45 @@ CSL.prototype._parseFieldAttrChildren = function(element, desc) {
}
var children = element.children();
if(children.length()) {
// parse children
if(children.length() > element.substitute.length()) {
// if there are non-substitute children, clear the current children
// array
desc.children = new Array();
}
// add children to children array
for each(var child in children) {
if(child.namespace() == CSL.ns) { // ignore elements in other
// namespaces
// parse recursively
var name = child.localName();
if(name == "substitute") {
// place substitutes in their own key, so that they're
// overridden separately
if(child.choose.length) { // choose
desc.substitute = new Array();
var chooseChildren = child.choose.children();
for each(var choose in chooseChildren) {
if(choose.namespace() == CSL.ns) {
var option = new Object();
option.name = choose.localName();
this._parseFieldAttrChildren(choose, option);
desc.substitute.push(option);
if(!ignoreChildren) {
if(children.length()) {
// parse children
if(children.length() > element.substitute.length()) {
// if there are non-substitute children, clear the current children
// array
desc.children = new Array();
}
// add children to children array
for each(var child in children) {
if(child.namespace() == CSL.ns) { // ignore elements in other
// namespaces
// parse recursively
var name = child.localName();
if(name == "substitute") {
// place substitutes in their own key, so that they're
// overridden separately
if(child.choose.length) { // choose
desc.substitute = new Array();
var chooseChildren = child.choose.children();
for each(var choose in chooseChildren) {
if(choose.namespace() == CSL.ns) {
var option = new Object();
option.name = choose.localName();
this._parseFieldAttrChildren(choose, option);
desc.substitute.push(option);
}
}
} else { // don't choose
desc.substitute = child.text().toString();
}
} else { // don't choose
desc.substitute = child.text().toString();
} else {
var childDesc = this._parseFieldAttrChildren(child);
childDesc.name = name;
desc.children.push(childDesc);
}
} else {
var childDesc = this._parseFieldAttrChildren(child);
childDesc.name = name;
desc.children.push(childDesc);
}
}
}
@ -456,21 +486,18 @@ CSL.prototype._parseFieldDefaults = function(ref) {
/*
* parses a list of fields into an array of objects
*/
CSL.prototype._parseFields = function(ref, type) {
CSL.prototype._parseFields = function(ref, type, noInherit) {
var typeDesc = new Array();
for each(var element in ref) {
if(element.namespace() == CSL.ns) { // ignore elements in other namespaces
var itemDesc = new Object();
itemDesc.name = element.localName();
// parse attributes on this field
this._parseFieldAttrChildren(element, itemDesc);
// add defaults, but only if we're parsing as a reference type
if(type != undefined) {
var fieldDefaults = this._getFieldDefaults(itemDesc.name);
itemDesc = this._merge(fieldDefaults, itemDesc);
if(this._opt.inheritFormat) {
if(!noInherit) {
itemDesc = this._merge(this._opt.inheritFormat, itemDesc);
}
@ -481,19 +508,17 @@ CSL.prototype._parseFields = function(ref, type) {
}
// parse group children
if(itemDesc.name == "group" && itemDesc.children) {
for(var i in itemDesc.children) {
// don't bother merging fieldDefaults
itemDesc.children[i] = this._merge(this._getFieldDefaults(itemDesc.children[i].name),
itemDesc.children[i]);
if(type != undefined) {
// serialize children
itemDesc.children[i]._serialized = this._serializeElement(itemDesc.children[i].name,
itemDesc.children[i]);
// add to serialization for type
this._serializations[type][itemDesc._serialized] = itemDesc;
}
if(itemDesc.name == "group") {
// parse attributes on this field, but ignore children
this._parseFieldAttrChildren(element, itemDesc, true);
var children = element.children();
if(children.length()) {
itemDesc.children = this._parseFields(children, type, true);
}
} else {
// parse attributes on this field
this._parseFieldAttrChildren(element, itemDesc);
}
typeDesc.push(itemDesc);
@ -650,21 +675,24 @@ CSL.prototype._getFieldDefaults = function(elementName) {
/*
* gets a term, in singular or plural form
*/
CSL.prototype._getTerm = function(term, plural) {
if(!this._terms[term]) {
CSL.prototype._getTerm = function(term, plural, termSet) {
if(!termSet) {
termSet = "default";
}
if(!this._terms[termSet][term]) {
return "";
}
if(typeof(this._terms[term]) == "object") { // singular and plural forms
// are available
if(typeof(this._terms[termSet][term]) == "object") { // singular and plural forms
// are available
if(plural) {
return this._terms[term][1];
return this._terms[termSet][term][1];
} else {
return this._terms[term][0];
return this._terms[termSet][term][0];
}
}
return this._terms[term];
return this._terms[termSet][term];
}
/*
@ -834,7 +862,7 @@ CSL.prototype._formatLocator = function(identifier, element, number, format) {
string = this._getTerm(child["term-name"], plural);
} else if(identifier && child.name == "label") {
var plural = (number.indexOf(",") != -1 || number.indexOf("-") != -1);
string = this._getTerm(identifier, plural);
string = this._getTerm(identifier, plural, child["term-set"]);
}
if(string) {
@ -1128,7 +1156,7 @@ CSL.prototype._processCreators = function(type, element, creators, format) {
}
string = authorStrings.join(joinString);
} else if(child.name == "label") {
string = this._getTerm(type, (maxCreators != 1));
string = this._getTerm(type, (maxCreators != 1), child["term-set"]);
}

View file

@ -206,8 +206,10 @@ Scholar.OpenURL = new function() {
/*
* Generates an OpenURL ContextObject from an item
*/
function createContextObject(itemObject, version) {
var item = itemObject.toArray();
function createContextObject(item, version) {
if(item.toArray) {
item = itemObject.toArray();
}
var identifiers = new Array();
if(item.DOI) {
@ -308,22 +310,36 @@ Scholar.OpenURL = new function() {
* accepts an item array to fill, or creates and returns a new item array
*/
function parseContextObject(co, item) {
var coParts = co.split("&");
if(!item) {
var item = new Array();
item.creators = new Array();
}
var coParts = co.split("&");
// get type
item.itemType = _determineResourceType(coParts);
for each(var part in coParts) {
if(part.substr(0, 12) == "rft_val_fmt=") {
var format = unescape(part.substr(12));
if(format == "info:ofi/fmt:kev:mtx:journal") {
item.itemType = "journalArticle";
} else if(format == "info:ofi/fmt:kev:mtx:book") {
if(Scholar.inArray("rft.genre=bookitem", coParts)) {
item.itemType = "bookSection";
} else {
item.itemType = "book";
}
break;
}
}
}
if(!item.itemType) {
return false;
}
var pagesKey = "";
for each(part in coParts) {
for each(var part in coParts) {
var keyVal = part.split("=");
var key = keyVal[0];
var value = unescape(keyVal[1].replace(/\+|%2[bB]/g, " "));
@ -419,30 +435,6 @@ Scholar.OpenURL = new function() {
return item;
}
/*
* Determines the type of an OpenURL contextObject
*/
function _determineResourceType(coParts) {
// determine resource type
var type = false;
for(var i in coParts) {
if(coParts[i].substr(0, 12) == "rft_val_fmt=") {
var format = unescape(coParts[i].substr(12));
if(format == "info:ofi/fmt:kev:mtx:journal") {
var type = "journal";
} else if(format == "info:ofi/fmt:kev:mtx:book") {
if(Scholar.inArray("rft.genre=bookitem", coParts)) {
var type = "bookSection";
} else {
var type = "book";
}
break;
}
}
}
return type;
}
/*
* Used to map tags for generating OpenURL contextObjects
*/

View file

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<terms>
<locale xml:lang="en">
<term name="in">in</term>
@ -6,109 +7,77 @@
<term name="forthcoming">forthcoming</term>
<term name="references">References</term>
<term name="and">and</term>
<term name="page">
<single>page</single>
<multiple>pages</multiple>
</term>
<term name="page-short">
<single>p</single>
<multiple>pp</multiple>
</term>
<term name="editor">
<single>editor</single>
<multiple>editors</multiple>
</term>
<term name="editor-short">
<single>ed</single>
<multiple>eds</multiple>
</term>
<term name="translator">
<single>translator</single>
<multiple>translators</multiple>
</term>
<term name="translator-short">
<single>tran</single>
<multiple>trans</multiple>
</term>
<term name="month-01">January</term>
<term name="month-02">February</term>
<term name="month-03">March</term>
<term name="month-04">April</term>
<term name="month-05">May</term>
<term name="month-06">June</term>
<term name="month-07">July</term>
<term name="month-08">August</term>
<term name="month-09">September</term>
<term name="month-10">October</term>
<term name="month-11">November</term>
<term name="month-12">December</term>
<term name="month-01-short">Jan</term>
<term name="month-02-short">Feb</term>
<term name="month-03-short">Mar</term>
<term name="month-04-short">Apr</term>
<term name="month-05-short">May</term>
<term name="month-06-short">Jun</term>
<term name="month-07-short">Jul</term>
<term name="month-08-short">Aug</term>
<term name="month-09-short">Sep</term>
<term name="month-10-short">Oct</term>
<term name="month-11-short">Nov</term>
<term name="month-12-short">Dec</term>
</locale>
<locale xml:lang="nl">
<term name="in">in</term>
<term name="ibid">ibid</term>
<term name="accessed">benaderd</term>
<term name="forthcoming">in voorbereiding</term>
<term name="references">Referenties</term>
<term name="and">en</term>
<term name="page">
<single>pagina</single>
<multiple>pagina's</multiple>
</term>
<term name="page-short">
<single>p</single>
<multiple>pp</multiple>
</term>
<term name="editor">
<single>redacteur</single>
<multiple>redacteurs</multiple>
</term>
<term name="editor-short">
<single>red</single>
<multiple>reds</multiple>
</term>
<term name="translator">
<single>vertaler</single>
<multiple>vertalers</multiple>
</term>
<term name="translator-short">
<single>vert</single>
<multiple>verts</multiple>
</term>
<term name="month-01">januari</term>
<term name="month-02">februari</term>
<term name="month-03">maart</term>
<term name="month-04">april</term>
<term name="month-05">mei</term>
<term name="month-06">juni</term>
<term name="month-07">juli</term>
<term name="month-08">augustus</term>
<term name="month-09">september</term>
<term name="month-10">oktober</term>
<term name="month-11">november</term>
<term name="month-12">december</term>
<term name="month-01-short">jan</term>
<term name="month-02-short">feb</term>
<term name="month-03-short">maa</term>
<term name="month-04-short">apr</term>
<term name="month-05-short">mei</term>
<term name="month-06-short">jun</term>
<term name="month-07-short">jul</term>
<term name="month-08-short">aug</term>
<term name="month-09-short">sep</term>
<term name="month-10-short">okt</term>
<term name="month-11-short">nov</term>
<term name="month-12-short">dec</term>
<term-set name="locators">
<term name="page">
<single>page</single>
<multiple>pages</multiple>
</term>
<term name="paragraph">
<single>paragraph</single>
<multiple>paragraph</multiple>
</term>
</term-set>
<term-set name="locators-short">
<term name="page">
<single>p</single>
<multiple>pp</multiple>
</term>
<term name="paragraph">
<single></single>
<multiple>¶¶</multiple>
</term>
</term-set>
<term-set name="roles">
<term name="editor">
<single>editor</single>
<multiple>editors</multiple>
</term>
<term name="translator">
<single>translator</single>
<multiple>translators</multiple>
</term>
</term-set>
<term-set name="roles-short">
<term name="editor">
<single>ed</single>
<multiple>eds</multiple>
</term>
<term name="translator">
<single>tran</single>
<multiple>trans</multiple>
</term>
</term-set>
<term-set name="roles-verb">
<term name="editor">edited by</term>
<term name="translator">translated by</term>
</term-set>
<term-set name="months">
<term name="month-01">January</term>
<term name="month-02">February</term>
<term name="month-03">March</term>
<term name="month-04">April</term>
<term name="month-05">May</term>
<term name="month-06">June</term>
<term name="month-07">July</term>
<term name="month-08">August</term>
<term name="month-09">September</term>
<term name="month-10">October</term>
<term name="month-11">November</term>
<term name="month-12">December</term>
</term-set>
<term-set name="months-short">
<term name="month-01">Jan</term>
<term name="month-02">Feb</term>
<term name="month-03">Mar</term>
<term name="month-04">Apr</term>
<term name="month-05">May</term>
<term name="month-06">Jun</term>
<term name="month-07">Jul</term>
<term name="month-08">Aug</term>
<term name="month-09">Sep</term>
<term name="month-10">Oct</term>
<term name="month-11">Nov</term>
<term name="month-12">Dec</term>
</term-set>
</locale>
</terms>

View file

@ -5360,20 +5360,20 @@ REPLACE INTO "csl" VALUES('http://purl.org/net/xbiblio/csl/styles/apa.csl', '200
<name>Bruce DArcus</name>
<email>bdarcus@sourceforge.net</email>
</author>
<author>
<contributor>
<name>Simon Kornblith</name>
<email>simon@simonster.com</email>
</author>
<updated>2006-08-13T23:28:00-05:00</updated>
</contributor>
<updated>2006-08-19T17:12:00-05:00</updated>
</info>
<defaults>
<contributors name-as-sort-order="no">
<contributor name-as-sort-order="no">
<name and="symbol" initialize-with="."/>
<label prefix=", " text-transform="capitalize"/>
</contributors>
<label term-set="roles-short" prefix=", " text-transform="capitalize" suffix="."/>
</contributor>
<author name-as-sort-order="all">
<name and="symbol" sort-separator=", " initialize-with="."/>
<label prefix=" (" suffix=")" text-transform="capitalize"/>
<label term-set="roles-short" prefix=" (" suffix=".)" text-transform="capitalize"/>
<substitute>
<choose>
<editor/>
@ -5461,17 +5461,17 @@ REPLACE INTO "csl" VALUES('http://purl.org/net/xbiblio/csl/styles/apa.csl', '200
<text term-name="in" text-transform="capitalize"/>
<editor prefix=" " suffix=",">
<name and="symbol" sort-separator=", " initialize-with="."/>
<label prefix=" (" suffix=")" text-transform="capitalize"/>
<label term-set="roles-short" prefix=" (" suffix=")" text-transform="capitalize"/>
</editor>
<translator prefix=" " suffix=",">
<name and="symbol" sort-separator=", " initialize-with="."/>
<label prefix=" (" suffix=")" text-transform="capitalize"/>
<label term-set="roles-short" prefix=" (" suffix=")" text-transform="capitalize"/>
</translator>
<titles relation="container" font-style="italic" prefix=" " suffix="."/>
<titles relation="collection" prefix=" " suffix="."/>
<publisher prefix=" "/>
<pages prefix=" (" suffix=")">
<label text-transform="capitalize" suffix=". "/>
<label term-set="locators-short" text-transform="capitalize" suffix=". "/>
<number/>
</pages>
</group>
@ -5514,17 +5514,21 @@ REPLACE INTO "csl" VALUES('http://purl.org/net/xbiblio/csl/styles/chicago-note.c
<name>Bruce DArcus</name>
<email>bdarcus@sourceforge.net</email>
</author>
<updated>2006-08-03T04:35:20-07:00</updated>
<contributor>
<name>Simon Kornblith</name>
<email>simon@simonster.com</email>
</contributor>
<updated>2006-08-19T17:12:00-05:00</updated>
<summary>The note-without-bibliography variant of the Chicago style.</summary>
</info>
<defaults>
<contributor>
<label suffix=". " text-transform="lowercase"/>
<label term-set="roles-short" suffix=". " text-transform="lowercase"/>
<name and="text"/>
</contributor>
<author>
<name and="text"/>
<label prefix = ", " suffix="." text-transform="lowercase"/>
<label term-set="roles-short" prefix=", " suffix="." text-transform="lowercase"/>
<substitute>
<choose>
<editor/>