From 0c24beee3ff422b31027ebf04b1f3c592eff0d51 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Tue, 29 Aug 2006 04:24:11 +0000 Subject: [PATCH] closes #213, add in-text citation support to citation engine fixes date and et al. handling bugs in citation engine permits citation of multiple items in Word integration --- Zotero.dot.dmg | Bin 28872 -> 31714 bytes .../chromeFiles/content/scholar/xpcom/cite.js | 707 +++++++++++------- .../content/scholar/xpcom/integration.js | 71 +- .../locale/en-US/scholar/locales.xml | 1 + scrapers.sql | 6 +- 5 files changed, 464 insertions(+), 321 deletions(-) diff --git a/Zotero.dot.dmg b/Zotero.dot.dmg index 995b2cdc406fd7de5939d5fe02dfff34290742d2..ff34aeeb07e1861c3a63acd6248ba9d0ba223d4b 100644 GIT binary patch delta 25986 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 delta 23105 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 1) { // separate first and subsequent et als for each(var etAlElement in etAl) { if(etAlElement.@position == "subsequent") { - this._opt.subsequentEtAl = new Object(); - this._opt.subsequentEtAl.minCreators = parseInt(etAlElement['@min-authors']); - this._opt.subsequentEtAl.useFirst = parseInt(etAlElement['@use-first']); + bibCitElement.subsequentEtAl = new Object(); + bibCitElement.subsequentEtAl.minCreators = parseInt(etAlElement['@min-authors']); + bibCitElement.subsequentEtAl.useFirst = parseInt(etAlElement['@use-first']); } else { var parseElement = etAlElement; } @@ -550,8 +527,8 @@ CSL.prototype._parseEtAl = function(etAl) { var parseElement = etAl; } - this._opt.etAl.minCreators = parseInt(parseElement['@min-authors']); - this._opt.etAl.useFirst = parseInt(parseElement['@use-first']); + bibCitElement.etAl.minCreators = parseInt(parseElement['@min-authors']); + bibCitElement.etAl.useFirst = parseInt(parseElement['@use-first']); } } @@ -561,31 +538,31 @@ CSL.prototype._parseEtAl = function(etAl) { */ CSL.prototype._parseBibliographyOptions = function() { var bibliography = this._csl.bibliography; - this._opt = new Object(); + this._bib = new Object(); // global prefix and suffix format information - this._opt.inheritFormat = new Array(); + this._bib.inheritFormat = new Array(); for each(var attribute in bibliography.layout.item.attributes()) { - this._opt.inheritFormat[attribute.name()] = attribute.toString(); + this._bib.inheritFormat[attribute.name()] = attribute.toString(); } // sections (TODO) - this._opt.sections = [{groupBy:"default", + this._bib.sections = [{groupBy:"default", heading:bibliography.layout.heading.text["@term-name"].toString()}]; for each(var section in bibliography.layout.section) { - this._opt.sections.push([{groupBy:section["@group-by"].toString(), + this._bib.sections.push([{groupBy:section["@group-by"].toString(), heading:section.heading.text["@term-name"].toString()}]); } // subsequent author substitute // replaces subsequent occurances of an author with a given string if(bibliography['@subsequent-author-substitute']) { - this._opt.subsequentAuthorSubstitute = bibliography['@subsequent-author-substitute'].toString(); + this._bib.subsequentAuthorSubstitute = bibliography['@subsequent-author-substitute'].toString(); } // hanging indent if(bibliography['@hanging-indent']) { - this._opt.hangingIndent = true; + this._bib.hangingIndent = true; } // sort order @@ -593,23 +570,26 @@ CSL.prototype._parseBibliographyOptions = function() { if(algorithm) { // for classes, use the sort order that if(algorithm == "author-date") { - this._opt.sortOrder = [this._getFieldDefaults("author"), + this._bib.sortOrder = [this._getFieldDefaults("author"), this._getFieldDefaults("date")]; - this._opt.sortOrder[0].name = "author"; - this._opt.sortOrder[1].name = "date"; + this._bib.sortOrder[0].name = "author"; + this._bib.sortOrder[1].name = "date"; } else if(algorithm == "label") { - this._opt.sortOrder = [this._getFieldDefaults("label")]; - this._opt.sortOrder[0].name = "label"; + this._bib.sortOrder = [this._getFieldDefaults("label")]; + this._bib.sortOrder[0].name = "label"; } else if(algorithm == "cited") { - this._opt.sortOrder = [this._getFieldDefaults("cited")]; - this._opt.sortOrder[0].name = "cited"; + this._bib.sortOrder = [this._getFieldDefaults("cited")]; + this._bib.sortOrder[0].name = "cited"; } } else { - this._opt.sortOrder = this._parseFields(bibliography.sort, false); + this._bib.sortOrder = this._parseFields(bibliography.sort, false, this._bib); } // parse et al - this._parseEtAl(bibliography["use-et_al"]); + this._parseEtAl(bibliography["et-al"], this._bib); + + // parse types + this._parseTypes(this._csl.bibliography.layout.item, this._bib); } /* @@ -618,24 +598,71 @@ CSL.prototype._parseBibliographyOptions = function() { */ CSL.prototype._parseCitationOptions = function() { var citation = this._csl.citation; - this._opt = new Object(); + this._cit = new Object(); // parse et al - this._parseEtAl(citation["use-et_al"]); + this._parseEtAl(citation["et-al"], this._cit); // global format information - this._opt.format = new Array(); + this._cit.format = new Array(); for each(var attribute in citation.attributes()) { - this._opt.format[attribute.name()] = attribute.toString(); + this._cit.format[attribute.name()] = attribute.toString(); + } + + // parse types + this._parseTypes(this._csl.citation.layout.item, this._cit); +} + +/* + * determine available reference types and add their XML objects to the tree + * (they will be parsed on the fly when necessary; see _parseReferenceType) + */ +CSL.prototype._parseTypes = function(itemElements, bibCitElement) { + Scholar.debug("CSL: parsing item elements"); + + bibCitElement._types = new Object(); + bibCitElement._serializations = new Object(); + + // find the type item without position="subsequent" + for each(var itemElement in itemElements) { + if(itemElement.@position.toString() == "subsequent") { + // bind subsequent element to position 1 + bibCitElement._types[1] = itemElement; + bibCitElement._serializations[1] = new Object(); + } else { + // create an associative array of available types + if(itemElement.choose.length()) { + for each(var type in itemElement.choose.type) { + bibCitElement._types[type.@name] = type; + bibCitElement._serializations[type.@name] = new Object(); + } + } else { + // if there's only one type, bind it to index 0 + bibCitElement._types[0] = itemElement; + bibCitElement._serializations[0] = new Object(); + } + } } } /* * convert reference types to native structures for speed */ -CSL.prototype._parseReferenceType = function(reftype) { - var ref = this._itemElement.choose.type.(@name==reftype).children(); - this._types[reftype] = this._parseFields(ref, reftype); +CSL.prototype._getTypeObject = function(reftype, bibCitElement) { + if(!bibCitElement._types[reftype]) { + // no type available + return false; + } + + // parse type if necessary + if(typeof(bibCitElement._types[reftype]) == "xml") { + Scholar.debug("CSL: parsing XML for "+reftype); + bibCitElement._types[reftype] = this._parseFields(bibCitElement._types[reftype].children(), + reftype, bibCitElement, true); + } + + Scholar.debug("CSL: got object for "+reftype); + return bibCitElement._types[reftype]; } /* @@ -711,23 +738,25 @@ CSL.prototype._processDate = function(string) { var jsDate = new Date(m[1], m[2]-1, m[3], false, false, false); } else { // not an sql date var yearRe = /^[0-9]+$/; - if(yearRe) { // is a year + if(yearRe.test(string)) { // is a year date.year = string; return date; - } else { // who knows what this is + } else { // who knows what this is var jsDate = new Date(string) } } if(isNaN(jsDate.valueOf())) { // couldn't parse // get year and say other parts are month - var yearRe = /^(.*)([^0-9]{4})(.*)$/ + var yearRe = /^(.*)([0-9]{4})(.*)$/ var m = yearRe.exec(string); - date.year = m[2]; - date.month = m[1] - if(m[2] && m[3]) date.month += " "; - date.month += m[3]; + if(m) { + date.year = m[2]; + date.month = m[1]; + if(m[2] && m[3]) date.month += " "; + date.month += m[3]; + } } else { date.year = jsDate.getFullYear(); date.month = jsDate.getMonth(); @@ -960,56 +989,56 @@ CSL.prototype._lpad = function(string, pad, length) { * preprocess items, separating authors, editors, and translators arrays into * separate properties */ -CSL.prototype._preprocessItems = function(items) { - for(var i in items) { - var item = items[i]; +CSL.prototype._preprocessItems = function() { + // get data necessary to generate citations before sorting + for(var i in this._items) { + var item = this._items[i]; - // namespace everything in item._csl so there's no chance of overlap - item._csl = new Object(); - item._csl.ignore = new Array(); - - item._csl.authors = new Array(); - item._csl.editors = new Array(); - item._csl.translators = new Array(); - - // separate item into authors, editors, translators - for(var j in item.creators) { - var creator = item.creators[j]; + if(!item._csl) { + // namespace everything in item._csl so there's no chance of overlap + item._csl = new Object(); + item._csl.ignore = new Array(); - if(creator.creatorType == "editor") { - item._csl.editors.push(creator); - } else if(creator.creatorType == "translator") { - item._csl.translators.push(creator); - } else if(creator.creatorType == "author") { - // TODO: do we just ignore contributors? - item._csl.authors.push(creator); - } + // separate item into authors, editors, translators + var creators = this._separateItemCreators(item); + item._csl.authors = creators[0]; + item._csl.editors = creators[1]; + item._csl.translators = creators[2]; + + // parse date + item._csl.date = CSL.prototype._processDate(item.getField("date")); + } else { + // clear disambiguation and subsequent author substitute + if(item._csl.disambiguation) item._csl.disambiguation = undefined; + if(item._csl.subsequentAuthorSubstitute) item._csl.subsequentAuthorSubstitute = undefined; } - - // parse date - item._csl.date = CSL.prototype._processDate(item.date); } -} - -/* - * disambiguates items, after pre-processing and sorting - */ -CSL.prototype._disambiguateItems = function(items) { + + // sort by sort order + if(this._bib.sortOrder) { + Scholar.debug("CSL: sorting this._items"); + var me = this; + this._items.sort(function(a, b) { + return me._compareItem(a, b); + }); + } + + // disambiguate items after preprocessing and sorting var usedCitations = new Array(); var lastAuthor; - for(var i in items) { - var item = items[i]; + for(var i in this._items) { + var item = this._items[i]; var author = this._getFieldValue("author", this._getFieldDefaults("author"), - item, "disambiguate"); + item, "disambiguate", this._bib); // handle (2006a) disambiguation for author-date styles if(this._class == "author-date") { var citation = author+" "+this._getFieldValue("date", this._getFieldDefaults("date"), - item, "disambiguate"); + item, "disambiguate", this._bib); if(usedCitations[citation]) { if(!usedCitations[citation]._csl.date.disambiguation) { @@ -1042,7 +1071,7 @@ CSL.prototype._disambiguateItems = function(items) { item._csl.number = i; // handle subsequent author substitutes - if(this._opt.subsequentAuthorSubstitute && lastAuthor == author) { + if(this._bib.subsequentAuthorSubstitute && lastAuthor == author) { item._csl.subsequentAuthorSubstitute = true; } lastAuthor = author; @@ -1053,11 +1082,13 @@ CSL.prototype._disambiguateItems = function(items) { * handles sorting of items */ CSL.prototype._compareItem = function(a, b, opt) { - for(var i in this._opt.sortOrder) { - var sortElement = this._opt.sortOrder[i]; + for(var i in this._bib.sortOrder) { + var sortElement = this._bib.sortOrder[i]; - var aValue = this._getFieldValue(sortElement.name, sortElement, a, "compare"); - var bValue = this._getFieldValue(sortElement.name, sortElement, b, "compare"); + var aValue = this._getFieldValue(sortElement.name, sortElement, a, + "compare", this._bib); + var bValue = this._getFieldValue(sortElement.name, sortElement, b, + "compare", this._bib); if(bValue > aValue) { return -1; } else if(bValue < aValue) { @@ -1073,7 +1104,7 @@ CSL.prototype._compareItem = function(a, b, opt) { * process creator objects; if someone had a creator model that handled * non-Western names better than ours, this would be the function to change */ -CSL.prototype._processCreators = function(type, element, creators, format) { +CSL.prototype._processCreators = function(type, element, creators, format, bibCitElement) { var maxCreators = creators.length; if(!maxCreators) return; @@ -1094,8 +1125,8 @@ CSL.prototype._processCreators = function(type, element, creators, format) { var useEtAl = false; // figure out if we need to use "et al" - if(this._opt.etAl && maxCreators >= this._opt.etAl.minCreators) { - maxCreators = this._opt.etAl.useFirst; + if(bibCitElement.etAl && maxCreators >= bibCitElement.etAl.minCreators) { + maxCreators = bibCitElement.etAl.useFirst; useEtAl = true; } @@ -1103,21 +1134,23 @@ CSL.prototype._processCreators = function(type, element, creators, format) { var authorStrings = []; var firstName, lastName; for(var i=0; i 1) { if(useEtAl) { // multiple creators and need et al - authorStrings.push(this._getTerm("et al.")); + authorStrings.push(this._getTerm("et-al")); } else { // multiple creators but no et al // add and to last creator if(child["and"]) { @@ -1176,10 +1209,46 @@ CSL.prototype._processCreators = function(type, element, creators, format) { return data; } +/* + * get a citation, given an item and bibCitElement + */ +CSL.prototype._getCitation = function(item, format, bibCitElement) { + Scholar.debug("CSL: generating citation for item "+item.getID()); + + // determine mapping + if(bibCitElement._types[0]) { + // only one element + var typeName = 0; + var type = this._getTypeObject(typeName, bibCitElement); + } else { + var typeNames = this._getTypeFromItem(item); + for each(var typeName in typeNames) { + var type = this._getTypeObject(typeName, bibCitElement); + if(type) { + break; + } + } + } + + if(!type) { + throw("CSL: ERROR: no type found for item"); + } + Scholar.debug("CSL: using CSL type "+typeName); + + var string = ""; + for(var j in type) { + var value = this._getFieldValue(type[j].name, type[j], item, format, + bibCitElement, typeName); + string += value; + } + + return string; +} + /* * processes an element from a (pre-processed) item into text */ -CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { +CSL.prototype._getFieldValue = function(name, element, item, format, bibCitElement, typeName) { var data = ""; if(element._serialized && item._csl.ignore[element._serialized]) { @@ -1190,16 +1259,16 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { var dontEscape = true; if(name == "author") { - if(item._csl.subsequentAuthorSubstitute) { + if(item._csl.subsequentAuthorSubstitute && bibCitElement.subsequentAuthorSubstitute) { // handle subsequent author substitute behavior - data = this._opt.subsequentAuthorSubstitute; + data = bibCitElement.subsequentAuthorSubstitute; } else { - data = this._processCreators(name, element, item._csl.authors, format); + data = this._processCreators(name, element, item._csl.authors, format, bibCitElement); } } else if(name == "editor") { - data = this._processCreators(name, element, item._csl.editors, format); + data = this._processCreators(name, element, item._csl.editors, format, bibCitElement); } else if(name == "translator") { - data = this._processCreators(name, element, item._csl.translators, format); + data = this._processCreators(name, element, item._csl.translators, format, bibCitElement); } else if(name == "titles") { for(var i in element.children) { var child = element.children[i]; @@ -1208,11 +1277,11 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { if(child.name == "title") { // for now, we only care about the // "title" sub-element if(!element.relation) { - string = item.title; + string = item.getField("title"); } else if(element.relation == "container") { - string = item.publicationTitle; + string = item.getField("publicationTitle"); } else if(element.relation == "collection") { - string = item.seriesTitle; + string = item.getField("seriesTitle"); } } @@ -1228,9 +1297,9 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { var string = ""; if(child.name == "place") { - string = item.place; + string = item.getField("place"); } else if(child.name == "name") { - string = item.publisher + string = item.getField("publisher"); } if(string) { @@ -1245,18 +1314,14 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { var string = ""; if(child.name == "url") { - // TODO: better URL-handling strategies - if(item.url) { - string = item.url; - } + string = item.getField("url"); } else if(child.name == "date") { - if(item.accessDate) { - string = this._formatDate(child, this._processDate(item.accessDate), format); + var field = item.getField("accessDate"); + if(field) { + string = this._formatDate(child, this._processDate(field), format); } } else if(child.name == "physicalLocation") { - if(item.archiveLocation) { - string = item.archiveLocation; - } + string = item.getField("archiveLocation"); } else if(child.name == "text") { string = this._getTerm(child["term-name"]); } @@ -1273,26 +1338,23 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { if(!save) { data = ""; } - } else if(name == "volume") { - if(item.volume) { - data = this._formatLocator("volume", element, item.volume, format); - } - } else if(name == "issue") { - if(item.issue) { - data = this._formatLocator("issue", element, item.issue, format); + } else if(name == "volume" || name == "issue") { + var field = item.getField(name); + if(field) { + data = this._formatLocator(name, element, field, format); } } else if(name == "pages") { - if(item.pages) { - data = this._formatLocator("page", element, item.pages, format); + var field = item.getField("pages"); + if(field) { + data = this._formatLocator("page", element, field, format); } } else if(name == "edition") { - if(item.edition) { - data = item.edition; - } + data = item.getField("edition"); dontEscape = false; } else if(name == "genre") { - if(item.type || item.thesisType) { - data = (item.type ? item.type : item.thesisType); + data = item.getField("type"); + if(!data) { + data = item.getField("thesisType"); } dontEscape = false; } else if(name == "group") { @@ -1302,7 +1364,7 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { var child = element.children[i]; var string = this._getFieldValue(child.name, child, item, - format, typeName); + format, typeName, bibCitElement); if(string) { childData.push(string); } @@ -1313,13 +1375,10 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { } else if(name == "text") { data = this._getTerm(element["term-name"]); dontEscape = false; - } else if(name == "isbn") { - if(item.ISBN) { - data = this._formatLocator(null, element, item.ISBN, format); - } - } else if(name == "doi") { - if(item.DOI) { - data = this._formatLocator(null, element, item.DOI, format); + } else if(name == "isbn" || name == "doi") { + var field = item.getField(name.toUpperCase()); + if(field) { + data = this._formatLocator(null, element, field, format); } } else if(name == "number") { data = this._csl.number; @@ -1338,14 +1397,14 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { var inheritElement; if(CSL._inherit[substituteElement.name] && CSL._inherit[name] && CSL._inherit[substituteElement.name] == CSL._inherit[name]) { - // if both substituteElement and the parent element inheirt from + // if both substituteElement and the parent element inherit from // the same base element, apply styles here inheritElement = element; } else { // search for elements with the same serialization - if(typeName != undefined && this._serializations[typeName] - && this._serializations[typeName][serialization]) { - inheritElement = this._serializations[typeName][serialization]; + if(typeName != undefined && bibCitElement._serializations[typeName] + && bibCitElement._serializations[typeName][serialization]) { + inheritElement = bibCitElement._serializations[typeName][serialization]; } else { // otherwise, use defaults inheritElement = this._getFieldDefaults(substituteElement.name); @@ -1366,7 +1425,8 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { // get field value data = this._getFieldValue(substituteElement.name, - substituteElement, item, format); + substituteElement, item, format, + bibCitElement); // return field value, if there is one; otherwise, keep processing // the data if(data) { @@ -1376,4 +1436,73 @@ CSL.prototype._getFieldValue = function(name, element, item, format, typeName) { } return ""; -} \ No newline at end of file +} + +/* + * THE FOLLOWING CODE IS SCHOLAR-SPECIFIC + * gets a list of possible CSL types, in order of preference, for an item + */ + CSL._optionalTypeMappings = { + journalArticle:"article-journal", + magazineArticle:"article-magazine", + newspaperArticle:"article-newspaper", + thesis:"thesis", + letter:"personal communication", + manuscript:"manuscript", + interview:"interview", + film:"motion picture", + artwork:"graphic", + website:"webpage" +}; +// TODO: check with Elena/APA/MLA on this +CSL._fallbackTypeMappings = { + book:"book", + bookSection:"chapter", + journalArticle:"article", + magazineArticle:"article", + newspaperArticle:"article", + thesis:"book", + letter:"article", + manuscript:"book", + interview:"book", + film:"book", + artwork:"book", + website:"article" +}; + +CSL.prototype._getTypeFromItem = function(item) { + var scholarType = Scholar.ItemTypes.getName(item.getType()); + + // get type + Scholar.debug("CSL: parsing item of Scholar type "+scholarType); + return [CSL._optionalTypeMappings[scholarType], CSL._fallbackTypeMappings[scholarType]]; +} + +CSL.prototype._separateItemCreators = function(item) { + var authors = new Array(); + var editors = new Array(); + var translators = new Array(); + + var authorID = Scholar.CreatorTypes.getID("author"); + var editorID = Scholar.CreatorTypes.getID("editor"); + var translatorID = Scholar.CreatorTypes.getID("translator"); + + var creators = item.getCreators(); + for(var j in creators) { + var creator = creators[j]; + + if(creator.creatorTypeID == editorID) { + editors.push(creator); + } else if(creator.creatorTypeID == translatorID) { + translators.push(creator); + } else if(creator.creatorTypeID == authorID) { + // TODO: do we just ignore contributors? + authors.push(creator); + } + } + + return [authors, editors, translators]; +} +/* + * END SCHOLAR-SPECIFIC CODE + */ \ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/xpcom/integration.js b/chrome/chromeFiles/content/scholar/xpcom/integration.js index 64447a7c50..ed704b7b8d 100644 --- a/chrome/chromeFiles/content/scholar/xpcom/integration.js +++ b/chrome/chromeFiles/content/scholar/xpcom/integration.js @@ -23,23 +23,14 @@ Scholar.Integration = new function() { Scholar.debug("Integration HTTP server listening on 127.0.0.1:"+serv.port); } - /* - * registers a SOAP method - */ - function registerSOAP(name, callback) { - _registeredSOAP[name] = callback; - } - /* * handles an HTTP request */ function handleHeader(header) { // get first line of request (all we care about for now) - var spaceIndex = header.indexOf(" "); - var method = header.substr(0, spaceIndex); - var uri = header.substr(spaceIndex+1); + var method = header.substr(0, header.indexOf(" ")); - if(!method || !uri) { + if(!method) { return _generateResponse("400 Bad Request"); } @@ -60,7 +51,7 @@ Scholar.Integration = new function() { * handles a SOAP envelope */ function handleEnvelope(envelope) { - Scholar.debug("Got SOAP envelope"); + Scholar.debug("Integration: got SOAP envelope"); Scholar.debug(envelope); envelope = envelope.replace(_XMLRe, ""); @@ -68,11 +59,13 @@ Scholar.Integration = new function() { var xml = new XML(envelope); var request = xml.env::Body.children()[0]; if(request.namespace() != this.ns) { - Scholar.debug("SOAP method not supported: invalid namespace"); + Scholar.debug("Integration: SOAP method not supported: invalid namespace"); } else { var name = request.localName(); if(Scholar.Integration.SOAP[name]) { if(request.input.length()) { + // split apart passed parameters (same colon-escaped format + // as we pass) var input = request.input.toString(); var vars = new Array(); vars[0] = ""; @@ -80,7 +73,6 @@ Scholar.Integration = new function() { colonIndex = input.indexOf(":"); while(colonIndex != -1) { - Scholar.debug(input); if(input[colonIndex+1] == ":") { // escaped vars[i] += input.substr(0, colonIndex+1); input = input.substr(colonIndex+2); @@ -128,7 +120,7 @@ Scholar.Integration = new function() { return _generateResponse("200 OK", 'text/xml; charset="utf-8"', responseEnvelope.toXMLString()); } else { - Scholar.debug("SOAP method not supported"); + Scholar.debug("Integration: SOAP method not supported"); } } } @@ -304,7 +296,9 @@ Scholar.Integration.SOAP = new function() { this.getCitation = getCitation; this.getBibliography = getBibliography; - function getCitation(parameters) { + function getCitation(vars) { + // get items + var myWindow = Components.classes["@mozilla.org/appshell/appShellService;1"] .getService(Components.interfaces.nsIAppShellService) .hiddenDOMWindow; @@ -313,28 +307,47 @@ Scholar.Integration.SOAP = new function() { myWindow.openDialog('chrome://scholar/content/selectItemsDialog.xul','', 'chrome,popup,modal,centerscreen,titlebar=no',io); - if(io.dataOut && io.dataOut[0]) { - var item = Scholar.Items.get(io.dataOut[0]); - var creator = item.getCreator(0); - return [io.dataOut[0], "{{"+creator.lastName+"}}"] + if(io.dataOut) { // cancel was not pressed + var selectedItemIDs = io.dataOut; + var selectedItems = Scholar.Items.get(selectedItemIDs); + + var style = vars[0]; + if(vars[1]) { // some items already exist in the document + var itemString = vars[1]; // underscore-delimited string + + var newItemIndex = parseInt(vars[2]); // index at which the + // item belongs in + // itemString + + // splice in the new item ID + if(newItemIndex == -1) { // at beginning + var items = selectedItems.concat(Scholar.Items.get(itemString.split("_"))); + } else { // at newItemIndex + var items = Scholar.Items.get(itemString.substr(0, newItemIndex).split("_")). + concat(selectedItems); + + if(newItemIndex != itemString.length) { // not at the end + items = items.concat(Scholar.Items.get(itemString.substr(newItemIndex+1).split("_"))) + } + } + } else { // this is the first item and the only item to worry + // about + var items = selectedItems; + } + + var citation = Scholar.Cite.getCitation(style, selectedItems, items, "Integration"); + + return [selectedItemIDs.join("_"), citation]; } } function getBibliography(vars) { // get items - var itemIDs = vars[1].split(","); + var itemIDs = vars[1].split("_"); var items = Scholar.Items.get(itemIDs); return Scholar.Cite.getBibliography(vars[0], items, "Integration"); } } -/*Scholar.Integration.registerURL("/", "text/plain", function(vars) { - return "Hi there! The HTTP server is working!"; -}); -Scholar.Integration.registerURL("/getBibliography", "text/html", - function(vars) { return Scholar.Integration.Cite.getBibliography(vars) }); -Scholar.Integration.registerURL("/getCitation", "text/html", - function(vars) { return Scholar.Integration.Cite.getCitation(vars) });*/ - Scholar.Integration.init(); \ No newline at end of file diff --git a/chrome/chromeFiles/locale/en-US/scholar/locales.xml b/chrome/chromeFiles/locale/en-US/scholar/locales.xml index 10764fdc51..4e0e5e338e 100644 --- a/chrome/chromeFiles/locale/en-US/scholar/locales.xml +++ b/chrome/chromeFiles/locale/en-US/scholar/locales.xml @@ -7,6 +7,7 @@ forthcoming References and + et al. page diff --git a/scrapers.sql b/scrapers.sql index 99dab8d570..09cf7b7d23 100644 --- a/scrapers.sql +++ b/scrapers.sql @@ -1,4 +1,4 @@ --- 61 +-- 62 -- Set the following timestamp to the most recent scraper update date REPLACE INTO "version" VALUES ('repository', STRFTIME('%s', '2006-08-15 15:42:00')); @@ -5983,8 +5983,8 @@ REPLACE INTO "csl" VALUES('http://purl.org/net/xbiblio/csl/styles/apa.csl', '200 - - + +