@uua/core
Version:
Unbelievable User-Agent Module for both Node.js and Browser
1,767 lines (1,763 loc) • 63.2 kB
JavaScript
'use strict';
function detectBrowserVersion(ptr, ua) {
const regexp = new RegExp(`${ptr}[\\s|/|:]?([.0-9a-zA-Z]+)`, 'i');
const [, matched = ''] = regexp.exec(ua) || [];
return matched;
}
function detectBrowser(ua) {
let version = null;
let title = '';
let code = '';
if (/360se/i.test(ua)) {
title = '360Safe Explorer';
version = '';
code = '360se';
}
else if (/Abolimba/i.test(ua)) {
title = 'Abolimba';
version = '';
code = 'abolimba';
}
else if (/Acoo\sBrowser/i.test(ua)) {
title = 'Acoo Browser';
version = detectBrowserVersion('Browser', ua);
code = 'acoobrowser';
}
else if (/Alienforce/i.test(ua)) {
title = 'Alienforce';
code = 'alienforce';
}
else if (/Amaya/i.test(ua)) {
title = 'Amaya';
code = 'amaya';
}
else if (/Amiga-AWeb/i.test(ua)) {
title = 'Amiga AWeb';
version = detectBrowserVersion('AWeb', ua);
code = 'amiga-aweb';
}
else if (/MRCHROME/i.test(ua)) {
title = 'Amigo';
version = '';
code = 'amigo';
}
else if (/America\sOnline\sBrowser/i.test(ua)) {
title = 'America Online Browser';
version = detectBrowserVersion('Browser', ua);
code = 'aol';
}
else if (/AmigaVoyager/i.test(ua)) {
title = 'Amiga Voyager';
version = detectBrowserVersion('Voyager', ua);
code = 'amigavoyager';
}
else if (/ANTFresco/i.test(ua)) {
title = 'ANT Fresco';
version = detectBrowserVersion('Fresco', ua);
code = 'antfresco';
}
else if (/AOL/i.test(ua)) {
title = 'AOL';
code = 'aol';
}
else if (/Arora/i.test(ua)) {
title = 'Arora';
code = 'arora';
}
else if (/AtomicBrowser/i.test(ua)) {
title = 'Atomic Web Browser';
version = detectBrowserVersion('AtomicBrowser', ua);
code = 'atomicwebbrowser';
}
else if (/Avant\sBrowser/i.test(ua)) {
title = 'Avant Browser';
version = detectBrowserVersion('Browser', ua);
code = 'avantbrowser';
}
else if (/WhiteHat\sAviator/i.test(ua)) {
title = 'Aviator';
code = 'aviator';
}
else if (/baidubrowser/i.test(ua)) {
title = 'Baidu Browser';
version = detectBrowserVersion('Browser', ua);
code = 'baidubrowser';
}
else if (/\sSpark/i.test(ua)) {
title = 'Baidu Spark';
version = detectBrowserVersion('Spark', ua);
code = 'baiduspark';
}
else if (/BarcaPro/i.test(ua)) {
title = 'Barca Pro';
version = detectBrowserVersion('BarcaPro', ua);
code = 'barca';
}
else if (/Barca/i.test(ua)) {
title = 'Barca';
code = 'barca';
}
else if (/Beamrise/i.test(ua)) {
title = 'Beamrise';
code = 'beamrise';
}
else if (/Beonex/i.test(ua)) {
title = 'Beonex';
code = 'beonex';
}
else if (/BlackBerry/i.test(ua)) {
title = 'BlackBerry';
code = 'blackberry';
}
else if (/Blackbird/i.test(ua)) {
title = 'Blackbird';
code = 'blackbird';
}
else if (/BlackHawk/i.test(ua)) {
title = 'BlackHawk';
code = 'blackhawk';
}
else if (/Blazer/i.test(ua)) {
title = 'Blazer';
code = 'blazer';
}
else if (/Bolt/i.test(ua)) {
title = 'Bolt';
code = 'bolt';
}
else if (/BonEcho/i.test(ua)) {
title = 'BonEcho';
code = 'firefoxdevpre';
}
else if (/BrowseX/i.test(ua)) {
title = 'BrowseX';
version = '';
code = 'browsex';
}
else if (/Browzar/i.test(ua)) {
title = 'Browzar';
code = 'browzar';
}
else if (/Bunjalloo/i.test(ua)) {
title = 'Bunjalloo';
code = 'bunjalloo';
}
else if (/Camino/i.test(ua)) {
title = 'Camino';
code = 'camino';
}
else if (/Cayman\sBrowser/i.test(ua)) {
title = 'Cayman Browser';
version = detectBrowserVersion('Browser', ua);
code = 'caymanbrowser';
}
else if (/Charon/i.test(ua)) {
title = 'Charon';
code = 'null';
}
else if (/Cheshire/i.test(ua)) {
title = 'Cheshire';
code = 'aol';
}
else if (/Chimera/i.test(ua)) {
title = 'Chimera';
code = 'null';
}
else if (/chromeframe/i.test(ua)) {
title = 'Google Chrome Frame';
version = detectBrowserVersion('chromeframe', ua);
code = 'google';
}
else if (/ChromePlus/i.test(ua)) {
title = 'ChromePlus';
code = 'chromeplus';
}
else if (/Iron/i.test(ua)) {
title = 'SRWare Iron';
version = detectBrowserVersion('Iron', ua);
code = 'srwareiron';
}
else if (/Chromium/i.test(ua)) {
title = 'Chromium';
code = 'chromium';
}
else if (/Classilla/i.test(ua)) {
title = 'Classilla';
version = detectBrowserVersion(' rv', ua);
code = 'classilla';
}
else if (/Coast/i.test(ua)) {
title = 'Coast';
code = 'coast';
}
else if (/coc_coc_browser/i.test(ua)) {
title = 'Coc Coc';
version = detectBrowserVersion('coc_coc_browser', ua);
code = 'coccoc';
}
else if (/Columbus/i.test(ua)) {
title = 'Columbus';
code = 'columbus';
}
else if (/CometBird/i.test(ua)) {
title = 'CometBird';
code = 'cometbird';
}
else if (/Comodo_Dragon/i.test(ua)) {
title = 'Comodo Dragon';
version = detectBrowserVersion('Dragon', ua);
code = 'comodo-dragon';
}
else if (/Conkeror/i.test(ua)) {
title = 'Conkeror';
code = 'conkeror';
}
else if (/CoolNovo/i.test(ua)) {
title = 'CoolNovo';
code = 'coolnovo';
}
else if (/CoRom/i.test(ua)) {
title = 'CoRom';
code = 'corom';
}
else if (/Crazy\sBrowser/i.test(ua)) {
title = 'Crazy Browser';
version = detectBrowserVersion('Browser', ua);
code = 'crazybrowser';
}
else if (/CrMo/i.test(ua)) {
title = 'Chrome Mobile';
version = detectBrowserVersion('CrMo', ua);
code = 'chrome';
}
else if (/CriOS/i.test(ua)) {
title = 'Chrome';
version = detectBrowserVersion('CriOS', ua);
code = 'chrome';
}
else if (/Cruz/i.test(ua)) {
title = 'Cruz';
code = 'cruz';
}
else if (/Cyberdog/i.test(ua)) {
title = 'Cyberdog';
code = 'cyberdog';
}
else if (/Deepnet\sExplorer/i.test(ua)) {
title = 'Deepnet Explorer';
code = 'deepnetexplorer';
}
else if (/Demeter/i.test(ua)) {
title = 'Demeter';
code = 'demeter';
}
else if (/DeskBrowse/i.test(ua)) {
title = 'DeskBrowse';
code = 'deskbrowse';
}
else if (/Dillo/i.test(ua)) {
title = 'Dillo';
code = 'dillo';
}
else if (/DoCoMo/i.test(ua)) {
title = 'DoCoMo';
code = 'null';
}
else if (/DocZilla/i.test(ua)) {
title = 'DocZilla';
code = 'doczilla';
}
else if (/Dolfin/i.test(ua)) {
title = 'Dolfin';
code = 'samsung';
}
else if (/Dooble/i.test(ua)) {
title = 'Dooble';
code = 'dooble';
}
else if (/Doris/i.test(ua)) {
title = 'Doris';
code = 'doris';
}
else if (/Dorothy/i.test(ua)) {
title = 'Dorothy';
code = 'dorothybrowser';
}
else if (/DPlus/i.test(ua)) {
version = detectBrowserVersion('DPlus', ua);
title = 'D+';
code = 'dillo';
}
else if (/Edbrowse/i.test(ua)) {
title = 'Edbrowse';
code = 'edbrowse';
}
else if (/Element\sBrowser/i.test(ua)) {
title = 'Element Browser';
version = detectBrowserVersion('Browser', ua);
code = 'elementbrowser';
}
else if (/Elinks/i.test(ua)) {
title = 'Elinks';
code = 'elinks';
}
else if (/Enigma\sBrowser/i.test(ua)) {
title = 'Enigma Browser';
version = detectBrowserVersion('Browser', ua);
code = 'enigmabrowser';
}
else if (/EnigmaFox/i.test(ua)) {
title = 'EnigmaFox';
code = 'null';
}
else if (/Epic/i.test(ua)) {
title = 'Epic';
code = 'epicbrowser';
}
else if (/Epiphany/i.test(ua)) {
title = 'Epiphany';
code = 'epiphany';
}
else if (/Escape/i.test(ua)) {
title = 'Espial TV Browser';
code = 'espialtvbrowser';
}
else if (/Espial/i.test(ua)) {
title = 'Espial TV Browser';
code = 'espialtvbrowser';
}
else if (/Fennec/i.test(ua)) {
title = 'Fennec';
code = 'fennec';
}
else if (/Firebird/i.test(ua)) {
title = 'Firebird';
code = 'firebird';
}
else if (/Fireweb\sNavigator/i.test(ua)) {
title = 'Fireweb Navigator';
code = 'firewebnavigator';
}
else if (/Flock/i.test(ua)) {
title = 'Flock';
code = 'flock';
}
else if (/Fluid/i.test(ua)) {
title = 'Fluid';
code = 'fluid';
}
else if (/Galaxy/i.test(ua) && !/Chrome/i.test(ua)) {
title = 'Galaxy';
code = 'galaxy';
}
else if (/Galeon/i.test(ua)) {
title = 'Galeon';
code = 'galeon';
}
else if (/GlobalMojo/i.test(ua)) {
title = 'GlobalMojo';
code = 'globalmojo';
}
else if (/GoBrowser/i.test(ua)) {
title = 'GO Browser';
version = detectBrowserVersion('Browser', ua);
code = 'gobrowser';
}
else if (/Google\sWireless\sTranscoder/i.test(ua)) {
title = 'Google Wireless Transcoder';
version = '';
code = 'google';
}
else if (/GoSurf/i.test(ua)) {
title = 'GoSurf';
code = 'gosurf';
}
else if (/GranParadiso/i.test(ua)) {
title = 'GranParadiso';
code = 'firefoxdevpre';
}
else if (/GreenBrowser/i.test(ua)) {
title = 'GreenBrowser';
code = 'greenbrowser';
}
else if (/GSA/i.test(ua) && /Mobile/i.test(ua)) {
title = 'Google Search App';
version = detectBrowserVersion('GSA', ua);
code = 'google';
}
else if (/Hana/i.test(ua)) {
title = 'Hana';
code = 'hana';
}
else if (/HotJava/i.test(ua)) {
title = 'HotJava';
code = 'hotjava';
}
else if (/Hv3/i.test(ua)) {
title = 'Hv3';
code = 'hv3';
}
else if (/Hydra\sBrowser/i.test(ua)) {
title = 'Hydra Browser';
version = '';
code = 'hydrabrowser';
}
else if (/Iris/i.test(ua)) {
title = 'Iris';
code = 'iris';
}
else if (/IBM\sWebExplorer/i.test(ua)) {
title = 'IBM WebExplorer';
version = detectBrowserVersion('WebExplorer', ua);
code = 'ibmwebexplorer';
}
else if (/IBrowse/i.test(ua) && !/MiuiBrowser/i.test(ua)) {
title = 'IBrowse';
code = 'ibrowse';
}
else if (/iCab/i.test(ua)) {
title = 'iCab';
code = 'icab';
}
else if (/Ice Browser/i.test(ua)) {
title = 'Ice Browser';
code = 'icebrowser';
}
else if (/Iceape/i.test(ua)) {
title = 'Iceape';
code = 'iceape';
}
else if (/IceCat/i.test(ua)) {
title = 'GNU IceCat';
version = detectBrowserVersion('IceCat', ua);
code = 'icecat';
}
else if (/IceDragon/i.test(ua)) {
title = 'IceDragon';
code = 'icedragon';
}
else if (/IceWeasel/i.test(ua)) {
title = 'IceWeasel';
code = 'iceweasel';
}
else if (/IEMobile/i.test(ua)) {
title = 'IEMobile';
code = 'msie-mobile';
}
else if (/iNet\sBrowser/i.test(ua)) {
title = 'iNet Browser';
version = detectBrowserVersion('Browser', ua);
code = 'null';
}
else if (/iRider/i.test(ua)) {
title = 'iRider';
code = 'irider';
}
else if (/Iron/i.test(ua)) {
title = 'Iron';
code = 'iron';
}
else if (/InternetSurfboard/i.test(ua)) {
title = 'InternetSurfboard';
code = 'internetsurfboard';
}
else if (/Jasmine/i.test(ua)) {
title = 'Jasmine';
code = 'samsung';
}
else if (/K-Meleon/i.test(ua)) {
title = 'K-Meleon';
code = 'kmeleon';
}
else if (/K-Ninja/i.test(ua)) {
title = 'K-Ninja';
code = 'kninja';
}
else if (/Kapiko/i.test(ua)) {
title = 'Kapiko';
code = 'kapiko';
}
else if (/Kazehakase/i.test(ua)) {
title = 'Kazehakase';
code = 'kazehakase';
}
else if (/Kinza/i.test(ua)) {
title = 'Kinza';
code = 'kinza';
}
else if (/Strata/i.test(ua)) {
title = 'Kirix Strata';
version = detectBrowserVersion('Strata', ua);
code = 'kirix-strata';
}
else if (/KKman/i.test(ua)) {
title = 'KKman';
code = 'kkman';
}
else if (/KMail/i.test(ua)) {
title = 'KMail';
code = 'kmail';
}
else if (/KMLite/i.test(ua)) {
title = 'KMLite';
code = 'kmeleon';
}
else if (/Konqueror/i.test(ua)) {
title = 'Konqueror';
code = 'konqueror';
}
else if (/Kylo/i.test(ua)) {
title = 'Kylo';
code = 'kylo';
}
else if (/LBrowser/i.test(ua)) {
title = 'LBrowser';
code = 'lbrowser';
}
else if (/LG Browser/i.test(ua)) {
title = 'LG Web Browser';
version = detectBrowserVersion('Browser', ua);
code = 'lgbrowser';
}
else if (/LeechCraft/i.test(ua)) {
title = 'LeechCraft';
version = '';
code = 'null';
}
else if (/Links/i.test(ua) && !/online\slink\svalidator/i.test(ua)) {
version = detectBrowserVersion('Links \\(', ua);
title = 'Links';
code = 'links';
}
else if (/Lobo/i.test(ua)) {
title = 'Lobo';
code = 'lobo';
}
else if (/lolifox/i.test(ua)) {
title = 'lolifox';
code = 'lolifox';
}
else if (/Lorentz/i.test(ua)) {
title = 'Lorentz';
code = 'firefoxdevpre';
}
else if (/luakit/i.test(ua)) {
title = 'luakit';
version = '';
code = 'luakit';
}
else if (/Lunascape/i.test(ua)) {
title = 'Lunascape';
code = 'lunascape';
}
else if (/Lynx/i.test(ua)) {
title = 'Lynx';
code = 'lynx';
}
else if (/Madfox/i.test(ua)) {
title = 'Madfox';
code = 'madfox';
}
else if (/Maemo\sBrowser/i.test(ua)) {
title = 'Maemo Browser';
code = 'maemo';
}
else if (/Maxthon/i.test(ua)) {
title = 'Maxthon';
code = 'maxthon';
}
else if (/\sMIB\//i.test(ua)) {
title = 'MIB';
code = 'mib';
}
else if (/Tablet\sbrowser/i.test(ua)) {
title = 'MicroB';
version = detectBrowserVersion('Tablet browser', ua);
code = 'microb';
}
else if (/Midori/i.test(ua)) {
title = 'Midori';
code = 'midori';
}
else if (/ min\//i.test(ua)) {
title = 'Min Browser';
version = detectBrowserVersion('min', ua);
code = 'min';
}
else if (/Minefield/i.test(ua)) {
title = 'Minefield';
code = 'minefield';
}
else if (/MiniBrowser/i.test(ua)) {
title = 'MiniBrowser';
code = 'minibrowser';
}
else if (/Minimo/i.test(ua)) {
title = 'Minimo';
code = 'minimo';
}
else if (/MiuiBrowser/i.test(ua)) {
title = 'MIUI Browser';
version = detectBrowserVersion('MiuiBrowser', ua);
code = 'miuibrowser';
}
else if (/Mosaic/i.test(ua)) {
title = 'Mosaic';
code = 'mosaic';
}
else if (/MozillaDeveloperPreview/i.test(ua)) {
title = 'Mozilla Developer Preview';
version = detectBrowserVersion('MozillaDeveloperPreview', ua);
code = 'firefoxdevpre';
}
else if (/MQQBrowser/i.test(ua) || /QQBrowser/i.test(ua)) {
title = 'QQbrowser';
if (/MQQBrowser/i.test(ua)) {
version = '';
}
code = 'qqbrowser';
}
else if (/Multi-Browser/i.test(ua)) {
title = 'Multi-Browser XP';
version = detectBrowserVersion('Multi-Browser', ua);
code = 'multi-browserxp';
}
else if (/MultiZilla/i.test(ua)) {
title = 'MultiZilla';
code = 'mozilla';
}
else if (/MxNitro/i.test(ua)) {
title = 'MxNitro';
code = 'mxnitro';
}
else if (/myibrow/i.test(ua) && /My\sInternet\sBrowser/i.test(ua)) {
title = 'myibrow';
code = 'my-internet-browser';
}
else if (/MyIE2/i.test(ua)) {
title = 'MyIE2';
code = 'myie2';
}
else if (/Namoroka/i.test(ua)) {
title = 'Namoroka';
code = 'firefoxdevpre';
}
else if (/Navigator/i.test(ua)) {
title = 'Netscape Navigator';
version = detectBrowserVersion('Navigator', ua);
code = 'netscape';
}
else if (/NetBox/i.test(ua)) {
title = 'NetBox';
code = 'netbox';
}
else if (/NetCaptor/i.test(ua)) {
title = 'NetCaptor';
code = 'netcaptor';
}
else if (/NetFrontLifeBrowser/i.test(ua)) {
title = 'NetFront Life';
version = detectBrowserVersion('NetFrontLifeBrowser', ua);
code = 'netfrontlife';
}
else if (/NetFront/i.test(ua)) {
title = 'NetFront';
code = 'netfront';
}
else if (/NetNewsWire/i.test(ua)) {
title = 'NetNewsWire';
code = 'netnewswire';
}
else if (/NetPositive/i.test(ua)) {
title = 'NetPositive';
code = 'netpositive';
}
else if (/Netscape/i.test(ua)) {
title = 'Netscape';
code = 'netscape';
}
else if (/NetSurf/i.test(ua)) {
title = 'NetSurf';
code = 'netsurf';
}
else if (/NF-Browser/i.test(ua)) {
title = 'NetFront';
version = detectBrowserVersion('NF-Browser', ua);
code = 'netfront';
}
else if (/Ninesky-android-mobile/i.test(ua)) {
title = 'Ninesky';
version = detectBrowserVersion('Ninesky-android-mobile', ua);
code = 'ninesky';
}
else if (/Nintendo 3DS/i.test(ua)) {
title = 'Nintendo 3DS';
version = '';
code = 'nintendo3dsbrowser';
}
else if (/NintendoBrowser/i.test(ua)) {
title = 'Nintendo Browser';
version = detectBrowserVersion('Browser', ua);
code = 'nintendobrowser';
}
else if (/NokiaBrowser/i.test(ua)) {
title = 'Nokia Browser';
version = detectBrowserVersion('Browser', ua);
code = 'nokia';
}
else if (/Novarra-Vision/i.test(ua)) {
title = 'Novarra Vision';
version = detectBrowserVersion('Vision', ua);
code = 'novarra';
}
else if (/Obigo/i.test(ua)) {
title = 'Obigo';
code = 'obigo';
}
else if (/OffByOne/i.test(ua)) {
title = 'Off By One';
version = '';
code = 'offbyone';
}
else if (/OmniWeb/i.test(ua)) {
title = 'OmniWeb';
code = 'omniweb';
}
else if (/OneBrowser/i.test(ua)) {
title = 'OneBrowser';
code = 'onebrowser';
}
else if (/Opera Mini/i.test(ua)) {
title = 'Opera Mini';
code = 'opera-2';
}
else if (/Opera Mobi/i.test(ua)) {
if (/Version/i.test(ua)) {
version = detectBrowserVersion('Version', ua);
}
else {
version = detectBrowserVersion('Opera Mobi', ua);
}
title = 'Opera Mobile';
code = 'opera-2';
}
else if (/Opera/i.test(ua) || /OPR/i.test(ua)) {
title = 'Opera';
code = 'opera-1';
// How is version stored on this Opera ua?
if (/Version/i.test(ua)) {
code = 'opera-2';
version = detectBrowserVersion('Version', ua);
}
else if (/OPR/i.test(ua)) {
code = 'opera-2';
version = detectBrowserVersion('OPR', ua);
}
else {
// Use Opera as fallback since full title may change (Next, Developer, etc.)
version = detectBrowserVersion('Opera', ua);
}
// Is this one with a known alternate icon?
if (/Opera Labs/i.test(ua) || /Edition Labs/i.test(ua)) {
code = 'opera-2-next';
}
else if (/Opera Next/i.test(ua) || /Edition Next/i.test(ua)) {
code = 'opera-2-next';
}
else if (/Opera Developer/i.test(ua) || /Edition Developer/i.test(ua)) {
code = 'opera-2-developer';
}
// Parse full edition name, ex: Opera/9.80 (X11; Linux x86_64; U; Edition Labs Camera and Pages; Ubuntu/11.10; en) Presto/2.9.220 Version/12.00
if (/Edition ([\s._0-9a-zA-Z]+)/i.test(ua)) {
const regexp = /Edition ([\s._0-9a-zA-Z]+)/i;
const [, matched = ''] = regexp.exec(ua) || [];
title += ` ${matched}`;
}
else if (/Opera ([\s._0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = /Edition ([\s._0-9a-zA-Z]+)/i.exec(ua) || [];
title += ` ${matched}`;
}
// Use the newest icon?
if (Number(version.split('.')[0]) > 13) {
code = 'opera-3';
}
}
else if (/Orca/i.test(ua)) {
title = 'Orca';
code = 'orca';
}
else if (/Oregano/i.test(ua)) {
title = 'Oregano';
code = 'oregano';
}
else if (/Origyn\sWeb\sBrowser/i.test(ua)) {
title = 'Oregano Web Browser';
version = '';
code = 'owb';
}
else if (/osb-browser/i.test(ua)) {
version = detectBrowserVersion('osb-browser', ua);
title = 'Gtk+ WebCore';
code = 'null';
}
else if (/Otter/i.test(ua)) {
title = 'Otter';
code = 'otter';
}
else if (/\sPre\//i.test(ua)) {
if (/Version/i.test(ua)) {
version = detectBrowserVersion('Version', ua);
}
else {
version = detectBrowserVersion('Pre', ua);
}
title = 'Palm';
code = 'palmpre';
}
else if (/\sWebPro\//i.test(ua)) {
title = 'Palm WebPro';
version = detectBrowserVersion('WebPro', ua);
code = 'palmwebpro';
}
else if (/Palemoon/i.test(ua)) {
title = 'Pale Moon';
version = detectBrowserVersion('Moon', ua);
code = 'palemoon';
}
else if (/Patriott::Browser/i.test(ua)) {
title = 'Patriott Browser';
version = detectBrowserVersion('Browser', ua);
code = 'patriott';
}
else if (/Perk/i.test(ua)) {
title = 'Perk';
code = 'perk';
}
else if (/Phaseout/i.test(ua)) {
title = 'Phaseout';
version = '';
code = 'phaseout';
}
else if (/Phoenix/i.test(ua)) {
title = 'Phoenix';
code = 'phoenix';
}
else if (/PlayStation\s4/i.test(ua)) {
title = 'PS4 Web Browser';
version = '';
code = 'webkit';
}
else if (/Podkicker/i.test(ua)) {
title = 'Podkicker';
code = 'podkicker';
}
else if (/Podkicker\sPro/i.test(ua)) {
title = 'Podkicker Pro';
code = 'podkicker';
}
else if (/Pogo/i.test(ua)) {
title = 'Pogo';
code = 'pogo';
}
else if (/Polaris/i.test(ua)) {
title = 'Polaris';
code = 'polaris';
}
else if (/Polarity/i.test(ua)) {
title = 'Polarity';
code = 'polarity';
}
else if (/Prism/i.test(ua)) {
title = 'Prism';
code = 'prism';
}
else if (/Puffin/i.test(ua)) {
title = 'Puffin';
code = 'puffin';
}
else if (/QtWeb\sInternet\sBrowser/i.test(ua)) {
title = 'QtWeb Internet Browser';
version = detectBrowserVersion('Browser', ua);
code = 'qtwebinternetbrowser';
}
else if (/QupZilla/i.test(ua)) {
title = 'QupZilla';
code = 'qupzilla';
}
else if (/Nichrome\/self/i.test(ua)) {
version = detectBrowserVersion('Nichrome/self', ua);
title = 'Rambler browser';
code = 'ramblerbrowser';
}
else if (/rekonq/i.test(ua)) {
title = 'rekonq';
version = '';
code = 'rekonq';
}
else if (/retawq/i.test(ua)) {
title = 'retawq';
code = 'terminal';
}
else if (/Roccat/i.test(ua)) {
title = 'Roccat';
code = 'roccatbrowser';
}
else if (/RockMelt/i.test(ua)) {
title = 'RockMelt';
code = 'rockmelt';
}
else if (/Ryouko/i.test(ua)) {
title = 'Ryouko';
code = 'ryouko';
}
else if (/SaaYaa/i.test(ua)) {
title = 'SaaYaa Explorer';
version = '';
code = 'saayaa';
}
else if (/SeaMonkey/i.test(ua)) {
title = 'SeaMonkey';
code = 'seamonkey';
}
else if (/SEMC-Browser/i.test(ua)) {
title = 'SEMC Browser';
version = detectBrowserVersion('SEMC-Browser', ua);
code = 'semcbrowser';
}
else if (/SEMC-java/i.test(ua)) {
title = 'SEMC-java';
code = 'semcbrowser';
}
else if (/Series60/i.test(ua) && !/Symbian/i.test(ua)) {
title = 'Nokia Series60';
version = detectBrowserVersion('Series60', ua);
code = 's60';
}
else if (/S60/i.test(ua) && !/Symbian/i.test(ua)) {
title = 'Nokia S60';
version = detectBrowserVersion('S60', ua);
code = 's60';
}
else if (/SE\s/i.test(ua) && /MetaSr/i.test(ua)) {
title = 'Sogou Explorer';
version = '';
code = 'sogou';
}
else if (/Seznam\.cz/i.test(ua)) {
title = 'Seznam.cz';
version = detectBrowserVersion('cz', ua);
code = 'seznam-cz';
}
else if (/Shiira/i.test(ua)) {
title = 'Shiira';
code = 'shiira';
}
else if (/Shiretoko/i.test(ua)) {
title = 'Shiretoko';
code = 'firefoxdevpre';
}
else if (/Silk/i.test(ua) && !/PlayStation/i.test(ua)) {
title = 'Amazon Silk';
version = detectBrowserVersion('Silk', ua);
code = 'silk';
}
else if (/SiteKiosk/i.test(ua)) {
title = 'SiteKiosk';
code = 'sitekiosk';
}
else if (/SkipStone/i.test(ua)) {
title = 'SkipStone';
code = 'skipstone';
}
else if (/Skyfire/i.test(ua)) {
title = 'Skyfire';
code = 'skyfire';
}
else if (/Sleipnir/i.test(ua)) {
title = 'Sleipnir';
code = 'sleipnir';
}
else if (/SlimBoat/i.test(ua)) {
title = 'SlimBoat';
code = 'slimboat';
}
else if (/SlimBrowser/i.test(ua)) {
title = 'SlimBrowser';
code = 'slimbrowser';
}
else if (/SmartTV/i.test(ua)) {
title = 'Maple Browser';
version = detectBrowserVersion('WebBrowser', ua);
code = 'maplebrowser';
}
else if (/Songbird/i.test(ua)) {
title = 'Songbird';
code = 'songbird';
}
else if (/Stainless/i.test(ua)) {
title = 'Stainless';
code = 'stainless';
}
else if (/SubStream/i.test(ua)) {
title = 'SubStream';
code = 'substream';
}
else if (/Sulfur/i.test(ua)) {
title = 'Flock Sulfur';
version = detectBrowserVersion('Sulfur', ua);
code = 'flock';
}
else if (/Sundance/i.test(ua)) {
title = 'Sundance';
code = 'sundance';
}
else if (/Sundial/i.test(ua)) {
title = 'Sundial';
code = 'sundial';
}
else if (/Sunrise/i.test(ua)) {
title = 'Sunrise';
code = 'sunrise';
}
else if (/Superbird/i.test(ua)) {
title = 'Superbird';
code = 'superbird';
}
else if (/Surf/i.test(ua)) {
title = 'Surf';
code = 'surf';
}
else if (/Swiftfox/i.test(ua)) {
title = 'Swiftfox';
code = 'swiftfox';
}
else if (/Swiftweasel/i.test(ua)) {
title = 'Swiftweasel';
code = 'swiftweasel';
}
else if (/Sylera/i.test(ua)) {
title = 'Sylera';
code = 'null';
}
else if (/tear/i.test(ua)) {
title = 'Tear';
version = '';
code = 'tear';
}
else if (/TeaShark/i.test(ua)) {
title = 'TeaShark';
code = 'teashark';
}
else if (/Teleca/i.test(ua)) {
title = ' Teleca';
code = 'obigo';
}
else if (/TenFourFox/i.test(ua)) {
title = 'TenFourFox';
version = detectBrowserVersion(' rv', ua);
code = 'tenfourfox';
}
else if (/QtCarBrowser/i.test(ua)) {
title = 'Tesla Car Browser';
version = '';
code = 'teslacarbrowser';
}
else if (/TheWorld/i.test(ua)) {
title = 'TheWorld Browser';
version = '';
code = 'theworld';
}
else if (/Thunderbird/i.test(ua)) {
title = 'Thunderbird';
code = 'thunderbird';
}
else if (/Tizen/i.test(ua)) {
title = 'Tizen';
code = 'tizen';
}
else if (/Tjusig/i.test(ua)) {
title = 'Tjusig';
code = 'tjusig';
}
else if (/TencentTraveler/i.test(ua)) {
title = 'TT Explorer';
version = detectBrowserVersion('TencentTraveler', ua);
code = 'tt-explorer';
}
else if (/uBrowser/i.test(ua) && !/Chrome/i.test(ua)) {
title = 'uBrowser';
code = 'ubrowser';
}
else if (/Ubuntu;\sMobile/i.test(ua) || (/Ubuntu;\sTablet/i.test(ua) && /WebKit/i.test(ua))) {
title = 'Ubuntu Web Browser';
version = '';
code = 'ubuntuwebbrowser';
}
else if (/UBrowser/i.test(ua)) {
title = 'UC Browser';
version = detectBrowserVersion('UBrowser', ua);
code = 'ucbrowser';
}
else if (/UCBrowser/i.test(ua)) {
title = 'UC Browser';
version = detectBrowserVersion('UCBrowser', ua);
code = 'ucbrowser';
}
else if (/UC\sBrowser/i.test(ua)) {
title = 'UC Browser';
version = detectBrowserVersion('UC Browser', ua);
code = 'ucbrowser';
}
else if (/UCWEB/i.test(ua)) {
title = 'UC Browser';
version = detectBrowserVersion('UCWEB', ua);
code = 'ucweb';
}
else if (/UltraBrowser/i.test(ua)) {
title = 'UltraBrowser';
code = 'ultrabrowser';
}
else if (/UP.Browser/i.test(ua)) {
title = 'Openwave Mobile Browser';
version = detectBrowserVersion('UP.Browser', ua);
code = 'openwave';
}
else if (/UP.Link/i.test(ua)) {
title = 'Openwave Mobile Browser';
version = detectBrowserVersion('UP.Link', ua);
code = 'openwave';
}
else if (/Usejump/i.test(ua)) {
title = 'Usejump';
code = 'usejump';
}
else if (/uZardWeb/i.test(ua)) {
title = 'uZardWeb';
code = 'uzardweb';
}
else if (/uZard/i.test(ua)) {
title = 'uZard';
code = 'uzardweb';
}
else if (/uzbl/i.test(ua)) {
title = 'uzbl';
code = 'uzbl';
}
else if (/Vivaldi/i.test(ua)) {
title = 'Vivaldi';
code = 'vivaldi';
}
else if (/Vimprobable/i.test(ua)) {
title = 'Vimprobable';
code = 'null';
}
else if (/Vonkeror/i.test(ua)) {
title = 'Vonkeror';
code = 'null';
}
else if (/w3m/i.test(ua)) {
title = 'W3M';
code = 'w3m';
}
else if (/AppleWebkit/i.test(ua) && /WebPositive/i.test(ua)) {
title = 'WebPositive';
code = 'webpositive';
}
else if (/AppleWebkit/i.test(ua) && /Android/i.test(ua) && !/Chrome/i.test(ua)) {
title = 'Android Webkit';
version = detectBrowserVersion('Version', ua);
code = 'android-webkit';
}
else if (/Waterfox/i.test(ua)) {
title = 'Waterfox';
code = 'waterfox';
}
else if (/WebExplorer/i.test(ua)) {
title = 'Web Explorer';
version = detectBrowserVersion('Explorer', ua);
code = 'webexplorer';
}
else if (/WebianShell/i.test(ua)) {
title = 'Webian Shell';
version = detectBrowserVersion('Shell', ua);
code = 'webianshell';
}
else if (/Webrender/i.test(ua)) {
title = 'Webrender';
version = '';
code = 'webrender';
}
else if (/Chrome/i.test(ua) && /Mobile/i.test(ua) && (/Version/i.test(ua) || /wv/i.test(ua))) {
// https://developer.chrome.com/multidevice/user-agent
title = 'WebView';
version = detectBrowserVersion('Version', ua);
code = 'android-webkit';
}
else if (/WeltweitimnetzBrowser/i.test(ua)) {
title = 'Weltweitimnetz Browser';
version = detectBrowserVersion('Browser', ua);
code = 'weltweitimnetzbrowser';
}
else if (/wKiosk/i.test(ua)) {
title = 'wKiosk';
version = '';
code = 'wkiosk';
}
else if (/WorldWideWeb/i.test(ua)) {
title = 'WorldWideWeb';
code = 'worldwideweb';
}
else if (/wOSBrowser/i.test(ua) || /webOSBrowser/i.test(ua)) {
title = 'wOSBrowser';
version = detectBrowserVersion('OSBrowser', ua);
code = 'webos';
}
else if (/wp-android/i.test(ua)) {
version = detectBrowserVersion('wp-android', ua); // TODO check into Android version being returned
title = 'Wordpress App';
code = 'wordpress';
}
else if (/wp-blackberry/i.test(ua)) {
title = 'wp-blackberry';
code = 'wordpress';
}
else if (/wp-iphone/i.test(ua)) {
title = 'Wordpress App';
version = detectBrowserVersion('wp-iphone', ua);
code = 'wordpress';
}
else if (/wp-nokia/i.test(ua)) {
title = 'wp-nokia';
code = 'wordpress';
}
else if (/wp-webos/i.test(ua)) {
title = 'wp-webos';
code = 'wordpress';
}
else if (/wp-windowsphone/i.test(ua)) {
title = 'wp-windowsphone';
code = 'wordpress';
}
else if (/Wyzo/i.test(ua)) {
title = 'Wyzo';
code = 'Wyzo';
}
else if (/X-Smiles/i.test(ua)) {
title = 'X-Smiles';
code = 'x-smiles';
}
else if (/Xiino/i.test(ua)) {
title = 'Xiino';
code = 'null';
}
else if (/YaBrowser/i.test(ua)) {
title = 'Yandex Browser';
version = detectBrowserVersion('Browser', ua);
code = 'yandex';
}
else if (/YRCWeblink/i.test(ua)) {
title = 'YRC Weblink';
version = detectBrowserVersion('Weblink', ua);
code = 'yrcweblink';
}
else if (/zBrowser/i.test(ua)) {
title = 'zBrowser';
code = 'zbrowser';
}
else if (/ZipZap/i.test(ua)) {
title = 'ZipZap';
code = 'zipzap';
}
// Pulled out of order to help ensure better detection for above browsers
else if (/ABrowse/i.test(ua)) {
title = 'ABrowse';
code = 'abrowse';
}
else if (/Edge/i.test(ua) && /Chrome/i.test(ua) && /Safari/i.test(ua)) {
title = 'Microsoft Edge';
version = detectBrowserVersion('Edge', ua);
code = 'msedge12';
}
else if (/Edge\//i.test(ua) || /Edg\//i.test(ua) || /EdgiOS\//i.test(ua) || /EdgA\//i.test(ua)) {
title = 'Microsoft Edge';
if (/Edge\//i.test(ua)) {
// Edge (MSIE rebrand and rewrite)
version = detectBrowserVersion('Edge', ua);
code = 'edge-1';
}
else {
if (/EdgiOS\//i.test(ua)) {
// Edge for iOS
version = detectBrowserVersion('EdgiOS', ua);
}
else if (/EdgA\//i.test(ua)) {
// Edge for Android
version = detectBrowserVersion('EdgA', ua);
}
else {
// Edge (Chromium)
version = detectBrowserVersion('Edg', ua);
}
code = 'edge-2';
}
}
else if (/Chrome/i.test(ua)) {
title = 'Google Chrome';
version = detectBrowserVersion('Chrome', ua);
code = 'chrome';
}
else if (/Safari/i.test(ua) && !/Nokia/i.test(ua)) {
title = 'Safari';
if (/Version/i.test(ua)) {
version = detectBrowserVersion('Version', ua);
}
if (/Mobile Safari/i.test(ua)) {
title = `Mobile ${title}`;
}
code = 'safari';
}
else if (/Nokia/i.test(ua)) {
title = 'Nokia Web Browser';
version = '';
code = 'maemo';
}
else if (/Firefox/i.test(ua)) {
title = 'Firefox';
code = 'firefox';
}
else if (/MSIE/i.test(ua) || /Trident/i.test(ua)) {
title = 'Internet Explorer';
if (/\srv:([.0-9a-zA-Z]+)/i.test(ua)) {
// IE11 or newer
version = detectBrowserVersion(' rv', ua);
}
else {
// IE10 or older, regex: '/MSIE[\s|\/]?([.0-9a-zA-Z]+)/i'
version = detectBrowserVersion('MSIE', ua);
}
if (Number(version) >= 10) {
code = 'msie10';
}
else if (Number(version) >= 9) {
code = 'msie9';
}
else if (Number(version) >= 7) {
// also ie8
code = 'msie7';
// Detect compatibility mode for IE
if (version === '7.0' && /Trident\/4.0/i.test(ua)) {
version = '8.0 (Compatibility Mode)'; // Fix for IE8 quirky UA string with Compatibility Mode enabled
}
}
else if (Number(version) >= 6) {
code = 'msie6';
}
else if (Number(version) >= 4) {
// also ie5
code = 'msie4';
}
else if (Number(version) >= 3) {
code = 'msie3';
}
else if (Number(version) >= 2) {
code = 'msie2';
}
else if (Number(version) >= 1) {
code = 'msie1';
}
else {
code = 'msie';
}
}
else if (/Mozilla/i.test(ua)) {
title = 'Mozilla';
version = detectBrowserVersion(' rv', ua);
if (version === null) {
title += ' Compatible';
}
code = 'mozilla';
}
// No Web browser match
else {
title = 'Unknown';
version = '';
code = 'null';
}
// Set version if it hasn't been parsed yet (generic structure)...
if (version === null) {
version = detectBrowserVersion(title, ua);
}
return {
title,
version,
code,
icon: `/device/${code}.png`
};
}
function detectDevice(ua) {
let version = null;
let title = '';
let code = '';
// Apple
if (/iPad/i.test(ua)) {
title = 'iPad';
if (/CPU\sOS\s([._0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/CPU\sOS\s([._0-9a-zA-Z]+)/i) || [];
version = `iOS ${matched.replace(/_/g, '.')}`;
}
code = 'ipad';
}
else if (/iPod/i.test(ua)) {
title = 'iPod';
if (/iPhone\sOS\s([._0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/iPhone\sOS\s([._0-9a-zA-Z]+)/i) || [];
version = `iOS ${matched.replace(/_/g, '.')}`;
}
code = 'iphone';
}
else if (/iPhone/i.test(ua) && !/Windows Phone/i.test(ua)) {
title = 'iPhone';
if (/iPhone\sOS\s([._0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/iPhone\sOS\s([._0-9a-zA-Z]+)/i) || [];
version = `iOS ${matched.replace(/_/g, '.')}`;
}
code = 'iphone';
}
// BenQ-Siemens (Openwave)
else if (/[^M]SIE/i.test(ua)) {
title = 'BenQ-Siemens';
if (/[^M]SIE-([.0-9a-zA-Z]+)\//i.test(ua)) {
const [, matched = ''] = ua.match(/[^M]SIE-([.0-9a-zA-Z]+)\//i) || [];
version = matched;
}
code = 'benq-siemens';
}
// BlackBerry
else if (/BlackBerry/i.test(ua)) {
title = 'BlackBerry';
if (/blackberry([.0-9a-zA-Z]+)\//i.test(ua)) {
const [, matched = ''] = ua.match(/blackberry([.0-9a-zA-Z]+)\//i) || [];
version = matched;
}
code = 'blackberry';
}
// Dell
else if (/Dell Mini 5/i.test(ua)) {
title = 'Dell Mini 5';
code = 'dell';
}
else if (/Dell Streak/i.test(ua)) {
title = 'Dell Streak';
code = 'dell';
}
else if (/Dell/i.test(ua)) {
title = 'Dell';
code = 'dell';
}
// Google
else if (/Nexus One/i.test(ua)) {
title = 'Nexus One';
code = 'google-nexusone';
}
// HTC
else if (/Desire/i.test(ua)) {
title = 'HTC Desire';
code = 'htc';
}
else if (/Rhodium/i.test(ua) || /HTC[_|\s]Touch[_|\s]Pro2/i.test(ua) || /WMD-50433/i.test(ua)) {
title = 'HTC Touch Pro2';
code = 'htc';
}
else if (/HTC[_|\s]Touch[_|\s]Pro/i.test(ua)) {
title = 'HTC Touch Pro';
code = 'htc';
}
else if (/HTC/i.test(ua)) {
title = 'HTC';
if (/HTC[\s|_|-]8500/i.test(ua)) {
title += ' Startrek';
}
else if (/HTC[\s|_|-]Hero/i.test(ua)) {
title += ' Hero';
}
else if (/HTC[\s|_|-]Legend/i.test(ua)) {
title += ' Legend';
}
else if (/HTC[\s|_|-]Magic/i.test(ua)) {
title += ' Magic';
}
else if (/HTC[\s|_|-]P3450/i.test(ua)) {
title += ' Touch';
}
else if (/HTC[\s|_|-]P3650/i.test(ua)) {
title += ' Polaris';
}
else if (/HTC[\s|_|-]S710/i.test(ua)) {
title += ' S710';
}
else if (/HTC[\s|_|-]Tattoo/i.test(ua)) {
title += ' Tattoo';
}
else if (/HTC[\s|_|-]?([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/HTC[\s|_|-]?([.0-9a-zA-Z]+)/i) || [];
title += ` ${matched}`; // Matche other HTC product names (possibly versions?)
}
else if (/HTC([._0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/HTC([._0-9a-zA-Z]+)/i) || [];
title += matched.replace(/_/g, '.');
}
code = 'htc';
}
// Kindle
else if (/Kindle/i.test(ua)) {
title = 'Kindle';
if (/Kindle\/([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/Kindle\/([.0-9a-zA-Z]+)/i) || [];
version = matched;
}
code = 'kindle';
}
// LG
else if (/LG/i.test(ua)) {
title = 'LG';
if (/LG[E]?[\s|-|/]([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/LG[E]?[\s|-|/]([.0-9a-zA-Z]+)/i) || [];
version = matched;
}
code = 'lg';
}
// Microsoft
else if (/Windows Phone OS 7/i.test(ua) || /ZuneWP7/i.test(ua) || /WP7/i.test(ua)) {
title = 'Windows Phone';
version = '7';
code = 'wp7';
}
else if (/Windows Phone OS 8\.1/i.test(ua) || /Windows Phone 8\.1/i.test(ua) || /WP8\.1/i.test(ua)) {
title = 'Windows Phone';
version = '8.1';
code = 'wp7';
}
else if (/Windows Phone OS 8/i.test(ua) || /Windows Phone 8/i.test(ua) || /WP8/i.test(ua)) {
title = 'Windows Phone';
version = '8';
code = 'wp7';
}
else if (/Windows Phone 10/i.test(ua) || /WP10/i.test(ua)) {
title = 'Windows Phone';
version = '10';
code = 'wp10';
}
else if (/Xbox/i.test(ua)) {
title = 'Xbox';
code = 'xbox';
if (/Xbox\s?360/i.test(ua)) {
title += ' 360';
code = 'xbox';
}
else if (/XboxOne/i.test(ua)) {
title += ' One';
code = 'xboxone';
}
}
// Motorola
else if (/\sDroid/i.test(ua)) {
title = 'Motorola Droid';
code = 'motorola';
}
else if (/XT720/i.test(ua)) {
title = 'Motorola Motoroi (XT720)';
code = 'motorola';
}
else if (/MOT-/i.test(ua) || /MIB/i.test(ua)) {
title = 'Motorola';
if (/MOT[O-]([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/MOTO([.0-9a-zA-Z]+)/i) || [];
version = matched;
}
code = 'motorola';
}
else if (/XOOM/i.test(ua)) {
title = 'Motorola Xoom';
code = 'motorola';
}
// Nintendo
else if (/Nintendo/i.test(ua)) {
title = 'Nintendo';
if (/Nintendo 3DS/i.test(ua)) {
title += ' 3DS';
code = 'nintendods';
}
else if (/Nintendo DSi/i.test(ua)) {
title += ' DSi';
code = 'nintendodsi';
}
else if (/Nintendo DS/i.test(ua)) {
title += ' DS';
code = 'nintendods';
}
else if (/Nintendo WiiU/i.test(ua)) {
title += ' Wii U';
code = 'nintendowiiu';
}
else if (/Nintendo Wii/i.test(ua)) {
title += ' Wii';
code = 'nintendowii';
}
else {
code = 'nintendo';
}
}
// Nokia
else if (/Nokia/i.test(ua) && !/S(eries)?60/i.test(ua)) {
title = 'Nokia';
if (/Nokia(E|N)?([0-9]+)/i.test(ua)) {
const [, m1, m2] = ua.match(/Nokia(E|N)?([0-9]+)/i) || [];
title += ` ${m1}${m2}`;
}
code = 'nokia';
}
else if (/S(eries)?60/i.test(ua)) {
title = 'Nokia Series60';
code = 'nokia';
}
// OLPC (One Laptop Per Child)
else if (/OLPC/i.test(ua)) {
title = 'OLPC (XO)';
code = 'olpc';
}
// Palm
else if (/\sPixi\//i.test(ua)) {
title = 'Palm Pixi';
code = 'palm';
}
else if (/\sPre\//i.test(ua)) {
title = 'Palm Pre';
code = 'palm';
}
else if (/Palm/i.test(ua)) {
title = 'Palm';
code = 'palm';
}
else if (/wp-webos/i.test(ua)) {
title = 'Palm';
code = 'palm';
}
// Playstation
else if (/PlayStation/i.test(ua)) {
title = 'PlayStation';
if (/[PS|PlayStation\s]3/i.test(ua)) {
title += ' 3';
}
else if (/[PS|PlayStation\s]4/i.test(ua)) {
title += ' 4';
}
else if (/[PlayStation Portable|PSP]/i.test(ua)) {
title += ' Portable';
}
else if (/[PlayStation Vita|PSVita]/i.test(ua)) {
title += ' Vita';
}
code = 'playstation';
}
// Samsung
else if (/Galaxy Nexus/i.test(ua)) {
title = 'Galaxy Nexus';
code = 'samsung';
}
else if (/SmartTV/i.test(ua)) {
title = 'Samsung Smart TV';
code = 'samsung';
}
else if (/Samsung/i.test(ua)) {
title = 'Samsung';
if (/Samsung-([.\-0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/Samsung-([.\-0-9a-zA-Z]+)/i) || [];
title += ` ${matched}`;
}
code = 'samsung';
}
// Sony Ericsson
else if (/SonyEricsson/i.test(ua)) {
title = 'Sony Ericsson';
if (/SonyEricsson([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = ua.match(/SonyEricsson([.0-9a-zA-Z]+)/i) || [];
if (matched.toLowerCase() === 'u20i') {
title += ' Xperia X10 Mini Pro';
}
else {
title += ` ${matched}`;
}
}
code = 'sonyericsson';
}
// Ubuntu Phone/Tablet
else if (/Ubuntu;\sMobile/i.test(ua)) {
title = 'Ubuntu Phone';
code = 'ubuntutouch';
}
else if (/Ubuntu;\sTablet/i.test(ua)) {
title = 'Ubuntu Tablet';
code = 'ubuntutouch';
}
// Windows Phone
else if (/wp-windowsphone/i.test(ua)) {
title = 'Windows Phone';
code = 'windowsphone';
}
// No Device match
else {
return undefined;
}
return {
title,
version: version || '',
code,
icon: `/net/${code}.png`
};
}
function detectOs(ua) {
let version = null;
let title = '';
let code = '';
if (/AmigaOS/i.test(ua)) {
title = 'AmigaOS';
if (/AmigaOS ([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = /AmigaOS ([.0-9a-zA-Z]+)/i.exec(ua) || [];
version = matched;
}
code = 'amigaos';
}
else if (/Android/i.test(ua)) {
title = 'Android';
code = 'android';
if (/Android[ |/]?([.0-9a-zA-Z]+)/i.test(ua)) {
const [, matched = ''] = /Android[ |/]?([.0-9a-zA-Z]+)/i.exec(ua) || [];
version = matched;
}
}
else if (/[^A-Za-z]Arch/i.test(ua)) {
title = 'Arch Linux';
code = 'archlinux';
}
else if (/BeOS/i.test(ua)) {
title = 'BeOS';
code = 'beos';
}
else if (/CentOS/i.test(ua)) {
title = 'CentOS';
if (/.el([.0-9a-zA-Z]+).centos/i.test(ua)) {
const [, matched = ''] = ua.match(/.el([.0-9a-zA-Z]+).centos/i) || [];
version = matched;
}
code = 'centos';
}
else if (/Chakra/i.test(ua)) {
title = 'Chakra Linux';
code = 'chakra';
}
else if (/CrOS/i.test(ua)) {
title = 'Google Chrome OS';
code = 'chromeos';
}
else if (/Crunchbang/i.test(ua)) {
title = 'Crunchbang';