| 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; | 
| -    } | 
| -  } | 
| -}; | 
|  |