www

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

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 }