Diff -- /var/www/vhosts/3dshawn.com/crm.3dshawn.com/MODS/ContactForge/UAParser.pm

O Operator
Diff

/var/www/vhosts/3dshawn.com/crm.3dshawn.com/MODS/ContactForge/UAParser.pm

added on local at 2026-07-01 15:02:58

Added
+0
lines
Removed
-0
lines
Context
51
unchanged
Blobs
from 1d2e031c60d3
to 1d2e031c60d3
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
11package MODS::ContactForge::UAParser;
22#======================================================================
33# ContactForge -- minimal User-Agent string parser. No CPAN deps.
44# Catches the top 95% of real-world UA strings into:
55# { browser, browser_version, os, os_version, device }
66#======================================================================
77use strict;
88use warnings;
99
1010sub new { bless {}, shift }
1111
1212sub parse {
1313 my ($self, $ua) = @_;
1414 $ua //= '';
1515 my $r = { browser => '', browser_version => '', os => '', os_version => '', device => 'desktop' };
1616
1717 # OS
1818 if ($ua =~ /Windows NT 10/i) { $r->{os} = 'Windows'; $r->{os_version} = '10/11'; }
1919 elsif ($ua =~ /Windows NT ([\d.]+)/i) { $r->{os} = 'Windows'; $r->{os_version} = $1; }
2020 elsif ($ua =~ /Mac OS X ([\d_]+)/i) { $r->{os} = 'macOS'; ($r->{os_version} = $1) =~ tr/_/./; }
2121 elsif ($ua =~ /iPhone OS ([\d_]+)/i) { $r->{os} = 'iOS'; ($r->{os_version} = $1) =~ tr/_/./; $r->{device} = 'mobile'; }
2222 elsif ($ua =~ /iPad/i && $ua =~ /OS ([\d_]+)/) { $r->{os} = 'iOS'; ($r->{os_version} = $1) =~ tr/_/./; $r->{device} = 'tablet'; }
2323 elsif ($ua =~ /Android ([\d.]+)/i) { $r->{os} = 'Android'; $r->{os_version} = $1; $r->{device} = ($ua =~ /Mobile/i) ? 'mobile' : 'tablet'; }
2424 elsif ($ua =~ /CrOS/i) { $r->{os} = 'ChromeOS'; }
2525 elsif ($ua =~ /Linux/i) { $r->{os} = 'Linux'; }
2626
2727 # Browser (order matters: Edge before Chrome before Safari, OPR before Chrome)
2828 if ($ua =~ /Edg(?:e|A|iOS)?\/([\d.]+)/i) { $r->{browser} = 'Edge'; $r->{browser_version} = $1; }
2929 elsif ($ua =~ /OPR\/([\d.]+)/i) { $r->{browser} = 'Opera'; $r->{browser_version} = $1; }
3030 elsif ($ua =~ /SamsungBrowser\/([\d.]+)/i) { $r->{browser} = 'Samsung'; $r->{browser_version} = $1; }
3131 elsif ($ua =~ /YaBrowser\/([\d.]+)/i) { $r->{browser} = 'Yandex'; $r->{browser_version} = $1; }
3232 elsif ($ua =~ /Firefox\/([\d.]+)/i) { $r->{browser} = 'Firefox'; $r->{browser_version} = $1; }
3333 elsif ($ua =~ /CriOS\/([\d.]+)/i) { $r->{browser} = 'Chrome'; $r->{browser_version} = $1; }
3434 elsif ($ua =~ /Chrome\/([\d.]+)/i) { $r->{browser} = 'Chrome'; $r->{browser_version} = $1; }
3535 elsif ($ua =~ /Version\/([\d.]+).*Safari/i) { $r->{browser} = 'Safari'; $r->{browser_version} = $1; }
3636 elsif ($ua =~ /Safari/i) { $r->{browser} = 'Safari'; }
3737 elsif ($ua =~ /MSIE ([\d.]+)/i) { $r->{browser} = 'IE'; $r->{browser_version} = $1; }
3838 elsif ($ua =~ /Trident.*rv:([\d.]+)/i) { $r->{browser} = 'IE'; $r->{browser_version} = $1; }
3939
4040 # Device override
4141 if ($ua =~ /bot|crawl|spider|google|bing|yahoo|baidu|duckduck|slurp|yandexbot|sogou|exabot|facebookexternalhit|monitor/i) {
4242 $r->{device} = 'bot';
4343 } elsif ($r->{device} eq 'desktop') {
4444 if ($ua =~ /iPad|Tablet/i) { $r->{device} = 'tablet'; }
4545 elsif ($ua =~ /Mobi|iPhone|Android.*Mobile/i) { $r->{device} = 'mobile'; }
4646 }
4747
4848 return $r;
4949}
5050
51511;