www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 94bd2415da1a5a983743ab5a7bd4fd10ada3cc22
parent 89acdf101ca35514e4282339ff4c34fca89619f4
Author: Simon Kornblith <simon@simonster.com>
Date:   Sat, 19 Aug 2006 23:14:27 +0000

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


Diffstat:
Mchrome/chromeFiles/content/scholar/xpcom/cite.js | 204+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mchrome/chromeFiles/content/scholar/xpcom/ingester.js | 52++++++++++++++++++++++------------------------------
Mchrome/chromeFiles/locale/en-US/scholar/locales.xml | 177+++++++++++++++++++++++++++++++++----------------------------------------------
Mscrapers.sql | 30+++++++++++++++++-------------
4 files changed, 228 insertions(+), 235 deletions(-)

diff --git a/chrome/chromeFiles/content/scholar/xpcom/cite.js b/chrome/chromeFiles/content/scholar/xpcom/cite.js @@ -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"]); } diff --git a/chrome/chromeFiles/content/scholar/xpcom/ingester.js b/chrome/chromeFiles/content/scholar/xpcom/ingester.js @@ -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, " ")); @@ -420,30 +436,6 @@ Scholar.OpenURL = new function() { } /* - * 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 */ function _mapTag(data, tag, version) { diff --git a/chrome/chromeFiles/locale/en-US/scholar/locales.xml b/chrome/chromeFiles/locale/en-US/scholar/locales.xml @@ -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> \ No newline at end of file diff --git a/scrapers.sql b/scrapers.sql @@ -5360,20 +5360,20 @@ REPLACE INTO "csl" VALUES('http://purl.org/net/xbiblio/csl/styles/apa.csl', '200 <name>Bruce D’Arcus</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 D’Arcus</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/>