$NetBSD: patch-ab,v 1.1 2008/09/14 13:58:57 taca Exp $

--- raggle.orig	2005-12-14 22:54:11.000000000 +0000
+++ raggle
@@ -81,6 +81,7 @@ require 'pstore'
 require 'thread'
 require 'time'
 require 'uri'
+require 'rubygems' if RUBY_VERSION.sub(/\.\d+$/, "") < "1.9"
 
 #########################
 # load external modules #
@@ -132,7 +133,7 @@ if $HAVE_LIB['gettext']
   GetText::bindtextdomain('raggle', nil)
 end
 
-unless $HAVE_LIB['webrick'] || $HAVE_LIB['ncurses']
+unless $HAVE_LIB['webrick'] and $HAVE_LIB['ncurses']
   $stderr.puts _(<<-ENDERR
 ERROR: No interfaces available.
 You're missing the both the Ncurses-Ruby and WEBrick modules.  You need
@@ -457,16 +458,16 @@ class String
         HTML_ENTITY_LUT[m]
       else
         case m
-        when 'amp':   '&'
-        when 'nbsp'   ' '
-        when /^quot$/ni:  '"'
-        when /^lt$/ni:    '<'
-        when /^gt$/ni:    '>'
-        when /^copy/:     '(c)'
-        when /^trade/:    '(tm)'
-        when /^#8212$/n:  ","
-        when /^#8217$/n:  "'"
-        when /^#8218$/n:  ","
+        when 'amp';   '&'
+        when 'nbsp';   ' '
+        when /^quot$/ni;  '"'
+        when /^lt$/ni;    '<'
+        when /^gt$/ni;    '>'
+        when /^copy/;     '(c)'
+        when /^trade/;    '(tm)'
+        when /^#8212$/n;  ","
+        when /^#8217$/n;  "'"
+        when /^#8218$/n;  ","
         when /^#(\d+)$/n
           r = $1.to_i # Integer() interprets leading zeros as octal
           if !r.between?(0, 255) && munge_uni
@@ -1146,7 +1147,7 @@ module Raggle
             max_items = outline.attributes['max_items'] || nil
             priority = outline.attributes['priority'].to_i || $config['default_feed_priority']
             # the following properties take effect unless overridden on CLI
-            if outline.attributes['refresh']: opml_refresh = outline.attributes['refresh'].to_i 
+            if outline.attributes['refresh']; opml_refresh = outline.attributes['refresh'].to_i 
             else opml_refresh = nil; end  # fixes clobberation
             frefresh = refresh || opml_refresh || $config['default_feed_refresh']
             fsave_items = save_items || outline.attributes['save_items'] || false
@@ -1185,7 +1186,7 @@ module Raggle
         raise if $wins
         die "Parsing #{file_name} failed: #{parse_err.message}" unless $wins
       rescue => err
-        if $wins: Interfaces::NcursesInterface::set_status($config['msg_bad_uri'])
+        if $wins; Interfaces::NcursesInterface::set_status($config['msg_bad_uri'])
         else die err.message; end
       end
     end
@@ -1222,7 +1223,7 @@ module Raggle
           raise "Couldn't open output file \"#{file_name}\"."
         end
       rescue => err
-        if $wins: Interfaces::NcursesInterface::set_status($config['msg_bad_uri'])
+        if $wins; Interfaces::NcursesInterface::set_status($config['msg_bad_uri'])
         else die err.message; end
       end
     end
@@ -1519,14 +1520,14 @@ module Raggle
         refresh_interval_check opts['refresh'] if !opts['force'] &&
                                                   opts.has_key?('refresh')
         if id == -1
-          0.upto($config['feeds'].size - 1) do |id|
-            feed = $config['feeds'].get(id)
+          0.upto($config['feeds'].size - 1) do |i|
+            feed = $config['feeds'].get(i)
             ourl = feed['url']
             otitle = feed['title']
             %w{title url site refresh priority category lock_title? save_items? max_items}.each { |key|
               feed[key] = opts[key] if opts.has_key? key
             }
-            $config['feeds'].invalidate(id) if opts.has_key?('url') and opts['url'] != ourl
+            $config['feeds'].invalidate(i) if opts.has_key?('url') and opts['url'] != ourl
             feed['lock_title?'] = true if opts.has_key?('title') and opts['title'] != otitle
           end
         else 
@@ -1749,14 +1750,14 @@ ENDWARNING
           @items = []
 
           item_element_path = is_atom ? '//feed/entry' : '//item'
-          doc.root.elements.each(item_element_path) { |e| 
+          doc.root.elements.each(item_element_path) { |el| 
             # get item attributes (the ones that are set, anyway... stupid
             # RSS)
             h = {}
 
             if is_atom
               # parse atom entry
-              h = parse_atom_entry(e)
+              h = parse_atom_entry(el)
             else
               # basic item attribute element check
               ['title', 'link', 'date', 'description'].each { |val|
@@ -1765,7 +1766,7 @@ ENDWARNING
 
               # more elaborate xpath checks for item attribute elements
               ['link', 'date', 'description'].each { |key|
-                h[key] = find_element(e, key)
+                h[key] = find_element(el, key)
               }
 
               # handle RSS enclosures for this element
@@ -1813,8 +1814,15 @@ ENDWARNING
         if $HAVE_LIB['iconv'] && $config['use_iconv']
           unless $iconv
             # $iconv hasn't been intialized; create it
-            enc += '//TRANSLIT' if $config['use_iconv_translit']
-            $iconv = Iconv.new(enc, 'UTF-8')
+            if $config['use_iconv_translit']
+              begin
+                $iconv = Iconv.new(enc + '//TRANSLIT', 'UTF-8')
+              rescue Iconv::InvalidEncoding
+                $iconv = Iconv.new(enc, 'UTF-8')
+              end
+            else
+              $iconv = Iconv.new(enc, 'UTF-8')
+            end
           end
 
           # decode element using iconv
@@ -2025,37 +2033,37 @@ ENDUSAGE
             when '--update'
               ret['mode'] = 'update'
               ret['id'] = (arg && (arg != 'all')) ? arg.to_i : 'all'
-            when '--config':  $config['config_path'] = arg
-            when '--force':   ret['force'] = true
-            when '--list':    ret['mode'] = 'list'
-            when '--title':   ret['title'] = arg
-            when '--url':     ret['url'] = arg
-            when '--refresh': ret['refresh'] = arg.to_i
+            when '--config';  $config['config_path'] = arg
+            when '--force';   ret['force'] = true
+            when '--list';    ret['mode'] = 'list'
+            when '--title';   ret['title'] = arg
+            when '--url';     ret['url'] = arg
+            when '--refresh'; ret['refresh'] = arg.to_i
             when '--version'
               puts "Raggle v#$VERSION"
               exit(0)
-            when '--priority':      ret['priority'] = arg.to_i
-            when '--purge':         ret['mode'] = 'purge'
+            when '--priority';      ret['priority'] = arg.to_i
+            when '--purge';         ret['mode'] = 'purge'
             when '--sort'
               ret['mode'] = 'sort'
-            when '--lock-title':    ret['lock_title?'] = true
-            when '--unlock-title':  ret['lock_title?'] = false
-            when '--save-items':    ret['save_items?'] = true
+            when '--lock-title';    ret['lock_title?'] = true
+            when '--unlock-title';  ret['lock_title?'] = false
+            when '--save-items';    ret['save_items?'] = true
             when '--max'
               ret['max_items'] = arg.to_i
               ret['save_items?'] = true if ret['max_items'] > 0
-            when '--unsave-items':  ret['save_items?'] = false
-            when '--verbose':       $config['verbose'] = true
+            when '--unsave-items';  ret['save_items?'] = false
+            when '--verbose';       $config['verbose'] = true
             when '--import-opml'
               ret['mode'] = 'import_opml'
               ret['opml_file'] = arg
             when '--export-opml'
               ret['mode'] = 'export_opml'
               ret['opml_file'] = arg
-            when '--diag':          $config['diag'] = true
+            when '--diag';          $config['diag'] = true
             when '--default-config'
               ret['mode'] = 'default_config'
-            when '--ascii':         ret['ascii'] = true
+            when '--ascii';         ret['ascii'] = true
             when '--server'
               if $HAVE_LIB['webrick']
                 $config['run_http_server'] = true
@@ -2333,10 +2341,10 @@ ENDUSAGE
         #
         def Key::close_window
           case $a_win
-          when NcursesInterface::get_win_id('find'): $wins[$a_win].close(true)
-          when NcursesInterface::get_win_id('cat'): $wins[$a_win].close(true)
-          when NcursesInterface::get_win_id('keys'): $wins[$a_win].close(true)
-          when NcursesInterface::get_win_id('edit'): $wins[$a_win].close(true)
+          when NcursesInterface::get_win_id('find'); $wins[$a_win].close(true)
+          when NcursesInterface::get_win_id('cat'); $wins[$a_win].close(true)
+          when NcursesInterface::get_win_id('keys'); $wins[$a_win].close(true)
+          when NcursesInterface::get_win_id('edit'); $wins[$a_win].close(true)
           end
         end
 
@@ -3391,11 +3399,11 @@ ENDUSAGE
           error = true if (feedopt == 'priority' or feedopt == 'refresh') and
                           str !~ /^-?\d+$/
           error = true if feedopt == 'max_items' and
-                          not (str =~ /^\d+$/ or str =~ /none|nil/i)
+                          not(str =~ /^\d+$/ or str =~ /none|nil/i)
           error = true if (feedopt == 'url' or feedopt == 'site') and
                           not uri?(str)
           error = true if feedopt == 'save_items?' and
-                          not (str =~ /true/i or str =~ /false/i)
+                          not(str =~ /true/i or str =~ /false/i)
           error = true if feedopt == 'refresh' and
                           str.to_i < $config['feed_refresh_warn']
           if error  # bail if user entered nonsense via basic checks
@@ -3405,15 +3413,15 @@ ENDUSAGE
 
           case feedopt  # create options hash to pass to engine
           when 'save_items?'
-            if str =~ /true/i: newopts = {feedopt => true}
+            if str =~ /true/i; newopts = {feedopt => true}
             else newopts = {feedopt => false}; end
           when 'priority', 'refresh'
             newopts = {feedopt => str.to_i}
           when 'max_items'
-            if str =~ /none|nil/i: newopts = {feedopt => nil}
+            if str =~ /none|nil/i; newopts = {feedopt => nil}
             else newopts = {feedopt => str.to_i}; end
           when 'category'
-            if str =~ /\bnone\b|\bnil\b/i: newopts = {feedopt => nil}
+            if str =~ /\bnone\b|\bnil\b/i; newopts = {feedopt => nil}
             else newopts = {feedopt => str}; end
           else newopts = {feedopt => str}
           end
@@ -3575,7 +3583,7 @@ ENDUSAGE
           item_content = item_content.gsub(/href\s*=\s*["']([^'"]+?)['"]/m) {
             m = $1.dup
             new_url = case m
-              when (/^(\w+):\/\//): m
+              when (/^(\w+):\/\//); m
               else 
                 # attempt to merge URI with host_uri.  if that fails,
                 # log a warning, then fall back to the unmodified string
@@ -3599,7 +3607,7 @@ ENDUSAGE
           # fix host-relative item URL
           item_url = feed['items'][id]['url'].dup
           item_url = case item_url
-            when (/(\w+):\/\//):  item_url
+            when (/(\w+):\/\//);  item_url
             else [host_uri, item_url].join('/')
           end
         end
@@ -3664,10 +3672,11 @@ ENDUSAGE
 
         # get browser command
         cmd = $config['browser_cmd'].map { |cmd_part|
-        case cmd_part
-          when /%s/:  cmd_part % url.escape
-          when '${browser}':  $config['browser']
-          else cmd_part
+          case cmd_part
+          when /%s/;  cmd_part % url.escape
+          when '${browser}';  $config['browser']
+          else
+            cmd_part
           end
         }
 
@@ -3833,7 +3842,7 @@ ENDUSAGE
         # if it's not nil, then add it to our list
         added = false
         if url && url.length > 0
-          if title: added = Engine::add_feed({ 'url' => url, 'title' => title })
+          if title; added = Engine::add_feed({ 'url' => url, 'title' => title })
           else added = Engine::add_feed({ 'url' => url }); end
           NcursesInterface::populate_feed_win
         else
@@ -4112,13 +4121,13 @@ ENDUSAGE
           old_key = key
           key = key.gsub(/^KEY_/, '')
           case key
-          when 'DC':        key = 'Delete'
-          when ' ':         key = 'Space'
-          when 'NPAGE':     key = 'Page Down'
-          when 'PPAGE':     key = 'Page Up'
-          when '':        key = 'Control-L'
-          when '	':  key = 'Tab'
-          when /^\d$/:      key = '1-9'
+          when 'DC';        key = 'Delete'
+          when ' ';         key = 'Space'
+          when 'NPAGE';     key = 'Page Down'
+          when 'PPAGE';     key = 'Page Up'
+          when '';        key = 'Control-L'
+          when '	';  key = 'Tab'
+          when /^\d$/;      key = '1-9'
           end
           unless key == old_key  # remove cruft if key info updated
             keys[key] = keys[old_key]
@@ -4251,9 +4260,9 @@ ENDUSAGE
         $wins = []
         $config['theme']['window_order'].each { |i|
           case i
-            when /feed/:  cl = NcursesInterface::ListWindow
-            when /item/:  cl = NcursesInterface::ListWindow
-            when /desc/:  cl = NcursesInterface::TextWindow
+            when /feed/;  cl = NcursesInterface::ListWindow
+            when /item/;  cl = NcursesInterface::ListWindow
+            when /desc/;  cl = NcursesInterface::TextWindow
           else
             raise "Unknown window #{i}"
           end
@@ -4606,10 +4615,10 @@ ENDUSAGE
                 ((cat =~ /\ball\b/i) ? ' selected="1"' : '') <<
                 ">All</option>\n"
 
-          $config['feeds'].categories.each { |cat| 
-            ret << "  <option value='#{cat.title}'" <<
-                   ((cat =~ /\b#{cat.title}\b/i) ? ' selected="1"' : '') <<
-                   ">#{cat.title}</option>\n"
+          $config['feeds'].categories.each { |c| 
+            ret << "  <option value='#{c.title}'" <<
+                   ((cat =~ /\b#{c.title}\b/i) ? ' selected="1"' : '') <<
+                   ">#{c.title}</option>\n"
           }
           ret << "</select>\n"
 
