commit 6d265f448f94307d22b58a1305c64af006f5278f
parent 2928752d1956437f2662a9f669fe94d0de3d5297
Author: Dan Stillman <dstillman@zotero.org>
Date: Wed, 19 Jul 2017 03:38:18 -0400
Restore site-specific Quick Copy settings
Using the last URL passed by a connector
Closes https://github.com/zotero/zotero-connectors/issues/145
Diffstat:
8 files changed, 100 insertions(+), 121 deletions(-)
diff --git a/chrome/content/zotero/preferences/preferences_export.js b/chrome/content/zotero/preferences/preferences_export.js
@@ -66,9 +66,7 @@ Zotero_Preferences.Export = {
this._lastSelectedLocale = Zotero.Prefs.get("export.quickCopy.locale");
this.updateQuickCopyUI();
- if (!Zotero.isStandalone) {
- yield this.refreshQuickCopySiteList();
- }
+ yield this.refreshQuickCopySiteList();
}),
diff --git a/chrome/content/zotero/preferences/preferences_export.xul b/chrome/content/zotero/preferences/preferences_export.xul
@@ -64,7 +64,30 @@
oncommand="Zotero_Preferences.Export.buildQuickCopyFormatDropDown(document.getElementById('zotero-quickCopy-menu'), this.checked ? 'html' : '');"/>
</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">
<label value="&zotero.preferences.quickCopy.dragLimit;"/>
diff --git a/chrome/content/zotero/preferences/preferences_export_firefox.xul b/chrome/content/zotero/preferences/preferences_export_firefox.xul
@@ -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>
diff --git a/chrome/content/zotero/preferences/quickCopySiteEditor.xul b/chrome/content/zotero/preferences/quickCopySiteEditor.xul
@@ -45,30 +45,9 @@
<script src="preferences.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">
<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"/>
@@ -95,6 +74,31 @@
<script>
<![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 contentType = io.asHTML ? 'html' : '';
document.getElementById('zotero-quickCopy-domain').value = io.domain ? io.domain : '';
diff --git a/chrome/content/zotero/xpcom/itemTreeView.js b/chrome/content/zotero/xpcom/itemTreeView.js
@@ -2720,10 +2720,8 @@ Zotero.ItemTreeView.prototype.onDragStart = function (event) {
}
}
- // Get Quick Copy format for current URL
- var url = this._ownerDocument.defaultView.content && this._ownerDocument.defaultView.content.location ?
- this._ownerDocument.defaultView.content.location.href : null;
- var format = Zotero.QuickCopy.getFormatFromURL(url);
+ // Get Quick Copy format for current URL (set via /ping from connector)
+ var format = Zotero.QuickCopy.getFormatFromURL(Zotero.QuickCopy.lastActiveURL);
Zotero.debug("Dragging with format " + format);
diff --git a/chrome/content/zotero/xpcom/quickCopy.js b/chrome/content/zotero/xpcom/quickCopy.js
@@ -26,6 +26,8 @@
"use strict";
Zotero.QuickCopy = new function() {
+ this.lastActiveURL = null;
+
var _initTimeoutID
var _initPromise;
var _initialized = false;
@@ -36,15 +38,13 @@ Zotero.QuickCopy = new function() {
this.init = Zotero.Promise.coroutine(function* () {
Zotero.debug("Initializing Quick Copy");
- yield this.loadSiteSettings();
-
if (!_initialized) {
// Make sure export translator code is loaded whenever the output format changes
Zotero.Prefs.registerObserver("export.quickCopy.setting", _loadOutputFormat);
_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)
Zotero.Schema.schemaUpdatePromise
.then(function () {
@@ -54,8 +54,14 @@ Zotero.QuickCopy = new function() {
// if an export format is selected
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
};
});
+ 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
*
@@ -174,26 +186,11 @@ Zotero.QuickCopy = new function() {
}
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++) {
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 path = row.domainPath.substr(domain.length) || '/';
- let re = new RegExp('(^|[./])' + Zotero.Utilities.quotemeta(domain) + '$', 'i');
- if (re.test(urlHostPort) && urlPath.indexOf(path) === 0) {
+ if (urlHostPort.endsWith(domain) && urlPath.startsWith(path)) {
matches.push({
format: JSON.stringify(this.unserializeSetting(row.format)),
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
* asynchronously) ahead of time, since drag-and-drop requires synchronous operation
+ *
+ * @return {Promise}
*/
var _loadOutputFormat = Zotero.Promise.coroutine(function* () {
var format = Zotero.Prefs.get("export.quickCopy.setting");
+ return _preloadFormat(format);
+ });
+
+
+ var _preloadFormat = async function (format) {
format = Zotero.QuickCopy.unserializeSetting(format);
if (format.mode == 'export') {
- Zotero.debug("Preloading code for Quick Copy export format");
- yield Zotero.Translators.init();
+ Zotero.debug(`Preloading ${format.id} for Quick Copy`);
+ await Zotero.Translators.init();
let translator = Zotero.Translators.get(format.id);
translator.cacheCode = true;
- yield translator.getCode();
+ await translator.getCode();
}
- });
+ };
var _loadFormattedNames = Zotero.Promise.coroutine(function* () {
diff --git a/chrome/content/zotero/xpcom/server_connector.js b/chrome/content/zotero/xpcom/server_connector.js
@@ -821,12 +821,27 @@ Zotero.Server.Connector.Ping.prototype = {
* Sends 200 and HTML status on GET requests
* @param data {Object} request information defined in connector.js
*/
- init: function(data) {
- if (data.method == 'GET') {
+ init: function (req) {
+ if (req.method == 'GET') {
return [200, "text/html", '<!DOCTYPE html><html><head>' +
'<title>Zotero Connector Server is Available</title></head>' +
'<body>Zotero Connector Server is Available</body></html>'];
} 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', ''];
}
}
diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js
@@ -2146,8 +2146,7 @@ var ZoteroPane = new function()
return;
}
- var url = (window.content && window.content.location ? window.content.location.href : null);
- var format = Zotero.QuickCopy.getFormatFromURL(url);
+ var format = Zotero.QuickCopy.getFormatFromURL(Zotero.QuickCopy.lastActiveURL);
format = Zotero.QuickCopy.unserializeSetting(format);
// determine locale preference