www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

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:
Mchrome/content/zotero/preferences/preferences_export.js | 4+---
Mchrome/content/zotero/preferences/preferences_export.xul | 25++++++++++++++++++++++++-
Dchrome/content/zotero/preferences/preferences_export_firefox.xul | 62--------------------------------------------------------------
Mchrome/content/zotero/preferences/quickCopySiteEditor.xul | 48++++++++++++++++++++++++++----------------------
Mchrome/content/zotero/xpcom/itemTreeView.js | 6++----
Mchrome/content/zotero/xpcom/quickCopy.js | 54+++++++++++++++++++++++++++++-------------------------
Mchrome/content/zotero/xpcom/server_connector.js | 19+++++++++++++++++--
Mchrome/content/zotero/zoteroPane.js | 3+--
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