| 5 | | # Dynamically generate it! |
| 6 | | BEGIN |
| 7 | | { |
| 8 | | # this matching should be robust enough |
| 9 | | # detailed analysis is done in subclass's parse() |
| 10 | | my $DoCoMoRE = '^DoCoMo\/\d\.\d[ \/]'; |
| 11 | | my $JPhoneRE = '^(?i:J-PHONE\/\d\.\d)'; |
| 12 | | my $VodafoneRE = '^Vodafone\/\d\.\d'; |
| 13 | | my $VodafoneMotRE = '^MOT-'; |
| 14 | | my $SoftBankRE = '^SoftBank\/\d\.\d'; |
| 15 | | my $SoftBankCrawlerRE = '^Nokia[^\/]+\/\d\.\d'; |
| 16 | | my $EZwebRE = '^(?:KDDI-[A-Z]+\d+[A-Z]? )?UP\.Browser\\/'; |
| 17 | | my $AirHRE = '^Mozilla\/3\.0\((?:WILLCOM|DDIPOCKET)\;'; |
| | 5 | # this matching should be robust enough |
| | 6 | # detailed analysis is done in subclass's parse() |
| | 7 | our $DoCoMoRE = '^DoCoMo\/\d\.\d[ \/]'; |
| | 8 | our $JPhoneRE = '^(?i:J-PHONE\/\d\.\d)'; |
| | 9 | our $VodafoneRE = '^Vodafone\/\d\.\d'; |
| | 10 | our $VodafoneMotRE = '^MOT-'; |
| | 11 | our $SoftBankRE = '^SoftBank\/\d\.\d'; |
| | 12 | our $SoftBankCrawlerRE = '^Nokia[^\/]+\/\d\.\d'; |
| | 13 | our $EZwebRE = '^(?:KDDI-[A-Z]+\d+[A-Z]? )?UP\.Browser\\/'; |
| | 14 | our $AirHRE = '^Mozilla\/3\.0\((?:WILLCOM|DDIPOCKET)\;'; |
| 28 | | my $code = <<EOM; |
| 29 | | sub detect { |
| 30 | | my \$user_agent = shift; |
| 31 | | EOM |
| 32 | | my $not_first = 0; |
| 33 | | while (@map) { |
| 34 | | my ($key, $re_list) = (shift @map, shift @map); |
| 35 | | my $re = join('|', @$re_list); |
| 36 | | $code .= sprintf( <<EOM, $not_first++ ? '} elsif' : 'if', $key); |
| 37 | | %s (\$user_agent =~ /$re/) { |
| 38 | | return '%s'; |
| 39 | | EOM |
| 40 | | } |
| 41 | | |
| 42 | | $code .= <<EOM; |
| | 19 | if ( $user_agent =~ /$DoCoMoRE/ ) { |
| | 20 | return 'DoCoMo'; |
| | 21 | } elsif ( $user_agent =~ /$JPhoneRE|$VodafoneRE|$VodafoneMotRE|$SoftBankRE|$SoftBankCrawlerRE/) { |
| | 22 | return 'ThirdForce'; |
| | 23 | } elsif ( $user_agent =~ /$EZwebRE/ ) { |
| | 24 | return 'EZweb'; |
| | 25 | } elsif ( $user_agent =~ /$AirHRE/ ) { |
| | 26 | return 'AirHPhone'; |