From Wikipedia, the free encyclopedia

NOTE not shown here are the 50+ test cases that are run against this script.

  def parse_length(params)
    raise UnresolvedCase unless params'length_unit'].empty?
    return "{{convert|#{params'length'}|km|mi|abbr=on}}#{", #{params'length_orientation'}" unless params'length_orientation'].empty?}#{params'length_note'}" unless params'length'].empty?
    return "{{convert|#{params'length_imperial'}|mi|km|abbr=on}}#{", #{params'length_orientation'}" unless params'length_orientation'].empty?}#{params'length_note'}" unless params'length_imperial'].empty?
  end
  
  def parse_watershed(params)
    raise UnresolvedCase unless params'watershed_unit'].empty?
    return "{{convert|#{params'watershed'}|km2|abbr=on}}#{params'watershed_note'}" unless params'watershed'].empty?
    return "{{convert|#{params'watershed_imperial'}|sqmi|abbr=on}}#{params'watershed_note'}" unless params'watershed_imperial'].empty?
  end
  
  def parse_mouth_elevation(params)
    raise UnresolvedCase unless params'mouth_elevation_unit'].empty?
    return "{{convert|#{params'mouth_elevation'}|m|abbr=on}}#{params'mouth_elevation_note'}" unless params'mouth_elevation'].empty?
    return "{{convert|#{params'mouth_elevation_imperial'}|ft|abbr=on}}#{params'mouth_elevation_note'}" unless params'mouth_elevation_imperial'].empty?
  end
  
  def parse_tributaries_l(params)
    values = 
        autolink(params'tributary_left'),
        autolink(params'tributary_left1'),
        autolink(params'tributary_left2'),
        autolink(params'tributary_left3'),
        autolink(params'tributary_left4'),
        autolink(params'tributary_left5'),
        autolink(params'tributary_left6'),
        autolink(params'tributary_left7'),
        autolink(params'tributary_left8'),
        autolink(params'tributary_left9'),
        autolink(params'tributary_left10'),
        autolink(params'tributary_left11'),
        autolink(params'tributary_left12'),
        autolink(params'tributary_left13'),
        autolink(params'tributary_left14'),
        autolink(params'tributary_left15')
    ].reject{|val| val.empty?}
    return "#{values.join(', ')}"
  end
  
  def parse_tributaries_r(params)
    values = 
        autolink(params'tributary_right'),
        autolink(params'tributary_right1'),
        autolink(params'tributary_right2'),
        autolink(params'tributary_right3'),
        autolink(params'tributary_right4'),
        autolink(params'tributary_right5'),
        autolink(params'tributary_right6'),
        autolink(params'tributary_right7'),
        autolink(params'tributary_right8'),
        autolink(params'tributary_right9'),
        autolink(params'tributary_right10'),
        autolink(params'tributary_right11'),
        autolink(params'tributary_right12'),
        autolink(params'tributary_right13'),
        autolink(params'tributary_right14'),
        autolink(params'tributary_right15')
    ].reject{|val| val.empty?}
    return "#{values.join(', ')}"
  end

  def parse_source_elevation(params, value)
    raise UnresolvedCase unless params"#{value}_elevation_unit"].empty?
    return "{{convert|#{params"#{value}_elevation"}|m|abbr=on}}#{params"#{value}_elevation_note"}" unless params"#{value}_elevation"].empty?
    return "{{convert|#{params"#{value}_elevation_imperial"}|ft|abbr=on}}#{params"#{value}_elevation_note"}" unless params"#{value}_elevation_imperial"].empty?
  end
  
  def parse_river_location(params, value)
    
        autolink(params"#{value}_location"), 
        autolink(params"#{value}_municipality"), 
        autolink(params"#{value}_district"), 
        autolink(params"#{value}_region"), 
        autolink(params"#{value}_state"), 
        autolink(params"#{value}_country"), 
    ].reject{|val| val.empty?}.join(', ')
  end
  
  def parse_sources(params)
    result = "
| source1            = #{autolink params'source'}#{autolink params'source_name'}
| source1_location   = #{parse_river_location(params, 'source')}
| source1_coordinates= #{params'source_coordinates'}#{params'source_coordinates_note'}
| source1_elevation  = #{parse_source_elevation(params, 'source')}"
    unless params'source1'].empty?
      result += "
| source2            = #{autolink params'source1'}#{autolink params'source1_name'}
| source2_location   = #{parse_river_location(params, 'source1')}
| source2_coordinates= #{params'source1_coordinates'}#{params'source1_coordinates_note'}
| source2_elevation  = #{parse_source_elevation(params, 'source1')}"
    end
    unless params'source2'].empty?
      result += "
| source3            = #{autolink params'source2'}#{autolink params'source2_name'}
| source3_location   = #{parse_river_location(params, 'source2')}
| source3_coordinates= #{params'source2_coordinates'}#{params'source2_coordinates_note'}
| source3_elevation  = #{parse_source_elevation(params, 'source2')}"
    end
    unless params'source3'].empty?
      result += "
| source4            = #{params'source3'}#{params'source3_name'}
| source4_location   = #{parse_river_location(params, 'source3')}
| source4_coordinates= #{params'source3_coordinates'}#{params'source3_coordinates_note'}
| source4_elevation  = #{parse_source_elevation(params, 'source3')}"
    end
    unless params'source3'].empty?
      result += "
| source5            = #{params'source4'}#{params'source4_name'}
| source5_location   = #{parse_river_location(params, 'source4')}
| source5_coordinates= #{params'source4_coordinates'}#{params'source4_coordinates_note'}
| source5_elevation  = #{parse_source_elevation(params, 'source4')}"
    end
    result
  end

  def parse_discharge_rate2(params, pre)
    raise UnresolvedCase unless params"#{pre}_unit"].empty?
    #NOTE: If either of the next two lines are ever raised, perhaps they should just return nil string instead of raising error
    return '' unless (params"#{pre}_average"].empty? && params"#{pre}_average_imperial"].empty?)
    return "{{convert|#{params"#{pre}"}|m3/s|cuft/s|abbr=on}}#{params"#{pre}_note"}" unless params"#{pre}"].empty?
    return "{{convert|#{params"#{pre}_imperial"}|cuft/s|m3/s|abbr=on}}#{params"#{pre}_note"}" unless params"#{pre}_imperial"].empty?
  end


  def parse_discharge_rate(params, pre, val)
    raise UnresolvedCase unless params"#{pre}_unit"].empty?
    raise UnresolvedCase unless params"#{pre}_#{val}_unit"].empty?
    return "{{convert|#{params"#{pre}_#{val}"}|m3/s|cuft/s|abbr=on}}#{params"#{pre}_#{val}_note"}" unless params"#{pre}_#{val}"].empty?
    return "{{convert|#{params"#{pre}_#{val}_imperial"}|cuft/s|m3/s|abbr=on}}#{params"#{pre}_#{val}_note"}" unless params"#{pre}_#{val}_imperial"].empty?
  end

  def parse_discharge(params)
    result = "
| discharge1_location= #{autolink(params'discharge_location')}#{params'discharge_note' unless params'discharge_location'].empty? }
| discharge1_min     = #{parse_discharge_rate(params, 'discharge', 'min')}
| discharge1_avg     = #{parse_discharge_rate(params, 'discharge', 'average')}#{parse_discharge_rate2(params, 'discharge')}
| discharge1_max     = #{parse_discharge_rate(params, 'discharge', 'max')}"
    unless params'discharge1_location'].empty?
      result += "
| discharge2_location= #{autolink(params'discharge1_location')}#{params'discharge1_note' unless params'discharge1_location'].empty?}
| discharge2_min     = #{parse_discharge_rate(params, 'discharge1', 'min')}
| discharge2_avg     = #{parse_discharge_rate(params, 'discharge1', 'average')}#{parse_discharge_rate2(params, 'discharge1')}
| discharge2_max     = #{parse_discharge_rate(params, 'discharge1', 'max')}"
    end
    unless params'discharge2_location'].empty?
      result += "
| discharge3_location= #{autolink(params'discharge2_location')}#{params'discharge2_note' unless params'discharge2_location'].empty?}
| discharge3_min     = #{parse_discharge_rate(params, 'discharge2', 'min')} 
| discharge3_avg     = #{parse_discharge_rate(params, 'discharge2', 'average')}#{parse_discharge_rate2(params, 'discharge2')}
| discharge3_max     = #{parse_discharge_rate(params, 'discharge2', 'max')}"
    end
    unless params'discharge3_location'].empty?
      result += "
| discharge4_location= #{autolink(params'discharge3_location')}#{params'discharge3_note' unless params'discharge3_location'].empty?}
| discharge4_min     = #{parse_discharge_rate(params, 'discharge3', 'min')} 
| discharge4_avg     = #{parse_discharge_rate(params, 'discharge3', 'average')}#{parse_discharge_rate2(params, 'discharge3')}
| discharge4_max     = #{parse_discharge_rate(params, 'discharge3', 'max')}"
    end
    unless params'discharge4_location'].empty?
      result += "
| discharge5_location= #{autolink(params'discharge4_location')}#{params'discharge4_note' unless params'discharge4_location'].empty?}
| discharge5_min     = #{parse_discharge_rate(params, 'discharge4', 'min')} 
| discharge5_avg     = #{parse_discharge_rate(params, 'discharge4', 'average')}#{parse_discharge_rate2(params, 'discharge4')} 
| discharge5_max     = #{parse_discharge_rate(params, 'discharge4', 'max')}"
    end
    result
  end
  
  def parse_multi_location(params, val)
    # val = 'country', 'district', 'town', 'city', etc...
    result = "#{autolink(paramsval)}#{params"#{val}_note" unless paramsval].empty? }"
    (1..15).each do |i|
      param = val+i.to_s
      result << "#{autolink(paramsparam)}#{params"#{param}_note"}" unless paramsparam].empty?
    end
    result.join(', ')
  end
  
  def parse_city_type(params)
    raise UnresolvedCase unless (params"municipality"].empty? || params"city"].empty?)
    return '' if (params"municipality"].empty? && params"city"].empty?)
    if params"municipality"].empty?
      return params'city_type' unless params'city_type'].empty?
      return params"city1"].empty? ? 'City' : 'Cities'
    else
      return params'municipality_type' unless params'municipality_type'].empty?
      return params"municipality1"].empty? ? 'Municipality' : 'Municipalities'
    end
  end
  
  def parse_city(params)
    raise UnresolvedCase unless (params"municipality"].empty? || params"city"].empty?)
    return '' if (params"municipality"].empty? && params"city"].empty?)
    result = []
    if params"municipality"].empty?
      result = "#{autolink(params'city')}#{params"city_note" unless params'city'].empty? }"
      (1..15).each do |i|
        param = 'city'+i.to_s
        result << "#{autolink(paramsparam)}#{params"#{param}_note"}" unless paramsparam].empty?
      end
    else
      result = "#{autolink(params'municipality')}#{params"municipality_note" unless params'municipality'].empty? }"
      (1..15).each do |i|
        param = 'municipality'+i.to_s
        result << "#{autolink(paramsparam)}#{params"#{param}_note"}" unless paramsparam].empty?
      end
    end
    result.join(', ')
  end
  
  def parse_other_name(params)
    result = "#{params'other_name'}#{params"other_name_note" unless params'other_name'].empty? }"
    (1..7).each do |i|
      param = 'other_name'+i.to_s
      result << "#{paramsparam}#{params"#{param}_note"}" unless paramsparam].empty?
    end
    result.reject{|val| val.empty?}.join(', ')
  end
  
  def autolink(value)
    return '' if value.nil? || value.empty?  
    return value if (value.include?('[[') || value.include?('{{'))
    "{{subst:#ifexist:#{value}|[[#{value}]]|#{value}}}"
  end

def parse_geobox_to_river(page)
    page.force_encoding('UTF-8')
    templates = page.scan(/(?=\{\{(?:geobox|geo box}))(\{\{(?>[^{}]++|\g<1>)*}})/i).flatten
    raise NoTemplatesFound if templates.empty?
    raise UnresolvedCase if templates.size > 1

    template = templates.first
    old_template = template.dup
    
    raise UnresolvedCase.new('Contains invalid ref') if template.match?(/<ref\s*name=".*\|.*\"/i)
    
    template.gsub!(/<!--[\w\W]*?-->/,'')
    template.gsub!('{{USA}}', '[[United States]]')
    template.gsub!(/\{\{flag\|(.*)\}\}/,'[[\1]]')
    params = Helper.parse_template(template)

    raise UnresolvedCase.new('contains unsupported param') unless params"depth"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"depth_imperial"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"depth1"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"depth1_imperial"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"free"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"free2"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"source_confluence_coordinates"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"source_confluence"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"source_confluence_location"].empty?
    
    result = "{{Infobox river
| name               = #{params"name"}#{"{{subst:PAGENAME}}" if params'name'].empty?}
| name_native        = #{params'native_name'}
| name_native_lang   = 
| name_other         = #{parse_other_name(params)}
| name_etymology     = #{params'etymology'}#{params'etymology_note'}
<!---------------------- IMAGE & MAP -->
| image              = #{params"image"}
| image_size         = #{params'image_size'}
| image_caption      = #{params"image_caption"}
| map                = #{params'map'}
| map_size           = #{params'map_size'}#{params'pushpin_map_size' if params'map_size'].empty?}
| map_caption        = #{params'map_caption'}
| pushpin_map        = #{get_map(params)}
| pushpin_map_size   = #{params'map_size'}#{params'pushpin_map_size' if params'map_size'].empty?}
| pushpin_map_caption= #{params'pushpin_map_caption'}
<!---------------------- LOCATION -->
| subdivision_type1  = Country
| subdivision_name1  = #{parse_multi_location(params, 'country')}
| subdivision_type2  = #{('State' unless(params"state"].empty? || !params'state_type'].empty?))||params"state_type"}
| subdivision_name2  = #{parse_multi_location(params, 'state')}
| subdivision_type3  = #{('Region' unless (params"region"].empty? || !params'region_type'].empty?))||params"region_type"}
| subdivision_name3  = #{parse_multi_location(params, 'region')}
| subdivision_type4  = #{('District' unless (params"district"].empty? || !params'district_type'].empty?))||params"district_type"}
| subdivision_name4  = #{parse_multi_location(params, 'district')}
| subdivision_type5  = #{parse_city_type(params)}
| subdivision_name5  = #{parse_city(params)}
<!---------------------- PHYSICAL CHARACTERISTICS -->
| length             = #{parse_length(params)} 
| width_min          = 
| width_avg          = 
| width_max          = 
| depth_min          = 
| depth_avg          = 
| depth_max          = #{parse_discharge(params)}
<!---------------------- BASIN FEATURES -->#{parse_sources(params)}
| mouth              = #{autolink(params'mouth_name')}#{autolink(params'mouth')}#{params'mouth_note' unless (params'mouth'].empty? && params'mouth_name'].empty?)}
| mouth_location     = #{parse_river_location(params, 'mouth')}
| mouth_coordinates  = #{params'mouth_coordinates'}#{params'mouth_coordinates_country'}#{params'mouth_coordinates_note'}
| mouth_elevation    = #{parse_mouth_elevation(params)}
| progression        = 
| river_system       = #{autolink(params'parent')}
| basin_size         = #{parse_watershed(params)}
| tributaries_left   = #{parse_tributaries_l(params)}
| tributaries_right  = #{parse_tributaries_r(params)}
| custom_label       = 
| custom_data        = 
| extra              = #{params'footnotes'}
}}"  
    page.sub!(old_template, result)
    page
  end
From Wikipedia, the free encyclopedia

NOTE not shown here are the 50+ test cases that are run against this script.

  def parse_length(params)
    raise UnresolvedCase unless params'length_unit'].empty?
    return "{{convert|#{params'length'}|km|mi|abbr=on}}#{", #{params'length_orientation'}" unless params'length_orientation'].empty?}#{params'length_note'}" unless params'length'].empty?
    return "{{convert|#{params'length_imperial'}|mi|km|abbr=on}}#{", #{params'length_orientation'}" unless params'length_orientation'].empty?}#{params'length_note'}" unless params'length_imperial'].empty?
  end
  
  def parse_watershed(params)
    raise UnresolvedCase unless params'watershed_unit'].empty?
    return "{{convert|#{params'watershed'}|km2|abbr=on}}#{params'watershed_note'}" unless params'watershed'].empty?
    return "{{convert|#{params'watershed_imperial'}|sqmi|abbr=on}}#{params'watershed_note'}" unless params'watershed_imperial'].empty?
  end
  
  def parse_mouth_elevation(params)
    raise UnresolvedCase unless params'mouth_elevation_unit'].empty?
    return "{{convert|#{params'mouth_elevation'}|m|abbr=on}}#{params'mouth_elevation_note'}" unless params'mouth_elevation'].empty?
    return "{{convert|#{params'mouth_elevation_imperial'}|ft|abbr=on}}#{params'mouth_elevation_note'}" unless params'mouth_elevation_imperial'].empty?
  end
  
  def parse_tributaries_l(params)
    values = 
        autolink(params'tributary_left'),
        autolink(params'tributary_left1'),
        autolink(params'tributary_left2'),
        autolink(params'tributary_left3'),
        autolink(params'tributary_left4'),
        autolink(params'tributary_left5'),
        autolink(params'tributary_left6'),
        autolink(params'tributary_left7'),
        autolink(params'tributary_left8'),
        autolink(params'tributary_left9'),
        autolink(params'tributary_left10'),
        autolink(params'tributary_left11'),
        autolink(params'tributary_left12'),
        autolink(params'tributary_left13'),
        autolink(params'tributary_left14'),
        autolink(params'tributary_left15')
    ].reject{|val| val.empty?}
    return "#{values.join(', ')}"
  end
  
  def parse_tributaries_r(params)
    values = 
        autolink(params'tributary_right'),
        autolink(params'tributary_right1'),
        autolink(params'tributary_right2'),
        autolink(params'tributary_right3'),
        autolink(params'tributary_right4'),
        autolink(params'tributary_right5'),
        autolink(params'tributary_right6'),
        autolink(params'tributary_right7'),
        autolink(params'tributary_right8'),
        autolink(params'tributary_right9'),
        autolink(params'tributary_right10'),
        autolink(params'tributary_right11'),
        autolink(params'tributary_right12'),
        autolink(params'tributary_right13'),
        autolink(params'tributary_right14'),
        autolink(params'tributary_right15')
    ].reject{|val| val.empty?}
    return "#{values.join(', ')}"
  end

  def parse_source_elevation(params, value)
    raise UnresolvedCase unless params"#{value}_elevation_unit"].empty?
    return "{{convert|#{params"#{value}_elevation"}|m|abbr=on}}#{params"#{value}_elevation_note"}" unless params"#{value}_elevation"].empty?
    return "{{convert|#{params"#{value}_elevation_imperial"}|ft|abbr=on}}#{params"#{value}_elevation_note"}" unless params"#{value}_elevation_imperial"].empty?
  end
  
  def parse_river_location(params, value)
    
        autolink(params"#{value}_location"), 
        autolink(params"#{value}_municipality"), 
        autolink(params"#{value}_district"), 
        autolink(params"#{value}_region"), 
        autolink(params"#{value}_state"), 
        autolink(params"#{value}_country"), 
    ].reject{|val| val.empty?}.join(', ')
  end
  
  def parse_sources(params)
    result = "
| source1            = #{autolink params'source'}#{autolink params'source_name'}
| source1_location   = #{parse_river_location(params, 'source')}
| source1_coordinates= #{params'source_coordinates'}#{params'source_coordinates_note'}
| source1_elevation  = #{parse_source_elevation(params, 'source')}"
    unless params'source1'].empty?
      result += "
| source2            = #{autolink params'source1'}#{autolink params'source1_name'}
| source2_location   = #{parse_river_location(params, 'source1')}
| source2_coordinates= #{params'source1_coordinates'}#{params'source1_coordinates_note'}
| source2_elevation  = #{parse_source_elevation(params, 'source1')}"
    end
    unless params'source2'].empty?
      result += "
| source3            = #{autolink params'source2'}#{autolink params'source2_name'}
| source3_location   = #{parse_river_location(params, 'source2')}
| source3_coordinates= #{params'source2_coordinates'}#{params'source2_coordinates_note'}
| source3_elevation  = #{parse_source_elevation(params, 'source2')}"
    end
    unless params'source3'].empty?
      result += "
| source4            = #{params'source3'}#{params'source3_name'}
| source4_location   = #{parse_river_location(params, 'source3')}
| source4_coordinates= #{params'source3_coordinates'}#{params'source3_coordinates_note'}
| source4_elevation  = #{parse_source_elevation(params, 'source3')}"
    end
    unless params'source3'].empty?
      result += "
| source5            = #{params'source4'}#{params'source4_name'}
| source5_location   = #{parse_river_location(params, 'source4')}
| source5_coordinates= #{params'source4_coordinates'}#{params'source4_coordinates_note'}
| source5_elevation  = #{parse_source_elevation(params, 'source4')}"
    end
    result
  end

  def parse_discharge_rate2(params, pre)
    raise UnresolvedCase unless params"#{pre}_unit"].empty?
    #NOTE: If either of the next two lines are ever raised, perhaps they should just return nil string instead of raising error
    return '' unless (params"#{pre}_average"].empty? && params"#{pre}_average_imperial"].empty?)
    return "{{convert|#{params"#{pre}"}|m3/s|cuft/s|abbr=on}}#{params"#{pre}_note"}" unless params"#{pre}"].empty?
    return "{{convert|#{params"#{pre}_imperial"}|cuft/s|m3/s|abbr=on}}#{params"#{pre}_note"}" unless params"#{pre}_imperial"].empty?
  end


  def parse_discharge_rate(params, pre, val)
    raise UnresolvedCase unless params"#{pre}_unit"].empty?
    raise UnresolvedCase unless params"#{pre}_#{val}_unit"].empty?
    return "{{convert|#{params"#{pre}_#{val}"}|m3/s|cuft/s|abbr=on}}#{params"#{pre}_#{val}_note"}" unless params"#{pre}_#{val}"].empty?
    return "{{convert|#{params"#{pre}_#{val}_imperial"}|cuft/s|m3/s|abbr=on}}#{params"#{pre}_#{val}_note"}" unless params"#{pre}_#{val}_imperial"].empty?
  end

  def parse_discharge(params)
    result = "
| discharge1_location= #{autolink(params'discharge_location')}#{params'discharge_note' unless params'discharge_location'].empty? }
| discharge1_min     = #{parse_discharge_rate(params, 'discharge', 'min')}
| discharge1_avg     = #{parse_discharge_rate(params, 'discharge', 'average')}#{parse_discharge_rate2(params, 'discharge')}
| discharge1_max     = #{parse_discharge_rate(params, 'discharge', 'max')}"
    unless params'discharge1_location'].empty?
      result += "
| discharge2_location= #{autolink(params'discharge1_location')}#{params'discharge1_note' unless params'discharge1_location'].empty?}
| discharge2_min     = #{parse_discharge_rate(params, 'discharge1', 'min')}
| discharge2_avg     = #{parse_discharge_rate(params, 'discharge1', 'average')}#{parse_discharge_rate2(params, 'discharge1')}
| discharge2_max     = #{parse_discharge_rate(params, 'discharge1', 'max')}"
    end
    unless params'discharge2_location'].empty?
      result += "
| discharge3_location= #{autolink(params'discharge2_location')}#{params'discharge2_note' unless params'discharge2_location'].empty?}
| discharge3_min     = #{parse_discharge_rate(params, 'discharge2', 'min')} 
| discharge3_avg     = #{parse_discharge_rate(params, 'discharge2', 'average')}#{parse_discharge_rate2(params, 'discharge2')}
| discharge3_max     = #{parse_discharge_rate(params, 'discharge2', 'max')}"
    end
    unless params'discharge3_location'].empty?
      result += "
| discharge4_location= #{autolink(params'discharge3_location')}#{params'discharge3_note' unless params'discharge3_location'].empty?}
| discharge4_min     = #{parse_discharge_rate(params, 'discharge3', 'min')} 
| discharge4_avg     = #{parse_discharge_rate(params, 'discharge3', 'average')}#{parse_discharge_rate2(params, 'discharge3')}
| discharge4_max     = #{parse_discharge_rate(params, 'discharge3', 'max')}"
    end
    unless params'discharge4_location'].empty?
      result += "
| discharge5_location= #{autolink(params'discharge4_location')}#{params'discharge4_note' unless params'discharge4_location'].empty?}
| discharge5_min     = #{parse_discharge_rate(params, 'discharge4', 'min')} 
| discharge5_avg     = #{parse_discharge_rate(params, 'discharge4', 'average')}#{parse_discharge_rate2(params, 'discharge4')} 
| discharge5_max     = #{parse_discharge_rate(params, 'discharge4', 'max')}"
    end
    result
  end
  
  def parse_multi_location(params, val)
    # val = 'country', 'district', 'town', 'city', etc...
    result = "#{autolink(paramsval)}#{params"#{val}_note" unless paramsval].empty? }"
    (1..15).each do |i|
      param = val+i.to_s
      result << "#{autolink(paramsparam)}#{params"#{param}_note"}" unless paramsparam].empty?
    end
    result.join(', ')
  end
  
  def parse_city_type(params)
    raise UnresolvedCase unless (params"municipality"].empty? || params"city"].empty?)
    return '' if (params"municipality"].empty? && params"city"].empty?)
    if params"municipality"].empty?
      return params'city_type' unless params'city_type'].empty?
      return params"city1"].empty? ? 'City' : 'Cities'
    else
      return params'municipality_type' unless params'municipality_type'].empty?
      return params"municipality1"].empty? ? 'Municipality' : 'Municipalities'
    end
  end
  
  def parse_city(params)
    raise UnresolvedCase unless (params"municipality"].empty? || params"city"].empty?)
    return '' if (params"municipality"].empty? && params"city"].empty?)
    result = []
    if params"municipality"].empty?
      result = "#{autolink(params'city')}#{params"city_note" unless params'city'].empty? }"
      (1..15).each do |i|
        param = 'city'+i.to_s
        result << "#{autolink(paramsparam)}#{params"#{param}_note"}" unless paramsparam].empty?
      end
    else
      result = "#{autolink(params'municipality')}#{params"municipality_note" unless params'municipality'].empty? }"
      (1..15).each do |i|
        param = 'municipality'+i.to_s
        result << "#{autolink(paramsparam)}#{params"#{param}_note"}" unless paramsparam].empty?
      end
    end
    result.join(', ')
  end
  
  def parse_other_name(params)
    result = "#{params'other_name'}#{params"other_name_note" unless params'other_name'].empty? }"
    (1..7).each do |i|
      param = 'other_name'+i.to_s
      result << "#{paramsparam}#{params"#{param}_note"}" unless paramsparam].empty?
    end
    result.reject{|val| val.empty?}.join(', ')
  end
  
  def autolink(value)
    return '' if value.nil? || value.empty?  
    return value if (value.include?('[[') || value.include?('{{'))
    "{{subst:#ifexist:#{value}|[[#{value}]]|#{value}}}"
  end

def parse_geobox_to_river(page)
    page.force_encoding('UTF-8')
    templates = page.scan(/(?=\{\{(?:geobox|geo box}))(\{\{(?>[^{}]++|\g<1>)*}})/i).flatten
    raise NoTemplatesFound if templates.empty?
    raise UnresolvedCase if templates.size > 1

    template = templates.first
    old_template = template.dup
    
    raise UnresolvedCase.new('Contains invalid ref') if template.match?(/<ref\s*name=".*\|.*\"/i)
    
    template.gsub!(/<!--[\w\W]*?-->/,'')
    template.gsub!('{{USA}}', '[[United States]]')
    template.gsub!(/\{\{flag\|(.*)\}\}/,'[[\1]]')
    params = Helper.parse_template(template)

    raise UnresolvedCase.new('contains unsupported param') unless params"depth"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"depth_imperial"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"depth1"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"depth1_imperial"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"free"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"free2"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"source_confluence_coordinates"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"source_confluence"].empty?
    raise UnresolvedCase.new('contains unsupported param') unless params"source_confluence_location"].empty?
    
    result = "{{Infobox river
| name               = #{params"name"}#{"{{subst:PAGENAME}}" if params'name'].empty?}
| name_native        = #{params'native_name'}
| name_native_lang   = 
| name_other         = #{parse_other_name(params)}
| name_etymology     = #{params'etymology'}#{params'etymology_note'}
<!---------------------- IMAGE & MAP -->
| image              = #{params"image"}
| image_size         = #{params'image_size'}
| image_caption      = #{params"image_caption"}
| map                = #{params'map'}
| map_size           = #{params'map_size'}#{params'pushpin_map_size' if params'map_size'].empty?}
| map_caption        = #{params'map_caption'}
| pushpin_map        = #{get_map(params)}
| pushpin_map_size   = #{params'map_size'}#{params'pushpin_map_size' if params'map_size'].empty?}
| pushpin_map_caption= #{params'pushpin_map_caption'}
<!---------------------- LOCATION -->
| subdivision_type1  = Country
| subdivision_name1  = #{parse_multi_location(params, 'country')}
| subdivision_type2  = #{('State' unless(params"state"].empty? || !params'state_type'].empty?))||params"state_type"}
| subdivision_name2  = #{parse_multi_location(params, 'state')}
| subdivision_type3  = #{('Region' unless (params"region"].empty? || !params'region_type'].empty?))||params"region_type"}
| subdivision_name3  = #{parse_multi_location(params, 'region')}
| subdivision_type4  = #{('District' unless (params"district"].empty? || !params'district_type'].empty?))||params"district_type"}
| subdivision_name4  = #{parse_multi_location(params, 'district')}
| subdivision_type5  = #{parse_city_type(params)}
| subdivision_name5  = #{parse_city(params)}
<!---------------------- PHYSICAL CHARACTERISTICS -->
| length             = #{parse_length(params)} 
| width_min          = 
| width_avg          = 
| width_max          = 
| depth_min          = 
| depth_avg          = 
| depth_max          = #{parse_discharge(params)}
<!---------------------- BASIN FEATURES -->#{parse_sources(params)}
| mouth              = #{autolink(params'mouth_name')}#{autolink(params'mouth')}#{params'mouth_note' unless (params'mouth'].empty? && params'mouth_name'].empty?)}
| mouth_location     = #{parse_river_location(params, 'mouth')}
| mouth_coordinates  = #{params'mouth_coordinates'}#{params'mouth_coordinates_country'}#{params'mouth_coordinates_note'}
| mouth_elevation    = #{parse_mouth_elevation(params)}
| progression        = 
| river_system       = #{autolink(params'parent')}
| basin_size         = #{parse_watershed(params)}
| tributaries_left   = #{parse_tributaries_l(params)}
| tributaries_right  = #{parse_tributaries_r(params)}
| custom_label       = 
| custom_data        = 
| extra              = #{params'footnotes'}
}}"  
    page.sub!(old_template, result)
    page
  end

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook