Restore site-specific Quick Copy settings
Using the last URL passed by a connector Closes https://github.com/zotero/zotero-connectors/issues/145
This commit is contained in:
parent
2928752d19
commit
6d265f448f
8 changed files with 100 additions and 121 deletions
|
@ -66,9 +66,7 @@ Zotero_Preferences.Export = {
|
||||||
this._lastSelectedLocale = Zotero.Prefs.get("export.quickCopy.locale");
|
this._lastSelectedLocale = Zotero.Prefs.get("export.quickCopy.locale");
|
||||||
this.updateQuickCopyUI();
|
this.updateQuickCopyUI();
|
||||||
|
|
||||||
if (!Zotero.isStandalone) {
|
|
||||||
yield this.refreshQuickCopySiteList();
|
yield this.refreshQuickCopySiteList();
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,30 @@
|
||||||
oncommand="Zotero_Preferences.Export.buildQuickCopyFormatDropDown(document.getElementById('zotero-quickCopy-menu'), this.checked ? 'html' : '');"/>
|
oncommand="Zotero_Preferences.Export.buildQuickCopyFormatDropDown(document.getElementById('zotero-quickCopy-menu'), this.checked ? 'html' : '');"/>
|
||||||
</hbox>
|
</hbox>
|
||||||
|
|
||||||
<vbox id="zotero-prefpane-export-siteSettings"/>
|
<separator/>
|
||||||
|
|
||||||
|
<label value="&zotero.preferences.quickCopy.siteEditor.setings;" control="quickCopy-siteSettings"/>
|
||||||
|
<tree flex="1" id="quickCopy-siteSettings" hidecolumnpicker="true" rows="6" seltype="single"
|
||||||
|
ondblclick="Zotero_Preferences.Export.showQuickCopySiteEditor(this.currentIndex)"
|
||||||
|
onselect="Zotero_Preferences.Export.enableQuickCopySiteButtons()"
|
||||||
|
onkeypress="if (event.keyCode == event.DOM_VK_DELETE) { Zotero_Preferences.Export.deleteSelectedQuickCopySite(); }">
|
||||||
|
<treecols>
|
||||||
|
<treecol id="quickCopy-urlColumn" label="&zotero.preferences.quickCopy.siteEditor.domainPath;" flex="1"/>
|
||||||
|
<treecol id="quickCopy-formatColumn" label="&zotero.preferences.quickCopy.siteEditor.outputFormat;" flex="2"/>
|
||||||
|
<treecol id="quickCopy-localeColumn" label="&zotero.preferences.quickCopy.siteEditor.locale;"/>
|
||||||
|
<treecol id="quickCopy-copyAsHTML" label="HTML"/>
|
||||||
|
</treecols>
|
||||||
|
<treechildren id="quickCopy-siteSettings-rows"/>
|
||||||
|
</tree>
|
||||||
|
<separator class="thin"/>
|
||||||
|
<hbox>
|
||||||
|
<button disabled="true" id="quickCopy-edit" label="&zotero.general.edit;"
|
||||||
|
onclick="Zotero_Preferences.Export.showQuickCopySiteEditor(document.getElementById('quickCopy-siteSettings').currentIndex)"/>
|
||||||
|
<spacer flex="1"/>
|
||||||
|
<button disabled="true" id="quickCopy-delete" label="-" onclick="Zotero_Preferences.Export.deleteSelectedQuickCopySite()"/>
|
||||||
|
<button label="+"
|
||||||
|
onclick="Zotero_Preferences.Export.showQuickCopySiteEditor()"/>
|
||||||
|
</hbox>
|
||||||
|
|
||||||
<hbox align="center">
|
<hbox align="center">
|
||||||
<label value="&zotero.preferences.quickCopy.dragLimit;"/>
|
<label value="&zotero.preferences.quickCopy.dragLimit;"/>
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<!--
|
|
||||||
***** BEGIN LICENSE BLOCK *****
|
|
||||||
|
|
||||||
Copyright © 2006–2013 Center for History and New Media
|
|
||||||
George Mason University, Fairfax, Virginia, USA
|
|
||||||
http://zotero.org
|
|
||||||
|
|
||||||
This file is part of Zotero.
|
|
||||||
|
|
||||||
Zotero is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
Zotero is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
***** END LICENSE BLOCK *****
|
|
||||||
-->
|
|
||||||
<!DOCTYPE prefwindow [
|
|
||||||
<!ENTITY % preferencesDTD SYSTEM "chrome://zotero/locale/preferences.dtd"> %preferencesDTD;
|
|
||||||
<!ENTITY % zoteroDTD SYSTEM "chrome://zotero/locale/zotero.dtd"> %zoteroDTD;
|
|
||||||
]>
|
|
||||||
|
|
||||||
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
||||||
<prefpane id="zotero-prefpane-export">
|
|
||||||
<groupbox id="zotero-prefpane-export-groupbox">
|
|
||||||
<vbox id="zotero-prefpane-export-siteSettings">
|
|
||||||
<separator/>
|
|
||||||
|
|
||||||
<label value="&zotero.preferences.quickCopy.siteEditor.setings;" control="quickCopy-siteSettings"/>
|
|
||||||
<tree flex="1" id="quickCopy-siteSettings" hidecolumnpicker="true" rows="6" seltype="single"
|
|
||||||
ondblclick="Zotero_Preferences.Export.showQuickCopySiteEditor(this.currentIndex)"
|
|
||||||
onselect="Zotero_Preferences.Export.enableQuickCopySiteButtons()"
|
|
||||||
onkeypress="if (event.keyCode == event.DOM_VK_DELETE) { Zotero_Preferences.Export.deleteSelectedQuickCopySite(); }">
|
|
||||||
<treecols>
|
|
||||||
<treecol id="quickCopy-urlColumn" label="&zotero.preferences.quickCopy.siteEditor.domainPath;" flex="1"/>
|
|
||||||
<treecol id="quickCopy-formatColumn" label="&zotero.preferences.quickCopy.siteEditor.outputFormat;" flex="2"/>
|
|
||||||
<treecol id="quickCopy-localeColumn" label="&zotero.preferences.quickCopy.siteEditor.locale;"/>
|
|
||||||
<treecol id="quickCopy-copyAsHTML" label="HTML"/>
|
|
||||||
</treecols>
|
|
||||||
<treechildren id="quickCopy-siteSettings-rows"/>
|
|
||||||
</tree>
|
|
||||||
<separator class="thin"/>
|
|
||||||
<hbox>
|
|
||||||
<button disabled="true" id="quickCopy-edit" label="&zotero.general.edit;"
|
|
||||||
onclick="Zotero_Preferences.Export.showQuickCopySiteEditor(document.getElementById('quickCopy-siteSettings').currentIndex)"/>
|
|
||||||
<spacer flex="1"/>
|
|
||||||
<button disabled="true" id="quickCopy-delete" label="-" onclick="Zotero_Preferences.Export.deleteSelectedQuickCopySite()"/>
|
|
||||||
<button label="+"
|
|
||||||
onclick="Zotero_Preferences.Export.showQuickCopySiteEditor()"/>
|
|
||||||
</hbox>
|
|
||||||
</vbox>
|
|
||||||
</groupbox>
|
|
||||||
</prefpane>
|
|
||||||
</overlay>
|
|
|
@ -45,30 +45,9 @@
|
||||||
<script src="preferences.js"/>
|
<script src="preferences.js"/>
|
||||||
<script src="preferences_export.js"/>
|
<script src="preferences_export.js"/>
|
||||||
|
|
||||||
<script>
|
|
||||||
<![CDATA[
|
|
||||||
var Zotero_QuickCopySiteEditor = new function () {
|
|
||||||
this.onAccept = onAccept;
|
|
||||||
|
|
||||||
function onAccept() {
|
|
||||||
var io = window.arguments[0];
|
|
||||||
io.domain = document.getElementById('zotero-quickCopy-domain').value;
|
|
||||||
io.format = document.getElementById('zotero-quickCopy-menu').value;
|
|
||||||
|
|
||||||
io.locale = '';
|
|
||||||
if (!document.getElementById('zotero-quickCopy-locale-menu').disabled) {
|
|
||||||
io.locale = document.getElementById('zotero-quickCopy-locale-menu').value;
|
|
||||||
}
|
|
||||||
|
|
||||||
io.ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]]>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<vbox id="zotero-preferences-quickCopySiteEditor">
|
<vbox id="zotero-preferences-quickCopySiteEditor">
|
||||||
<label value="&zotero.preferences.quickCopy.siteEditor.domainPath; &zotero.preferences.quickCopy.siteEditor.domainPath.example;" control="zotero-quickCopy-domain"/>
|
<label value="&zotero.preferences.quickCopy.siteEditor.domainPath; &zotero.preferences.quickCopy.siteEditor.domainPath.example;" control="zotero-quickCopy-domain"/>
|
||||||
<textbox id="zotero-quickCopy-domain"/>
|
<textbox id="zotero-quickCopy-domain" oninput="Zotero_QuickCopySiteEditor.onDomainInput(event)"/>
|
||||||
|
|
||||||
<separator class="thin"/>
|
<separator class="thin"/>
|
||||||
|
|
||||||
|
@ -95,6 +74,31 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
|
var Zotero_QuickCopySiteEditor = new function () {
|
||||||
|
var menu = document.getElementById('zotero-quickCopy-menu');
|
||||||
|
|
||||||
|
this.onAccept = function () {
|
||||||
|
var io = window.arguments[0];
|
||||||
|
io.domain = document.getElementById('zotero-quickCopy-domain').value;
|
||||||
|
io.format = menu.value;
|
||||||
|
|
||||||
|
io.locale = '';
|
||||||
|
if (!document.getElementById('zotero-quickCopy-locale-menu').disabled) {
|
||||||
|
io.locale = document.getElementById('zotero-quickCopy-locale-menu').value;
|
||||||
|
}
|
||||||
|
|
||||||
|
io.ok = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onDomainInput = function (event) {
|
||||||
|
if (event.target.value == 'wikipedia.org') {
|
||||||
|
Zotero.debug("SETTING TO WIKI");
|
||||||
|
menu.value = 'export=3f50aaac-7acc-4350-acd0-59cb77faf620';
|
||||||
|
Zotero_Preferences.Export.updateQuickCopyUI();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
var io = window.arguments[0];
|
var io = window.arguments[0];
|
||||||
var contentType = io.asHTML ? 'html' : '';
|
var contentType = io.asHTML ? 'html' : '';
|
||||||
document.getElementById('zotero-quickCopy-domain').value = io.domain ? io.domain : '';
|
document.getElementById('zotero-quickCopy-domain').value = io.domain ? io.domain : '';
|
||||||
|
|
|
@ -2720,10 +2720,8 @@ Zotero.ItemTreeView.prototype.onDragStart = function (event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get Quick Copy format for current URL
|
// Get Quick Copy format for current URL (set via /ping from connector)
|
||||||
var url = this._ownerDocument.defaultView.content && this._ownerDocument.defaultView.content.location ?
|
var format = Zotero.QuickCopy.getFormatFromURL(Zotero.QuickCopy.lastActiveURL);
|
||||||
this._ownerDocument.defaultView.content.location.href : null;
|
|
||||||
var format = Zotero.QuickCopy.getFormatFromURL(url);
|
|
||||||
|
|
||||||
Zotero.debug("Dragging with format " + format);
|
Zotero.debug("Dragging with format " + format);
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Zotero.QuickCopy = new function() {
|
Zotero.QuickCopy = new function() {
|
||||||
|
this.lastActiveURL = null;
|
||||||
|
|
||||||
var _initTimeoutID
|
var _initTimeoutID
|
||||||
var _initPromise;
|
var _initPromise;
|
||||||
var _initialized = false;
|
var _initialized = false;
|
||||||
|
@ -36,15 +38,13 @@ Zotero.QuickCopy = new function() {
|
||||||
this.init = Zotero.Promise.coroutine(function* () {
|
this.init = Zotero.Promise.coroutine(function* () {
|
||||||
Zotero.debug("Initializing Quick Copy");
|
Zotero.debug("Initializing Quick Copy");
|
||||||
|
|
||||||
yield this.loadSiteSettings();
|
|
||||||
|
|
||||||
if (!_initialized) {
|
if (!_initialized) {
|
||||||
// Make sure export translator code is loaded whenever the output format changes
|
// Make sure export translator code is loaded whenever the output format changes
|
||||||
Zotero.Prefs.registerObserver("export.quickCopy.setting", _loadOutputFormat);
|
Zotero.Prefs.registerObserver("export.quickCopy.setting", _loadOutputFormat);
|
||||||
_initialized = true;
|
_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load code for selected export translator ahead of time
|
// Load code for selected export translators ahead of time
|
||||||
// (in the background, because it requires translator initialization)
|
// (in the background, because it requires translator initialization)
|
||||||
Zotero.Schema.schemaUpdatePromise
|
Zotero.Schema.schemaUpdatePromise
|
||||||
.then(function () {
|
.then(function () {
|
||||||
|
@ -54,8 +54,14 @@ Zotero.QuickCopy = new function() {
|
||||||
// if an export format is selected
|
// if an export format is selected
|
||||||
if (Zotero.test) return;
|
if (Zotero.test) return;
|
||||||
|
|
||||||
_initPromise = _loadOutputFormat();
|
_initPromise = Zotero.Promise.each(
|
||||||
});
|
[
|
||||||
|
() => _loadOutputFormat(),
|
||||||
|
() => this.loadSiteSettings()
|
||||||
|
],
|
||||||
|
f => f()
|
||||||
|
);
|
||||||
|
}.bind(this));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,9 +86,15 @@ Zotero.QuickCopy = new function() {
|
||||||
format: row.format
|
format: row.format
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
yield Zotero.Promise.map(rows, row => _preloadFormat(row.format));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
this.hasSiteSettings = function () {
|
||||||
|
return _siteSettings.length > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return Quick Copy setting object from string, stringified object, or object
|
* Return Quick Copy setting object from string, stringified object, or object
|
||||||
*
|
*
|
||||||
|
@ -174,26 +186,11 @@ Zotero.QuickCopy = new function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var matches = [];
|
var matches = [];
|
||||||
// Match last one or two sections of domain, not counting trailing period
|
|
||||||
var urlDomain = urlHostPort.match(/(?:[^.]+\.)?[^.]+(?=\.?$)/);
|
|
||||||
// Hopefully can't happen, but until we're sure
|
|
||||||
if (!urlDomain) {
|
|
||||||
Zotero.logError("Quick Copy host '" + urlHostPort + "' not matched");
|
|
||||||
return quickCopyPref;
|
|
||||||
}
|
|
||||||
for (let i=0; i<_siteSettings.length; i++) {
|
for (let i=0; i<_siteSettings.length; i++) {
|
||||||
let row = _siteSettings[i];
|
let row = _siteSettings[i];
|
||||||
|
|
||||||
// Only concern ourselves with entries containing the current domain
|
|
||||||
// or paths that apply to all domains
|
|
||||||
if (!row.domainPath.indexOf(urlDomain[0]) != -1 && !row.domainPath.startsWith('/')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let domain = row.domainPath.split('/',1)[0];
|
let domain = row.domainPath.split('/',1)[0];
|
||||||
let path = row.domainPath.substr(domain.length) || '/';
|
let path = row.domainPath.substr(domain.length) || '/';
|
||||||
let re = new RegExp('(^|[./])' + Zotero.Utilities.quotemeta(domain) + '$', 'i');
|
if (urlHostPort.endsWith(domain) && urlPath.startsWith(path)) {
|
||||||
if (re.test(urlHostPort) && urlPath.indexOf(path) === 0) {
|
|
||||||
matches.push({
|
matches.push({
|
||||||
format: JSON.stringify(this.unserializeSetting(row.format)),
|
format: JSON.stringify(this.unserializeSetting(row.format)),
|
||||||
domainLength: domain.length,
|
domainLength: domain.length,
|
||||||
|
@ -449,18 +446,25 @@ Zotero.QuickCopy = new function() {
|
||||||
/**
|
/**
|
||||||
* If an export translator is the selected output format, load its code (which must be done
|
* If an export translator is the selected output format, load its code (which must be done
|
||||||
* asynchronously) ahead of time, since drag-and-drop requires synchronous operation
|
* asynchronously) ahead of time, since drag-and-drop requires synchronous operation
|
||||||
|
*
|
||||||
|
* @return {Promise}
|
||||||
*/
|
*/
|
||||||
var _loadOutputFormat = Zotero.Promise.coroutine(function* () {
|
var _loadOutputFormat = Zotero.Promise.coroutine(function* () {
|
||||||
var format = Zotero.Prefs.get("export.quickCopy.setting");
|
var format = Zotero.Prefs.get("export.quickCopy.setting");
|
||||||
|
return _preloadFormat(format);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var _preloadFormat = async function (format) {
|
||||||
format = Zotero.QuickCopy.unserializeSetting(format);
|
format = Zotero.QuickCopy.unserializeSetting(format);
|
||||||
if (format.mode == 'export') {
|
if (format.mode == 'export') {
|
||||||
Zotero.debug("Preloading code for Quick Copy export format");
|
Zotero.debug(`Preloading ${format.id} for Quick Copy`);
|
||||||
yield Zotero.Translators.init();
|
await Zotero.Translators.init();
|
||||||
let translator = Zotero.Translators.get(format.id);
|
let translator = Zotero.Translators.get(format.id);
|
||||||
translator.cacheCode = true;
|
translator.cacheCode = true;
|
||||||
yield translator.getCode();
|
await translator.getCode();
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
|
||||||
var _loadFormattedNames = Zotero.Promise.coroutine(function* () {
|
var _loadFormattedNames = Zotero.Promise.coroutine(function* () {
|
||||||
|
|
|
@ -821,12 +821,27 @@ Zotero.Server.Connector.Ping.prototype = {
|
||||||
* Sends 200 and HTML status on GET requests
|
* Sends 200 and HTML status on GET requests
|
||||||
* @param data {Object} request information defined in connector.js
|
* @param data {Object} request information defined in connector.js
|
||||||
*/
|
*/
|
||||||
init: function(data) {
|
init: function (req) {
|
||||||
if (data.method == 'GET') {
|
if (req.method == 'GET') {
|
||||||
return [200, "text/html", '<!DOCTYPE html><html><head>' +
|
return [200, "text/html", '<!DOCTYPE html><html><head>' +
|
||||||
'<title>Zotero Connector Server is Available</title></head>' +
|
'<title>Zotero Connector Server is Available</title></head>' +
|
||||||
'<body>Zotero Connector Server is Available</body></html>'];
|
'<body>Zotero Connector Server is Available</body></html>'];
|
||||||
} else {
|
} else {
|
||||||
|
// Store the active URL so it can be used for site-specific Quick Copy
|
||||||
|
if (req.data.activeURL) {
|
||||||
|
//Zotero.debug("Setting active URL to " + req.data.activeURL);
|
||||||
|
Zotero.QuickCopy.lastActiveURL = req.data.activeURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Zotero.QuickCopy.hasSiteSettings()) {
|
||||||
|
let response = {
|
||||||
|
prefs: {
|
||||||
|
reportActiveURL: true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return [200, 'application/json', JSON.stringify(response)];
|
||||||
|
}
|
||||||
|
|
||||||
return [200, 'text/plain', ''];
|
return [200, 'text/plain', ''];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2146,8 +2146,7 @@ var ZoteroPane = new function()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var url = (window.content && window.content.location ? window.content.location.href : null);
|
var format = Zotero.QuickCopy.getFormatFromURL(Zotero.QuickCopy.lastActiveURL);
|
||||||
var format = Zotero.QuickCopy.getFormatFromURL(url);
|
|
||||||
format = Zotero.QuickCopy.unserializeSetting(format);
|
format = Zotero.QuickCopy.unserializeSetting(format);
|
||||||
|
|
||||||
// determine locale preference
|
// determine locale preference
|
||||||
|
|
Loading…
Add table
Reference in a new issue