Add context menu to translate icon, allowing the user to save to Zotero with alternative translators and to perform library lookup or use lookup engines without first saving the item
This commit is contained in:
parent
46dc429d73
commit
953ec31166
6 changed files with 118 additions and 33 deletions
|
@ -125,7 +125,7 @@ var Zotero_Browser = new function() {
|
||||||
* Scrapes a page (called when the capture icon is clicked
|
* Scrapes a page (called when the capture icon is clicked
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function scrapeThisPage(/*libraryID, collectionID*/) {
|
function scrapeThisPage(translator) {
|
||||||
if (Zotero.locked) {
|
if (Zotero.locked) {
|
||||||
Zotero_Browser.progress.changeHeadline(Zotero.getString("ingester.scrapeError"));
|
Zotero_Browser.progress.changeHeadline(Zotero.getString("ingester.scrapeError"));
|
||||||
var desc = Zotero.localeJoin([
|
var desc = Zotero.localeJoin([
|
||||||
|
@ -159,7 +159,7 @@ var Zotero_Browser = new function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// translate into specified library and collection
|
// translate into specified library and collection
|
||||||
_getTabObject(this.tabbrowser.selectedBrowser).translate(libraryID, collectionID);
|
_getTabObject(Zotero_Browser.tabbrowser.selectedBrowser).translate(libraryID, collectionID, translator);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -480,23 +480,85 @@ var Zotero_Browser = new function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when status bar icon is right-clicked
|
||||||
|
*/
|
||||||
|
this.onStatusPopupShowing = function(e) {
|
||||||
|
var popup = e.target;
|
||||||
|
while(popup.hasChildNodes()) popup.removeChild(popup.lastChild);
|
||||||
|
|
||||||
|
var tab = _getTabObject(this.tabbrowser.selectedBrowser);
|
||||||
|
var translators = tab.page.translators;
|
||||||
|
for(var i=0, n=translators.length; i<n; i++) {
|
||||||
|
let translator = translators[i];
|
||||||
|
|
||||||
|
var menuitem = document.createElement("menuitem");
|
||||||
|
menuitem.setAttribute("label",
|
||||||
|
Zotero.getString("ingester.saveToZoteroUsing", translator.label));
|
||||||
|
menuitem.setAttribute("image", (translator.itemType === "multiple"
|
||||||
|
? "chrome://zotero/skin/treesource-collection.png"
|
||||||
|
: Zotero.ItemTypes.getImageSrc(translator.itemType)));
|
||||||
|
menuitem.setAttribute("class", "menuitem-iconic");
|
||||||
|
menuitem.addEventListener("command", function(e) {
|
||||||
|
scrapeThisPage(translator);
|
||||||
|
}, false);
|
||||||
|
popup.appendChild(menuitem);
|
||||||
|
}
|
||||||
|
|
||||||
|
popup.appendChild(document.createElement("menuseparator"));
|
||||||
|
|
||||||
|
var menuitem = document.createElement("menuitem");
|
||||||
|
menuitem.setAttribute("label", Zotero.getString("locate.libraryLookup.label"));
|
||||||
|
menuitem.setAttribute("tooltiptext", Zotero.getString("locate.libraryLookup.tooltip"));
|
||||||
|
menuitem.setAttribute("image", "chrome://zotero/skin/locate-library-lookup.png");
|
||||||
|
menuitem.setAttribute("class", "menuitem-iconic");
|
||||||
|
menuitem.addEventListener("command", _constructLookupFunction(tab, function(event, obj) {
|
||||||
|
var urls = [];
|
||||||
|
for each(var item in obj.newItems) {
|
||||||
|
var url = Zotero.OpenURL.resolve(item);
|
||||||
|
if(url) urls.push(url);
|
||||||
|
}
|
||||||
|
ZoteroPane.loadURI(urls, event);
|
||||||
|
}), false);
|
||||||
|
popup.appendChild(menuitem);
|
||||||
|
|
||||||
|
var locateEngines = Zotero.LocateManager.getVisibleEngines();
|
||||||
|
Zotero_LocateMenu.addLocateEngines(popup, locateEngines,
|
||||||
|
_constructLookupFunction(tab, function(e, obj) {
|
||||||
|
Zotero_LocateMenu.locateItem(e, obj.newItems);
|
||||||
|
}), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Private Zotero_Browser methods
|
// Private Zotero_Browser methods
|
||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function _constructLookupFunction(tab, success) {
|
||||||
|
return function(e) {
|
||||||
|
tab.page.translate.setTranslator(tab.page.translators[0]);
|
||||||
|
tab.page.translate.clearHandlers("done");
|
||||||
|
tab.page.translate.clearHandlers("itemDone");
|
||||||
|
tab.page.translate.setHandler("done", function(obj, status) {
|
||||||
|
if(status) {
|
||||||
|
success(e, obj);
|
||||||
|
Zotero_Browser.progress.close();
|
||||||
|
} else {
|
||||||
|
Zotero_Browser.progress.changeHeadline(Zotero.getString("ingester.lookup.error"));
|
||||||
|
Zotero_Browser.progress.startCloseTimer(8000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Zotero_Browser.progress.show();
|
||||||
|
Zotero_Browser.progress.changeHeadline(Zotero.getString("ingester.lookup.performing"));
|
||||||
|
tab.page.translate.translate(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Gets a data object given a browser window object
|
* Gets a data 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.
|
|
||||||
*
|
|
||||||
* Currently, the data object contains only one property: "translators," which
|
|
||||||
* is an array of translators that should work with the given page as returned
|
|
||||||
* from Zotero.Translate.getTranslator()
|
|
||||||
*/
|
*/
|
||||||
function _getTabObject(browser) {
|
function _getTabObject(browser) {
|
||||||
if(!browser) return false;
|
if(!browser) return false;
|
||||||
|
@ -506,8 +568,8 @@ var Zotero_Browser = new function() {
|
||||||
return browser.zoteroBrowserData;
|
return browser.zoteroBrowserData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* adds an annotation
|
* Adds an annotation
|
||||||
*/
|
*/
|
||||||
function _add(type, e) {
|
function _add(type, e) {
|
||||||
var tab = _getTabObject(Zotero_Browser.tabbrowser.selectedBrowser);
|
var tab = _getTabObject(Zotero_Browser.tabbrowser.selectedBrowser);
|
||||||
|
@ -582,7 +644,7 @@ Zotero_Browser.Tab.prototype.detectTranslators = function(rootDoc, doc) {
|
||||||
var translate = new Zotero.Translate.Web();
|
var translate = new Zotero.Translate.Web();
|
||||||
translate.setDocument(doc);
|
translate.setDocument(doc);
|
||||||
translate.setHandler("translators", function(obj, item) { me._translatorsAvailable(obj, item) });
|
translate.setHandler("translators", function(obj, item) { me._translatorsAvailable(obj, item) });
|
||||||
translate.getTranslators();
|
translate.getTranslators(true);
|
||||||
} else if(doc.documentURI.substr(0, 7) == "file://") {
|
} else if(doc.documentURI.substr(0, 7) == "file://") {
|
||||||
this._attemptLocalFileImport(doc);
|
this._attemptLocalFileImport(doc);
|
||||||
}
|
}
|
||||||
|
@ -646,7 +708,7 @@ Zotero_Browser.Tab.prototype._attemptLocalFileImport = function(doc) {
|
||||||
* @param {Integer} libraryID
|
* @param {Integer} libraryID
|
||||||
* @param {Integer} collectionID
|
* @param {Integer} collectionID
|
||||||
*/
|
*/
|
||||||
Zotero_Browser.Tab.prototype.translate = function(libraryID, collectionID) {
|
Zotero_Browser.Tab.prototype.translate = function(libraryID, collectionID, translator) {
|
||||||
if(this.page.translators && this.page.translators.length) {
|
if(this.page.translators && this.page.translators.length) {
|
||||||
Zotero_Browser.progress.show();
|
Zotero_Browser.progress.show();
|
||||||
Zotero_Browser.isScraping = true;
|
Zotero_Browser.isScraping = true;
|
||||||
|
@ -660,14 +722,13 @@ Zotero_Browser.Tab.prototype.translate = function(libraryID, collectionID) {
|
||||||
|
|
||||||
var me = this;
|
var me = this;
|
||||||
|
|
||||||
if(!this.page.hasBeenTranslated) {
|
// use first translator available
|
||||||
// use first translator available
|
this.page.translate.setTranslator(translator ? translator : this.page.translators[0]);
|
||||||
this.page.translate.setTranslator(this.page.translators[0]);
|
|
||||||
this.page.translate.setHandler("select", me._selectItems);
|
this.page.translate.clearHandlers("done");
|
||||||
this.page.translate.setHandler("done", function(obj, item) { Zotero_Browser.finishScraping(obj, item) });
|
|
||||||
this.page.hasBeenTranslated = true;
|
|
||||||
}
|
|
||||||
this.page.translate.clearHandlers("itemDone");
|
this.page.translate.clearHandlers("itemDone");
|
||||||
|
|
||||||
|
this.page.translate.setHandler("done", function(obj, item) { Zotero_Browser.finishScraping(obj, item) });
|
||||||
this.page.translate.setHandler("itemDone", function(obj, dbItem, item) { Zotero_Browser.itemDone(obj, dbItem, item, collection) });
|
this.page.translate.setHandler("itemDone", function(obj, dbItem, item) { Zotero_Browser.itemDone(obj, dbItem, item, collection) });
|
||||||
|
|
||||||
this.page.translate.translate(libraryID);
|
this.page.translate.translate(libraryID);
|
||||||
|
@ -728,10 +789,14 @@ Zotero_Browser.Tab.prototype._translatorsAvailable = function(translate, transla
|
||||||
this.page.translate = translate;
|
this.page.translate = translate;
|
||||||
this.page.translators = translators;
|
this.page.translators = translators;
|
||||||
this.page.document = translate.document;
|
this.page.document = translate.document;
|
||||||
|
|
||||||
|
this.page.translate.clearHandlers("select");
|
||||||
|
this.page.translate.setHandler("select", this._selectItems);
|
||||||
} else if(translate.type != "import" && translate.document.documentURI.length > 7
|
} else if(translate.type != "import" && translate.document.documentURI.length > 7
|
||||||
&& translate.document.documentURI.substr(0, 7) == "file://") {
|
&& translate.document.documentURI.substr(0, 7) == "file://") {
|
||||||
this._attemptLocalFileImport(translate.document);
|
this._attemptLocalFileImport(translate.document);
|
||||||
}
|
}
|
||||||
|
|
||||||
Zotero_Browser.updateStatus();
|
Zotero_Browser.updateStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ var Zotero_LocateMenu = new function() {
|
||||||
var availableEngines = _getAvailableLocateEngines(selectedItems);
|
var availableEngines = _getAvailableLocateEngines(selectedItems);
|
||||||
// add engines that are available for selected items
|
// add engines that are available for selected items
|
||||||
if(availableEngines.length) {
|
if(availableEngines.length) {
|
||||||
_addLocateEngines(locateMenu, availableEngines, true);
|
Zotero_LocateMenu.addLocateEngines(locateMenu, availableEngines, null, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// add "no items selected"
|
// add "no items selected"
|
||||||
|
@ -207,16 +207,21 @@ var Zotero_LocateMenu = new function() {
|
||||||
/**
|
/**
|
||||||
* Add locate engine options to a menu
|
* Add locate engine options to a menu
|
||||||
* @param {menupopup} menu The menu to add menu items to
|
* @param {menupopup} menu The menu to add menu items to
|
||||||
* @param {Zotero.LocateManater.LocateEngine[]} engines The list of engines to add to the menu
|
* @param {Zotero.LocateManager.LocateEngine[]} engines The list of engines to add to the menu
|
||||||
|
* @param {Function|null} items Function to call to locate items
|
||||||
* @param {Boolean} showIcons Whether menu items should have associated icons
|
* @param {Boolean} showIcons Whether menu items should have associated icons
|
||||||
*/
|
*/
|
||||||
function _addLocateEngines(menu, engines, showIcons) {
|
this.addLocateEngines = function(menu, engines, locateFn, showIcons) {
|
||||||
|
if(!locateFn) {
|
||||||
|
locateFn = this.locateItem;
|
||||||
|
}
|
||||||
|
|
||||||
for each(var engine in engines) {
|
for each(var engine in engines) {
|
||||||
var menuitem = _createMenuItem(engine.name, null, engine.description);
|
var menuitem = _createMenuItem(engine.name, null, engine.description);
|
||||||
menuitem.setAttribute("class", "menuitem-iconic");
|
menuitem.setAttribute("class", "menuitem-iconic");
|
||||||
menuitem.setAttribute("image", engine.icon);
|
menuitem.setAttribute("image", engine.icon);
|
||||||
menu.appendChild(menuitem);
|
menu.appendChild(menuitem);
|
||||||
menuitem.addEventListener("command", _locateItem, false);
|
menuitem.addEventListener("command", locateFn, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,8 +275,10 @@ var Zotero_LocateMenu = new function() {
|
||||||
/**
|
/**
|
||||||
* Locate selected items
|
* Locate selected items
|
||||||
*/
|
*/
|
||||||
function _locateItem(event) {
|
this.locateItem = function(event, selectedItems) {
|
||||||
var selectedItems = _getSelectedItems();
|
if(!selectedItems) {
|
||||||
|
selectedItems = _getSelectedItems();
|
||||||
|
}
|
||||||
|
|
||||||
// find selected engine
|
// find selected engine
|
||||||
var selectedEngine = Zotero.LocateManager.getEngineByName(event.target.label);
|
var selectedEngine = Zotero.LocateManager.getEngineByName(event.target.label);
|
||||||
|
|
|
@ -69,7 +69,12 @@
|
||||||
|
|
||||||
<!-- Scrape Code -->
|
<!-- Scrape Code -->
|
||||||
<hbox id="urlbar-icons">
|
<hbox id="urlbar-icons">
|
||||||
<image src="chrome://zotero/skin/treeitem-book.png" id="zotero-status-image" onclick="Zotero_Browser.scrapeThisPage()" position="1" hidden="true"/>
|
<popupset>
|
||||||
|
<menupopup id="zotero-status-image-context" onpopupshowing="Zotero_Browser.onStatusPopupShowing(event)"/>
|
||||||
|
</popupset>
|
||||||
|
<image src="chrome://zotero/skin/treeitem-book.png" id="zotero-status-image"
|
||||||
|
onclick="if(event.button === 0) Zotero_Browser.scrapeThisPage()" context="zotero-status-image-context"
|
||||||
|
position="1" hidden="true"/>
|
||||||
</hbox>
|
</hbox>
|
||||||
|
|
||||||
<menupopup id="menu_ToolsPopup">
|
<menupopup id="menu_ToolsPopup">
|
||||||
|
|
|
@ -269,7 +269,7 @@ Zotero.LocateManager = new function() {
|
||||||
var ns = engine._urlNamespaces[nsPrefix];
|
var ns = engine._urlNamespaces[nsPrefix];
|
||||||
if(!ns) return false;
|
if(!ns) return false;
|
||||||
} else {
|
} else {
|
||||||
if(param === "searchTerms") return [item.getField("title")];
|
if(param === "searchTerms") return [item.title];
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +277,7 @@ Zotero.LocateManager = new function() {
|
||||||
// take a normal "title," even though we don't use it, because it is valid (but not
|
// take a normal "title," even though we don't use it, because it is valid (but not
|
||||||
// preferred) OpenURL
|
// preferred) OpenURL
|
||||||
if(param === "title") {
|
if(param === "title") {
|
||||||
var title = item.getField("title");
|
var title = item.title;
|
||||||
return (title ? [encodeURIComponent(title)] : false);
|
return (title ? [encodeURIComponent(title)] : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ Zotero.LocateManager = new function() {
|
||||||
} else if(param === "year") {
|
} else if(param === "year") {
|
||||||
return (itemOpenURL["rft.date"] ? [itemOpenURL["rft.date"][0].substr(0, 4)] : false);
|
return (itemOpenURL["rft.date"] ? [itemOpenURL["rft.date"][0].substr(0, 4)] : false);
|
||||||
} else {
|
} else {
|
||||||
var result = item.getField(param);
|
var result = item[param];
|
||||||
return (result ? [encodeURIComponent(result)] : false);
|
return (result ? [encodeURIComponent(result)] : false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -412,6 +412,10 @@ Zotero.LocateManager = new function() {
|
||||||
if(responseType && responseType !== "text/html") {
|
if(responseType && responseType !== "text/html") {
|
||||||
throw "LocateManager supports only responseType text/html";
|
throw "LocateManager supports only responseType text/html";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(item.toArray) {
|
||||||
|
item = item.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
var itemAsOpenURL = Zotero.OpenURL.createContextObject(item, "1.0", true);
|
var itemAsOpenURL = Zotero.OpenURL.createContextObject(item, "1.0", true);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
<script src="reportInterface.js"/>
|
<script src="reportInterface.js"/>
|
||||||
<script src="timelineInterface.js"/>
|
<script src="timelineInterface.js"/>
|
||||||
<script src="recognizePDF.js"/>
|
<script src="recognizePDF.js"/>
|
||||||
<script src="browser.js"/>
|
<script src="browser.js" type="application/javascript;version=1.8"/>
|
||||||
<script src="lookup.js"/>
|
<script src="lookup.js"/>
|
||||||
<script src="locateMenu.js" type="application/javascript;version=1.8"/>
|
<script src="locateMenu.js" type="application/javascript;version=1.8"/>
|
||||||
|
|
||||||
|
|
|
@ -398,6 +398,7 @@ save.link = Saving Link…
|
||||||
save.link.error = An error occurred while saving this link.
|
save.link.error = An error occurred while saving this link.
|
||||||
|
|
||||||
ingester.saveToZotero = Save to Zotero
|
ingester.saveToZotero = Save to Zotero
|
||||||
|
ingester.saveToZoteroUsing = Save to Zotero using "%S"
|
||||||
ingester.scraping = Saving Item…
|
ingester.scraping = Saving Item…
|
||||||
ingester.scrapeComplete = Item Saved
|
ingester.scrapeComplete = Item Saved
|
||||||
ingester.scrapeError = Could Not Save Item
|
ingester.scrapeError = Could Not Save Item
|
||||||
|
@ -412,6 +413,9 @@ ingester.importReferRISDialog.checkMsg = Always allow for this site
|
||||||
ingester.importFile.title = Import File
|
ingester.importFile.title = Import File
|
||||||
ingester.importFile.text = Do you want to import the file "%S"?\n\nItems will be added to a new collection.
|
ingester.importFile.text = Do you want to import the file "%S"?\n\nItems will be added to a new collection.
|
||||||
|
|
||||||
|
ingester.lookup.performing = Performing Lookup…
|
||||||
|
ingester.lookup.error = An error occurred while performing lookup for this item.
|
||||||
|
|
||||||
db.dbCorrupted = The Zotero database '%S' appears to have become corrupted.
|
db.dbCorrupted = The Zotero database '%S' appears to have become corrupted.
|
||||||
db.dbCorrupted.restart = Please restart %S to attempt an automatic restore from the last backup.
|
db.dbCorrupted.restart = Please restart %S to attempt an automatic restore from the last backup.
|
||||||
db.dbCorruptedNoBackup = The Zotero database '%S' appears to have become corrupted, and no automatic backup is available.\n\nA new database file has been created. The damaged file was saved in your Zotero directory.
|
db.dbCorruptedNoBackup = The Zotero database '%S' appears to have become corrupted, and no automatic backup is available.\n\nA new database file has been created. The damaged file was saved in your Zotero directory.
|
||||||
|
|
Loading…
Reference in a new issue