| Index: lib/filterStorage.js |
| =================================================================== |
| --- a/lib/filterStorage.js |
| +++ b/lib/filterStorage.js |
| @@ -105,22 +105,36 @@ |
| * @type {string} |
| */ |
| get sourceFile() |
| { |
| return "patterns.ini"; |
| } |
| /** |
| - * Yields all subscriptions in the storage. |
| + * Yields subscriptions in the storage. |
| + * @param {?string} [filterText] The filter text for which to look. If |
| + * specified, the function yields only those subscriptions that contain the |
| + * given filter text. By default the function yields all subscriptions. |
| * @yields {Subscription} |
| */ |
| - *subscriptions() |
| + *subscriptions(filterText = null) |
| { |
| - yield* this.knownSubscriptions.values(); |
| + if (filterText == null) |
| + { |
| + yield* this.knownSubscriptions.values(); |
| + } |
| + else |
| + { |
| + for (let subscription of this.knownSubscriptions.values()) |
| + { |
| + if (subscription.hasFilterText(filterText)) |
| + yield subscription; |
| + } |
| + } |
| } |
| /** |
| * The number of subscriptions in the storage. |
| * @type {number} |
| */ |
| get subscriptionCount() |
| { |
| @@ -160,32 +174,29 @@ |
| * @param {Subscription} subscription The subscription to be added. |
| */ |
| addSubscription(subscription) |
| { |
| if (this.knownSubscriptions.has(subscription.url)) |
| return; |
| this.knownSubscriptions.set(subscription.url, subscription); |
| - connectSubscriptionFilters(subscription); |
| filterNotifier.emit("subscription.added", subscription); |
| } |
| /** |
| * Removes a subscription from the storage. |
| * @param {Subscription} subscription The subscription to be removed. |
| */ |
| removeSubscription(subscription) |
| { |
| if (!this.knownSubscriptions.has(subscription.url)) |
| return; |
| - disconnectSubscriptionFilters(subscription); |
| - |
| this.knownSubscriptions.delete(subscription.url); |
| // This should be the last remaining reference to the Subscription |
| // object. |
| Subscription.knownSubscriptions.delete(subscription.url); |
| filterNotifier.emit("subscription.removed", subscription); |
| } |
| @@ -193,41 +204,38 @@ |
| /** |
| * Replaces the list of filters in a subscription with a new list. |
| * @param {Subscription} subscription The subscription to be updated. |
| * @param {Array.<string>} filterText The new filter text. |
| */ |
| updateSubscriptionFilters(subscription, filterText) |
| { |
| let oldFilterText = [...subscription.filterText()]; |
| - disconnectSubscriptionFilters(subscription, oldFilterText); |
|
Manish Jethani
2019/02/26 12:29:57
You might think that looking up the subscriptions
hub
2019/03/08 21:36:19
my default config has 6. Add one language, that ma
Manish Jethani
2019/03/30 20:50:35
Each user-defined filter is not a special subscrip
|
| subscription.clearFilters(); |
| for (let text of filterText) |
| subscription.addFilterText(text); |
| - connectSubscriptionFilters(subscription, filterText); |
| - |
| filterNotifier.emit("subscription.updated", subscription, oldFilterText); |
| } |
| /** |
| * Adds a user-defined filter to the storage. |
| * @param {Filter} filter |
| * @param {?SpecialSubscription} [subscription] The subscription that the |
| * filter should be added to. |
| * @param {number} [position] The position within the subscription at which |
| * the filter should be added. If not specified, the filter is added at the |
| * end of the subscription. |
| */ |
| addFilter(filter, subscription, position) |
| { |
| if (!subscription) |
| { |
| - for (let currentSubscription of filter.subscriptions()) |
| + for (let currentSubscription of this.subscriptions(filter.text)) |
| { |
| if (currentSubscription instanceof SpecialSubscription && |
| !currentSubscription.disabled) |
| { |
| return; // No need to add |
| } |
| } |
| subscription = this.getGroupForFilter(filter); |
| @@ -238,17 +246,16 @@ |
| subscription = SpecialSubscription.createForFilter(filter); |
| this.addSubscription(subscription); |
| return; |
| } |
| if (typeof position == "undefined") |
| position = subscription.filterCount; |
| - filter.addSubscription(subscription); |
| subscription.insertFilterAt(filter, position); |
| filterNotifier.emit("filter.added", filter, subscription, position); |
| } |
| /** |
| * Removes a user-defined filter from the storage. |
| * @param {Filter} filter |
| * @param {?SpecialSubscription} [subscription] The subscription that the |
| @@ -256,46 +263,44 @@ |
| * removed from all subscriptions. |
| * @param {number} [position] The position within the subscription at which |
| * the filter should be removed. If not specified, all instances of the |
| * filter will be removed. |
| */ |
| removeFilter(filter, subscription, position) |
| { |
| let subscriptions = ( |
| - subscription ? [subscription] : filter.subscriptions() |
| + subscription ? [subscription] : this.subscriptions(filter.text) |
| ); |
| for (let currentSubscription of subscriptions) |
| { |
| if (currentSubscription instanceof SpecialSubscription) |
| { |
| let positions = []; |
| if (typeof position == "undefined") |
| { |
| let index = -1; |
| do |
| { |
| - index = currentSubscription.searchFilter(filter, index + 1); |
| + index = currentSubscription.findFilterIndex(filter, index + 1); |
| if (index >= 0) |
| positions.push(index); |
| } while (index >= 0); |
| } |
| else |
| positions.push(position); |
| for (let j = positions.length - 1; j >= 0; j--) |
| { |
| let currentPosition = positions[j]; |
| let currentFilterText = |
| currentSubscription.filterTextAt(currentPosition); |
| if (currentFilterText && currentFilterText == filter.text) |
| { |
| currentSubscription.deleteFilterAt(currentPosition); |
| - if (currentSubscription.searchFilter(filter) < 0) |
| - filter.removeSubscription(currentSubscription); |
| filterNotifier.emit("filter.removed", filter, currentSubscription, |
| currentPosition); |
| } |
| } |
| } |
| } |
| } |
| @@ -645,42 +650,8 @@ |
| /** |
| * Reads the user's filters from disk, manages them in memory, and writes them |
| * back to disk. |
| */ |
| let filterStorage = new FilterStorage(); |
| exports.filterStorage = filterStorage; |
| - |
| -/** |
| - * Connects a subscription to its filters without any notifications. |
| - * @param {Subscription} subscription The subscription that should be |
| - * connected to its filters. |
| - * @param {?Array.<string>} [filterText] A list of filters (in text form) to |
| - * which the subscription should be connected. If this is not given, the |
| - * subscription is connected to its own filters. |
| - */ |
| -function connectSubscriptionFilters(subscription, filterText) |
| -{ |
| - if (!filterStorage.knownSubscriptions.has(subscription.url)) |
| - return; |
| - |
| - for (let text of filterText || subscription.filterText()) |
| - Filter.fromText(text).addSubscription(subscription); |
| -} |
| - |
| -/** |
| - * Disconnects a subscription from its filters without any notifications. |
| - * @param {Subscription} subscription The subscription that should be |
| - * disconnected from its filters. |
| - * @param {?Array.<string>} [filterText] A list of filters (in text form) from |
| - * which the subscription should be disconnected. If this is not given, the |
| - * subscription is disconnected from its own filters. |
| - */ |
| -function disconnectSubscriptionFilters(subscription, filterText) |
| -{ |
| - if (!filterStorage.knownSubscriptions.has(subscription.url)) |
| - return; |
| - |
| - for (let text of filterText || subscription.filterText()) |
| - Filter.fromText(text).removeSubscription(subscription); |
| -} |