Branch Coverage

File:blib/lib/CGI/Lingua.pm
Coverage:87.6%

line%coveragebranch
545100TFif (not defined $class) { }
100TFelsif (ref $class) { }
54650TFif ($params)
55050TFif (&Scalar::Util::blessed($logger) and $logger->can("error"))
55850TFif defined $params->{'supported'}
565100TFif (defined $params->{'logger'} and &Scalar::Util::blessed($params->{'logger'}))
566100TFunless ($params->{'logger'}->can("warn") and $params->{'logger'}->can("info") and $params->{'logger'}->can("error"))
580100TFif (defined $params->{'supported'}) { }
582100TFif (ref $params->{'supported'}) { }
100TFelsif (length $params->{'supported'} < 2 or length $params->{'supported'} > 5) { }
583100TFif (ref $params->{'supported'} ne "ARRAY")
59050TFif (my $logger = $params->{'logger'})
601100TFif (defined $info and not &Scalar::Util::blessed($info) && ($info->can('lang') || $info->can('AUTOLOAD')))
610100TFref $params->{'supported'} ? :
612100TFif (defined $entry and not ref $entry and $entry =~ /$SUPPORTED_RE/)
613100TFif (lc $entry eq $DEPRECATED_EN_UK)
61650TFif (&Scalar::Util::blessed($params->{'logger'}) and $params->{'logger'}->can('warn')) { }
62750TFif (&Scalar::Util::blessed($params->{'logger'}) and $params->{'logger'}->can('warn')) { }
652100TFif ($cache and $ENV{'REMOTE_ADDR'})
655100TFif (defined $key and my $frozen = _cache_call($params, $cache, "get", $key))
660100TFif (ref $rc eq "HASH")
662100TFif defined $rc->{$_}
664100TFif (@bad) { }
66650TFif (&Scalar::Util::blessed($params->{'logger'}) and $params->{'logger'}->can('warn')) { }
67750TFif (_info_lang($info))
70550TFunless defined $ip
712100TFif (defined($l = _info_lang($info)) or defined($l = $class->_what_language))
71450TFif length $l
720100TFref $params->{'supported'} eq 'ARRAY' ? :
72150TFif defined $_ and not ref $_
73650TFunless defined $raw and not ref $raw
737100TF$raw =~ /$IP_SHAPE_RE/ ? :
757100TFif eval {         do {         local $SIG{'__DIE__'}; $rc = $cache->$method(@args); 1 } }
762100TFif (&Scalar::Util::blessed($self)) { }
50TFelsif (ref $self eq 'HASH' and &Scalar::Util::blessed($self->{'logger'}) and $self->{'logger'}->can('warn')) { }
783100TFunless $info
786100TFunless eval {         do {         local $SIG{'__DIE__'}; $lang = $info->lang; 1 } }
787100TFunless defined $lang and length $lang
791100TFif not ref $lang and $lang =~ /$ACCEPT_LANG_RE/
79250TFif ref $self
811100TFif not defined $value or not ref $value and $value =~ /$re/
82250TFif (defined $^V and $^V ge "v5.14.0")
82350TFif ${^GLOBAL_PHASE} eq "DESTRUCT"
825100TFunless $ENV{'REMOTE_ADDR'}
82850TFunless ref $self
831100TFunless $cache
83950TFunless defined $key
840100TFif $self->_cache_call($cache, "get", $key)
911100TFunless $self->{'_slanguage'}
999100TFunless $self->{'_slanguage'}
1039100TFunless $self->{'_slanguage'}
1103100TFunless $self->{'_slanguage'}
1150100TFunless $self->{'_rlanguage'}
1182100TFif (defined $http_accept_language and $http_accept_language =~ /;\s*q\s*=/i)
1185100TFif ($tag =~ /;\s*q\s*=\s*(\S*?)\s*\z/i)
1187100TFunless $q =~ /^(?:0(?:\.[0-9]{0,3})?|1(?:\.0{0,3})?)\z/
1188100TFif $q == 0
1192100TF@acceptable ? :
1196100TFif (defined $http_accept_language)
1206100TFif ($http_accept_language =~ s/(?<![A-Za-z0-9-])\Q$DEPRECATED_EN_UK\E(?![A-Za-z0-9-])/$CANONICAL_EN_GB/gi)
1215100TFif ($l) { }
100TFelsif ($http_accept_language =~ /;/) { }
1216100TFif $self->_resolve_match($l, $requested_sublanguage, $http_accept_language)
1228100TFif (!$self->{'_rlanguage'} || $self->{'_rlanguage'} eq 'Unknown' and length $http_accept_language == 2 || $http_accept_language =~ /^..-..$/)
1237100TFif $self->{'_dont_use_ip'}
1263100TFif ($l and $http_accept_language =~ /-/ and not $http_accept_language =~ qr/$l/i)
1269100TFunless ($l)
1275100TFunless ($l)
1278100TFif $l
1297100TFif ($token =~ s/;\s*q\s*=\s*(\d+(?:\.\d+)?)//)
1301100TFif length $token
1320100TFunless $tag =~ /^(..)-(..)$/
1323100TFif ($i18n->accepts($base, $self->{'_supported'}))
1345100TFif $tag =~ /^..-../
1347100TFif ($i18n->accepts($tag, $self->{'_supported'}))
1368100TFif (not $l =~ /^..-../) { }
100TFelsif ($l =~ /(.+)-(..)$/) { }
1390100TFunless $self->{'_slanguage'}
1398100TFif ($header =~ /..-(..)$/) { }
100TFelsif ($header =~ /..-([a-z]{2,3})$/i) { }
140350TFif ($_locale_object_db_ok // 1)
140550TFif ($@) { }
14060TFif $@ =~ /database was not in/
1414100TFif ($sl) { }
100TFelsif ($requested_sublanguage) { }
1417100TFif (my $c = $self->_code2countryname($requested_sublanguage)) { }
1445100TFif $accepts
1452100TFunless $accepts
145950TFif ($variety =~ /[a-z]{2,3}/ and not defined $self->{'_sublanguage'})
1464100TFif ($self->{'_cache'})
1468100TFif (defined $from_cache) { }
50TFelsif ($_locale_object_db_ok // 1) { }
147450TFunless defined $language_name and length $language_name
148050TFunless eval {         do {         my $db = "Locale::Object::DB"->new; my(@results) = @{$db->lookup("table", "country", "result_column", "name", "search_column", "code_alpha2", "value", $variety);}; $_locale_object_db_ok = 1; if (defined $results[0]) {         $language_name = $self->_code2countryname($variety); } else {         $self->_debug("Can't find the country code for $variety in Locale::Object::DB"); } ; 1 } }
1489100TFif (defined $results[0]) { }
149650TFif ($db_error)
14970TFif $db_error =~ /database was not in/
1503100TFif ($db_error or not defined $language_name)
150450TFif $db_error
1509100TFif (not defined $language_name) { }
1516100TFif ($self->{'_cache'} and not defined $from_cache)
153150TFif (defined $self->{'_sublanguage'})
1553100TFif (not defined $country and my $c = $self->_what_language)
1554100TFif ($c =~ /^(..)_(..)/) { }
100TFelsif ($c =~ /^(..)$/) { }
1560100TFunless defined $country
1565100TFif ($self->{'_cache'})
1569100TFif ($from_cache) { }
1574100TFif ($l)
1576100TFif (defined $l)
157950TFif $language_name
1586100TFunless $language_name
1588100TFif (not defined $self->{'_rlanguage'} or $self->{'_rlanguage'} eq "Unknown")
1592100TFunless (exists $self->{'_slanguage'} and $self->{'_slanguage'} ne "Unknown")
1595100TFif ($language_name and $language_code2 and not defined $http_accept_language) { }
1603100TFunless ($code)
160450TFif ($http_accept_language and $http_accept_language ne $self->{'_rlanguage'})
160850TFunless ($code)
161050TFif ($self->{'_rlanguage'} =~ /(.+)\s\(.+/)
16110TFif (not defined $http_accept_language or $1 ne $self->{'_rlanguage'})
161650TFunless ($code)
1625100TFif ($code)
1627100TFif ($self->{'_slanguage'}) { }
1638100TFif (not defined $self->{'_slanguage_code_alpha2'}) { }
100TFelsif (not defined $from_cache and $self->{'_cache'} and defined $self->{'_slanguage_code_alpha2'}) { }
1661100TF/^(.+)-/ ? :
1663100TFif (exists $base_languages{$language_string})
1680100TFif (ref $self)
1682100TFif (defined $self->{'_what_language'})
1686100TFif (my $info = $self->{'_info'})
1687100TFif (my $rc = _info_lang($info, $self))
1694100TFif (my $raw_lang = $ENV{'HTTP_ACCEPT_LANGUAGE'})
1698100TFif ($raw_lang =~ /$ACCEPT_LANG_RE/) { }
50TFelsif (ref $self) { }
1700100TFif (ref $self)
1709100TFif (defined $ENV{'LANG'})
1715100TFif ($ENV{'LANG'} =~ /^([A-Za-z0-9_.\-]{1,$ACCEPT_LANG_MAX})$/a) { }
50TFelsif (ref $self) { }
171750TFif (ref $self)
1840100TFif ($self->{'_country'})
1846100TFif (defined $ENV{'GEOIP_COUNTRY_CODE'})
1847100TFif ($ENV{'GEOIP_COUNTRY_CODE'} =~ /^([A-Z]{2})\z/a) { }
1856100TFif ($ENV{'HTTP_CF_IPCOUNTRY'} and $ENV{'HTTP_CF_IPCOUNTRY'} ne "XX")
1857100TFif ($ENV{'HTTP_CF_IPCOUNTRY'} =~ /^([A-Z]{2})\z/a) { }
1866100TFunless defined $raw_ip
1870100TFunless (defined $ip)
1881100TFunless (defined $_have_dvip)
188350TFif (eval {         do {         require Data::Validate::IP; 'Data::Validate::IP'->import('is_ipv4', 'is_ipv6', 'is_private_ip', 'is_loopback_ip'); 1 } }) { }
1895100TFunless (is_ipv4($ip))
1897100TFif ($ip eq '::1') { }
100TFelsif ($ip =~ /^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i) { }
100TFelsif (not is_ipv6($ip)) { }
1904100TFunless (is_ipv4($ip))
1913100TFif (is_private_ip($ip))
1917100TFif (is_loopback_ip($ip))
1923100TFif ($self->{'_cache'})
1925100TFif (defined $self->{'_country'})
1926100TFif (not ref $self->{'_country'} || $self->{'_country'} =~ /\D/) { }
100TFelsif (ref $self->{'_country'} or not $self->{'_country'} =~ /$COUNTRY_RE/) { }
1945100TFif ($self->{'_have_ipcountry'} == $GEO_UNKNOWN)
194650TFif (eval {         do {         require IP::Country::Fast } }) { }
1957100TFif ($self->{'_have_ipcountry'})
1959100TFif ($self->{'_country'}) { }
50TFelsif (is_ipv4($ip)) { }
1967100TFunless (defined $self->{'_country'})
1968100TFif ($self->{'_have_geoip'} == $GEO_UNKNOWN)
1971100TFif ($self->{'_have_geoip'} == $GEO_PRESENT)
1976100TFif (not defined $self->{'_country'} and $ip ne $BROKEN_GEOIPFREE)
1977100TFif ($self->{'_have_geoipfree'} == $GEO_UNKNOWN)
197950TFif ($@) { }
1989100TFif ($self->{'_have_geoipfree'} == $GEO_PRESENT)
199050TFif (my $country = ($self->{'_geoipfree'}->LookUp($ip))[0])
1998100TFif ($self->{'_country'} and $self->{'_country'} eq "eu")
2003100TFif (not $self->{'_country'} and eval {         do {         require LWP::Simple::WithCache; require JSON::Parse } })
2010100TFif $@
2011100TFif ($data)
2013100TFif $@
2020100TFif (defined $v and ref $v || !($v =~ /^[A-Za-z]{2}\z/))
2021100TFif (not ref $v and length $v and not $v =~ /\D/) { }
100TFelsif (ref $v or length $v) { }
2031100TFunless ($self->{'_country'})
2036100TFif ($self->{'_country'})
2037100TFif (not $self->{'_country'} =~ /\D/) { }
2044100TFif ($self->{'_country'} eq 'hk') { }
100TFelsif ($self->{'_country'} eq 'eu') { }
205050TFif ($self->{'_country'} and not $self->{'_country'} =~ /\D/) { }
100TFelsif ($self->{'_country'} and $self->{'_country'} ne 'Unknown' and not $self->{'_country'} =~ /^[a-z]{2}$/) { }
100TFelsif ($self->{'_country'} and $self->{'_cache'}) { }
2099100TFunless ($@ or not defined $whois or ref $whois ne "HASH")
2100100TFif (defined $whois->{'Country'}) { }
50TFelsif (defined $whois->{'country'}) { }
210550TFif ($self->{'_country'})
2106100TFif ($self->{'_country'} eq 'EU') { }
100TFelsif ($self->{'_country'} eq 'US' and defined $whois->{'StateProv'} and $whois->{'StateProv'} eq 'PR') { }
2115100TFif ($self->{'_country'})
2120100TFif defined $self->{'_country'}
2133100TFif (eval {         do {         local $SIG{'__DIE__'}; my $iana = 'Net::Whois::IANA'->new; $iana->whois_query('-ip', $ip); $country = $iana->country; 1 } }) { }
2146100TFif ($self->{'_country'})
2148100TFunless defined $self->{'_country'}
2161100TFunless defined $raw
2167100TFif ($raw =~ /^([A-Za-z]{2})\s*(?:#.*)?$/)
2182100TFunless defined $ip and $ip =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\z/a
2185100TFif grep {$_ > 255;} $1, $2, $3, $4
220650TFif (eval {         do {         require Net::Subnet; 'Net::Subnet'->import; 1 } }) { }
2212100TFif ($in_baidu) { }
2232100TFif -f $_
2233100TFunless (defined $dat)
223850TFunless (eval {         do {         local $SIG{'__DIE__'}; require Geo::IP; 1 } })
22480TFif (&Scalar::Util::blessed($geoip)) { }
2323100TFif $self->{'_locale'}
2329100TFif (defined(my $raw_agent = $ENV{'HTTP_USER_AGENT'}))
2330100TFif ($raw_agent =~ /^([\x20-\x7e]{1,$UA_MAX})$/a) { }
2338100TFif (defined $agent and $agent =~ /\((.+)\)/)
2343100TFif ($candidate =~ /^[a-zA-Z]{2}-([a-zA-Z]{2})$/)
234550TFif (my $c = $self->_code2country($1))
2353100TFif (eval {         do {         require HTTP::BrowserDetect } })
235850TFif ($browser)
2360100TFif ($bc =~ /^([A-Za-z]{2})$/a)
236150TFif (my $c = $self->_code2country($1))
2372100TFif ($country)
237950TFunless ($@)
238050TFif ($c)
2389100TFif (defined $ENV{'GEOIP_COUNTRY_CODE'})
239050TFif ($ENV{'GEOIP_COUNTRY_CODE'} =~ /^([A-Z]{2})\z/a)
23910TFif (my $c = $self->_code2country(lc $1))
2471100TFif ($self->{'_timezone'})
2478100TFif (defined $raw_ip) { }
2482100TFunless (defined $ip)
2487100TFif ($self->{'_have_geoip'} == $GEO_UNKNOWN)
2490100TFif ($self->{'_have_geoip'} == $GEO_PRESENT)
2494100TFunless ($self->{'_timezone'})
2495100TFif (eval {         do {         require LWP::Simple::WithCache; require JSON::Parse } }) { }
100TFelsif (eval {         do {         require LWP::Simple; require JSON::Parse } }) { }
2499100TFif $@
2500100TFif ($data)
2502100TFif $@
250850TFif $@
250950TFif ($data)
251150TFif $@
2517100TFif (eval {         do {         require LWP::Simple::WithCache; 1 } } or eval {         do {         require LWP::Simple; 1 } }) { }
2526100TFif (defined(my $tz = $self->_read_zone_file)) { }
2537100TFif $@
2545100TFif (defined $self->{'_timezone'} and ref $self->{'_timezone'} || !($self->{'_timezone'} =~ /$ZONE_RE/))
2551100TFunless (defined $self->{'_timezone'})
2571100TFunless -f $ZONE_FILE and -r _
257250TFunless open my $fin, "<", $ZONE_FILE
2575100TFunless $got
2579100TFunless (defined $zone and $zone =~ /$ZONE_RE/)
2621100TF$RTL_LANGS{$self->language_code_alpha2 // ''} ? :
2655100TF$self->is_rtl ? :
2854100TFunless defined $n
28560TFint $_[0] == 1 ? :
2930100TFunless defined $dir
2935100TFif (ref $dir or not length $dir or $dir =~ /\.\./ or $dir =~ /\x00/)
2945100TFunless ($ext =~ /^[A-Za-z0-9\-]+\z/)
2953100TFunless defined $lang and $lang =~ /$LANG_CODE_RE/
2955100TFif (defined(my $sub = $self->sublanguage_code_alpha2))
295650TFif $sub =~ /$LANG_CODE_RE/
2965100TFif -f $path and -r _
2979100TFunless defined $value
2980100TFif ref $value
2995100TFunless $code
2996100TFif (defined $self->{'_country'}) { }
3002100TFunless ($self->{'_cache'})
3006100TFif (my $from_cache = $self->_cache_get_valid($CACHE_NS . "code2language:$code", $NAME_RE))
3015100TFif (defined $name)
3031100TFunless $code
3032100TFif ($self->{'_country'}) { }
303950TFif ($_locale_object_db_ok // 1)
304450TFif ($@) { }
30450TFif $@ =~ /database was not in/
3066100TFunless defined $code
3068100TFif exists $COUNTRY_SHORT_NAMES{$lc}
3087100TFunless $code
3090100TFunless ($self->{'_cache'})
3092100TFif defined $country
3096100TFif (my $from_cache = $self->_cache_get_valid($CACHE_NS . "code2countryname:$code", $NAME_RE))
3102100TFif (my $country = $self->_code2country($code)) { }
3110100TFif (defined $name)
3131100TFunless ref $self and scalar @messages
3134100TFunless length $text
3137100TFif (my $logger = $self->{'logger'})
316050TFref $params ? :
3162100TFif (defined $self->{'logger'}) { }
3186100TFif $_[0] =~ /$skip/
318750TFif (ref $prev eq 'CODE') { }
3203100TFunless defined $ip and $ip =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\z/a
3209100TFunless defined $ip and $ip =~ /:/
3212100TFif (defined &Socket::inet_pton)
3224100TFunless defined $ip
3225100TFif ($ip =~ /^(\d+)\.(\d+)/)
3227100TFif $a == 10
3228100TFif $a == 172 and $b >= 16 and $b <= 31
3229100TFif $a == 192 and $b == 168
3230100TFif $a == 169 and $b == 254
3233100TFif $ip =~ /^fe[89ab][0-9a-f]:/i
3234100TFif $ip =~ /^f[cd]/i
3240100TFunless defined $ip
3241100TFif $ip eq "::1"