worldfootball 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 170277c7714f9b75e93176eb5fff6242fb6efb85051bc8977f7f635dbebf0513
4
- data.tar.gz: 5b15d132765c3ee2df4cbdd847b43ba6c7e7bd617ed55bb5fe4dfabc0becb0e0
3
+ metadata.gz: 99623775fef73f0837946ba44625a572bbe5fee3a64aa6aa9a2f6f79702a0d01
4
+ data.tar.gz: 1ed058214bcca9fad1aac5b205e73c101a79a14ef979dbdee37c3a784fe03460
5
5
  SHA512:
6
- metadata.gz: c95b4b2becf545be2c208a207e8980d06369148d18b0657cddfb81470331c828ee8492649908ece372fb996b9d1a6dfc8eeaa45c54a3757eba7fb6d02e363bf0
7
- data.tar.gz: ca127cb3f69c861dba48b049ed6da30b9ecde1f3935b30422d6184869b650b5cafc056be7fa37c7198bbd72ad65bdd262e56c82631c62629f4bbb4222992a9c9
6
+ metadata.gz: 2b2ec98872c3cf9ae5b9f39cd6ac5bcd205ea35a4ea1282a575f8ea9256226f4395c4021b57417e6d77db38b474127b35cd2836aee3d381a8138b318cb588be0
7
+ data.tar.gz: dff2a077af11f10c6c0f1e923e42710b04b198a5c7a7677363a25bfa7e508ec56867d64c2df8f907a51584613b0d86a8f246f6727755fa1dfa1e6c1135962877
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.1.1
1
+ ### 0.1.2
2
2
 
3
3
  ### 0.0.1 / 2024-07-04
4
4
 
data/Manifest.txt CHANGED
@@ -3,24 +3,16 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  bin/wfb
6
+ config/leagues.csv
6
7
  lib/worldfootball.rb
8
+ lib/worldfootball/build-parse_score.rb
7
9
  lib/worldfootball/build.rb
10
+ lib/worldfootball/cache.rb
11
+ lib/worldfootball/config.rb
8
12
  lib/worldfootball/convert.rb
9
13
  lib/worldfootball/convert_reports.rb
10
14
  lib/worldfootball/download.rb
11
- lib/worldfootball/generator.rb
12
15
  lib/worldfootball/leagues.rb
13
- lib/worldfootball/leagues/asia.rb
14
- lib/worldfootball/leagues/europe--british_isles.rb
15
- lib/worldfootball/leagues/europe--central.rb
16
- lib/worldfootball/leagues/europe--eastern.rb
17
- lib/worldfootball/leagues/europe--northern.rb
18
- lib/worldfootball/leagues/europe--southern.rb
19
- lib/worldfootball/leagues/europe--western.rb
20
- lib/worldfootball/leagues/europe.rb
21
- lib/worldfootball/leagues/north_america.rb
22
- lib/worldfootball/leagues/pacific.rb
23
- lib/worldfootball/leagues/south_america.rb
24
16
  lib/worldfootball/mods.rb
25
17
  lib/worldfootball/page.rb
26
18
  lib/worldfootball/page_report.rb
data/README.md CHANGED
@@ -11,7 +11,42 @@
11
11
  ## Usage
12
12
 
13
13
 
14
- To be done
14
+ To get started use the `wfb` command-line tool.
15
+
16
+ List all (pre-configured) leagues:
17
+
18
+ ```
19
+ $ wfb leagues
20
+ ```
21
+
22
+ Print the match schedue of a league (season). Let's try the English Premier League:
23
+
24
+ ```
25
+ $ wfb eng.1 2024/25
26
+ $ wfb eng.1 2024/25 --offline # use cached (offline local) pages
27
+ ```
28
+
29
+ Or try the DFB Pokal (that is, the German Cup):
30
+
31
+ ```
32
+ $ wfb de.cup 2024/25 --offline # use cached (offline local) pages
33
+ ```
34
+
35
+ and so on.
36
+
37
+
38
+
39
+
40
+
41
+
42
+ ### More
43
+
44
+ Debugging tips. List all cached (offline local) match schedule pages:
45
+
46
+ ```
47
+ $ wfb cache
48
+ ```
49
+
15
50
 
16
51
 
17
52
 
data/Rakefile CHANGED
@@ -19,8 +19,8 @@ Hoe.spec 'worldfootball' do
19
19
 
20
20
  self.extra_deps = [
21
21
  ## ['tzinfo'],
22
- ['season-formats'],
23
- ['webget'],
22
+ ['season-formats'],
23
+ ['webget'],
24
24
  ['nokogiri'],
25
25
  ['cocos'], ## later pull in with sportsdb-writers
26
26
  ]
@@ -28,7 +28,7 @@ Hoe.spec 'worldfootball' do
28
28
  self.licenses = ['Public Domain']
29
29
 
30
30
  self.spec_extras = {
31
- required_ruby_version: '>= 2.2.2'
31
+ required_ruby_version: '>= 3.1.0'
32
32
  }
33
33
 
34
34
  end
data/bin/wfb CHANGED
@@ -9,18 +9,30 @@ require 'worldfootball'
9
9
  Webcache.root = if File.exist?( '/sports/cache' )
10
10
  puts " setting web cache to >/sports/cache<"
11
11
  '/sports/cache'
12
- else
12
+ else
13
13
  './cache'
14
14
  end
15
15
 
16
+ ## convert (default) output directory
17
+ Worldfootball.config.convert.out_dir = if File.exist?( '/sports/cache.wfb')
18
+ puts " setting convert out_dir to >/sports/cache.wfb<"
19
+ '/sports/cache.wfb'
20
+ else
21
+ '.' ## use working dir
22
+ end
16
23
 
17
24
  require 'optparse'
18
25
 
19
26
 
20
27
  module Worldfootball
21
- def self.main( args=ARGV )
28
+ def self.main( args=ARGV )
29
+
30
+ opts = {
31
+ cached: false,
32
+ convert: true,
33
+ }
34
+
22
35
 
23
- opts = {}
24
36
  parser = OptionParser.new do |parser|
25
37
  parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
26
38
 
@@ -28,12 +40,27 @@ parser = OptionParser.new do |parser|
28
40
  ## check if git has a offline option?? (use same)
29
41
  ## check for other tools - why? why not?
30
42
 
43
+ ## todo - add a single letter option for offline/cached
31
44
 
32
45
  parser.on( "--cache", "--cached", "--offline",
33
- "use cached data in #{Webcache.root}" ) do |cached|
46
+ "use cached data in >#{Webcache.root}<" ) do |cached|
34
47
  opts[:cached] = cached
35
48
  end
49
+
50
+ parser.on( "--no-convert",
51
+ "turn off conversion to .csv in #{Worldfootball.config.convert.out_dir} - default is (#{!opts[:convert]})" ) do |convert|
52
+ opts[:convert] = !convert
53
+ end
54
+
55
+ parser.on( "--dry",
56
+ "dry run / show league page meta info" ) do |dry|
57
+ opts[:dry] = dry
58
+ end
36
59
  end
60
+
61
+
62
+
63
+
37
64
  parser.parse!( args )
38
65
 
39
66
  puts "OPTS:"
@@ -42,12 +69,19 @@ puts "ARGV:"
42
69
  p args
43
70
 
44
71
 
72
+ ### check special (built-in) commands first
73
+ if ['cache'].include?( args[0] )
74
+ Worldfootball.list_pages
75
+ exit 0
76
+ end
77
+
78
+
45
79
  if ['league', 'leagues', 'ls'].include?( args[0] || 'leagues' )
46
80
  keys = LEAGUES.keys
47
-
81
+
48
82
  pp keys
49
83
  puts " #{keys.size} league(s)"
50
-
84
+
51
85
  # puts
52
86
  # puts " pages:"
53
87
  # pp Worldfootball::PAGES
@@ -59,33 +93,42 @@ end
59
93
 
60
94
  league_code = args[0].downcase
61
95
 
62
- league = find_league( league_code ) ## league info lookup
63
-
64
- season = Season( args[1] || '2024/25' )
96
+ league = find_league!( league_code ) ## league info lookup
97
+
98
+ if opts[:dry]
99
+ ## output more page meta info
100
+ puts "league meta:"
101
+ pp league
102
+ end
103
+
104
+
105
+ season = Season( args[1] || '2024/25' )
106
+
107
+ pages = league.pages!( season: season )
65
108
 
66
- pages = league.pages( season: season )
67
109
 
110
+ puts
68
111
  pp pages
69
112
  puts " #{pages.size} page(s)"
70
113
 
71
114
 
72
- ## wrap single page record into array
73
- pages = pages.is_a?( Array ) ? pages : [pages]
115
+ if opts[:dry]
116
+ ## stop here if dry run
117
+ exit 0
118
+ end
74
119
 
75
- if opts[:cached]
120
+
121
+ if opts[:cached]
76
122
  # do nothing
77
123
  else ## download to cache
78
- pages.each_with_index do |page_rec,i|
79
- slug = page_rec[:slug]
80
- puts "==> #{i+1}/#{pages.size} - #{league_code} @ #{slug}..."
81
- page = Metal.download_schedule( slug )
82
- end
124
+ pages.each_with_index do |(slug,_),i|
125
+ puts "==> #{i+1}/#{pages.size} - #{league_code} @ #{slug}..."
126
+ page = Metal.download_schedule( slug )
127
+ end
83
128
  end
84
129
 
85
130
 
86
- pages.each_with_index do |page_rec,i|
87
- slug = page_rec[:slug]
88
-
131
+ pages.each_with_index do |(slug,_),i|
89
132
  puts "==> #{i+1}/#{pages.size} - #{league_code} @ #{slug}..."
90
133
  page = Page::Schedule.from_cache( slug )
91
134
  matches = page.matches
@@ -94,11 +137,16 @@ pages.each_with_index do |page_rec,i|
94
137
  end
95
138
 
96
139
 
140
+ if opts[:convert]
141
+ ## write out (export to) comma-separated values (.csv) datafile
142
+ convert( league: league_code,
143
+ season: season )
144
+ end
97
145
  end # def self.main
98
146
  end # module Worldfootball
99
-
147
+
100
148
 
101
149
  Worldfootball.main( ARGV )
102
150
 
103
-
151
+
104
152
  puts "bye"
@@ -0,0 +1,16 @@
1
+ key, slug
2
+
3
+ de.1, bundesliga-2024-2025
4
+ de.2, 2-bundesliga-2024-2025
5
+ de.3, 3-liga-2024-2025
6
+ de.4.bayern, regionalliga-bayern-2024-2025
7
+ de.cup, dfb-pokal-2024-2025
8
+
9
+ at.1, aut-bundesliga-2024-2025
10
+ at.2, aut-2-liga-2024-2025
11
+ at.3.o, aut-regionalliga-ost-2024-2025
12
+ at.cup, aut-oefb-cup-2024-2025
13
+
14
+
15
+
16
+
@@ -0,0 +1,156 @@
1
+ module Worldfootball
2
+
3
+
4
+
5
+ def self.parse_score( score_str )
6
+ ## add support for
7
+ ## 3-0 (0-0, 0-0) Wert.
8
+ ## 3-0 (0-0, 0-0) awd.
9
+
10
+ ## check for 0:3 Wert. - change Wert. to awd. (awarded)
11
+ ## todo/fix - use "hardcoded" Wert\. in regex - why? why not?
12
+ ## score_str = score_str.sub( /Wert\./i, 'awd.' )
13
+
14
+
15
+ comments = String.new ## check - rename to/use status or such - why? why not?
16
+
17
+ ## split score
18
+ ft = ''
19
+ ht = ''
20
+ et = ''
21
+ pen = ''
22
+
23
+
24
+ if score_str == '---' ## in the future (no score yet) - was -:-
25
+ ft = ''
26
+ ht = ''
27
+ elsif score_str == 'n.gesp.' || ## cancelled (british) / canceled (us)
28
+ score_str == 'ausg.' || ## todo/check: change to some other status ????
29
+ score_str == 'annull.' ## todo/check: change to some other status (see ie 2012) ????
30
+ ft = '(*)'
31
+ ht = ''
32
+ comments = 'cancelled'
33
+ elsif score_str == 'abgebr.' ## abandoned -- waiting for replay?
34
+ ft = '(*)'
35
+ ht = ''
36
+ comments = 'abandoned'
37
+ elsif score_str == 'verl.' ## postponed
38
+ ft = ''
39
+ ht = ''
40
+ comments = 'postponed'
41
+ # 5-4 (0-0, 1-1, 2-2) i.E.
42
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
43
+ [ ]*
44
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
45
+ [ ]*,[ ]*
46
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)
47
+ [ ]*,[ ]*
48
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)\)
49
+ [ ]*
50
+ i\.E\.
51
+ /x
52
+ pen = "#{$1}-#{$2}"
53
+ ht = "#{$3}-#{$4}"
54
+ ft = "#{$5}-#{$6}"
55
+ et = "#{$7}-#{$8}"
56
+ # 3-2 (0-0, 1-1) i.E. - note: no extra time!!! only ht,ft!!!
57
+ # "popular" in southamerica & mexico
58
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
59
+ [ ]*
60
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
61
+ [ ]*,[ ]*
62
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)\)
63
+ [ ]*
64
+ i\.E\.
65
+ /x
66
+ pen = "#{$1}-#{$2}"
67
+ ht = "#{$3}-#{$4}"
68
+ ft = "#{$5}-#{$6}"
69
+ et = ''
70
+ # 2-1 (1-0, 1-1) n.V
71
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
72
+ [ ]*
73
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
74
+ [ ]*,[ ]*
75
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)
76
+ \)
77
+ [ ]*
78
+ n\.V\.
79
+ /x
80
+ et = "#{$1}-#{$2}"
81
+ ht = "#{$3}-#{$4}"
82
+ ft = "#{$5}-#{$6}"
83
+ ### auto-patch fix drop last score
84
+ ## 1-3 (0-1, 1-1, 0-2) n.V. => 1-3 (0-1, 1-1) n.V.
85
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
86
+ [ ]*
87
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
88
+ [ ]*,[ ]*
89
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)
90
+ [ ]*,[ ]*
91
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)
92
+ \)
93
+ [ ]*
94
+ n\.V\.
95
+ /x
96
+ et = "#{$1}-#{$2}"
97
+ ht = "#{$3}-#{$4}"
98
+ ft = "#{$5}-#{$6}"
99
+
100
+ puts "!! WARN - auto-fix/patch score - >#{score_str}<"
101
+ ### todo/fix - log auto-patch/fix - for double checking!!!!!
102
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
103
+ [ ]*
104
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
105
+ \)
106
+ /x
107
+ ft = "#{$1}-#{$2}"
108
+ ht = "#{$3}-#{$4}"
109
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
110
+ [ ]*
111
+ Wert\. # ([a-z.]+)
112
+ /x ### assume awd. (awarded) always - why? why not?
113
+ ft = "#{$1}-#{$2} (*)"
114
+ ht = ''
115
+ comments = 'awd.' # awarded - $3
116
+ ## auto-fix/patch
117
+ ## drop last scores (only use ft)
118
+ ## 3-0 (0-0, 0-0) awd.
119
+ elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
120
+ [ ]*
121
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
122
+ [ ]*,[ ]*
123
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)
124
+ \)
125
+ [ ]*
126
+ Wert\. # ([a-z.]+)
127
+ /x ### assume awd. (awarded) always - why? why not?
128
+ ft = "#{$1}-#{$2} (*)"
129
+ ht = ''
130
+ comments = 'awd.' # awarded - $7
131
+ ## (auto) log case for double checking - why? why not?
132
+ elsif score_str =~ /^([0-9]+)-([0-9]+)$/
133
+ ft = "#{$1}-#{$2}" ## e.g. see luxemburg and others
134
+ ht = ''
135
+ ## auto-fix/patch
136
+ # 3-3 (0-3, 3-3) => 3-3 (0-3) - drop last score
137
+ elsif score_str =~ /^([0-9]+) [ ]*-[ ]* ([0-9]+)
138
+ [ ]*
139
+ \(([0-9]+) [ ]*-[ ]* ([0-9]+)
140
+ [ ]*,[ ]*
141
+ ([0-9]+) [ ]*-[ ]* ([0-9]+)
142
+ \)$
143
+ /x
144
+ ft = "#{$1}-#{$2}"
145
+ ht = "#{$3}-#{$4}"
146
+
147
+ puts "!! WARN - auto-fix/patch score - >#{score_str}<"
148
+ ### todo/fix - log auto-patch/fix - for double checking!!!!!
149
+ else
150
+ puts "!! ERROR - unsupported score format >#{score_str}< - sorry; maybe add a score error fix/patch"
151
+ exit 1
152
+ end
153
+
154
+ [ht, ft, et, pen, comments]
155
+ end
156
+ end # module Worldfootball
@@ -7,6 +7,9 @@ ROUND_TO_EN = {
7
7
  '2. Runde' => 'Round 2',
8
8
  '3. Runde' => 'Round 3',
9
9
  '4. Runde' => 'Round 4',
10
+ '5. Runde' => 'Round 5',
11
+ '6. Runde' => 'Round 6',
12
+ '7. Runde' => 'Round 7',
10
13
  'Achtelfinale' => 'Round of 16',
11
14
  'Viertelfinale' => 'Quarterfinals',
12
15
  'Halbfinale' => 'Semifinals',
@@ -20,9 +23,10 @@ ROUND_TO_EN = {
20
23
  def self.build( rows, season:, league:, stage: '' ) ## rename to fixup or such - why? why not?
21
24
  season = Season( season ) ## cast (ensure) season class (NOT string, integer, etc.)
22
25
 
23
- raise ArgumentError, "league key as string expected" unless league.is_a?(String) ## note: do NOT pass in league struct! pass in key (string)
26
+ ## note: do NOT pass in league struct! pass in key (string)
27
+ raise ArgumentError, "league key as string expected" unless league.is_a?(String)
24
28
 
25
- print " #{rows.size} rows - build #{league} #{season}"
29
+ print " #{rows.size} row(s) - Worldfootball.build #{league} #{season}"
26
30
  print " - #{stage}" unless stage.empty?
27
31
  print "\n"
28
32
 
@@ -47,44 +51,49 @@ def self.build( rows, season:, league:, stage: '' ) ## rename to fixup or such
47
51
  print '[%03d] ' % (i+1)
48
52
  print row[:round]
49
53
 
50
- if m = row[:round].match( /([0-9]+)\. Spieltag/ )
54
+ if (m = row[:round].match( /^(?<num>[0-9]+)\. Spieltag$/ ))
51
55
  ## todo/check: always use a string even if number (as a string eg. '1' etc.)
52
- round = m[1] ## note: keep as string (NOT number)
56
+ round = m[:num] ## note: keep as string (NOT number)
53
57
  print " => #{round}"
54
58
  else
55
- puts "!! ERROR: cannot find matchday number"
59
+ puts "!! ERROR: cannot find matchday number in >#{row[:round]}<:"
60
+ pp row
56
61
  exit 1
57
62
  end
58
63
  print "\n"
59
- elsif row[:round] =~ /[1-9]\.[ ]Runde|
64
+
65
+ ## note - must start line e.g.
66
+ ## do NOT match => Qual. 1. Runde (1. Runde)!!!
67
+ elsif row[:round] =~ /^(
68
+ [1-9]\.[ ]Runde|
60
69
  Achtelfinale|
61
70
  Viertelfinale|
62
71
  Halbfinale|
63
72
  Finale
64
- /x
73
+ )$
74
+ /x
65
75
  puts
66
76
  print '[%03d] ' % (i+1)
67
77
  print row[:round]
68
78
 
79
+ round = ROUND_TO_EN[ row[:round] ]
80
+ print " => #{round}"
81
+ print "\n"
69
82
 
70
- ## do NOT translate rounds (to english) - keep in german / deutsch (de)
71
- if ['at.cup', 'at.1', ## at.1 - incl. europa league playoff
72
- 'de.cup'].include?( league )
73
- round = row[:round]
74
- else
75
- round = ROUND_TO_EN[ row[:round] ]
76
- if round.nil?
77
- puts "!! ERROR: no mapping for round to english (en) found >#{row[:round]}<:"
78
- pp row
79
- exit 1
80
- end
81
- print " => #{round}"
83
+ if round.nil?
84
+ puts "!! ERROR: no mapping for round to english (en) found >#{row[:round]}<:"
85
+ pp row
86
+ exit 1
82
87
  end
83
- print "\n"
84
88
  else
85
- puts "!! ERROR: unknown round >#{row[:round]}< for league >#{league}<:"
89
+ puts
90
+ print '[%03d] ' % (i+1)
91
+ print row[:round]
92
+ print "\n"
93
+
94
+ puts "!! WARN: unknown round >#{row[:round]}< for league >#{league}<:"
86
95
  pp row
87
- exit 1
96
+ round = row[:round]
88
97
  end
89
98
 
90
99
 
@@ -123,8 +132,6 @@ def self.build( rows, season:, league:, stage: '' ) ## rename to fixup or such
123
132
  print "\n"
124
133
 
125
134
 
126
- ## check for 0:3 Wert. - change Wert. to awd. (awarded)
127
- score_str = score_str.sub( /Wert\./i, 'awd.' )
128
135
 
129
136
  ## clean team name (e.g. remove (old))
130
137
  ## and asciify (e.g. ’ to ' )
@@ -135,12 +142,9 @@ def self.build( rows, season:, league:, stage: '' ) ## rename to fixup or such
135
142
  team2_str = mods[ team2_str ] if mods[ team2_str ]
136
143
 
137
144
 
138
-
139
-
140
145
  ht, ft, et, pen, comments = parse_score( score_str )
141
146
 
142
147
 
143
-
144
148
  recs << [stage,
145
149
  round,
146
150
  date.strftime( '%Y-%m-%d' ),
@@ -155,91 +159,4 @@ def self.build( rows, season:, league:, stage: '' ) ## rename to fixup or such
155
159
  end # each row
156
160
  recs
157
161
  end # build
158
-
159
-
160
-
161
- def self.parse_score( score_str )
162
- comments = String.new( '' ) ## check - rename to/use status or such - why? why not?
163
-
164
- ## split score
165
- ft = ''
166
- ht = ''
167
- et = ''
168
- pen = ''
169
- if score_str == '---' ## in the future (no score yet) - was -:-
170
- ft = ''
171
- ht = ''
172
- elsif score_str == 'n.gesp.' || ## cancelled (british) / canceled (us)
173
- score_str == 'ausg.' || ## todo/check: change to some other status ????
174
- score_str == 'annull.' ## todo/check: change to some other status (see ie 2012) ????
175
- ft = '(*)'
176
- ht = ''
177
- comments = 'cancelled'
178
- elsif score_str == 'abgebr.' ## abandoned -- waiting for replay?
179
- ft = '(*)'
180
- ht = ''
181
- comments = 'abandoned'
182
- elsif score_str == 'verl.' ## postponed
183
- ft = ''
184
- ht = ''
185
- comments = 'postponed'
186
- # 5-4 (0-0, 1-1, 2-2) i.E.
187
- elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
188
- [ ]*
189
- \(([0-9]+) [ ]*-[ ]* ([0-9]+)
190
- [ ]*,[ ]*
191
- ([0-9]+) [ ]*-[ ]* ([0-9]+)
192
- [ ]*,[ ]*
193
- ([0-9]+) [ ]*-[ ]* ([0-9]+)\)
194
- [ ]*
195
- i\.E\.
196
- /x
197
- pen = "#{$1}-#{$2}"
198
- ht = "#{$3}-#{$4}"
199
- ft = "#{$5}-#{$6}"
200
- et = "#{$7}-#{$8}"
201
- # 2-1 (1-0, 1-1) n.V
202
- elsif score_str =~ /([0-9]+) [ ]*-[ ]* ([0-9]+)
203
- [ ]*
204
- \(([0-9]+) [ ]*-[ ]* ([0-9]+)
205
- [ ]*,[ ]*
206
- ([0-9]+) [ ]*-[ ]* ([0-9]+)
207
- \)
208
- [ ]*
209
- n\.V\.
210
- /x
211
- et = "#{$1}-#{$2}"
212
- ht = "#{$3}-#{$4}"
213
- ft = "#{$5}-#{$6}"
214
- elsif score_str =~ /([0-9]+)
215
- [ ]*-[ ]*
216
- ([0-9]+)
217
- [ ]*
218
- \(([0-9]+)
219
- [ ]*-[ ]*
220
- ([0-9]+)
221
- \)
222
- /x
223
- ft = "#{$1}-#{$2}"
224
- ht = "#{$3}-#{$4}"
225
- elsif score_str =~ /([0-9]+)
226
- [ ]*-[ ]*
227
- ([0-9]+)
228
- [ ]*
229
- ([a-z.]+)
230
- /x
231
- ft = "#{$1}-#{$2} (*)"
232
- ht = ''
233
- comments = $3
234
- elsif score_str =~ /^([0-9]+)-([0-9]+)$/
235
- ft = "#{$1}-#{$2}" ## e.g. see luxemburg and others
236
- ht = ''
237
- else
238
- puts "!! ERROR - unsupported score format >#{score_str}< - sorry; maybe add a score error fix/patch"
239
- exit 1
240
- end
241
-
242
- [ht, ft, et, pen, comments]
243
- end
244
-
245
162
  end # module Worldfootball