diff --git a/chrome/chromeFiles/content/scholar/ingester/browser.js b/chrome/chromeFiles/content/scholar/ingester/browser.js index ee407c089e..27e5fffe2e 100644 --- a/chrome/chromeFiles/content/scholar/ingester/browser.js +++ b/chrome/chromeFiles/content/scholar/ingester/browser.js @@ -1,9 +1,23 @@ // Firefox Scholar Ingester Browser Functions -// Utilities based on code taken from Greasemonkey +// Based on code taken from Greasemonkey and PiggyBank // This code is licensed according to the GPL +////////////////////////////////////////////////////////////////////////////// +// +// Scholar.Ingester.Interface +// +////////////////////////////////////////////////////////////////////////////// + +// Class to interface with the browser when ingesting data + Scholar.Ingester.Interface = function() {} +////////////////////////////////////////////////////////////////////////////// +// +// Public Scholar.Ingester.Interface methods +// +////////////////////////////////////////////////////////////////////////////// + /* * Initialize some variables and prepare event listeners for when chrome is done * loading @@ -40,63 +54,14 @@ Scholar.Ingester.Interface.chromeUnload = function() { this.tabBrowser.removeProgressListener(this); } - -/* - * Gets a document object given a browser window object - * - * NOTE: Browser objects are associated with document objects via keys generated - * from the time the browser object is opened. I'm not sure if this is the - * appropriate mechanism for handling this, but it's what PiggyBank used and it - * appears to work. - */ -Scholar.Ingester.Interface.getDocument = function(browser) { - try { - var key = browser.getAttribute("scholar-key"); - if(Scholar.Ingester.Interface.browserDocuments[key]) { - return Scholar.Ingester.Interface.browserDocuments[key]; - } - } finally {} - return false; -} - -/* - * Creates a new document object for a browser window object, attempts to - * retrieve appropriate scraper - */ -Scholar.Ingester.Interface.setDocument = function(browser) { - try { - var key = browser.getAttribute("scholar-key"); - } finally { - if(!key) { - var key = (new Date()).getTime(); - browser.setAttribute("scholar-key", key); - } - } - Scholar.Ingester.Interface.browserDocuments[key] = new Scholar.Ingester.Document(browser); - Scholar.Ingester.Interface.browserDocuments[key].retrieveScraper(); -} - -/* - * Deletes the document object associated with a given browser window object - */ -Scholar.Ingester.Interface.deleteDocument = function(browser) { - try { - var key = browser.getAttribute("scholar-key"); - if(Scholar.Ingester.Interface.browserDocuments[key]) { - delete Scholar.Ingester.Interface.browserDocuments[key]; - return true; - } - } finally {} - return false; -} - /* * Scrapes a page (called when the capture icon is clicked) */ Scholar.Ingester.Interface.scrapeThisPage = function() { - var document = Scholar.Ingester.Interface.getDocument(Scholar.Ingester.Interface.tabBrowser.selectedBrowser); - if(document.scraper) { - document.scrapePage(); + var documentObject = Scholar.Ingester.Interface._getDocument(Scholar.Ingester.Interface.tabBrowser.selectedBrowser); + if(documentObject.scraper) { + Scholar.Ingester.Interface.scrapeProgress = new Scholar.Ingester.Interface.Progress(window, Scholar.Ingester.Interface.tabBrowser.selectedBrowser.contentDocument, Scholar.getString("ingester.scraping")); + documentObject.scrapePage(Scholar.Ingester.Interface._finishScraping); } } @@ -105,11 +70,11 @@ Scholar.Ingester.Interface.scrapeThisPage = function() { * thereof of the current page */ Scholar.Ingester.Interface.updateStatus = function(browser) { - var document = Scholar.Ingester.Interface.getDocument(browser); - if(document && document.scraper) { - this.statusImage.src = "chrome://scholar/skin/capture_colored.png"; + var documentObject = Scholar.Ingester.Interface._getDocument(browser); + if(documentObject && documentObject.scraper) { + Scholar.Ingester.Interface.statusImage.src = "chrome://scholar/skin/capture_colored.png"; } else { - this.statusImage.src = "chrome://scholar/skin/capture_gray.png"; + Scholar.Ingester.Interface.statusImage.src = "chrome://scholar/skin/capture_gray.png"; } } @@ -122,8 +87,8 @@ Scholar.Ingester.Interface.updateStatus = function(browser) { * if a tab is loaded behind the currently selected page, the ingester will not * create a new object for it. */ -Scholar.Ingester.Interface.contentLoad = function() { - Scholar.Ingester.Interface.setDocument(Scholar.Ingester.Interface.tabBrowser.selectedBrowser); +Scholar.Ingester.Interface.contentLoad = function() { + Scholar.Ingester.Interface._setDocument(Scholar.Ingester.Interface.tabBrowser.selectedBrowser); Scholar.Ingester.Interface.updateStatus(Scholar.Ingester.Interface.tabBrowser.selectedBrowser); } @@ -159,7 +124,7 @@ Scholar.Ingester.Interface.Listener.onLocationChange = function() { Scholar.Ingester.Interface.browsers.splice(i,1); // To execute if document object does not exist - Scholar.Ingester.Interface.deleteDocument(browser); + Scholar.Ingester.Interface._deleteDocument(browser); } } @@ -185,4 +150,179 @@ Scholar.Ingester.Interface.Listener.onLocationChange = function() { Scholar.Ingester.Interface.updateStatus( Scholar.Ingester.Interface.tabBrowser.selectedBrowser ); -} \ No newline at end of file +} + +////////////////////////////////////////////////////////////////////////////// +// +// Private Scholar.Ingester.Document methods +// +////////////////////////////////////////////////////////////////////////////// + +/* + * Gets a document object given a browser window object + * + * NOTE: Browser objects are associated with document objects via keys generated + * from the time the browser object is opened. I'm not sure if this is the + * appropriate mechanism for handling this, but it's what PiggyBank used and it + * appears to work. + */ +Scholar.Ingester.Interface._getDocument = function(browser) { + try { + var key = browser.getAttribute("scholar-key"); + if(Scholar.Ingester.Interface.browserDocuments[key]) { + return Scholar.Ingester.Interface.browserDocuments[key]; + } + } finally {} + return false; +} + +/* + * Creates a new document object for a browser window object, attempts to + * retrieve appropriate scraper + */ +Scholar.Ingester.Interface._setDocument = function(browser) { + try { + var key = browser.getAttribute("scholar-key"); + } finally { + if(!key) { + var key = (new Date()).getTime(); + browser.setAttribute("scholar-key", key); + } + } + Scholar.Ingester.Interface.browserDocuments[key] = new Scholar.Ingester.Document(browser); + Scholar.Ingester.Interface.browserDocuments[key].retrieveScraper(); +} + +/* + * Deletes the document object associated with a given browser window object + */ +Scholar.Ingester.Interface._deleteDocument = function(browser) { + try { + var key = browser.getAttribute("scholar-key"); + if(Scholar.Ingester.Interface.browserDocuments[key]) { + delete Scholar.Ingester.Interface.browserDocuments[key]; + return true; + } + } finally {} + return false; +} + +/* + * Callback to be executed when scraping is complete + */ +Scholar.Ingester.Interface._finishScraping = function(documentObject) { + Scholar.Ingester.Interface.scrapeProgress.changeHeadline(Scholar.getString("ingester.scrapeComplete")); + + var fields = Scholar.ItemFields.getItemTypeFields(documentObject.item.getField("itemTypeID")); + + var titleLabel = Scholar.getString("itemFields.title") + ":" + Scholar.Ingester.Interface.scrapeProgress.addResult(titleLabel, this.item.getField("title")); + var creators = documentObject.item.numCreators(); + if(creators) { + for(var i=0; i - - - - - - - - - - - - - - diff --git a/chrome/chromeFiles/content/scholar/xpcom/ingester.js b/chrome/chromeFiles/content/scholar/xpcom/ingester.js index ed94aa1a74..a071f3fef9 100644 --- a/chrome/chromeFiles/content/scholar/xpcom/ingester.js +++ b/chrome/chromeFiles/content/scholar/xpcom/ingester.js @@ -356,7 +356,7 @@ Scholar.Ingester.Document.prototype.canScrape = function(currentScraper) { currentScraper.scraperDetectCode + "\n})()", scraperSandbox); } catch(e) { - throw e+' in scraper '+currentScraper.label; + throw e+' in scraperDetectCode for '+currentScraper.label; } } return canScrape; @@ -375,7 +375,11 @@ Scholar.Ingester.Document.prototype.scrapePage = function(callback) { var scraperSandbox = this.sandbox; - Components.utils.evalInSandbox(this.scraper.scraperJavaScript, scraperSandbox); + try { + Components.utils.evalInSandbox(this.scraper.scraperJavaScript, scraperSandbox); + } catch(e) { + throw e+' in scraperJavaScript for '+this.scraper.label; + } // If synchronous, call _scrapePageComplete(); if(!scraperSandbox._waitForCompletion) { @@ -413,7 +417,7 @@ Scholar.Ingester.Document.prototype.scrapePage = function(callback) { Scholar.Ingester.Document.prototype._scrapePageComplete = function() { this._updateDatabase(); if(this._scrapeCallback) { - this._scrapeCallback(); + this._scrapeCallback(this); } } @@ -469,5 +473,10 @@ Scholar.Ingester.Document.prototype._updateDatabase = function() { newItem.setCreator(0, firstName, lastName); } newItem.save(); + + // First one is stored so as to be accessible + if(!this.item) { + this.item = newItem; + } } } \ No newline at end of file diff --git a/chrome/chromeFiles/locale/en-US/scholar/scholar.properties b/chrome/chromeFiles/locale/en-US/scholar/scholar.properties index 1bda8d5ad5..7bff59bf6d 100644 --- a/chrome/chromeFiles/locale/en-US/scholar/scholar.properties +++ b/chrome/chromeFiles/locale/en-US/scholar/scholar.properties @@ -21,4 +21,7 @@ itemTypes.journalArticle = Journal Article creatorTypes.author = Author creatorTypes.contributor = Contributor -creatorTypes.editor = Editor \ No newline at end of file +creatorTypes.editor = Editor + +ingester.scraping = Scraping Page... +ingester.scrapeComplete = Scraping Complete \ No newline at end of file