diff --git a/chrome/chromeFiles/content/scholar/bibliography.js b/chrome/chromeFiles/content/scholar/bibliography.js
new file mode 100644
index 000000000..3bdc9a755
--- /dev/null
+++ 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
new file mode 100644
index 000000000..04debab5d
--- /dev/null
+++ b/chrome/chromeFiles/content/scholar/bibliography.xul
@@ -0,0 +1,29 @@
+
+
+
+
\ No newline at end of file
diff --git a/chrome/chromeFiles/content/scholar/fileInterface.js b/chrome/chromeFiles/content/scholar/fileInterface.js
index 7d7bead70..65a6afe35 100644
--- 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
@@ -54,6 +55,16 @@ 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.
@@ -61,4 +72,77 @@ Scholar_File_Interface = new function() {
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 +='\n';
+ html +='\n';
+ html +='
\n';
+ html +='\n';
+ html +='Bibliography\n';
+ html +='\n';
+ html +='\n';
+ html += bibliography;
+ html +='\n';
+ 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
index d073930ee..5aa23b5e1 100644
--- 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
index 5dbf43132..d8daa8b96 100644
--- 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
index 204568543..3dc9cca75 100644
--- 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
index 74385f822..2ae3b0b71 100644
--- 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
index 4092688bf..6bf81902d 100644
--- a/chrome/chromeFiles/locale/en-US/scholar/scholar.dtd
+++ b/chrome/chromeFiles/locale/en-US/scholar/scholar.dtd
@@ -32,4 +32,11 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scrapers.sql b/scrapers.sql
index 45ac4a41a..de6971721 100644
--- 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";