Add "Include Zotero Links" option for note export and QuickCopy

Fixes #2349
This commit is contained in:
Martynas Bagdonas 2022-06-29 14:58:37 +03:00 committed by Dan Stillman
parent f2bfaeb7a9
commit d0d3ed731d
9 changed files with 147 additions and 24 deletions

View file

@ -238,26 +238,29 @@ var Zotero_File_Interface = new function() {
/* /*
* exports items to clipboard * exports items to clipboard
*/ */
function exportItemsToClipboard(items, translatorID) { function exportItemsToClipboard(items, format) {
function _translate(items, translatorID, callback) { function _translate(items, format, callback) {
let translation = new Zotero.Translate.Export(); let translation = new Zotero.Translate.Export();
translation.setItems(items.slice()); translation.setItems(items.slice());
translation.setTranslator(translatorID); translation.setTranslator(format.id);
if (format.options) {
translation.setDisplayOptions(format.options);
}
translation.setHandler("done", callback); translation.setHandler("done", callback);
translation.translate(); translation.translate();
} }
// If translating with virtual "Markdown + Rich Text" translator, use Note Markdown and // If translating with virtual "Markdown + Rich Text" translator, use Note Markdown and
// Note HTML instead // Note HTML instead
if (translatorID == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) { if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
translatorID = Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN; let markdownFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN, options: format.markdownOptions };
_translate(items, translatorID, (obj, worked) => { let htmlFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML, options: format.htmlOptions };
_translate(items, markdownFormat, (obj, worked) => {
if (!worked) { if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning'); Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');
return; return;
} }
translatorID = Zotero.Translators.TRANSLATOR_ID_NOTE_HTML; _translate(items, htmlFormat, (obj2, worked) => {
_translate(items, translatorID, (obj2, worked) => {
if (!worked) { if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning'); Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');
return; return;
@ -293,14 +296,14 @@ var Zotero_File_Interface = new function() {
}); });
} }
else { else {
_translate(items, translatorID, (obj, worked) => { _translate(items, format, (obj, worked) => {
if (!worked) { if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning'); Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');
return; return;
} }
let text = obj.string; let text = obj.string;
// For Note HTML translator use body content only // For Note HTML translator use body content only
if (translatorID == Zotero.Translators.TRANSLATOR_ID_NOTE_HTML) { if (format.id == Zotero.Translators.TRANSLATOR_ID_NOTE_HTML) {
let parser = Components.classes['@mozilla.org/xmlextras/domparser;1'] let parser = Components.classes['@mozilla.org/xmlextras/domparser;1']
.createInstance(Components.interfaces.nsIDOMParser); .createInstance(Components.interfaces.nsIDOMParser);
let doc = parser.parseFromString(text, 'text/html'); let doc = parser.parseFromString(text, 'text/html');

View file

@ -2012,8 +2012,8 @@ var ItemTree = class ItemTree extends LibraryTree {
// If exporting with virtual "Markdown + Rich Text" translator, call Note Markdown // If exporting with virtual "Markdown + Rich Text" translator, call Note Markdown
// and Note HTML translators instead // and Note HTML translators instead
if (format.id === Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) { if (format.id === Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
let markdownFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN }; let markdownFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN, options: format.markdownOptions };
let htmlFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML }; let htmlFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML, options: format.htmlOptions };
Zotero.QuickCopy.getContentFromItems(items, markdownFormat, (obj, worked) => { Zotero.QuickCopy.getContentFromItems(items, markdownFormat, (obj, worked) => {
if (!worked) { if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning'); Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');

View file

@ -94,6 +94,8 @@ Zotero_Preferences.Export = {
format = Zotero.QuickCopy.unserializeSetting(format); format = Zotero.QuickCopy.unserializeSetting(format);
var menulist = document.getElementById("zotero-noteQuickCopy-menu"); var menulist = document.getElementById("zotero-noteQuickCopy-menu");
menulist.setAttribute('preference', "pref-noteQuickCopy-setting"); menulist.setAttribute('preference', "pref-noteQuickCopy-setting");
menulist.removeEventListener('command', this.updateNoteQuickCopyUI);
menulist.addEventListener('command', this.updateNoteQuickCopyUI);
if (!format) { if (!format) {
format = menulist.value; format = menulist.value;
@ -149,11 +151,42 @@ Zotero_Preferences.Export = {
return; return;
} }
var val = JSON.stringify({ mode: 'export', id: translator.translatorID }); var value = { mode: 'export', id: translator.translatorID };
if (translator.translatorID == format.id) {
value = format;
}
else if (translator.translatorID == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
value = {
mode: 'export',
id: translator.translatorID,
markdownOptions: {
includeAppLinks: true
},
htmlOptions: {
includeAppLinks: false
}
};
if (format.id == Zotero.Translators.TRANSLATOR_ID_NOTE_HTML && format.options) {
value.htmlOptions = format.options;
}
}
else if (translator.translatorID == Zotero.Translators.TRANSLATOR_ID_NOTE_HTML) {
value = {
mode: 'export',
id: translator.translatorID,
options: {
includeAppLinks: false
}
};
if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT && format.htmlOptions) {
value.options = format.htmlOptions;
}
}
value = JSON.stringify(value);
var itemNode = document.createElement('menuitem'); var itemNode = document.createElement('menuitem');
itemNode.setAttribute('value', val); itemNode.setAttribute('value', value);
itemNode.setAttribute('label', translator.label); itemNode.setAttribute('label', translator.label);
// itemNode.setAttribute('oncommand', 'Zotero_Preferences.Export.updateQuickCopyUI()');
popup.appendChild(itemNode); popup.appendChild(itemNode);
if (format.mode == 'export' && format.id == translator.translatorID) { if (format.mode == 'export' && format.id == translator.translatorID) {
@ -162,6 +195,70 @@ Zotero_Preferences.Export = {
}); });
menulist.click(); menulist.click();
this.updateNoteQuickCopyUI();
},
updateNoteQuickCopyUI: () => {
var format = document.getElementById('zotero-noteQuickCopy-menu').value;
format = JSON.parse(format);
var markdownOptions = document.getElementById('zotero-noteQuickCopy-markdown-options');
var htmlOptions = document.getElementById('zotero-noteQuickCopy-html-options');
var markdownIncludeAppLinks = document.getElementById("zotero-noteQuickCopy-markdown-includeAppLinks");
var htmlIncludeAppLinks = document.getElementById("zotero-noteQuickCopy-html-includeAppLinks");
markdownIncludeAppLinks.label = Zotero.getString('exportOptions.includeAppLinks', Zotero.appName);
htmlIncludeAppLinks.label = Zotero.getString('exportOptions.includeAppLinks', Zotero.appName);
if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
markdownOptions.hidden = false;
htmlOptions.hidden = false;
markdownIncludeAppLinks.checked = format.markdownOptions && format.markdownOptions.includeAppLinks;
htmlIncludeAppLinks.checked = format.htmlOptions && format.htmlOptions.includeAppLinks;
}
else if (format.id == Zotero.Translators.TRANSLATOR_ID_NOTE_HTML) {
markdownOptions.hidden = true;
htmlOptions.hidden = false;
htmlIncludeAppLinks.checked = format.options && format.options.includeAppLinks;
}
else {
markdownOptions.hidden = true;
htmlOptions.hidden = true;
}
},
onUpdateNoteExportOptions() {
var menulist = document.getElementById("zotero-noteQuickCopy-menu");
var markdownIncludeAppLinks = document.getElementById("zotero-noteQuickCopy-markdown-includeAppLinks");
var htmlIncludeAppLinks = document.getElementById("zotero-noteQuickCopy-html-includeAppLinks");
for (let i = 0; i < menulist.itemCount; i++) {
let item = menulist.getItemAtIndex(i);
let format = JSON.parse(item.getAttribute('value'));
if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
if (!format.markdownOptions) {
format.markdownOptions = {};
}
if (!format.htmlOptions) {
format.htmlOptions = {};
}
format.markdownOptions.includeAppLinks = markdownIncludeAppLinks.checked;
format.htmlOptions.includeAppLinks = htmlIncludeAppLinks.checked;
}
else if (format.id == Zotero.Translators.TRANSLATOR_ID_NOTE_HTML) {
if (!format.options) {
format.options = {};
}
format.options.includeAppLinks = htmlIncludeAppLinks.checked;
}
else {
continue;
}
item.value = JSON.stringify(format);
}
// After updating menulist item value we have to wait a bit before doing click(), to avoid anomalies
// like an empty row in menulist. 0 in setTimeout is not enough
setTimeout(() => menulist.click(), 50);
}, },

View file

@ -72,6 +72,24 @@
<label value="&zotero.preferences.quickCopy.noteFormat;" control="zotero-noteQuickCopy-menu"/> <label value="&zotero.preferences.quickCopy.noteFormat;" control="zotero-noteQuickCopy-menu"/>
<menulist id="zotero-noteQuickCopy-menu" label="&zotero.general.loading;"/> <menulist id="zotero-noteQuickCopy-menu" label="&zotero.general.loading;"/>
<vbox id="zotero-noteQuickCopy-markdown-options">
<label value="&zotero.preferences.quickCopy.markdown;"/>
<vbox style="margin-left: 2em">
<checkbox id="zotero-noteQuickCopy-markdown-includeAppLinks"
label="Include App Links"
oncommand="Zotero_Preferences.Export.onUpdateNoteExportOptions()"/>
</vbox>
</vbox>
<vbox id="zotero-noteQuickCopy-html-options">
<label value="&zotero.preferences.quickCopy.html;"/>
<vbox style="margin-left: 2em">
<checkbox id="zotero-noteQuickCopy-html-includeAppLinks"
label="Include App Links"
oncommand="Zotero_Preferences.Export.onUpdateNoteExportOptions()"/>
</vbox>
</vbox>
<separator/> <separator/>
<label value="&zotero.preferences.quickCopy.siteEditor.setings;" control="quickCopy-siteSettings"/> <label value="&zotero.preferences.quickCopy.siteEditor.setings;" control="quickCopy-siteSettings"/>

View file

@ -269,6 +269,9 @@ Zotero.QuickCopy = new function() {
// Allow to reuse items array // Allow to reuse items array
translation.setItems(items.slice()); translation.setItems(items.slice());
translation.setTranslator(format.id); translation.setTranslator(format.id);
if (format.options) {
translation.setDisplayOptions(format.options);
}
translation.setHandler("done", callback); translation.setHandler("done", callback);
translation.translate(); translation.translate();
return true; return true;
@ -325,8 +328,8 @@ Zotero.QuickCopy = new function() {
// If virtual "Markdown + Rich Text" translator is selected, preload Note Markdown and // If virtual "Markdown + Rich Text" translator is selected, preload Note Markdown and
// Note HTML translators // Note HTML translators
if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) { if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
await _preloadFormat({ mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN }); await _preloadFormat({ mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN, options: format.markdownOptions });
await _preloadFormat({ mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML }); await _preloadFormat({ mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML, options: format.htmlOptions });
return; return;
} }
return _preloadFormat(format); return _preloadFormat(format);

View file

@ -443,8 +443,8 @@ class ReaderInstance {
// If exporting with virtual "Markdown + Rich Text" translator, call Note Markdown // If exporting with virtual "Markdown + Rich Text" translator, call Note Markdown
// and Note HTML translators instead // and Note HTML translators instead
if (format.id === Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) { if (format.id === Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
let markdownFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN }; let markdownFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN, options: format.markdownOptions };
let htmlFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML }; let htmlFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML, options: format.htmlOptions };
Zotero.QuickCopy.getContentFromItems(items, markdownFormat, (obj, worked) => { Zotero.QuickCopy.getContentFromItems(items, markdownFormat, (obj, worked) => {
if (!worked) { if (!worked) {
return; return;

View file

@ -2401,7 +2401,7 @@ var ZoteroPane = new function()
return; return;
} }
else { else {
Zotero_File_Interface.exportItemsToClipboard(items, format.id); Zotero_File_Interface.exportItemsToClipboard(items, format);
} }
} }
} }

View file

@ -107,6 +107,8 @@
<!ENTITY zotero.preferences.quickCopy.caption "Quick Copy"> <!ENTITY zotero.preferences.quickCopy.caption "Quick Copy">
<!ENTITY zotero.preferences.quickCopy.itemFormat "Item Format:"> <!ENTITY zotero.preferences.quickCopy.itemFormat "Item Format:">
<!ENTITY zotero.preferences.quickCopy.noteFormat "Note Format:"> <!ENTITY zotero.preferences.quickCopy.noteFormat "Note Format:">
<!ENTITY zotero.preferences.quickCopy.markdown "Markdown:">
<!ENTITY zotero.preferences.quickCopy.html "Rich Text/HTML:">
<!ENTITY zotero.preferences.quickCopy.copyAsHTML "Copy as HTML"> <!ENTITY zotero.preferences.quickCopy.copyAsHTML "Copy as HTML">
<!ENTITY zotero.preferences.quickCopy.siteEditor.setings "Site-Specific Settings:"> <!ENTITY zotero.preferences.quickCopy.siteEditor.setings "Site-Specific Settings:">
<!ENTITY zotero.preferences.quickCopy.siteEditor.domainPath "Domain/Path"> <!ENTITY zotero.preferences.quickCopy.siteEditor.domainPath "Domain/Path">

View file

@ -129,7 +129,7 @@ pref("extensions.zotero.rtfScan.lastOutputFile", "");
pref("extensions.zotero.export.quickCopy.setting", "bibliography=http://www.zotero.org/styles/chicago-note-bibliography"); pref("extensions.zotero.export.quickCopy.setting", "bibliography=http://www.zotero.org/styles/chicago-note-bibliography");
pref("extensions.zotero.export.quickCopy.dragLimit", 50); pref("extensions.zotero.export.quickCopy.dragLimit", 50);
pref("extensions.zotero.export.noteQuickCopy.setting", '{"mode": "export", "id": "a45eca67-1ee8-45e5-b4c6-23fb8a852873"}'); pref("extensions.zotero.export.noteQuickCopy.setting", '{"mode":"export","id":"a45eca67-1ee8-45e5-b4c6-23fb8a852873","markdownOptions":{"includeAppLinks":true},"htmlOptions":{"includeAppLinks":false}}');
// Integration settings // Integration settings
pref("extensions.zotero.integration.port", 50001); pref("extensions.zotero.integration.port", 50001);