1#!/usr/bin/env ruby
2
3require "nkf"
4class String
5  # From tdiary.rb
6  def shorten( len = 120 )
7    lines = NKF::nkf( "-t -m0 -f#{len}", self.gsub( /\n/, ' ' ) ).split( /\n/ )
8    lines[0].concat( '...' ) if lines[0] and lines[1]
9    lines[0]
10  end
11end
12
13require "rss"
14
15items = []
16verbose = false
17
18def error(exception)
19  mark = "=" * 20
20  mark = "#{mark} error #{mark}"
21  puts mark
22  puts exception.class
23  puts exception.message
24  puts exception.backtrace
25  puts mark
26end
27before_time = Time.now
28ARGV.each do |fname|
29  if fname == '-v'
30    verbose = true
31    next
32  end
33  rss = nil
34  f = File.new(fname).read
35  begin
36    ## do validate parse
37    rss = RSS::Parser.parse(f)
38  rescue RSS::InvalidRSSError
39    error($!) if verbose
40    ## do non validate parse for invalid RSS 1.0
41    begin
42      rss = RSS::Parser.parse(f, false)
43    rescue RSS::Error
44      ## invalid RSS.
45      error($!) if verbose
46    end
47  rescue RSS::Error
48    error($!) if verbose
49  end
50  if rss.nil?
51    puts "#{fname} does not include RSS 1.0 or 0.9x/2.0"
52  else
53    begin
54      rss.output_encoding = "utf-8"
55    rescue RSS::UnknownConversionMethodError
56      error($!) if verbose
57    end
58
59    rss = rss.to_rss("1.0") do |maker|
60      maker.channel.about ||= maker.channel.link
61      maker.channel.description ||= "No description"
62      maker.items.each do |item|
63        item.title ||= "UNKNOWN"
64        item.link ||= "UNKNOWN"
65      end
66    end
67    next if rss.nil?
68
69    rss.items.each do |item|
70      items << [rss.channel, item] if item.dc_date
71    end
72  end
73end
74processing_time = Time.now - before_time
75
76items.sort do |x, y|
77  y[1].dc_date <=> x[1].dc_date
78end[0..20].each do |channel, item|
79  puts "#{item.dc_date.localtime.iso8601}: " <<
80    "#{channel.title}: #{item.title}"
81  puts " Description: #{item.description.shorten(50)}" if item.description
82end
83
84puts "Used XML parser: #{RSS::Parser.default_parser}"
85puts "Processing time: #{processing_time}s"
86