feedSettings.js (5491B)
1 /* 2 ***** BEGIN LICENSE BLOCK ***** 3 4 Copyright © 2015 Center for History and New Media 5 George Mason University, Fairfax, Virginia, USA 6 http://zotero.org 7 8 This file is part of Zotero. 9 10 Zotero is free software: you can redistribute it and/or modify 11 it under the terms of the GNU Affero General Public License as published by 12 the Free Software Foundation, either version 3 of the License, or 13 (at your option) any later version. 14 15 Zotero is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU Affero General Public License for more details. 19 20 You should have received a copy of the GNU Affero General Public License 21 along with Zotero. If not, see <http://www.gnu.org/licenses/>. 22 23 ***** END LICENSE BLOCK ***** 24 */ 25 26 ////////////////////////////////////////////////////////////////////////////// 27 // 28 // Zotero_Feed_Settings 29 // 30 ////////////////////////////////////////////////////////////////////////////// 31 32 var Zotero_Feed_Settings = new function() { 33 let urlIsValid = true, 34 data = null, 35 feedReader = null, 36 urlTainted = false; 37 38 let cleanURL = function(url) { 39 let cleanURL = Zotero.Utilities.cleanURL(url, true); 40 41 if (cleanURL) { 42 if (/^https?:\/\/[^\/\s]+\/\S/.test(cleanURL)) { 43 return cleanURL; 44 } else { 45 Zotero.debug(url + " has an unsupported protocol for feeds"); 46 } 47 } 48 }; 49 50 this.init = Zotero.Promise.coroutine(function* () { 51 this.toggleAdvancedOptions(false); 52 53 data = window.arguments[0]; 54 55 if (data.url) { 56 document.getElementById('feed-url').value = data.url; 57 // Do not allow to change URL for existing feed 58 document.getElementById('feed-url').readOnly = true; 59 } else { 60 this.invalidateURL(); 61 } 62 63 if (data.title) { 64 document.getElementById('feed-title').value = data.title; 65 } 66 67 let ttl; 68 if (data.ttl !== undefined) { 69 ttl = Math.floor(data.ttl / 60); 70 } else { 71 ttl = Zotero.Prefs.get('feeds.defaultTTL'); 72 } 73 document.getElementById('feed-ttl').value = ttl; 74 75 let cleanupReadAfter = data.cleanupReadAfter; 76 if (cleanupReadAfter === undefined) cleanupReadAfter = Zotero.Prefs.get('feeds.defaultCleanupReadAfter'); 77 document.getElementById('feed-cleanupReadAfter').value = cleanupReadAfter; 78 79 let cleanupUnreadAfter = data.cleanupUnreadAfter; 80 if (cleanupUnreadAfter === undefined) cleanupUnreadAfter = Zotero.Prefs.get('feeds.defaultCleanupUnreadAfter'); 81 document.getElementById('feed-cleanupUnreadAfter').value = cleanupUnreadAfter; 82 83 if (data.url && !data.urlIsValid) { 84 yield this.validateURL(); 85 } 86 }); 87 88 this.invalidateURL = function() { 89 urlTainted = true; 90 if (feedReader) { 91 feedReader.terminate(); 92 feedReader = null; 93 } 94 95 if (!urlIsValid) return; 96 97 urlIsValid = false; 98 document.getElementById('feed-title').disabled = true; 99 document.getElementById('feed-ttl').disabled = true; 100 document.getElementById('feed-cleanupReadAfter').disabled = true; 101 document.getElementById('feed-cleanupUnreadAfter').disabled = true; 102 document.documentElement.getButton('accept').disabled = true; 103 }; 104 105 this.validateURL = Zotero.Promise.coroutine(function* () { 106 if (feedReader) { 107 feedReader.terminate(); 108 feedReader = null; 109 } 110 111 let url = cleanURL(document.getElementById('feed-url').value); 112 urlTainted = false; 113 if (!url) return; 114 115 try { 116 var fr = feedReader = new Zotero.FeedReader(url); 117 yield fr.process(); 118 let feed = fr.feedProperties; 119 // Prevent progress if textbox changes triggered another call to 120 // validateURL / invalidateURL (old session) 121 if (feedReader !== fr || urlTainted) return; 122 123 let title = document.getElementById('feed-title'); 124 if (feed.title && (!data.url || data.unsaved)) { 125 title.value = feed.title; 126 } 127 128 let ttl = document.getElementById('feed-ttl'); 129 if (feed.ttl && (!data.url || data.unsaved)) { 130 ttl.value = Math.floor(feed.ttl / 60) || 1; 131 } 132 133 document.getElementById('feed-url').value = url; 134 135 urlIsValid = true; 136 title.disabled = false; 137 ttl.disabled = false; 138 document.getElementById('feed-cleanupReadAfter').disabled = false; 139 document.getElementById('feed-cleanupUnreadAfter').disabled = false; 140 document.documentElement.getButton('accept').disabled = false; 141 } 142 catch (e) { 143 Zotero.debug(e); 144 } 145 finally { 146 if (feedReader === fr) feedReader = null; 147 } 148 }); 149 150 this.accept = function() { 151 data.url = document.getElementById('feed-url').value; 152 data.title = document.getElementById('feed-title').value; 153 data.ttl = document.getElementById('feed-ttl').value * 60; 154 data.cleanupReadAfter = document.getElementById('feed-cleanupReadAfter').value * 1; 155 data.cleanupUnreadAfter = document.getElementById('feed-cleanupUnreadAfter').value * 1; 156 return true; 157 }; 158 159 this.cancel = function() { 160 data.cancelled = true; 161 return true; 162 }; 163 164 /* 165 * Show/hide advanced options 166 * @param {Boolean} [show] If set, indicates whether the advanced 167 * options should be shown or not. If omitted, the options toggle 168 */ 169 this.toggleAdvancedOptions = function(show) { 170 var opts = document.getElementById("advanced-options-togglable"); 171 opts.hidden = show !== undefined ? !show : !opts.hidden; 172 document.getElementById("advanced-options") 173 .setAttribute("state", opts.hidden ? "closed" : "open"); 174 window.sizeToContent(); 175 }; 176 }