22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/fifa/country_reader.rb', line 22
def parse
countries = []
last_country = nil
OutlineReader.parse( @txt ).each do |node|
node_type = node[0]
if [:h1, :h2].include?( node_type )
elsif node_type == :p lines = node[1]
lines.each do |line|
if line.start_with?( '|' )
values = line[1..-1].split( '|' ) values = values.map { |value| value.strip.gsub( /[ \t]+/, ' ' ) }
last_country.alt_names += values
elsif line =~ /^-[ ]*(\d{4})
[ ]+
(.+)$
/x year = $1.to_i
parts = $2.split( /=>|⇒/ )
values = parts[0].split( ',' )
values = values.map { |value| value.strip.gsub( /[ \t]+/, ' ' ) }
name = values[0]
code = values[1]
last_country = country = Country.new( name: "#{name} (-#{year})",
code: code )
countries << country
else
if line =~ /^([a-z]{2,4})
[ ]+
(.+)$/x
key = $1
values = $2.split( ',' )
values = values.map { |value| value.strip.gsub( /[ \t]+/, ' ' ) }
geos = split_geo( values[0] )
name = geos[0]
code = if values[1] && values[1] =~ /^[A-Z]{3,4}$/ values[1]
else
if values[1]
puts "** !!! ERROR !!! wrong code format >#{values[1]}<; expected three (or four)-letter all up-case"
else
puts "** !!! ERROR !!! missing code for (canonical) country name"
end
exit 1
end
tags = if values[2] split_tags( values[2] )
else
[]
end
last_country = country = Country.new( key: key,
name: name,
code: code,
tags: tags )
countries << country
else
puts "** !! ERROR - missing key for (canonical) country name"
exit 1
end
end
end else
puts "** !! ERROR - unknown node type / (input) source line:"
pp node
exit 1
end
end
countries
end
|