sunflower 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,339 +1,339 @@
1
- require 'orderedhash'
2
- require 'hpricot'
3
- require 'net/http'
4
- require 'sunflower-core.rb'
5
- require 'sunflower-listmaker.rb'
6
- include Net
7
-
8
- $datafile=File.open('aktual.txt','w')
9
- $datafile.sync=true
10
-
11
- id2team={}
12
- begin
13
- File.open('id2team.txt') do |f|
14
- id2team.replace Hash[*f.read.strip.split(/\r?\n|\t/)]
15
- end
16
- rescue
17
- end
18
-
19
- # comes from http://rubyforge.org/frs/?group_id=6257&release_id=36721
20
- module Levenshtein
21
- VERSION = "0.2.0"
22
-
23
- # Returns the Levenshtein distance as a number between 0.0 and
24
- # 1.0. It's basically the Levenshtein distance divided by the
25
- # length of the longest sequence.
26
-
27
- def self.normalized_distance(s1, s2, threshold=nil)
28
- s1, s2 = s2, s1 if s1.length > s2.length # s1 is the short one; s2 is the long one.
29
-
30
- if s2.length == 0
31
- 0.0 # Since s1.length < s2.length, s1 must be empty as well.
32
- else
33
- if threshold
34
- if d = self.distance(s1, s2, (threshold*s2.length+1).to_i)
35
- d.to_f/s2.length
36
- else
37
- nil
38
- end
39
- else
40
- self.distance(s1, s2).to_f/s2.length
41
- end
42
- end
43
- end
44
-
45
- # Returns the Levenshtein distance between two sequences.
46
- #
47
- # The two sequences can be two strings, two arrays, or two other
48
- # objects. Strings, arrays and arrays of strings are handled with
49
- # optimized (very fast) C code. All other sequences are handled
50
- # with generic (fast) C code.
51
- #
52
- # The sequences should respond to :length and :[] and all objects
53
- # in the sequences (as returned by []) should response to :==.
54
-
55
- def self.distance(s1, s2, threshold=nil)
56
- s1, s2 = s2, s1 if s1.length > s2.length # s1 is the short one; s2 is the long one.
57
-
58
- # Handle some basic circumstances.
59
-
60
- return 0 if s1 == s2
61
- return s2.length if s1.length == 0
62
-
63
- if threshold
64
- return nil if (s2.length-s1.length) >= threshold
65
-
66
- a1, a2 = nil, nil
67
- a1, a2 = s1, s2 if s1.respond_to?(:-) and s2.respond_to?(:-)
68
- a1, a2 = s1.scan(/./), s2.scan(/./) if s1.respond_to?(:scan) and s2.respond_to?(:scan)
69
-
70
- if a1 and a2
71
- return nil if (a1-a2).length >= threshold
72
- return nil if (a2-a1).length >= threshold
73
- end
74
- end
75
-
76
- distance_fast_or_slow(s1, s2, threshold)
77
- end
78
-
79
- def self.distance_fast_or_slow(s1, s2, threshold) # :nodoc:
80
- if respond_to?(:levenshtein_distance_fast)
81
- levenshtein_distance_fast(s1, s2, threshold) # Implemented in C.
82
- else
83
- levenshtein_distance_slow(s1, s2, threshold) # Implemented in Ruby.
84
- end
85
- end
86
-
87
- def self.levenshtein_distance_slow(s1, s2, threshold) # :nodoc:
88
- row = (0..s1.length).to_a
89
-
90
- 1.upto(s2.length) do |y|
91
- prow = row
92
- row = [y]
93
-
94
- 1.upto(s1.length) do |x|
95
- row[x] = [prow[x]+1, row[x-1]+1, prow[x-1]+(s1[x-1]==s2[y-1] ? 0 : 1)].min
96
- end
97
-
98
- # Stop analysing this sequence as soon as the best possible
99
- # result for this sequence is bigger than the best result so far.
100
- # (The minimum value in the next row will be equal to or greater
101
- # than the minimum value in this row.)
102
-
103
- return nil if threshold and row.min >= threshold
104
- end
105
-
106
- row[-1]
107
- end
108
- end
109
-
110
-
111
- def puts *arg
112
- arg.each{|str| $stdout.puts str; $datafile.puts str}
113
- end
114
-
115
- def saveData
116
- =begin
117
- File.open('aktualdata.txt','w'){|f|
118
- f.write "
119
- $notfound=#{$notfound.length}
120
- $same=#{$same.length}
121
- $diff=#{$diff.length}
122
- ----
123
- $notfound:
124
- # {$notfound.join "\n"}
125
- ----
126
- $same:
127
- # {$same.join "\n"}
128
- ----
129
- $diff:
130
- # {$diff.join "\n"}
131
- "
132
- }
133
- =end
134
- end
135
-
136
- def get(url)
137
- return HTTP.get(URI.parse(url))
138
- end
139
-
140
- def getPlayerData url
141
- r=get url
142
- r=~/<b>All time playing career<\/b>/
143
- r=$'
144
- r=~/<a name=games><\/a>/
145
- table=$`.strip
146
-
147
- h=Hpricot.parse table
148
- rows=h.search 'tr+tr'
149
-
150
- data={}
151
- rows.each do |r|
152
- if r.at('td')['colspan']==nil && (r.inner_html=~/No appearance data available/)==nil
153
- cells=r.search 'td'
154
- team=cells[0].search('font a')[0].inner_html.strip
155
- teamid=cells[0].search('font a')[0]['href'].sub(/\A.+?(\d+)\Z/, '\1')
156
- matches=cells[4].at('font').inner_html.split('(').map{|m| m.gsub(/[^0-9]/,'').to_i}
157
- matches=matches[0]+matches[1]
158
- goals=cells[5].at('font').inner_html.gsub(/[^0-9]/,'').to_i
159
-
160
- data[team]=[matches,goals,teamid]
161
- end
162
- end
163
- return data
164
- end
165
-
166
- def searchForPlayer text
167
- d=get "http://www.soccerbase.com/search.sd?search_string=#{CGI.escape text}&search_cat=players"
168
- d=~/window.location = "(http:[^"]+)"/
169
-
170
- return $1
171
- end
172
-
173
- $edits=0
174
- $summary='aktualizacja danych o meczach piłkarza'
175
-
176
- puts 'Making list...'
177
- s=Sunflower.new('pl.wikipedia.org')
178
- s.login
179
- enw=Sunflower.new('en.wikipedia.org')
180
- enw.login
181
-
182
- # list=(
183
- # s.makeList('category-r', 'Kategoria:Piłkarze Aston Villa F.C.')+
184
- # s.makeList('category-r', 'Kategoria:Piłkarze Chelsea F.C.')+
185
- # s.makeList('category-r', 'Kategoria:Piłkarze Liverpool F.C.')
186
- # ).uniq
187
- # list=(
188
- # s.makeList('category-r', 'Kategoria:Piłkarze angielskich klubów')+
189
- # s.makeList('category-r', 'Kategoria:Piłkarze walijskich klubów')
190
- # ).uniq
191
-
192
- # list.delete_if{|i| i=~/^Kategoria:/}
193
-
194
- # File.open('lista-pilkarze.txt','w').write list.join("\n")
195
- # list=File.open('lista-pilkarze.txt').read.split(/\r?\n/)
196
- list=['Wikipedysta:Matma Rex/brudnopis']
197
-
198
- puts 'Done!'
199
- puts ''
200
-
201
- $notfound=[]
202
- $same=[]
203
- $diff=[]
204
-
205
- list.each_with_index do |art, i|
206
- exit if $edits>4
207
-
208
- # finding data
209
- puts "* [[#{art}]]"
210
- pPl=Page.new(art, 'pl')
211
- pPl.read=~/\[\[en:([^\]]+)\]\]/
212
- if $1
213
- artEn=$1
214
- puts "** Interwiki-en: [[:en:#{artEn}]]"
215
- else
216
- artEn=art
217
- puts "** No interwiki; guessing [[:en:#{art}]]"
218
- end
219
-
220
- pPl.read=~/\{\{soccerbase.*?(\d+).*?\}\}|soccerbase\.com\/players_details\.sd\?playerid=(\d+)/i
221
- if $1||$2
222
- soccid=$1||$2
223
- url="http://www.soccerbase.com/players_details.sd?playerid=#{soccid}"
224
- puts '** Found id on plwiki'
225
- else
226
- pEn=Page.new(art, 'en')
227
- pEn.read=~/\{\{soccerbase.*?(\d+).*?\}\}|soccerbase\.com\/players_details\.sd\?playerid=(\d+)/i
228
- if $1||$2
229
- soccid=$1||$2
230
- url="http://www.soccerbase.com/players_details.sd?playerid=#{soccid}"
231
- puts '** Found id on enwiki'
232
- else
233
- url=searchForPlayer(art)||searchForPlayer(artEn)
234
- end
235
- end
236
-
237
- if url==nil
238
- puts '** Not found.'
239
- $notfound<<art
240
- else
241
- data=getPlayerData url
242
- puts "** URL: #{url}"
243
- unless data.empty?
244
- puts "** Found info on soccerbase."
245
- else
246
- puts '** Found, but no data.'
247
- $notfound<<art
248
- end
249
- end
250
-
251
- pPl.read =~ /występy\(gole\)\s*=(.+)/
252
- if $1==nil
253
- puts '** Wiki: error. No infobox?'
254
- else
255
- a=$1.split(/\s*<br.*?>\s*/)[-1].strip
256
- a=~/(\d+)\s*\((\d+)\)/
257
- matchesW, goalsW = $1.to_i, $2.to_i
258
- puts "** Wiki info: #{matchesW} matches, #{goalsW} goals."
259
- end
260
-
261
- saveData if i%30==0 && i!=0
262
-
263
- # $change=File.open('changelist.txt','w')
264
- # $change.sync=true
265
-
266
- # editing
267
- if data
268
- #$change.puts "* [[#{art}]] - #{matchesW}/#{goalsW} -> #{matches}/#{goals}"
269
-
270
- pPl.text=~/(kluby\s*=\s*)([^\|]+)(\s*\|)/
271
- kluby=$2
272
- pPl.text=~/(występy\(gole\)\s*=\s*)([^\|]+)(\s*\|)/
273
- wystepygole=$2
274
-
275
- resolve={}
276
- kluby=kluby.split(/<\/?br[^>]*>/).map do |i|
277
- short=i.strip.gsub(/\[\[(?:[^\]\|]+\||)([^\]\|]+)\]\]/,'\1').gsub(/→|\(wyp\.\)/,'').strip
278
- resolve[short]=i.strip
279
- short
280
- end
281
- wystepygole=wystepygole.split(/<\/?br[^>]*?>/).map{|i| i.strip}
282
- wystepygole.delete_if{|i| i==''}
283
- kluby.delete_if{|i| i==''}
284
-
285
- wystepygole.pop while wystepygole.length>kluby.length
286
- wystepygole.push [0,0] while wystepygole.length<kluby.length
287
-
288
- wikidata=OrderedHash.new
289
- kluby.each_index do |i|
290
- wystepygole[i]=~/(\d+)\s*\((\d+)\)/
291
- wikidata[kluby[i]]=[$1.to_i, $2.to_i]
292
- end
293
-
294
- # puts data.inspect
295
- # puts wikidata.inspect
296
-
297
- data.each_pair do |scbclub, scb, teamid|
298
- min=[999, 'null']
299
- wikidata.each_pair do |wikiclub, wiki|
300
- if wikiclub.index scbclub || scbclub.index wikiclub
301
- min=[0, wikiclub]
302
- break
303
- end
304
- if wikiclub.index id2team[teamid] || id2team[teamid].index wikiclub
305
- min=[0, wikiclub]
306
- break
307
- end
308
-
309
- d=Levenshtein.distance(scbclub, wikiclub)
310
- min=[d, wikiclub] if d<min[0]
311
-
312
- d=Levenshtein.distance(id2team[teamid], wikiclub)
313
- min=[d, wikiclub] if d<min[0]
314
- end
315
- club=min[1]
316
-
317
- wikidata[club]=data[scbclub]
318
- end
319
-
320
- infoboxwystepygole=[]
321
- infoboxkluby=[]
322
-
323
- wikidata.each do |club, info|
324
- infoboxkluby<<resolve[club]
325
- infoboxwystepygole<<"#{info[0]} (#{info[1]})"
326
- end
327
-
328
- infoboxkluby=infoboxkluby.join('<br />')
329
- infoboxwystepygole=infoboxwystepygole.join('<br />')
330
-
331
- pPl.text=pPl.text.sub(/(występy\(gole\)\s*=\s*)([^\|]+?)(\s*\|)/){$1+infoboxwystepygole+$3}
332
- pPl.text=pPl.text.sub(/(kluby\s*=\s*)([^\|]+?)(\s*\|)/){$1+infoboxkluby+$3}
333
- pPl.text=pPl.text.sub(/(data1\s*=\s*)([^\|]+?)(\s*\|)/, '\1{{subst:CURRENTDAY}} {{subst:CURRENTMONTHNAMEGEN}} {{subst:CURRENTYEAR}}\3')
334
-
335
- $edits+=1
336
- pPl.save
337
- end
338
- end
339
-
1
+ require 'orderedhash'
2
+ require 'hpricot'
3
+ require 'net/http'
4
+ require 'sunflower-core.rb'
5
+ require 'sunflower-listmaker.rb'
6
+ include Net
7
+
8
+ $datafile=File.open('aktual.txt','w')
9
+ $datafile.sync=true
10
+
11
+ id2team={}
12
+ begin
13
+ File.open('id2team.txt') do |f|
14
+ id2team.replace Hash[*f.read.strip.split(/\r?\n|\t/)]
15
+ end
16
+ rescue
17
+ end
18
+
19
+ # comes from http://rubyforge.org/frs/?group_id=6257&release_id=36721
20
+ module Levenshtein
21
+ VERSION = "0.2.0"
22
+
23
+ # Returns the Levenshtein distance as a number between 0.0 and
24
+ # 1.0. It's basically the Levenshtein distance divided by the
25
+ # length of the longest sequence.
26
+
27
+ def self.normalized_distance(s1, s2, threshold=nil)
28
+ s1, s2 = s2, s1 if s1.length > s2.length # s1 is the short one; s2 is the long one.
29
+
30
+ if s2.length == 0
31
+ 0.0 # Since s1.length < s2.length, s1 must be empty as well.
32
+ else
33
+ if threshold
34
+ if d = self.distance(s1, s2, (threshold*s2.length+1).to_i)
35
+ d.to_f/s2.length
36
+ else
37
+ nil
38
+ end
39
+ else
40
+ self.distance(s1, s2).to_f/s2.length
41
+ end
42
+ end
43
+ end
44
+
45
+ # Returns the Levenshtein distance between two sequences.
46
+ #
47
+ # The two sequences can be two strings, two arrays, or two other
48
+ # objects. Strings, arrays and arrays of strings are handled with
49
+ # optimized (very fast) C code. All other sequences are handled
50
+ # with generic (fast) C code.
51
+ #
52
+ # The sequences should respond to :length and :[] and all objects
53
+ # in the sequences (as returned by []) should response to :==.
54
+
55
+ def self.distance(s1, s2, threshold=nil)
56
+ s1, s2 = s2, s1 if s1.length > s2.length # s1 is the short one; s2 is the long one.
57
+
58
+ # Handle some basic circumstances.
59
+
60
+ return 0 if s1 == s2
61
+ return s2.length if s1.length == 0
62
+
63
+ if threshold
64
+ return nil if (s2.length-s1.length) >= threshold
65
+
66
+ a1, a2 = nil, nil
67
+ a1, a2 = s1, s2 if s1.respond_to?(:-) and s2.respond_to?(:-)
68
+ a1, a2 = s1.scan(/./), s2.scan(/./) if s1.respond_to?(:scan) and s2.respond_to?(:scan)
69
+
70
+ if a1 and a2
71
+ return nil if (a1-a2).length >= threshold
72
+ return nil if (a2-a1).length >= threshold
73
+ end
74
+ end
75
+
76
+ distance_fast_or_slow(s1, s2, threshold)
77
+ end
78
+
79
+ def self.distance_fast_or_slow(s1, s2, threshold) # :nodoc:
80
+ if respond_to?(:levenshtein_distance_fast)
81
+ levenshtein_distance_fast(s1, s2, threshold) # Implemented in C.
82
+ else
83
+ levenshtein_distance_slow(s1, s2, threshold) # Implemented in Ruby.
84
+ end
85
+ end
86
+
87
+ def self.levenshtein_distance_slow(s1, s2, threshold) # :nodoc:
88
+ row = (0..s1.length).to_a
89
+
90
+ 1.upto(s2.length) do |y|
91
+ prow = row
92
+ row = [y]
93
+
94
+ 1.upto(s1.length) do |x|
95
+ row[x] = [prow[x]+1, row[x-1]+1, prow[x-1]+(s1[x-1]==s2[y-1] ? 0 : 1)].min
96
+ end
97
+
98
+ # Stop analysing this sequence as soon as the best possible
99
+ # result for this sequence is bigger than the best result so far.
100
+ # (The minimum value in the next row will be equal to or greater
101
+ # than the minimum value in this row.)
102
+
103
+ return nil if threshold and row.min >= threshold
104
+ end
105
+
106
+ row[-1]
107
+ end
108
+ end
109
+
110
+
111
+ def puts *arg
112
+ arg.each{|str| $stdout.puts str; $datafile.puts str}
113
+ end
114
+
115
+ def saveData
116
+ =begin
117
+ File.open('aktualdata.txt','w'){|f|
118
+ f.write "
119
+ $notfound=#{$notfound.length}
120
+ $same=#{$same.length}
121
+ $diff=#{$diff.length}
122
+ ----
123
+ $notfound:
124
+ # {$notfound.join "\n"}
125
+ ----
126
+ $same:
127
+ # {$same.join "\n"}
128
+ ----
129
+ $diff:
130
+ # {$diff.join "\n"}
131
+ "
132
+ }
133
+ =end
134
+ end
135
+
136
+ def get(url)
137
+ return HTTP.get(URI.parse(url))
138
+ end
139
+
140
+ def getPlayerData url
141
+ r=get url
142
+ r=~/<b>All time playing career<\/b>/
143
+ r=$'
144
+ r=~/<a name=games><\/a>/
145
+ table=$`.strip
146
+
147
+ h=Hpricot.parse table
148
+ rows=h.search 'tr+tr'
149
+
150
+ data={}
151
+ rows.each do |r|
152
+ if r.at('td')['colspan']==nil && (r.inner_html=~/No appearance data available/)==nil
153
+ cells=r.search 'td'
154
+ team=cells[0].search('font a')[0].inner_html.strip
155
+ teamid=cells[0].search('font a')[0]['href'].sub(/\A.+?(\d+)\Z/, '\1')
156
+ matches=cells[4].at('font').inner_html.split('(').map{|m| m.gsub(/[^0-9]/,'').to_i}
157
+ matches=matches[0]+matches[1]
158
+ goals=cells[5].at('font').inner_html.gsub(/[^0-9]/,'').to_i
159
+
160
+ data[team]=[matches,goals,teamid]
161
+ end
162
+ end
163
+ return data
164
+ end
165
+
166
+ def searchForPlayer text
167
+ d=get "http://www.soccerbase.com/search.sd?search_string=#{CGI.escape text}&search_cat=players"
168
+ d=~/window.location = "(http:[^"]+)"/
169
+
170
+ return $1
171
+ end
172
+
173
+ $edits=0
174
+ $summary='aktualizacja danych o meczach piłkarza'
175
+
176
+ puts 'Making list...'
177
+ s=Sunflower.new('pl.wikipedia.org')
178
+ s.login
179
+ enw=Sunflower.new('en.wikipedia.org')
180
+ enw.login
181
+
182
+ # list=(
183
+ # s.makeList('category-r', 'Kategoria:Piłkarze Aston Villa F.C.')+
184
+ # s.makeList('category-r', 'Kategoria:Piłkarze Chelsea F.C.')+
185
+ # s.makeList('category-r', 'Kategoria:Piłkarze Liverpool F.C.')
186
+ # ).uniq
187
+ # list=(
188
+ # s.makeList('category-r', 'Kategoria:Piłkarze angielskich klubów')+
189
+ # s.makeList('category-r', 'Kategoria:Piłkarze walijskich klubów')
190
+ # ).uniq
191
+
192
+ # list.delete_if{|i| i=~/^Kategoria:/}
193
+
194
+ # File.open('lista-pilkarze.txt','w').write list.join("\n")
195
+ # list=File.open('lista-pilkarze.txt').read.split(/\r?\n/)
196
+ list=['Wikipedysta:Matma Rex/brudnopis']
197
+
198
+ puts 'Done!'
199
+ puts ''
200
+
201
+ $notfound=[]
202
+ $same=[]
203
+ $diff=[]
204
+
205
+ list.each_with_index do |art, i|
206
+ exit if $edits>4
207
+
208
+ # finding data
209
+ puts "* [[#{art}]]"
210
+ pPl=Page.new(art, 'pl')
211
+ pPl.read=~/\[\[en:([^\]]+)\]\]/
212
+ if $1
213
+ artEn=$1
214
+ puts "** Interwiki-en: [[:en:#{artEn}]]"
215
+ else
216
+ artEn=art
217
+ puts "** No interwiki; guessing [[:en:#{art}]]"
218
+ end
219
+
220
+ pPl.read=~/\{\{soccerbase.*?(\d+).*?\}\}|soccerbase\.com\/players_details\.sd\?playerid=(\d+)/i
221
+ if $1||$2
222
+ soccid=$1||$2
223
+ url="http://www.soccerbase.com/players_details.sd?playerid=#{soccid}"
224
+ puts '** Found id on plwiki'
225
+ else
226
+ pEn=Page.new(art, 'en')
227
+ pEn.read=~/\{\{soccerbase.*?(\d+).*?\}\}|soccerbase\.com\/players_details\.sd\?playerid=(\d+)/i
228
+ if $1||$2
229
+ soccid=$1||$2
230
+ url="http://www.soccerbase.com/players_details.sd?playerid=#{soccid}"
231
+ puts '** Found id on enwiki'
232
+ else
233
+ url=searchForPlayer(art)||searchForPlayer(artEn)
234
+ end
235
+ end
236
+
237
+ if url==nil
238
+ puts '** Not found.'
239
+ $notfound<<art
240
+ else
241
+ data=getPlayerData url
242
+ puts "** URL: #{url}"
243
+ unless data.empty?
244
+ puts "** Found info on soccerbase."
245
+ else
246
+ puts '** Found, but no data.'
247
+ $notfound<<art
248
+ end
249
+ end
250
+
251
+ pPl.read =~ /występy\(gole\)\s*=(.+)/
252
+ if $1==nil
253
+ puts '** Wiki: error. No infobox?'
254
+ else
255
+ a=$1.split(/\s*<br.*?>\s*/)[-1].strip
256
+ a=~/(\d+)\s*\((\d+)\)/
257
+ matchesW, goalsW = $1.to_i, $2.to_i
258
+ puts "** Wiki info: #{matchesW} matches, #{goalsW} goals."
259
+ end
260
+
261
+ saveData if i%30==0 && i!=0
262
+
263
+ # $change=File.open('changelist.txt','w')
264
+ # $change.sync=true
265
+
266
+ # editing
267
+ if data
268
+ #$change.puts "* [[#{art}]] - #{matchesW}/#{goalsW} -> #{matches}/#{goals}"
269
+
270
+ pPl.text=~/(kluby\s*=\s*)([^\|]+)(\s*\|)/
271
+ kluby=$2
272
+ pPl.text=~/(występy\(gole\)\s*=\s*)([^\|]+)(\s*\|)/
273
+ wystepygole=$2
274
+
275
+ resolve={}
276
+ kluby=kluby.split(/<\/?br[^>]*>/).map do |i|
277
+ short=i.strip.gsub(/\[\[(?:[^\]\|]+\||)([^\]\|]+)\]\]/,'\1').gsub(/→|\(wyp\.\)/,'').strip
278
+ resolve[short]=i.strip
279
+ short
280
+ end
281
+ wystepygole=wystepygole.split(/<\/?br[^>]*?>/).map{|i| i.strip}
282
+ wystepygole.delete_if{|i| i==''}
283
+ kluby.delete_if{|i| i==''}
284
+
285
+ wystepygole.pop while wystepygole.length>kluby.length
286
+ wystepygole.push [0,0] while wystepygole.length<kluby.length
287
+
288
+ wikidata=OrderedHash.new
289
+ kluby.each_index do |i|
290
+ wystepygole[i]=~/(\d+)\s*\((\d+)\)/
291
+ wikidata[kluby[i]]=[$1.to_i, $2.to_i]
292
+ end
293
+
294
+ # puts data.inspect
295
+ # puts wikidata.inspect
296
+
297
+ data.each_pair do |scbclub, scb, teamid|
298
+ min=[999, 'null']
299
+ wikidata.each_pair do |wikiclub, wiki|
300
+ if wikiclub.index scbclub || scbclub.index wikiclub
301
+ min=[0, wikiclub]
302
+ break
303
+ end
304
+ if wikiclub.index id2team[teamid] || id2team[teamid].index wikiclub
305
+ min=[0, wikiclub]
306
+ break
307
+ end
308
+
309
+ d=Levenshtein.distance(scbclub, wikiclub)
310
+ min=[d, wikiclub] if d<min[0]
311
+
312
+ d=Levenshtein.distance(id2team[teamid], wikiclub)
313
+ min=[d, wikiclub] if d<min[0]
314
+ end
315
+ club=min[1]
316
+
317
+ wikidata[club]=data[scbclub]
318
+ end
319
+
320
+ infoboxwystepygole=[]
321
+ infoboxkluby=[]
322
+
323
+ wikidata.each do |club, info|
324
+ infoboxkluby<<resolve[club]
325
+ infoboxwystepygole<<"#{info[0]} (#{info[1]})"
326
+ end
327
+
328
+ infoboxkluby=infoboxkluby.join('<br />')
329
+ infoboxwystepygole=infoboxwystepygole.join('<br />')
330
+
331
+ pPl.text=pPl.text.sub(/(występy\(gole\)\s*=\s*)([^\|]+?)(\s*\|)/){$1+infoboxwystepygole+$3}
332
+ pPl.text=pPl.text.sub(/(kluby\s*=\s*)([^\|]+?)(\s*\|)/){$1+infoboxkluby+$3}
333
+ pPl.text=pPl.text.sub(/(data1\s*=\s*)([^\|]+?)(\s*\|)/, '\1{{subst:CURRENTDAY}} {{subst:CURRENTMONTHNAMEGEN}} {{subst:CURRENTYEAR}}\3')
334
+
335
+ $edits+=1
336
+ pPl.save
337
+ end
338
+ end
339
+