zotero/chrome/content/zotero/feedSettings.js
2022-05-13 04:28:57 -04:00

182 lines
No EOL
5.9 KiB
JavaScript

/*
***** BEGIN LICENSE BLOCK *****
Copyright © 2015 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 *****
*/
//////////////////////////////////////////////////////////////////////////////
//
// Zotero_Feed_Settings
//
//////////////////////////////////////////////////////////////////////////////
var Zotero_Feed_Settings = new function() {
let urlIsValid = true,
data = null,
feedReader = null,
urlTainted = false;
let cleanURL = function(url) {
let cleanURL = Zotero.Utilities.cleanURL(url, true);
if (cleanURL) {
if (/^https?:\/\/[^\/\s]+\/\S/.test(cleanURL)) {
return cleanURL;
} else {
Zotero.debug(url + " has an unsupported protocol for feeds");
}
}
};
this.init = Zotero.Promise.coroutine(function* () {
document.addEventListener('dialogaccept', this.accept.bind(this));
document.addEventListener('dialogcancel', this.cancel.bind(this));
this.toggleAdvancedOptions(false);
data = window.arguments[0];
if (data.url) {
document.getElementById('feed-url').value = data.url;
// Do not allow to change URL for existing feed
document.getElementById('feed-url').readOnly = true;
} else {
this.invalidateURL();
}
if (data.title) {
document.getElementById('feed-title').value = data.title;
}
let ttl;
if (data.ttl !== undefined) {
ttl = Math.floor(data.ttl / 60);
} else {
ttl = Zotero.Prefs.get('feeds.defaultTTL');
}
document.getElementById('feed-ttl').value = ttl;
let cleanupReadAfter = data.cleanupReadAfter;
if (cleanupReadAfter === undefined) cleanupReadAfter = Zotero.Prefs.get('feeds.defaultCleanupReadAfter');
document.getElementById('feed-cleanupReadAfter').value = cleanupReadAfter;
let cleanupUnreadAfter = data.cleanupUnreadAfter;
if (cleanupUnreadAfter === undefined) cleanupUnreadAfter = Zotero.Prefs.get('feeds.defaultCleanupUnreadAfter');
document.getElementById('feed-cleanupUnreadAfter').value = cleanupUnreadAfter;
if (data.url && !data.urlIsValid) {
yield this.validateURL();
}
});
this.invalidateURL = function() {
urlTainted = true;
if (feedReader) {
feedReader.terminate();
feedReader = null;
}
if (!urlIsValid) return;
urlIsValid = false;
document.getElementById('feed-title').disabled = true;
document.getElementById('feed-ttl').disabled = true;
document.getElementById('feed-cleanupReadAfter').disabled = true;
document.getElementById('feed-cleanupUnreadAfter').disabled = true;
document.querySelector('dialog').getButton('accept').disabled = true;
};
this.validateURL = Zotero.Promise.coroutine(function* () {
if (feedReader) {
feedReader.terminate();
feedReader = null;
}
let url = cleanURL(document.getElementById('feed-url').value);
urlTainted = false;
if (!url) return;
try {
var fr = feedReader = new Zotero.FeedReader(url);
yield fr.process();
let feed = fr.feedProperties;
// Prevent progress if textbox changes triggered another call to
// validateURL / invalidateURL (old session)
if (feedReader !== fr || urlTainted) return;
let title = document.getElementById('feed-title');
if (feed.title && (!data.url || data.unsaved)) {
title.value = feed.title;
}
let ttl = document.getElementById('feed-ttl');
if (feed.ttl && (!data.url || data.unsaved)) {
ttl.value = Math.floor(feed.ttl / 60) || 1;
}
document.getElementById('feed-url').value = url;
urlIsValid = true;
title.disabled = false;
ttl.disabled = false;
document.getElementById('feed-cleanupReadAfter').disabled = false;
document.getElementById('feed-cleanupUnreadAfter').disabled = false;
document.querySelector('dialog').getButton('accept').disabled = false;
}
catch (e) {
Zotero.debug(e);
}
finally {
if (feedReader === fr) feedReader = null;
}
});
this.accept = function() {
data.url = document.getElementById('feed-url').value;
data.title = document.getElementById('feed-title').value;
data.ttl = parseInt(document.getElementById('feed-ttl').value);
data.ttl = (isNaN(data.ttl) ? Zotero.Prefs.get('feeds.defaultTTL') : data.ttl) * 60;
data.cleanupReadAfter = parseInt(document.getElementById('feed-cleanupReadAfter').value);
data.cleanupReadAfter = isNaN(data.cleanupReadAfter) ? Zotero.Prefs.get('feeds.defaultCleanupReadAfter') : data.cleanupReadAfter;
data.cleanupUnreadAfter = parseInt(document.getElementById('feed-cleanupUnreadAfter').value);
data.cleanupUnreadAfter = isNaN(data.cleanupUnreadAfter) ? Zotero.Prefs.get('feeds.defaultCleanupUnreadAfter') : data.cleanupUnreadAfter;
return true;
};
this.cancel = function() {
data.cancelled = true;
return true;
};
/*
* Show/hide advanced options
* @param {Boolean} [show] If set, indicates whether the advanced
* options should be shown or not. If omitted, the options toggle
*/
this.toggleAdvancedOptions = function(show) {
var opts = document.getElementById("advanced-options-togglable");
opts.hidden = show !== undefined ? !show : !opts.hidden;
document.getElementById("advanced-options")
.setAttribute("state", opts.hidden ? "closed" : "open");
window.sizeToContent();
};
}