From 770457058121132e7115ba1b35291abd51806846 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Thu, 13 Sep 2012 18:39:12 +0700 Subject: [PATCH] Add getUA(), improve regxMap(), add Silk browser, add more older versions of Windows, etc --- package.json | 2 +- ua-parser.js | 71 ++++++++++++++++++++++++++-------------------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index 4e160ac..5d5e293 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "title": "UA-Parser.js", "name": "ua-parser-js", - "version": "0.3.1", + "version": "0.3.2", "author": "Faisal Salman (http://faisalman.com)", "description": "Lightweight JavaScript-based user-agent string parser", "keywords": [ diff --git a/ua-parser.js b/ua-parser.js index 4b77d1b..4923a0f 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -1,9 +1,9 @@ -// UA-Parser.js v0.3.1 -// Light-weight JavaScript-based all-in-one user-agent parser +// UA-Parser.js v0.3.2 +// Lightweight JavaScript-based User-Agent string parser // https://github.com/faisalman/ua-parser-js // // Copyright © 2012 Faisalman -// Licensed under GPLv2 & MIT +// Dual licensed under GPLv2 & MIT (function (undefined) { var parser = function UAParser (uastring) { @@ -12,17 +12,20 @@ // regexp mapper var regxMap = function (ua) { - var result; - var i, j, k, l; + var result = {}, i, j, k, l; for (i = 1; i < arguments.length; i += 2) { - var regex = arguments[i]; - var props = arguments[i + 1]; - var isMatchFound = false; + var regex = arguments[i], // odd sequence (2,4,6,..) + props = arguments[i + 1]; // even sequence (3,5,7,..) + for (k = 0; k < props.length; k++) { + if (typeof props[k] == 'object') { + result[props[k][0]] = undefined; + } else { + result[props[k]] = undefined; + } + } for (j = 0; j < regex.length; j++) { var match = regex[j].exec(ua); - //console.log(match); if (!!match) { - result = {}; l = 1; for (k = 0; k < props.length; k++) { if (typeof props[k] === 'object' && props[k].length === 2) { @@ -34,24 +37,10 @@ result[props[k]] = (!!match[k + l]) ? match[k + l] : undefined; } } - isMatchFound = true; break; } } - if (!isMatchFound) { - result = {}; - for (k in props) { - if (props.hasOwnProperty(k)) { - if (typeof props[k] == 'object') { - result[props[k][0]] = undefined; - } else { - result[props[k]] = undefined; - } - } - } - } else { - return result; - } + if(!!l) break; // break the loop if match found } return result; }; @@ -60,6 +49,12 @@ os : { win: function (str, match) { switch (match.toLowerCase()) { + case '4.90': + return 'ME'; + case 'nt3.51': + return 'NT 3.11'; + case 'nt4.0': + return 'NT 4.0'; case 'nt 5.0': return '2000'; case 'nt 5.1': @@ -96,7 +91,7 @@ /ms(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer // Webkit/KHTML based - /(chromium|flock|rockmelt|midori|epiphany)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany + /(chromium|flock|rockmelt|midori|epiphany|silk)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany /(chrome|omniweb|arora|dolfin|[tizenaok]{5}\s?browser)\/((\d+)?[\w\.]+)/i, // Chrome/OmniWeb/Arora/Dolphin/Tizen/Nokia ], ['name', 'version', 'major'], [ @@ -135,9 +130,11 @@ return regxMap(uastring || ua, [ // Windows based - /(windows\sphone\sos|windows)\s+([\w\.\s]+)*/i, // Windows - ], ['name', ['version', /(nt\s[\d\.]+)/gi, mapper.os.win]], [ - + /(windows\sphone\sos|windows)\s?([nt\d\.\s]+\d)*/i // Windows + ], ['name', ['version', /(.+)/gi, mapper.os.win]], [ + /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i + ], [['name', 'Windows'], ['version', /(.+)/gi, mapper.os.win]], [ + // Mobile/Embedded OS /(blackberry).+version\/([\w\.]+)/i, // Blackberry /(tizen)\/([\w\.]+)/i, // Tizen @@ -153,11 +150,11 @@ /(gnu|linux)\s?([\w\.]+)*/i // Other GNU/Linux ], ['name', 'version'], [ - /cros\s([\w\.\s]+)/i // Chromium OS + /cros\s([\w\.\s]+\d)/i // Chromium OS ], [['name', 'Chromium OS'], 'version'],[ // Solaris - /sunos\s?([\w\.\s]+)*/i // Solaris + /sunos\s?([\w\.\s]+\d)*/i // Solaris ], [['name', 'Solaris'], 'version'], [ // BSD based @@ -167,7 +164,7 @@ /(ip[honead]+).*os\s*([\w]+)*\slike\smac/i // iOS ], [['name', /.+/g, 'iOS'], ['version', /_/g, '.']], [ - /(mac\sos)\sx\s([\w\s\.]+)/i, // Mac OS + /(mac\sos\sx)\s([\w\s\.]+\w)/i, // Mac OS ], ['name', ['version', /_/g, '.']], [ // Other @@ -184,7 +181,7 @@ /(blackberry)[\s-]?(\w+)/i, // BlackBerry /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|nexus|zte)[\s_-]?([\w-]+)*/i, // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Nexus/ZTE - /(hp)\s([\w\s]+)/i, // HP iPAQ + /(hp)\s([\w\s]+\w)/i, // HP iPAQ /(hp).+(touchpad)/i, // HP TouchPad /(kindle)\/([\w\.]+)/i, // Kindle /(lg)[e;\s-]+(\w+)*/i, // LG @@ -214,9 +211,13 @@ /nokia[\s_-]?([\w-]+)*/i ], [['name', 'Nokia'], 'version']); }; + + this.getUA = function() { + return ua; + }; this.setUA = function (uastring) { - ua = uastring || ua; + ua = uastring; this.result = { browser : this.getBrowser(), engine : this.getEngine(), @@ -238,4 +239,4 @@ } else { this['UAParser'] = parser; } -})(); +})(); \ No newline at end of file