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