From c2c82e3c547c43047eb262e424da715502a6b590 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 28 Aug 2006 05:38:37 +0000 Subject: [PATCH] add basic Word integration. to see it in action, copy Zotero.dot to Microsoft Office 2004/Office/Startup/Word. if the gods are with you, you should see a new toolbar the next time you open Word. not yet implemented: - formatted in-text citations, rather than placeholders - footnotes - selection of citation style (for now, only APA is available) - support for non-ASCII characters - exclusion of notes from select items window - Windows support (although it shouldn't be difficult) - probably much more... --- Zotero.dot | Bin 0 -> 68608 bytes .../chromeFiles/content/scholar/xpcom/cite.js | 10 +- .../content/scholar/xpcom/integration.js | 340 ++++++++++++++++++ components/chnmIScholarService.js | 4 + 4 files changed, 352 insertions(+), 2 deletions(-) create mode 100644 Zotero.dot create mode 100644 chrome/chromeFiles/content/scholar/xpcom/integration.js diff --git a/Zotero.dot b/Zotero.dot new file mode 100644 index 0000000000000000000000000000000000000000..39b32dcda05af7cdc91a2589185992c3081c54c1 GIT binary patch literal 68608 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'; + if(coins) { + string += ''; + } if(this._class == "note") { output += "
  • "+string+"
  • \r\n"; @@ -215,6 +217,8 @@ CSL.prototype.createBibliography = function(items, format) { output += index+". "; } output += string+"\\\r\n\\\r\n"; + } else if(format == "Integration") { + output += string+"\r\n\r\n"; } } @@ -760,6 +764,8 @@ CSL.prototype._escapeString = function(string, format) { } return newString; + } else if(format == "Integration") { + return string.replace(/\\/g, "\\\\"); } else { return string; } @@ -820,7 +826,7 @@ CSL.prototype._formatString = function(element, string, format, dontEscape) { if(style) { string = ''+string+''; } - } else if(format == "RTF") { + } else if(format == "RTF" || format == "Integration") { if(element["font-style"] && (element["font-style"] == "oblique" || element["font-style"] == "italic")) { string = "\\i "+string+"\\i0 "; } diff --git a/chrome/chromeFiles/content/scholar/xpcom/integration.js b/chrome/chromeFiles/content/scholar/xpcom/integration.js new file mode 100644 index 000000000..64447a7c5 --- /dev/null +++ b/chrome/chromeFiles/content/scholar/xpcom/integration.js @@ -0,0 +1,340 @@ +Scholar.Integration = new function() { + var _contentLengthRe = /[\r\n]Content-Length: *([0-9]+)/i; + var _XMLRe = /<\?[^>]+\?>/; + this.ns = "http://chnm.gmu.edu/firefoxscholar/soap"; + + this.init = init; + this.handleHeader = handleHeader; + this.handleEnvelope = handleEnvelope; + + /* + * initializes a very rudimentary web server used for SOAP RPC + */ + function init() { + // start listening on socket + var sock = Components.classes["@mozilla.org/network/server-socket;1"]; + serv = sock.createInstance(); + serv = serv.QueryInterface(Components.interfaces.nsIServerSocket); + + // bind to a random port on loopback only + serv.init(50001, true, -1); + serv.asyncListen(Scholar.Integration.SocketListener); + + 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); + + if(!method || !uri) { + return _generateResponse("400 Bad Request"); + } + + if(method != "POST") { + return _generateResponse("501 Method Not Implemented"); + } else { + // parse content length + var m = _contentLengthRe.exec(header); + if(!m) { + return _generateResponse("400 Bad Request"); + } else { + return parseInt(m[1]); + } + } + } + + /* + * handles a SOAP envelope + */ + function handleEnvelope(envelope) { + Scholar.debug("Got SOAP envelope"); + Scholar.debug(envelope); + envelope = envelope.replace(_XMLRe, ""); + + var env = new Namespace("http://schemas.xmlsoap.org/soap/envelope/"); + 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"); + } else { + var name = request.localName(); + if(Scholar.Integration.SOAP[name]) { + if(request.input.length()) { + var input = request.input.toString(); + var vars = new Array(); + vars[0] = ""; + var i = 0; + + 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); + } else { // not escaped + vars[i] += input.substr(0, colonIndex); + i++; + vars[i] = ""; + input = input.substr(colonIndex+1); + } + colonIndex = input.indexOf(":"); + } + vars[i] += input; + } else { + var vars = null; + } + + // execute request + var output = Scholar.Integration.SOAP[name](vars); + + // ugh: we can't use real SOAP, since AppleScript VBA can't pass + // objects, so implode arrays + if(!output) { + output = ""; + } + + if(typeof(output) == "object") { + for(var i in output) { + if(typeof(output[i]) == "string") { + output[i] = output[i].replace(/:/g, "::"); + } + } + output = output.join(":"); + } + + // create envelope + var responseEnvelope = + + + {output} + + + ; + + // return OK + return _generateResponse("200 OK", 'text/xml; charset="utf-8"', + responseEnvelope.toXMLString()); + } else { + Scholar.debug("SOAP method not supported"); + } + } + } + + /* + * generates the response to an HTTP request + */ + function _generateResponse(status, contentType, body) { + var response = "HTTP/1.0 "+status+"\r\n"; + + if(body) { + if(contentType) { + response += "Content-Type: "+contentType+"\r\n"; + } + response += "Content-Length: "+body.length+"\r\n\r\n"+body; + } else { + response += "Content-Length: 0\r\n\r\n" + } + + return response; + } +} + +Scholar.Integration.SocketListener = new function() { + this.onSocketAccepted = onSocketAccepted; + + /* + * called when a socket is opened + */ + function onSocketAccepted(socket, transport) { + // get an input stream + var iStream = transport.openInputStream(0, 0, 0); + var oStream = transport.openOutputStream(0, 0, 0); + + var dataListener = new Scholar.Integration.DataListener(iStream, oStream); + var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"] + .createInstance(Components.interfaces.nsIInputStreamPump); + pump.init(iStream, -1, -1, 0, 0, false); + pump.asyncRead(dataListener, null); + } +} + +/* + * handles the actual acquisition of data + */ +Scholar.Integration.DataListener = function(iStream, oStream) { + this.header = ""; + this.headerFinished = false; + + this.body = ""; + this.bodyLength = 0; + + this.iStream = iStream; + this.oStream = oStream; + this.sStream = Components.classes["@mozilla.org/scriptableinputstream;1"] + .createInstance(Components.interfaces.nsIScriptableInputStream); + this.sStream.init(iStream); + + this.foundReturn = false; +} + +/* + * called when a request begins (although the request should have begun before + * the DataListener was generated) + */ +Scholar.Integration.DataListener.prototype.onStartRequest = function(request, context) {} + +/* + * called when a request stops + */ +Scholar.Integration.DataListener.prototype.onStopRequest = function(request, context, status) { + this.iStream.close(); + this.oStream.close(); +} + +/* + * called when new data is available + */ +Scholar.Integration.DataListener.prototype.onDataAvailable = function(request, context, + inputStream, offset, count) { + var readData = this.sStream.read(count); + + if(this.headerFinished) { // reading body + this.body += readData; + // check to see if data is done + this._bodyData(); + } else { // reading header + // see if there's a magic double return + var lineBreakIndex = readData.indexOf("\r\n\r\n"); + if(lineBreakIndex != -1) { + if(lineBreakIndex != 0) { + this.header += readData.substr(0, lineBreakIndex+4); + this.body = readData.substr(lineBreakIndex+4); + } + + this._headerFinished(); + return; + } + var lineBreakIndex = readData.indexOf("\n\n"); + if(lineBreakIndex != -1) { + if(lineBreakIndex != 0) { + this.header += readData.substr(0, lineBreakIndex+2); + this.body = readData.substr(lineBreakIndex+2); + } + + this._headerFinished(); + return; + } + if(this.header && this.header[this.header.length-1] == "\n" && + (readData[0] == "\n" || readData[0] == "\r")) { + if(readData.length > 1 && readData[1] == "\n") { + this.header += readData.substr(0, 2); + this.body = readData.substr(2); + } else { + this.header += readData[0]; + this.body = readData.substr(1); + } + + this._headerFinished(); + return; + } + this.header += readData; + } +} + +/* + * processes an HTTP header and decides what to do + */ +Scholar.Integration.DataListener.prototype._headerFinished = function() { + this.headerFinished = true; + var output = Scholar.Integration.handleHeader(this.header); + + if(typeof(output) == "number") { + this.bodyLength = output; + // check to see if data is done + this._bodyData(); + } else { + this._requestFinished(output); + } +} + +/* + * checks to see if Content-Length bytes of body have been read and, if they + * have, processes the body + */ +Scholar.Integration.DataListener.prototype._bodyData = function() { + if(this.body.length >= this.bodyLength) { + if(this.body.length > this.bodyLength) { + // truncate + this.body = this.body.substr(0, this.bodyLength); + } + + var output = Scholar.Integration.handleEnvelope(this.body); + this._requestFinished(output); + } +} + +/* + * returns HTTP data from a request + */ +Scholar.Integration.DataListener.prototype._requestFinished = function(response) { + // close input stream + this.iStream.close(); + + // write response + this.oStream.write(response, response.length); + + // close output stream + this.oStream.close(); +} + +Scholar.Integration.SOAP = new function() { + this.getCitation = getCitation; + this.getBibliography = getBibliography; + + function getCitation(parameters) { + var myWindow = Components.classes["@mozilla.org/appshell/appShellService;1"] + .getService(Components.interfaces.nsIAppShellService) + .hiddenDOMWindow; + + var io = {dataIn: null, dataOut: null}; + 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+"}}"] + } + } + + function getBibliography(vars) { + // get items + 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/components/chnmIScholarService.js b/components/chnmIScholarService.js index bff51d75c..6d78e820a 100644 --- a/components/chnmIScholarService.js +++ b/components/chnmIScholarService.js @@ -58,6 +58,10 @@ Cc["@mozilla.org/moz/jssubscript-loader;1"] .getService(Ci.mozIJSSubScriptLoader) .loadSubScript("chrome://scholar/content/xpcom/utilities.js"); +Cc["@mozilla.org/moz/jssubscript-loader;1"] + .getService(Ci.mozIJSSubScriptLoader) + .loadSubScript("chrome://scholar/content/xpcom/integration.js"); + Cc["@mozilla.org/moz/jssubscript-loader;1"] .getService(Ci.mozIJSSubScriptLoader) .loadSubScript("chrome://scholar/content/xpcom/file.js");