#!/usr/bin/env ruby
#
# Copyright (c) 2005, Joe Mason <joe@notcharles.ca>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject to the
# following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
# USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Usage: rss-tag-filter <list of tags to skip>
#
#        Skips all items which include one or more of the tags in their
#        "category" elements.  To skip a tag that includes spaces, put it
#        in quotation marks.
#
#        Example: to skip all entries with the tags "meme", "quiz" or
#        "picture post", do:
#
#        rss-tag-filter meme quiz "picture post"
#
#        Requires the Ruby RSS module, which is included in Ruby 1.8.3 or
#        higher and available for older versions of Ruby at
#        http://raa.ruby-lang.org/project/rss/.

# UNTESTED AS OF 2017
# Instructions: 

require 'rss/2.0'

# if no tags were given, no parsing needed
if ARGV.empty? then
  STDIN.each do |line|
    STDOUT.puts(line)
  end
  exit(0)
end

# parse the RSS
rss_source = STDIN.collect.join
begin
  rss = RSS::Parser.parse(rss_source)
rescue RSS::InvalidRSSError
  rss = RSS::Parser.parse(rss_source, false)    # no validation
end

# filter out all items with tags in the cmd-line args
rss.channel.items.reject! do |item|
  item.categories.detect do |cat|
    ARGV.include?(cat.content)
  end
end

# write the modified rss
STDOUT.puts(rss)

