| Index: lib/filterStorage.js | 
| =================================================================== | 
| --- a/lib/filterStorage.js | 
| +++ b/lib/filterStorage.js | 
| @@ -23,16 +23,17 @@ | 
| */ | 
| const {IO} = require("io"); | 
| const {Prefs} = require("prefs"); | 
| const {Filter, ActiveFilter} = require("./filterClasses"); | 
| const {Subscription, SpecialSubscription, | 
| ExternalSubscription} = require("./subscriptionClasses"); | 
| const {FilterNotifier} = require("./filterNotifier"); | 
| +const {INIParser} = require("./iniParser"); | 
| /** | 
| * Version number of the filter storage file format. | 
| * @type {number} | 
| */ | 
| let formatVersion = 5; | 
| /** | 
| @@ -675,106 +676,8 @@ | 
| function removeSubscriptionFilters(subscription) | 
| { | 
| if (!FilterStorage.knownSubscriptions.has(subscription.url)) | 
| return; | 
| for (let filter of subscription.filters) | 
| filter.subscriptions.delete(subscription); | 
| } | 
| - | 
| -/** | 
| - * Listener returned by FilterStorage.importData(), parses filter data. | 
| - * @constructor | 
| - */ | 
| -function INIParser() | 
| -{ | 
| - this.fileProperties = this.curObj = {}; | 
| - this.subscriptions = []; | 
| - this.knownFilters = new Map(); | 
| - this.knownSubscriptions = new Map(); | 
| -} | 
| -INIParser.prototype = | 
| -{ | 
| - linesProcessed: 0, | 
| - subscriptions: null, | 
| - knownFilters: null, | 
| - knownSubscriptions: null, | 
| - wantObj: true, | 
| - fileProperties: null, | 
| - curObj: null, | 
| - curSection: null, | 
| - | 
| - process(val) | 
| - { | 
| - let origKnownFilters = Filter.knownFilters; | 
| - Filter.knownFilters = this.knownFilters; | 
| - let origKnownSubscriptions = Subscription.knownSubscriptions; | 
| - Subscription.knownSubscriptions = this.knownSubscriptions; | 
| - let match; | 
| - try | 
| - { | 
| - if (this.wantObj === true && (match = /^(\w+)=(.*)$/.exec(val))) | 
| - this.curObj[match[1]] = match[2]; | 
| - else if (val === null || (match = /^\s*\[(.+)\]\s*$/.exec(val))) | 
| - { | 
| - if (this.curObj) | 
| - { | 
| - // Process current object before going to next section | 
| - switch (this.curSection) | 
| - { | 
| - case "filter": | 
| - if ("text" in this.curObj) | 
| - Filter.fromObject(this.curObj); | 
| - break; | 
| - case "subscription": { | 
| - let subscription = Subscription.fromObject(this.curObj); | 
| - if (subscription) | 
| - this.subscriptions.push(subscription); | 
| - break; | 
| - } | 
| - case "subscription filters": | 
| - if (this.subscriptions.length) | 
| - { | 
| - let subscription = this.subscriptions[ | 
| - this.subscriptions.length - 1 | 
| - ]; | 
| - for (let text of this.curObj) | 
| - { | 
| - let filter = Filter.fromText(text); | 
| - subscription.filters.push(filter); | 
| - filter.subscriptions.add(subscription); | 
| - } | 
| - } | 
| - break; | 
| - } | 
| - } | 
| - | 
| - if (val === null) | 
| - return; | 
| - | 
| - this.curSection = match[1].toLowerCase(); | 
| - switch (this.curSection) | 
| - { | 
| - case "filter": | 
| - case "subscription": | 
| - this.wantObj = true; | 
| - this.curObj = {}; | 
| - break; | 
| - case "subscription filters": | 
| - this.wantObj = false; | 
| - this.curObj = []; | 
| - break; | 
| - default: | 
| - this.wantObj = null; | 
| - this.curObj = null; | 
| - } | 
| - } | 
| - else if (this.wantObj === false && val) | 
| - this.curObj.push(val.replace(/\\\[/g, "[")); | 
| - } | 
| - finally | 
| - { | 
| - Filter.knownFilters = origKnownFilters; | 
| - Subscription.knownSubscriptions = origKnownSubscriptions; | 
| - } | 
| - } | 
| -}; |