tools/mkcharinfo: comment alternative nbsp stringification
[sheet.git] / tools / mkusage-wikimedia
1 #!/usr/bin/perl -n
2 use 5.012;
3 use warnings;
4 our %count;
5 our $mobile;
6
7 our $VERSION = '1.02';
8
9 if (m{<td class=hl>} .. m{</?td>}) {
10         $count{-source} = 'http://stats.wikimedia.org/archive/squid_reports/';
11         $count{-title } = 'Wikimedia';
12         $count{-date} = $1 if m{ period: (?:\d+ )?(\w+ \d+) };
13         next;
14 }
15
16 # select relevant data
17 />In alphabetical order/ .. eof or next;  # second table
18 my ($id, $count2, $count) = map { s/<[^>]*>//gr } split /<\/td>/;
19
20 if (/>Browser engines/ ... m{</table>}) {
21         my $apple = $id =~ s/^AppleWebKit ?//;
22         $apple .. 1 or next;
23         my ($abs) = m/>showCount\((\d+),/;
24
25         state %version;
26         if (defined $count2) {
27                 $version{$id} = $abs;
28                 next;
29         }
30
31         # replace safari total percentage by individual version counts
32         # have to use combined distribution for multiple platforms :(
33         for my $browser (qw/ safari ios_saf /) {
34                 my $multiplier = delete $count{$browser}{'0.0'} or next;
35                 $multiplier /= $abs;  # total number
36                 while (my ($verwebkit, $count) = each %version) {
37                         my $ver = safariver($verwebkit, $browser eq 'ios_saf');
38                         $count{$browser}{$ver} += $count * $multiplier;
39                 }
40         }
41         last;
42 }
43
44 # select version data
45 />Browser versions(.*)/ ... !defined $count2 or next;
46 unless (defined $count2) {
47         # header row if no td separator
48         $mobile = $id !~ /non mobile/;
49         next;
50 }
51
52 # convert to usable syntax
53 my ($browser, $version) = split /\h+/, $id || ' ', 2;
54 $count =~ s/,//g;
55 $count =~ s/%$//;
56 $version //= 0;
57 given ($browser) {
58         when (['Firefox', 'Iceweasel']) {
59                 $browser = $mobile ? 'and_ff' : 'firefox';
60                 continue;
61         }
62         when ('MSIE') {
63                 $browser = $mobile ? 'ie_mob' : 'ie';
64                 continue;
65         }
66         when ('Opera') {
67                 $browser = $mobile ? 'op_mob' : 'opera';
68                 for ($version) {
69                         if (m{\(Mini(.*)\)$}) {
70                                 $browser = 'op_mini';
71                                 ($_) = $1 =~ m{^/(\d+)};
72                                 continue;
73                         }
74                         s/^\d*\.\d\K.*//;  # one significant digit
75                 }
76                 continue;
77         }
78         when ('Safari') {
79                 $browser = $mobile ? 'ios_saf' : 'safari';
80         }
81         when ('Chrome') {
82                 $browser = $mobile ? 'and_chr' : 'chrome';
83                 s/\.\d+$// for $version;
84         }
85         when ('Android') {
86                 $browser = 'android';
87         }
88         when ('BlackBerry') {
89                 $browser = 'bb';
90         }
91         when ('UCWEB') {
92                 $browser = 'and_uc';
93         }
94         s/\.0$// for $version;
95 }
96
97 $count{$browser}{$version} += $count;
98
99 END {
100         use Data::Dump 'pp';
101         print pp(\%count);
102 }
103
104 sub safariver {
105         my ($webkitnum, $ios) = @_;
106         my $safarinum = '';
107         for (
108                 $ios ? (
109                         [ 413 => '1'   ],
110                         [ 419 => '1.1' ],
111                         [ 525 => '2'   ],
112                         [ 528 => '3'   ],
113                         [ 531 => '3.2' ], # or 4 from 531.022
114                         [ 532 => '4'   ],
115                         [ 533 => '4.2' ],
116                         [ 534 => '5'   ],
117                         [ 536 => '7'   ],
118                         [ 537 => '8'   ],
119                         [ 600 => '8.1' ],
120                 ) : (
121                         # http://en.wikipedia.org/wiki/Safari_version_history
122                         [ 412 => '2'   ],
123                         [ 522 => '3'   ],
124                         [ 525 => '3.1' ], # 3.2 from 525.026
125                         [ 526 => '4'   ],
126                         [ 533 => '5'   ], # or 4.1
127                         [ 534 => '5.1' ],
128                         [ 536 => '6'   ],
129                         [ 537 => '7.1' ], # or 6.1 or 7.0
130                         [ 538 => '8'   ],
131                 )
132         ) {
133                 last if $webkitnum lt $_->[0];
134                 $safarinum = $_->[1];
135         }
136         return $safarinum;
137 }
138
139 __END__
140
141 =head1 USAGE
142
143         curl http://stats.wikimedia.org/archive/squid_reports/2010-10/SquidReportClients.htm |
144         ./mkusage-wikimedia > browser-usage.inc.pl
145