class Array def to_filters(hook=nil) Filter::FILTER_MAP.values_at(*(self.map{|o| o.to_sym})).reject{|f| f.nil?}.map{|k| Kernel.const_get(k)}.select do |k| hook.nil? || k.hooks?(hook) end end def each_filter(hook=nil, &b) to_filters(hook).each{|f| b.call(f)} end end module Filter FILTER_MAP = { :reverse => :ReverseFilter, :pound => :ToPoundOrNotToPoundFilter, :twitter => :TwitterFilter, :lastfmdescription => :LastFmDescriptionFilter, :tumblrdescription => :TumblrDescriptionFilter, } def self.current_filters @@current_filters end def self.current_filters=(new_current_filters) @@current_filters = new_current_filters end def self.options h = {} self::FILTER_MAP.each do |key, klass| h[key.to_s] = Kernel.const_get(klass).describe end h end def describe self::DESCRIPTION end def hooks?(hook) self::HOOK == hook end ## Redefine these in new filters HOOK = nil DESCRIPTION = nil def run_filter #... end end module ReverseFilter extend Filter HOOK = :after_feeds_pulled DESCRIPTION = "Entries displayed in reverse chronological order." def run_filter reverse! end end module TwitterFilter extend Filter HOOK = :feed_after_grab_items DESCRIPTION = "Make twitter titles prettier." def run_filter if url =~ /twitter.com/ @links.map do |link| link.description = link.title.gsub(/^[a-zA-Z0-9]+: /, '') \ + link.date_published.strftime(" (%a %b %e, %l%p)").downcase link.title = '#' link end end end end module TumblrDescriptionFilter extend Filter HOOK = :feed_after_grab_items DESCRIPTION = "Make tumblr titles prettier." def run_filter if @normalized_feed.respond_to? :generator if @normalized_feed.generator =~ /Tumblr/ @links.map{|l| l.title = '#'; l} end end end end module LastFmDescriptionFilter extend Filter HOOK = :feed_after_grab_items DESCRIPTION = "Clean up useless info from Last.fm recent tracks" def run_filter if url =~ /ws.audioscrobbler.com.*recenttracks.rss/ @links.map{|l| l.description = ''; l} end end end module ToPoundOrNotToPoundFilter # I call it "hash" or "number sign" rather than "pound", but I love this function name extend Filter HOOK = :descriptive_feed_item DESCRIPTION = "Instead of a '#' title placeholder, skip it." def run_filter @title = '' if @title == '#' end end