www

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

commit 6305e4cadad8f8d65193491763d9d06bb0db47e6
parent 1d03bf6b71bb908a22dd91942a32f678e7da1862
Author: Simon Kornblith <simon@simonster.com>
Date:   Thu, 27 Jul 2006 23:01:55 +0000

closes #55, export bibliography to printable version
closes #4, Make printable version

- moves functions for creating and deleting hidden browser objects to scholar.js (from ingester.js), since these are necessary for printing as well
- allows saving bibliography in HTML or printing bibliography. style support is not yet complete (pending finalization of 0.9 version of CSL specification).



Diffstat:
Achrome/chromeFiles/content/scholar/bibliography.js | 48++++++++++++++++++++++++++++++++++++++++++++++++
Achrome/chromeFiles/content/scholar/bibliography.xul | 30++++++++++++++++++++++++++++++
Mchrome/chromeFiles/content/scholar/fileInterface.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mchrome/chromeFiles/content/scholar/xpcom/cite.js | 2+-
Mchrome/chromeFiles/content/scholar/xpcom/ingester.js | 15---------------
Mchrome/chromeFiles/content/scholar/xpcom/scholar.js | 27+++++++++++++++++++++++++++
Mchrome/chromeFiles/content/scholar/xpcom/utilities.js | 7++-----
Mchrome/chromeFiles/locale/en-US/scholar/scholar.dtd | 11+++++++++--
Mscrapers.sql | 10+++++-----
9 files changed, 206 insertions(+), 28 deletions(-)

diff --git a/chrome/chromeFiles/content/scholar/bibliography.js b/chrome/chromeFiles/content/scholar/bibliography.js @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Scholar_File_Interface_Bibliography +// +////////////////////////////////////////////////////////////////////////////// + +// Class to provide options for bibliography + +Scholar_File_Interface_Bibliography = new function() { + var _io; + + this.init = init; + this.acceptSelection = acceptSelection; + + /* + * Initialize some variables and prepare event listeners for when chrome is done + * loading + */ + function init() { + _io = window.arguments[0]; + + var listbox = document.getElementById("style-popup"); + var styles = Scholar.Cite.getStyles(); + + var firstItem = true; + for(i in styles) { + var itemNode = document.createElement("menuitem"); + itemNode.setAttribute("value", i); + itemNode.setAttribute("label", styles[i]); + listbox.appendChild(itemNode); + } + + // select first item by default + document.getElementById("style-menu").selectedIndex = 0; + + if(navigator.userAgent.toLowerCase().indexOf("mac") != -1) { + // hack to eliminate clipboard option for mac users + document.getElementById("output-radio").removeChild(document.getElementById("copy-to-clipboard")); + } + } + + function acceptSelection() { + // collect code + _io.style = document.getElementById("style-menu").selectedItem.value; + _io.output = document.getElementById("output-radio").selectedItem.id; + } +} +\ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/bibliography.xul b/chrome/chromeFiles/content/scholar/bibliography.xul @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> +<!DOCTYPE window SYSTEM "chrome://scholar/locale/scholar.dtd"> +<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + title="&bibliography.title;" buttons="cancel,accept" + ondialogaccept="Scholar_File_Interface_Bibliography.acceptSelection()" + id="scholar-bibliography" + onload="Scholar_File_Interface_Bibliography.init()"> + +<script src="include.js"/> +<script src="bibliography.js"/> + +<hbox> + <label value="&bibliography.style.label;" control="style-menu"/> + <menulist id="style-menu"> + <menupopup id="style-popup"> + </menupopup> + </menulist> +</hbox> +<groupbox> + <caption label="&bibliography.output.label;"/> + <radiogroup id="output-radio"> + <radio id="save-as-html" selected="true" label="&bibliography.saveAsHTML.label;"/> + <radio id="copy-to-clipboard" label="&bibliography.copyToClipboard.label;"/> + <radio id="print" label="&bibliography.print.label;"/> + </radiogroup> +</groupbox> + +</dialog> +\ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/fileInterface.js b/chrome/chromeFiles/content/scholar/fileInterface.js @@ -1,6 +1,7 @@ Scholar_File_Interface = new function() { this.exportFile = exportFile; this.importFile = importFile; + this.bibliographyFromProject = bibliographyFromProject; /* * Creates Scholar.Translate instance and shows file picker for file export @@ -55,10 +56,93 @@ Scholar_File_Interface = new function() { } /* + * Creates a bibliography + */ + function bibliographyFromProject() { + var collection = ScholarPane.getSelectedCollection(); + if(!collection) throw("error in bibliographyFromProject: no collection currently selected"); + + _doBibliographyOptions(Scholar.getItems(collection.getID())); + } + + /* * Saves items after they've been imported. We could have a nice little * "items imported" indicator, too. */ function _importItemDone(obj, item) { item.save(); } + + /* + * Shows bibliography options and creates a bibliography + */ + function _doBibliographyOptions(items) { + var io = new Object(); + var newDialog = window.openDialog("chrome://scholar/content/bibliography.xul", + "_blank","chrome,modal,centerscreen", io); + + // generate bibliography + var bibliography = Scholar.Cite.getBibliography(io.style, items); + + if(io.output == "print") { + // printable bibliography, using a hidden browser + var browser = Scholar.Browser.createHiddenBrowser(window); + browser.contentDocument.write(bibliography); + + // this is kinda nasty, but we have to temporarily modify the user's + // settings to eliminate the header and footer. the other way to do + // this would be to attempt to print with an embedded browser, but + // it's not even clear how to attempt to create one + var prefService = Components.classes["@mozilla.org/preferences-service;1"]. + getService(Components.interfaces.nsIPrefBranch); + var prefsToClear = ["print.print_headerleft", "print.print_headercenter", + "print.print_headerright", "print.print_footerleft", + "print.print_footercenter", "print.print_footerright"]; + var oldPrefs = new Array(); + for(var i in prefsToClear) { + oldPrefs[i] = prefService.getCharPref(prefsToClear[i]); + prefService.setCharPref(prefsToClear[i], ""); + } + + // print + browser.contentWindow.print(); + + // set the prefs back + for(var i in prefsToClear) { + prefService.setCharPref(prefsToClear[i], oldPrefs[i]); + } + + Scholar.Browser.deleteHiddenBrowser(browser); + bibliographyStream.close(); + } else if(io.output == "save-as-html") { + // savable bibliography, using a file stream + const nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"] + .createInstance(nsIFilePicker); + fp.init(window, "Save Bibliography", nsIFilePicker.modeSave); + fp.appendFilters(nsIFilePicker.filterHTML); + var rv = fp.show(); + if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) { + // open file + var fStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. + createInstance(Components.interfaces.nsIFileOutputStream); + fStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0); // write, create, truncate + + var html = ""; + html +='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n'; + html +='<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\n'; + html +='<head>\n'; + html +='<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n'; + html +='<title>Bibliography</title>\n'; + html +='</head>\n'; + html +='<body>\n'; + html += bibliography; + html +='</body>\n'; + html +='</html>\n'; + fStream.write(html, html.length); + + fStream.close(); + } + } + } } \ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/xpcom/cite.js b/chrome/chromeFiles/content/scholar/xpcom/cite.js @@ -9,7 +9,7 @@ Scholar.Cite = new function() { function getStyles() { // TODO: return key/values from database - return ["American Psychological Association"]; + return {1:"American Psychological Association"}; } function getBibliography(style, items) { diff --git a/chrome/chromeFiles/content/scholar/xpcom/ingester.js b/chrome/chromeFiles/content/scholar/xpcom/ingester.js @@ -4,21 +4,6 @@ Scholar.Ingester = new Object(); -Scholar.Ingester.createHiddenBrowser = function(myWindow) { - // Create a hidden browser - var newHiddenBrowser = myWindow.document.createElement("browser"); - var windows = myWindow.document.getElementsByTagName("window"); - windows[0].appendChild(newHiddenBrowser); - Scholar.debug("created hidden browser"); - return newHiddenBrowser; -} - -Scholar.Ingester.deleteHiddenBrowser = function(myBrowser) { - // Delete a hidden browser - delete myBrowser; - Scholar.debug("deleted hidden browser"); -} - ///////////////////////////////////////////////////////////////// // // Scholar.Ingester.ProxyMonitor diff --git a/chrome/chromeFiles/content/scholar/xpcom/scholar.js b/chrome/chromeFiles/content/scholar/xpcom/scholar.js @@ -522,4 +522,31 @@ Scholar.Date = new function(){ return false; } } +} + +Scholar.Browser = new function() { + this.createHiddenBrowser = createHiddenBrowser; + this.deleteHiddenBrowser = deleteHiddenBrowser; + + function createHiddenBrowser(myWindow) { + if(!myWindow) { + var myWindow = Components.classes["@mozilla.org/appshell/appShellService;1"] + .getService(Components.interfaces.nsIAppShellService) + .hiddenDOMWindow; + } + + // Create a hidden browser + var newHiddenBrowser = myWindow.document.createElement("browser"); + var windows = myWindow.document.getElementsByTagName("window"); + windows[0].appendChild(newHiddenBrowser); + Scholar.debug("created hidden browser"); + return newHiddenBrowser; + } + + function deleteHiddenBrowser(myBrowser) { + // Delete a hidden browser + myBrowser.parentNode.removeChild(myBrowser); + delete myBrowser; + Scholar.debug("deleted hidden browser"); + } } \ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/xpcom/utilities.js b/chrome/chromeFiles/content/scholar/xpcom/utilities.js @@ -535,10 +535,7 @@ Scholar.Utilities.HTTP = new function() { // saveBrowser - whether to save the hidden browser object; usually, you don't // want to do this, because it makes it easier to leak memory Scholar.Utilities.HTTP.processDocuments = function(firstDoc, urls, processor, done, exception, saveBrowser) { - var myWindow = Components.classes["@mozilla.org/appshell/appShellService;1"] - .getService(Components.interfaces.nsIAppShellService) - .hiddenDOMWindow; - var hiddenBrowser = Scholar.Ingester.createHiddenBrowser(myWindow); + var hiddenBrowser = Scholar.Browser.createHiddenBrowser(); var prevUrl, url; try { @@ -566,7 +563,7 @@ Scholar.Utilities.HTTP.processDocuments = function(firstDoc, urls, processor, do } else { hiddenBrowser.removeEventListener("load", onLoad, true); if(!saveBrowser) { - Scholar.Ingester.deleteHiddenBrowser(hiddenBrowser); + Scholar.Browser.deleteHiddenBrowser(hiddenBrowser); } done(); } diff --git a/chrome/chromeFiles/locale/en-US/scholar/scholar.dtd b/chrome/chromeFiles/locale/en-US/scholar/scholar.dtd @@ -32,4 +32,11 @@ <!ENTITY selectitems.title "Select Items"> <!ENTITY selectitems.intro.label "Select which items you'd like to add to your library"> <!ENTITY selectitems.cancel.label "Cancel"> -<!ENTITY selectitems.select.label "OK"> -\ No newline at end of file +<!ENTITY selectitems.select.label "OK"> + +<!ENTITY bibliography.title "Create Bibliography"> +<!ENTITY bibliography.style.label "Citation Style:"> +<!ENTITY bibliography.output.label "Output Format:"> +<!ENTITY bibliography.saveAsHTML.label "Save as HTML"> +<!ENTITY bibliography.copyToClipboard.label "Copy to Clipboard"> +<!ENTITY bibliography.print.label "Print"> +\ No newline at end of file diff --git a/scrapers.sql b/scrapers.sql @@ -4024,12 +4024,12 @@ MARC_Record.prototype.translate = function(item) { // Extract series this._associateDBField(item, ''440'', ''a'', ''series''); // Extract call number - this._associateDBField(item, ''050'', ''ab'', ''callNumber''); - this._associateDBField(item, ''060'', ''ab'', ''callNumber''); - this._associateDBField(item, ''070'', ''ab'', ''callNumber''); - this._associateDBField(item, ''080'', ''ab'', ''callNumber''); - this._associateDBField(item, ''082'', ''a'', ''callNumber''); this._associateDBField(item, ''084'', ''ab'', ''callNumber''); + this._associateDBField(item, ''082'', ''a'', ''callNumber''); + this._associateDBField(item, ''080'', ''ab'', ''callNumber''); + this._associateDBField(item, ''070'', ''ab'', ''callNumber''); + this._associateDBField(item, ''060'', ''ab'', ''callNumber''); + this._associateDBField(item, ''050'', ''ab'', ''callNumber''); // Set type item.itemType = "book";