Add preferences for ebook & snapshot file handling
This commit is contained in:
parent
2ef560f7d8
commit
deb6acaab1
6 changed files with 129 additions and 77 deletions
|
@ -40,8 +40,10 @@ Zotero_Preferences.General = {
|
|||
'zotero.preferences.launchNonNativeFiles', Zotero.appName
|
||||
);
|
||||
}
|
||||
var menuitem = document.getElementById('fileHandler-internal');
|
||||
menuitem.setAttribute('label', Zotero.appName);
|
||||
var menuitems = document.querySelectorAll('.fileHandler-internal');
|
||||
for (let menuitem of menuitems) {
|
||||
menuitem.setAttribute('label', Zotero.appName);
|
||||
}
|
||||
|
||||
// Set OpenURL resolver drop-down to last-known name
|
||||
if (Zotero.Prefs.get('openURL.resolver')) {
|
||||
|
@ -168,62 +170,65 @@ Zotero_Preferences.General = {
|
|||
},
|
||||
|
||||
_updateFileHandlerUI: function () {
|
||||
var handler = Zotero.Prefs.get('fileHandler.pdf');
|
||||
var menulist = document.getElementById('fileHandler-pdf');
|
||||
var customMenuItem = document.getElementById('fileHandler-custom');
|
||||
var inNewWindowCheckbox = document.getElementById('open-reader-in-new-window');
|
||||
|
||||
// System default
|
||||
if (handler == 'system') {
|
||||
customMenuItem.hidden = true;
|
||||
menulist.selectedIndex = 1;
|
||||
inNewWindowCheckbox.disabled = true;
|
||||
}
|
||||
// Custom handler
|
||||
else if (handler) {
|
||||
let icon;
|
||||
try {
|
||||
let urlspec = Zotero.File.pathToFileURI(handler);
|
||||
icon = "moz-icon://" + urlspec + "?size=16";
|
||||
}
|
||||
catch (e) {
|
||||
Zotero.logError(e);
|
||||
}
|
||||
function update(type) {
|
||||
let handler = Zotero.Prefs.get('fileHandler.' + type);
|
||||
let menulist = document.getElementById('fileHandler-' + type);
|
||||
var customMenuItem = menulist.querySelector('.fileHandler-custom');
|
||||
|
||||
let handlerFilename = OS.Path.basename(handler);
|
||||
if (Zotero.isMac) {
|
||||
handlerFilename = handlerFilename.replace(/\.app$/, '');
|
||||
// System default
|
||||
if (handler == 'system') {
|
||||
customMenuItem.hidden = true;
|
||||
menulist.selectedIndex = 1;
|
||||
}
|
||||
customMenuItem.setAttribute('label', handlerFilename);
|
||||
if (icon) {
|
||||
customMenuItem.className = 'menuitem-iconic';
|
||||
customMenuItem.setAttribute('image', icon);
|
||||
}
|
||||
else {
|
||||
customMenuItem.className = '';
|
||||
}
|
||||
customMenuItem.hidden = false;
|
||||
menulist.selectedIndex = 2;
|
||||
inNewWindowCheckbox.disabled = true;
|
||||
// Custom handler
|
||||
else if (handler) {
|
||||
let icon;
|
||||
try {
|
||||
let urlspec = Zotero.File.pathToFileURI(handler);
|
||||
icon = "moz-icon://" + urlspec + "?size=16";
|
||||
}
|
||||
catch (e) {
|
||||
Zotero.logError(e);
|
||||
}
|
||||
|
||||
// There's almost certainly a better way to do this...
|
||||
// but why doesn't the icon just behave by default?
|
||||
menulist.shadowRoot.querySelector('[part="icon"]').style.height = '16px';
|
||||
}
|
||||
// Zotero
|
||||
else {
|
||||
let menuitem = document.getElementById('fileHandler-internal');
|
||||
menulist.selectedIndex = 0;
|
||||
customMenuItem.hidden = true;
|
||||
inNewWindowCheckbox.disabled = false;
|
||||
let handlerFilename = OS.Path.basename(handler);
|
||||
if (Zotero.isMac) {
|
||||
handlerFilename = handlerFilename.replace(/\.app$/, '');
|
||||
}
|
||||
customMenuItem.setAttribute('label', handlerFilename);
|
||||
if (icon) {
|
||||
customMenuItem.className = 'menuitem-iconic';
|
||||
customMenuItem.setAttribute('image', icon);
|
||||
}
|
||||
else {
|
||||
customMenuItem.className = '';
|
||||
}
|
||||
customMenuItem.hidden = false;
|
||||
menulist.selectedIndex = 2;
|
||||
|
||||
// There's almost certainly a better way to do this...
|
||||
// but why doesn't the icon just behave by default?
|
||||
menulist.shadowRoot.querySelector('[part="icon"]').style.height = '16px';
|
||||
}
|
||||
// Zotero
|
||||
else {
|
||||
menulist.selectedIndex = 0;
|
||||
customMenuItem.hidden = true;
|
||||
}
|
||||
}
|
||||
|
||||
update('pdf');
|
||||
update('epub');
|
||||
update('snapshot');
|
||||
var inNewWindowCheckbox = document.getElementById('open-reader-in-new-window');
|
||||
inNewWindowCheckbox.disabled = ['pdf', 'epub', 'snapshot'].every(type => Zotero.Prefs.get('fileHandler.' + type));
|
||||
},
|
||||
|
||||
_getFileHandlerPref: function (type) {
|
||||
if (type != 'pdf') {
|
||||
if (type != 'pdf' && type != 'epub' && type != 'snapshot') {
|
||||
throw new Error(`Unknown file type ${type}`);
|
||||
}
|
||||
return 'fileHandler.pdf';
|
||||
return 'fileHandler.' + type;
|
||||
},
|
||||
|
||||
handleOpenURLPopupShowing: async function (event) {
|
||||
|
|
|
@ -49,26 +49,48 @@
|
|||
<checkbox label="&zotero.preferences.autoRecognizeFiles;" preference="extensions.zotero.autoRecognizeFiles" native="true"/>
|
||||
</vbox>
|
||||
|
||||
<vbox>
|
||||
<hbox align="center">
|
||||
<label value="&zotero.preferences.fileHandler.openPDFsUsing;" control="file-handler-pdf"/>
|
||||
<menulist id="fileHandler-pdf" class="fileHandler-menu" native="true">
|
||||
<menupopup>
|
||||
<menuitem id="fileHandler-internal"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('pdf', '')"/>
|
||||
<menuitem label="&zotero.preferences.fileHandler.systemDefault;"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('pdf', 'system')"/>
|
||||
<menuitem id="fileHandler-custom"/>
|
||||
<menuitem label="&zotero.preferences.custom;"
|
||||
oncommand="Zotero_Preferences.General.chooseFileHandler('pdf')"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
</hbox>
|
||||
<checkbox id="open-reader-in-new-window" class="indented-pref"
|
||||
label="&zotero.preferences.fileHandler.openReaderInNewWindow;"
|
||||
preference="extensions.zotero.openReaderInNewWindow"
|
||||
native="true"/>
|
||||
<vbox class="fileHandler-menus">
|
||||
<html:label for="fileHandler-pdf">&zotero.preferences.fileHandler.openPDFsUsing;</html:label>
|
||||
<menulist id="fileHandler-pdf" class="fileHandler-menu" native="true">
|
||||
<menupopup>
|
||||
<menuitem class="fileHandler-internal"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('pdf', '')"/>
|
||||
<menuitem label="&zotero.preferences.fileHandler.systemDefault;"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('pdf', 'system')"/>
|
||||
<menuitem class="fileHandler-custom"/>
|
||||
<menuitem label="&zotero.preferences.custom;"
|
||||
oncommand="Zotero_Preferences.General.chooseFileHandler('pdf')"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
<html:label for="fileHandler-epub">&zotero.preferences.fileHandler.openEbooksUsing;</html:label>
|
||||
<menulist id="fileHandler-epub" class="fileHandler-menu" native="true">
|
||||
<menupopup>
|
||||
<menuitem class="fileHandler-internal"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('epub', '')"/>
|
||||
<menuitem label="&zotero.preferences.fileHandler.systemDefault;"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('epub', 'system')"/>
|
||||
<menuitem class="fileHandler-custom"/>
|
||||
<menuitem label="&zotero.preferences.custom;"
|
||||
oncommand="Zotero_Preferences.General.chooseFileHandler('epub')"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
<html:label for="fileHandler-snapshot">&zotero.preferences.fileHandler.openSnapshotsUsing;</html:label>
|
||||
<menulist id="fileHandler-snapshot" class="fileHandler-menu" native="true">
|
||||
<menupopup>
|
||||
<menuitem class="fileHandler-internal"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('snapshot', '')"/>
|
||||
<menuitem label="&zotero.preferences.fileHandler.systemDefault;"
|
||||
oncommand="Zotero_Preferences.General.setFileHandler('snapshot', 'system')"/>
|
||||
<menuitem class="fileHandler-custom"/>
|
||||
<menuitem label="&zotero.preferences.custom;"
|
||||
oncommand="Zotero_Preferences.General.chooseFileHandler('snapshot')"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
</vbox>
|
||||
<checkbox id="open-reader-in-new-window" class="indented-pref"
|
||||
label="&zotero.preferences.fileHandler.openReaderInNewWindow;"
|
||||
preference="extensions.zotero.openReaderInNewWindow"
|
||||
native="true"/>
|
||||
</groupbox>
|
||||
|
||||
<groupbox id="zotero-prefpane-file-renaming-groupbox">
|
||||
|
|
|
@ -4722,9 +4722,20 @@ var ZoteroPane = new function()
|
|||
if (['application/pdf', 'application/epub+zip', 'text/html'].includes(contentType)) {
|
||||
let item = await Zotero.Items.getAsync(itemID);
|
||||
let library = Zotero.Libraries.get(item.libraryID);
|
||||
let pdfHandler = Zotero.Prefs.get("fileHandler.pdf");
|
||||
let type;
|
||||
if (contentType === 'application/pdf') {
|
||||
type = 'pdf';
|
||||
}
|
||||
else if (contentType === 'application/epub+zip') {
|
||||
type = 'epub';
|
||||
}
|
||||
else {
|
||||
type = 'snapshot';
|
||||
}
|
||||
let handler = Zotero.Prefs.get('fileHandler.' + type);
|
||||
|
||||
// Zotero PDF reader
|
||||
if (!pdfHandler) {
|
||||
if (!handler) {
|
||||
let openInWindow = Zotero.Prefs.get('openReaderInNewWindow');
|
||||
let useAlternateWindowBehavior = event?.shiftKey || extraData?.forceAlternateWindowBehavior;
|
||||
if (useAlternateWindowBehavior) {
|
||||
|
@ -4740,8 +4751,9 @@ var ZoteroPane = new function()
|
|||
);
|
||||
return;
|
||||
}
|
||||
// Try to open external reader to page number if specified
|
||||
else {
|
||||
// Try to open external PDF reader to page number if specified
|
||||
// TODO: Implement for EPUBs if readers support it
|
||||
else if (type == 'pdf') {
|
||||
let pageIndex = extraData?.location?.position?.pageIndex;
|
||||
if (pageIndex !== undefined) {
|
||||
await Zotero.OpenPDF.openToPage(
|
||||
|
@ -4753,17 +4765,17 @@ var ZoteroPane = new function()
|
|||
}
|
||||
// Custom PDF handler
|
||||
// TODO: Remove this and unify with Zotero.OpenPDF
|
||||
if (pdfHandler != 'system') {
|
||||
if (handler != 'system') {
|
||||
try {
|
||||
if (await OS.File.exists(pdfHandler)) {
|
||||
Zotero.launchFileWithApplication(path, pdfHandler);
|
||||
if (await OS.File.exists(handler)) {
|
||||
Zotero.launchFileWithApplication(path, handler);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
Zotero.logError(e);
|
||||
}
|
||||
Zotero.logError(`${pdfHandler} not found -- launching file normally`);
|
||||
Zotero.logError(`${handler} not found -- launching file normally`);
|
||||
}
|
||||
}
|
||||
Zotero.launchFile(path);
|
||||
|
|
|
@ -17,8 +17,10 @@
|
|||
<!ENTITY zotero.preferences.autoRecognizeFiles "Automatically retrieve metadata for PDFs and ebooks">
|
||||
<!ENTITY zotero.preferences.autoRenameFiles.renameLinked "Rename linked files">
|
||||
<!ENTITY zotero.preferences.fileHandler.openPDFsUsing "Open PDFs using">
|
||||
<!ENTITY zotero.preferences.fileHandler.openEbooksUsing "Open ebooks using">
|
||||
<!ENTITY zotero.preferences.fileHandler.openSnapshotsUsing "Open snapshots using">
|
||||
<!ENTITY zotero.preferences.fileHandler.systemDefault "System Default">
|
||||
<!ENTITY zotero.preferences.fileHandler.openReaderInNewWindow "Open PDFs in new windows instead of tabs">
|
||||
<!ENTITY zotero.preferences.fileHandler.openReaderInNewWindow "Open in new windows instead of tabs">
|
||||
|
||||
<!ENTITY zotero.preferences.miscellaneous "Miscellaneous">
|
||||
<!ENTITY zotero.preferences.autoUpdate "Automatically check for updated translators and styles">
|
||||
|
|
|
@ -278,6 +278,15 @@ button {
|
|||
margin-inline-start: 2em;
|
||||
}
|
||||
|
||||
.fileHandler-menus {
|
||||
display: grid;
|
||||
grid-template-columns: max-content max-content;
|
||||
align-items: center;
|
||||
justify-content: start;
|
||||
column-gap: 1em;
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
.fileHandler-menu .menulist-icon {
|
||||
height: 16px;
|
||||
}
|
||||
|
|
|
@ -186,6 +186,8 @@ pref("extensions.zotero.purge.tags", false);
|
|||
pref("extensions.zotero.pane.persist", "");
|
||||
|
||||
pref("extensions.zotero.fileHandler.pdf", "");
|
||||
pref("extensions.zotero.fileHandler.epub", "");
|
||||
pref("extensions.zotero.fileHandler.snapshot", "");
|
||||
pref("extensions.zotero.openReaderInNewWindow", false);
|
||||
|
||||
// File/URL opening executable if launch() fails
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue