Merge pull request #2676 from mrtcode/note-html-export-links

Add "Include Zotero Links" option for note export and QuickCopy
This commit is contained in:
Dan Stillman 2022-10-22 16:47:18 -04:00
commit 70f9462913
14 changed files with 188 additions and 28 deletions

View file

@ -238,26 +238,29 @@ var Zotero_File_Interface = new function() {
/*
* exports items to clipboard
*/
function exportItemsToClipboard(items, translatorID) {
function _translate(items, translatorID, callback) {
function exportItemsToClipboard(items, format) {
function _translate(items, format, callback) {
let translation = new Zotero.Translate.Export();
translation.setItems(items.slice());
translation.setTranslator(translatorID);
translation.setTranslator(format.id);
if (format.options) {
translation.setDisplayOptions(format.options);
}
translation.setHandler("done", callback);
translation.translate();
}
// If translating with virtual "Markdown + Rich Text" translator, use Note Markdown and
// Note HTML instead
if (translatorID == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
translatorID = Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN;
_translate(items, translatorID, (obj, worked) => {
if (format.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
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, options: format.htmlOptions };
_translate(items, markdownFormat, (obj, worked) => {
if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');
return;
}
translatorID = Zotero.Translators.TRANSLATOR_ID_NOTE_HTML;
_translate(items, translatorID, (obj2, worked) => {
_translate(items, htmlFormat, (obj2, worked) => {
if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');
return;
@ -293,14 +296,14 @@ var Zotero_File_Interface = new function() {
});
}
else {
_translate(items, translatorID, (obj, worked) => {
_translate(items, format, (obj, worked) => {
if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');
return;
}
let text = obj.string;
// 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']
.createInstance(Components.interfaces.nsIDOMParser);
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
// and Note HTML translators instead
if (format.id === Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
let markdownFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN };
let htmlFormat = { mode: 'export', id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML };
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, options: format.htmlOptions };
Zotero.QuickCopy.getContentFromItems(items, markdownFormat, (obj, worked) => {
if (!worked) {
Zotero.log(Zotero.getString('fileInterface.exportError'), 'warning');

View file

@ -89,12 +89,16 @@ Zotero_Preferences.Export = {
* Builds the note Quick Copy drop-down from the current global pref
*/
populateNoteQuickCopyList: async function () {
document.getElementById('noteQuickCopy-format-options').removeAttribute('hidden');
// Initialize default format drop-down
var format = Zotero.Prefs.get("export.noteQuickCopy.setting");
format = Zotero.QuickCopy.unserializeSetting(format);
var menulist = document.getElementById("zotero-noteQuickCopy-menu");
menulist.setAttribute('preference', "pref-noteQuickCopy-setting");
menulist.removeEventListener('command', this.updateNoteQuickCopyUI);
menulist.addEventListener('command', this.updateNoteQuickCopyUI);
if (!format) {
format = menulist.value;
}
@ -149,11 +153,42 @@ Zotero_Preferences.Export = {
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');
itemNode.setAttribute('value', val);
itemNode.setAttribute('value', value);
itemNode.setAttribute('label', translator.label);
// itemNode.setAttribute('oncommand', 'Zotero_Preferences.Export.updateQuickCopyUI()');
popup.appendChild(itemNode);
if (format.mode == 'export' && format.id == translator.translatorID) {
@ -162,6 +197,70 @@ Zotero_Preferences.Export = {
});
menulist.click();
this.updateNoteQuickCopyUI();
},
updateNoteQuickCopyUI: () => {
var format = document.getElementById('zotero-noteQuickCopy-menu').value;
format = JSON.parse(format);
var markdownOptions = document.getElementById('noteQuickCopy-markdown-options');
var htmlOptions = document.getElementById('noteQuickCopy-html-options');
var markdownIncludeAppLinks = document.getElementById("noteQuickCopy-markdown-includeAppLinks");
var htmlIncludeAppLinks = document.getElementById("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("noteQuickCopy-markdown-includeAppLinks");
var htmlIncludeAppLinks = document.getElementById("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

@ -71,9 +71,38 @@
<label value="&zotero.preferences.quickCopy.noteFormat;" control="zotero-noteQuickCopy-menu"/>
<menulist id="zotero-noteQuickCopy-menu" label="&zotero.general.loading;"/>
<table id="noteQuickCopy-format-options"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
hidden="hidden">
<tbody id="noteQuickCopy-markdown-options">
<tr>
<th>
<xul:label value="&zotero.preferences.quickCopy.markdown;"/>
</th>
<td>
<xul:checkbox id="noteQuickCopy-markdown-includeAppLinks"
oncommand="Zotero_Preferences.Export.onUpdateNoteExportOptions()"/>
</td>
</tr>
</tbody>
<tbody id="noteQuickCopy-html-options">
<tr>
<th>
<xul:label value="&zotero.preferences.quickCopy.html;"/>
</th>
<td>
<xul:checkbox id="noteQuickCopy-html-includeAppLinks"
oncommand="Zotero_Preferences.Export.onUpdateNoteExportOptions()"/>
</td>
</tr>
</tbody>
</table>
<separator/>
<label value="&zotero.preferences.quickCopy.siteEditor.setings;" control="quickCopy-siteSettings"/>
<hbox class="virtualized-table-container" flex="1" height="120px">
<html:div id="quickCopy-siteSettings"/>

View file

@ -49,7 +49,7 @@ Zotero.Prefs = new function(){
if (!fromVersion) {
fromVersion = 0;
}
var toVersion = 5;
var toVersion = 6;
if (fromVersion < toVersion) {
for (var i = fromVersion + 1; i <= toVersion; i++) {
switch (i) {
@ -85,6 +85,24 @@ Zotero.Prefs = new function(){
case 5:
this.clear('extensions.spellcheck.inline.max-misspellings', true);
break;
// If the note Quick Copy setting was set to Markdown + Rich Text but in a
// non-default way (e.g., because of whitespace differences), clear the pref
// to pick up the new app-link options
case 6:
var o = this.get('export.noteQuickCopy.setting');
try {
o = JSON.parse(o);
if (o.mode == 'export'
&& o.id == Zotero.Translators.TRANSLATOR_ID_MARKDOWN_AND_RICH_TEXT) {
this.clear('export.noteQuickCopy.setting');
}
}
catch (e) {
Zotero.logError(e);
this.clear('export.noteQuickCopy.setting');
}
break;
}
}
this.set('prefVersion', toVersion);

View file

@ -269,6 +269,9 @@ Zotero.QuickCopy = new function() {
// Allow to reuse items array
translation.setItems(items.slice());
translation.setTranslator(format.id);
if (format.options) {
translation.setDisplayOptions(format.options);
}
translation.setHandler("done", callback);
translation.translate();
return true;
@ -325,8 +328,8 @@ Zotero.QuickCopy = new function() {
// If virtual "Markdown + Rich Text" translator is selected, preload Note Markdown and
// Note HTML translators
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_HTML });
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, options: format.htmlOptions });
return;
}
return _preloadFormat(format);

View file

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

View file

@ -2401,7 +2401,7 @@ var ZoteroPane = new function()
return;
}
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.itemFormat "Item 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.siteEditor.setings "Site-Specific Settings:">
<!ENTITY zotero.preferences.quickCopy.siteEditor.domainPath "Domain/Path">

View file

@ -264,6 +264,12 @@ grid row hbox:first-child
min-height: 1.5em; /* Fix collapse on Windows */
}
#noteQuickCopy-format-options th {
font-weight: normal;
text-align: right;
max-width: 3.6em;
}
/*
* Cite pane
*/

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.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
pref("extensions.zotero.integration.port", 50001);

View file

@ -1 +1 @@
2022-09-28 08:35:26
2022-10-22 20:40:04

View file

@ -17,7 +17,7 @@ function makePath {
if [ -z "$FX_EXECUTABLE" ]; then
if [ "`uname`" == "Darwin" ]; then
FX_EXECUTABLE="$( dirname "$ROOT_DIR" )/zotero-standalone-build/xulrunner/Firefox.app/Contents/MacOS/firefox"
FX_EXECUTABLE="$( dirname "$ROOT_DIR" )/zotero-standalone-build-60/xulrunner/Firefox.app/Contents/MacOS/firefox"
else
FX_EXECUTABLE="$( dirname "$ROOT_DIR" )/zotero-standalone-build/xulrunner/firefox-x86_64/firefox"
fi

@ -1 +1 @@
Subproject commit 6538b03fa30878ee48840ffc237e3c39c57bc1cc
Subproject commit 37a8ce41f51f9c5ff6d0019cf3f1fb55c0855390