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:
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";