From 294b4e6d58872c4d2e9da7023b7fe47302616d04 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Sat, 31 Mar 2012 16:50:43 +0700 Subject: [PATCH 1/9] Added setUA() method and result object --- ua-parser.js | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/ua-parser.js b/ua-parser.js index f1f3ee3..b21b047 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -5,7 +5,9 @@ // Copyright © 2012 Faisalman // Licensed under GPLv2 -function uaparser (uastring) { +function UAParser (uastring) { + + var ua = uastring || window.navigator.userAgent; // regexp mapper var regxMap = function (ua) { @@ -69,15 +71,13 @@ function uaparser (uastring) { } }; - this.ua = uastring || window.navigator.userAgent; + this.getBrowser = function(uastring) { - this.getBrowser = function() { - - return regxMap(this.ua, [ + return regxMap(uastring || ua, [ // Mixed /(kindle)\/((\d+)?[\w\.]+)/i, // Kindle - /(lunpropsape|maxthon|netfront|jasmine)[\/\s]?((\d+)?[\w\.]+)/i, // Lunpropsape/Maxthon/Netfront/Jasmine + /(lunascape|maxthon|netfront|jasmine)[\/\s]?((\d+)?[\w\.]+)/i, // Lunascape/Maxthon/Netfront/Jasmine // Presto based /(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini @@ -108,9 +108,9 @@ function uaparser (uastring) { ], ['name', 'version', 'major']); }; - this.getEngine = function() { + this.getEngine = function(uastring) { - return regxMap(this.ua, [ + return regxMap(uastring || ua, [ /(presto)\/([\w\.]+)/i, // Presto /([aple]*webkit|trident)\/([\w\.]+)/i, // Webkit/Trident @@ -121,9 +121,9 @@ function uaparser (uastring) { ], ['version', 'name']); }; - this.getOS = function() { + this.getOS = function(uastring) { - return regxMap(this.ua, [ + return regxMap(uastring || ua, [ // Windows based /(windows\sphone\sos|windows)\s+([\w\.\s]+)*/i, // Windows @@ -164,4 +164,15 @@ function uaparser (uastring) { /(macintosh|unix|minix|beos)[\/\s]?()*/i ], ['name', 'version']); }; -}; \ No newline at end of file + + this.setUA = function (uastring) { + ua = uastring || ua; + return this.result = { + browser : this.getBrowser(), + engine : this.getEngine(), + os : this.getOS() + }; + }; + + this.setUA(ua); +}; From 7cba4e0eca6057ce7ec577e1878f2a484e4a73c9 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Sat, 31 Mar 2012 17:15:50 +0700 Subject: [PATCH 2/9] Fixed readme --- readme.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/readme.md b/readme.md index 5be4403..b435638 100644 --- a/readme.md +++ b/readme.md @@ -4,29 +4,36 @@ JavaScript-based user-agent parser * Author : Faisalman <> * Home : http://faisalman.github.com/ua-parser-js -* Source : http://github.com/faisalman/ua-parser-js +* Source : https://github.com/faisalman/ua-parser-js * License : GPLv2 ## Features Get detailed type and version of web browser, layout engine, and operating system. +## Methods + +* `getBrowser([uastring])` +* `getEngine([uastring])` +* `getOS([uastring])` +* `setUA(uastring)` + ## Example ```html ``` From e7500dca9dc975b46bbdd46d50f10374a13e6637 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Sat, 31 Mar 2012 17:28:39 +0700 Subject: [PATCH 3/9] Tagged as version 0.1.2 --- package.json | 4 ++-- readme.md | 2 +- ua-parser.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1de7c76..96e0cdc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "title" : "UA-Parser.js", "name" : "ua-parser-js", - "version" : "0.1.0", + "version" : "0.1.2", "author" : { "name" : "Faisal Salman", "email" : "fyzlman@gmail.com", @@ -37,4 +37,4 @@ "url" : "http://www.opensource.org/licenses/mit-license.php" } ] -} \ No newline at end of file +} diff --git a/readme.md b/readme.md index b435638..57fa7a6 100644 --- a/readme.md +++ b/readme.md @@ -3,7 +3,7 @@ JavaScript-based user-agent parser * Author : Faisalman <> -* Home : http://faisalman.github.com/ua-parser-js +* Home : http://faisalman.github.com/ua-parser-js * Source : https://github.com/faisalman/ua-parser-js * License : GPLv2 diff --git a/ua-parser.js b/ua-parser.js index b21b047..822ffcb 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -1,4 +1,4 @@ -// UA-Parser.js v0.1.1 +// UA-Parser.js v0.1.2 // Lightweight JavaScript-based user-agent parser // https://github.com/faisalman/ua-parser-js // From 42c16b2fc94409e5a06d16951aa911e78a6dfcd5 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Sun, 1 Apr 2012 22:32:01 +0700 Subject: [PATCH 4/9] Added new parser type: device --- ua-parser.js | 122 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 42 deletions(-) diff --git a/ua-parser.js b/ua-parser.js index 822ffcb..142e85b 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -1,4 +1,4 @@ -// UA-Parser.js v0.1.2 +// UA-Parser.js v0.2.0 // Lightweight JavaScript-based user-agent parser // https://github.com/faisalman/ua-parser-js // @@ -16,7 +16,7 @@ function UAParser (uastring) { for (i = 1; i < arguments.length; i += 2) { var regex = arguments[i]; var props = arguments[i + 1]; - var isMatch = false; + var isMatchFound = false; for (j = 0; j < regex.length; j++) { var match = regex[j].exec(ua); //console.log(match); @@ -28,50 +28,56 @@ function UAParser (uastring) { result[props[k][0]] = props[k][1]; l -= 1; } else if (typeof props[k] === 'object' && props[k].length === 3) { - result[props[k][0]] = (!!match[k + l]) ? match[k + l].replace(props[k][1], props[k][2]) : 'unknown'; + result[props[k][0]] = (!!match[k + l]) ? match[k + l].replace(props[k][1], props[k][2]) : undefined; } else { - result[props[k]] = (!!match[k + l]) ? match[k + l] : 'unknown'; + result[props[k]] = (!!match[k + l]) ? match[k + l] : undefined; } - }; - isMatch = true; + } + isMatchFound = true; break; } - }; - if (!isMatch) { - result = {}; - for (j in props) { - if (props.hasOwnProperty(j)) { - result[props[j]] = 'unknown'; - } - }; - } else { - 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; + } + } return result; }; var mapper = { - win: function (str, match) { - switch (match.toLowerCase()) { - case 'nt 5.0': - return '2000'; - case 'nt 5.1': - case 'nt 5.2': - return 'XP'; - case 'nt 6.0': - return 'Vista'; - case 'nt 6.1': - return '7'; - case 'nt 6.2': - return '8'; - default: - return match; - }; + os : { + win: function (str, match) { + switch (match.toLowerCase()) { + case 'nt 5.0': + return '2000'; + case 'nt 5.1': + case 'nt 5.2': + return 'XP'; + case 'nt 6.0': + return 'Vista'; + case 'nt 6.1': + return '7'; + case 'nt 6.2': + return '8'; + default: + return match; + }; + } } }; - this.getBrowser = function(uastring) { + this.getBrowser = function (uastring) { return regxMap(uastring || ua, [ @@ -92,8 +98,8 @@ function UAParser (uastring) { /(chromium|flock|rockmelt|midori|epiphany)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany /(chrome|omniweb|arora|dolfin)\/((\d+)?[\w\.]+)/i, // Chrome/OmniWeb/Arora/Dolphin ], ['name', 'version', 'major'], [ - /android.+(crmo)\/((\d+)?[\w\.]+)/i, // Chrome for Android - ], [['name', /.+/g, 'Chrome'], 'version', 'major'], [ + /android.+crmo\/((\d+)?[\w\.]+)/i, // Chrome for Android + ], [['name', 'Chrome'], 'version', 'major'], [ /(mobile\ssafari|safari|konqueror)\/((\d+)?[\w\.]+)/i, // Safari/Konqueror /(applewebkit|khtml)\/((\d+)?[\w\.]+)/i, @@ -108,7 +114,7 @@ function UAParser (uastring) { ], ['name', 'version', 'major']); }; - this.getEngine = function(uastring) { + this.getEngine = function (uastring) { return regxMap(uastring || ua, [ @@ -121,13 +127,13 @@ function UAParser (uastring) { ], ['version', 'name']); }; - this.getOS = function(uastring) { + this.getOS = function (uastring) { return regxMap(uastring || ua, [ // Windows based /(windows\sphone\sos|windows)\s+([\w\.\s]+)*/i, // Windows - ], ['name', ['version', /(nt\s[\d\.]+)/gi, mapper.win]], [ + ], ['name', ['version', /(nt\s[\d\.]+)/gi, mapper.os.win]], [ // Mobile/Embedded OS /(blackberry).+version\/([\w\.]+)/i, // Blackberry @@ -164,15 +170,47 @@ function UAParser (uastring) { /(macintosh|unix|minix|beos)[\/\s]?()*/i ], ['name', 'version']); }; - + + this.getDevice = function (uastring) { + + return regxMap(uastring || ua, [ + + /\((ip[honead]+|playbook);/i, // iPod/iPhone/iPad/PlayBook + /(blackberry)[\s-]?(\w+)/i, // BlackBerry + /(blackberry|benq|nokia|palm(?=\-)|sonyericsson)[\s-]?([\w-]+)*/i, // BenQ/Nokia/Palm/Sony-Ericsson + /(hp)\s([\w\s]+)/i, // HP iPAQ + /(hp).+(touchpad)/i, // HP TouchPad + /(kindle)\/([\w\.]+)/i, // Kindle + /(lg)[e;\s-]+(\w+)*/i, // LG + /(nintendo|playstation)\s([wids3portable]+)/i // Nintendo/Playstation + ], ['name', 'version'], [ + + /(htc)[;_\s-]+([\w\s]+(?=\))|[\w]+)*/i, // HTC + /(zte)-([\w]+)*/i + ], ['name', ['version', /_/g, ' ']], [ + + /\s(milestone|mz601|droid[2x]?|xoom)[globa\s]*\sbuild\//i, // Motorola + /mot[\s-]?(\w+)*/i + ], [['name', 'Motorola'], 'version'], [ + + /(s[cgp]h-\w+|gt-\w+|galaxy\snexus)/i, // Samsung + /sam[sung]*[\s-]*(\w+-?[\w-]*)*/i, + /sec-(sgh\w+)/i + ], [['name', 'Samsung'], 'version'], [ + + /sie-(\w+)*/i // Siemens + ], [['name', 'Siemens'], 'version']); + }; + this.setUA = function (uastring) { ua = uastring || ua; return this.result = { browser : this.getBrowser(), engine : this.getEngine(), - os : this.getOS() + os : this.getOS(), + device : this.getDevice() }; }; - + this.setUA(ua); }; From f1065dc4f8d367707dcc6e4327236fd1d2f72c33 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Thu, 19 Jul 2012 05:52:11 +0700 Subject: [PATCH 5/9] Added some devices: Asus, Acer, Dell, Nexus, ZTE --- ua-parser.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ua-parser.js b/ua-parser.js index 142e85b..96aeede 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -177,7 +177,8 @@ function UAParser (uastring) { /\((ip[honead]+|playbook);/i, // iPod/iPhone/iPad/PlayBook /(blackberry)[\s-]?(\w+)/i, // BlackBerry - /(blackberry|benq|nokia|palm(?=\-)|sonyericsson)[\s-]?([\w-]+)*/i, // BenQ/Nokia/Palm/Sony-Ericsson + /(blackberry|benq|nokia|palm(?=\-)|sonyericsson|acer|asus|dell|nexus|zte)[\s_-]?([\w-]+)*/i, + // BenQ/Nokia/Palm/Sony-Ericsson/Acer/Asus/Dell/Nexus/ZTE /(hp)\s([\w\s]+)/i, // HP iPAQ /(hp).+(touchpad)/i, // HP TouchPad /(kindle)\/([\w\.]+)/i, // Kindle @@ -197,6 +198,9 @@ function UAParser (uastring) { /sam[sung]*[\s-]*(\w+-?[\w-]*)*/i, /sec-(sgh\w+)/i ], [['name', 'Samsung'], 'version'], [ + + /(transfo[prime\s]{4,10}\s\w+|(?:android).*eeepc)/i // Asus + ], [['name', 'Asus'], 'version'], [ /sie-(\w+)*/i // Siemens ], [['name', 'Siemens'], 'version']); From 5e4d686e3eabe8fc6b3ef644f8560498316d9883 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Thu, 19 Jul 2012 22:45:55 +0700 Subject: [PATCH 6/9] Tag v0.2.1 --- package.json | 2 +- readme.md | 11 ++++++++--- ua-parser.js | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 96e0cdc..1475e71 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "title" : "UA-Parser.js", "name" : "ua-parser-js", - "version" : "0.1.2", + "version" : "0.2.1", "author" : { "name" : "Faisal Salman", "email" : "fyzlman@gmail.com", diff --git a/readme.md b/readme.md index 57fa7a6..5df835f 100644 --- a/readme.md +++ b/readme.md @@ -2,10 +2,10 @@ JavaScript-based user-agent parser -* Author : Faisalman <> +* Author : Faisalman <> * Home : http://faisalman.github.com/ua-parser-js -* Source : https://github.com/faisalman/ua-parser-js -* License : GPLv2 +* Source : https://github.com/faisalman/ua-parser-js +* License : GPLv2 ## Features @@ -14,6 +14,7 @@ Get detailed type and version of web browser, layout engine, and operating syste ## Methods * `getBrowser([uastring])` +* `getDevice([uastring])` * `getEngine([uastring])` * `getOS([uastring])` * `setUA(uastring)` @@ -35,6 +36,10 @@ Get detailed type and version of web browser, layout engine, and operating syste version: "", major: "" }, + device: { + name: "", + version: "" + }, engine: { name: "", version: "" diff --git a/ua-parser.js b/ua-parser.js index 96aeede..1963f5e 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -1,4 +1,4 @@ -// UA-Parser.js v0.2.0 +// UA-Parser.js v0.2.1 // Lightweight JavaScript-based user-agent parser // https://github.com/faisalman/ua-parser-js // From faefb6fbb7ad6b250d8cb841885a3497009fd957 Mon Sep 17 00:00:00 2001 From: Faisalman Date: Thu, 19 Jul 2012 23:14:41 +0700 Subject: [PATCH 7/9] Added new browser: Chrome for iOS --- ua-parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ua-parser.js b/ua-parser.js index 1963f5e..1a59825 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -98,7 +98,7 @@ function UAParser (uastring) { /(chromium|flock|rockmelt|midori|epiphany)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany /(chrome|omniweb|arora|dolfin)\/((\d+)?[\w\.]+)/i, // Chrome/OmniWeb/Arora/Dolphin ], ['name', 'version', 'major'], [ - /android.+crmo\/((\d+)?[\w\.]+)/i, // Chrome for Android + /(?:android.+crmo|crios)\/((\d+)?[\w\.]+)/i, // Chrome for Android/iOS ], [['name', 'Chrome'], 'version', 'major'], [ /(mobile\ssafari|safari|konqueror)\/((\d+)?[\w\.]+)/i, // Safari/Konqueror /(applewebkit|khtml)\/((\d+)?[\w\.]+)/i, From 8cb5b173fe8e03c224c4ea166ad04ef652adb99e Mon Sep 17 00:00:00 2001 From: Faisalman Date: Sat, 28 Jul 2012 17:28:43 +0700 Subject: [PATCH 8/9] Adapt js to be compatible with Node.js as module --- package.json | 7 +- readme.md | 44 ++++-- ua-parser.js | 419 ++++++++++++++++++++++++++------------------------- 3 files changed, 257 insertions(+), 213 deletions(-) diff --git a/package.json b/package.json index 96e0cdc..b676e7b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "title" : "UA-Parser.js", "name" : "ua-parser-js", - "version" : "0.1.2", + "version" : "0.3.0", "author" : { "name" : "Faisal Salman", "email" : "fyzlman@gmail.com", @@ -11,7 +11,10 @@ "keywords" : [ "user-agent", "parser", - "browser" + "browser", + "engine", + "os", + "device" ], "homepage" : "http://faisalman.github.com/ua-parser-js", "contributors": [ diff --git a/readme.md b/readme.md index 57fa7a6..b2c4b6a 100644 --- a/readme.md +++ b/readme.md @@ -5,28 +5,32 @@ JavaScript-based user-agent parser * Author : Faisalman <> * Home : http://faisalman.github.com/ua-parser-js * Source : https://github.com/faisalman/ua-parser-js -* License : GPLv2 +* License : GPLv2 & MIT ## Features -Get detailed type and version of web browser, layout engine, and operating system. +Get detailed type and version of web browser, layout engine, operating system, and device. ## Methods * `getBrowser([uastring])` * `getEngine([uastring])` * `getOS([uastring])` +* `getDevice([uastring])` * `setUA(uastring)` +## Properties + +* `result` + ## Example ```html ``` +## Using node.js + +```js +var parser = require('ua-parser'); + +var ua1 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11'; +var ua2 = 'Midori/0.2 (X11; Linux; U; cs-cz) WebKit/531.2+'; + +parser.setUA(ua1).getDevice().name; // prints "PlayBook" +parser.getOS() // prints {name: "RIM Tablet OS", version: "1.0.0"} +parser.getOS(ua2) // prints {name: "Linux", version: undefined} +parser.getOS() // prints {name: "RIM Tablet OS", version: "1.0.0"} +parser.getEngine().name; // prints "AppleWebKit" +``` + ## License Copyright © 2012 Faisalman <> diff --git a/ua-parser.js b/ua-parser.js index 142e85b..5680caf 100644 --- a/ua-parser.js +++ b/ua-parser.js @@ -1,216 +1,231 @@ -// UA-Parser.js v0.2.0 +// UA-Parser.js v0.3.0 // Lightweight JavaScript-based user-agent parser // https://github.com/faisalman/ua-parser-js // // Copyright © 2012 Faisalman -// Licensed under GPLv2 +// Licensed under GPLv2 & MIT -function UAParser (uastring) { +(function () { + function UAParser (uastring) { - var ua = uastring || window.navigator.userAgent; + var ua = uastring || typeof window !== 'undefined' ? window.navigator.userAgent : ""; - // regexp mapper - var regxMap = function (ua) { - var result; - var i, j, k, l; - for (i = 1; i < arguments.length; i += 2) { - var regex = arguments[i]; - var props = arguments[i + 1]; - var isMatchFound = false; - for (j = 0; j < regex.length; j++) { - var match = regex[j].exec(ua); - //console.log(match); - if (!!match) { + // regexp mapper + var regxMap = function (ua) { + var result; + var i, j, k, l; + for (i = 1; i < arguments.length; i += 2) { + var regex = arguments[i]; + var props = arguments[i + 1]; + var isMatchFound = false; + 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) { + result[props[k][0]] = props[k][1]; + l -= 1; + } else if (typeof props[k] === 'object' && props[k].length === 3) { + result[props[k][0]] = (!!match[k + l]) ? match[k + l].replace(props[k][1], props[k][2]) : undefined; + } else { + result[props[k]] = (!!match[k + l]) ? match[k + l] : undefined; + } + } + isMatchFound = true; + break; + } + } + if (!isMatchFound) { result = {}; - l = 1; - for (k = 0; k < props.length; k++) { - if (typeof props[k] === 'object' && props[k].length === 2) { - result[props[k][0]] = props[k][1]; - l -= 1; - } else if (typeof props[k] === 'object' && props[k].length === 3) { - result[props[k][0]] = (!!match[k + l]) ? match[k + l].replace(props[k][1], props[k][2]) : undefined; - } else { - result[props[k]] = (!!match[k + l]) ? match[k + l] : undefined; + for (k in props) { + if (props.hasOwnProperty(k)) { + if (typeof props[k] == 'object') { + result[props[k][0]] = undefined; + } else { + result[props[k]] = undefined; + } } } - isMatchFound = true; - break; + } else { + return result; } } - 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; - } - } - return result; - }; - - var mapper = { - os : { - win: function (str, match) { - switch (match.toLowerCase()) { - case 'nt 5.0': - return '2000'; - case 'nt 5.1': - case 'nt 5.2': - return 'XP'; - case 'nt 6.0': - return 'Vista'; - case 'nt 6.1': - return '7'; - case 'nt 6.2': - return '8'; - default: - return match; - }; - } - } - }; - - this.getBrowser = function (uastring) { - - return regxMap(uastring || ua, [ - - // Mixed - /(kindle)\/((\d+)?[\w\.]+)/i, // Kindle - /(lunascape|maxthon|netfront|jasmine)[\/\s]?((\d+)?[\w\.]+)/i, // Lunascape/Maxthon/Netfront/Jasmine - - // Presto based - /(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini - /(opera\smobi)\/((\d+)?[\w\.-]+)/i, // Opera Mobile - /(opera).*\/((\d+)?[\w\.]+)/i, // Opera - - // Trident based - /(avant\sbrowser|iemobile|slimbrowser)[\/\s]?((\d+)?[\w\.]*)/i, // Avant/IEMobile/SlimBrowser - /ms(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer - - // Webkit/KHTML based - /(chromium|flock|rockmelt|midori|epiphany)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany - /(chrome|omniweb|arora|dolfin)\/((\d+)?[\w\.]+)/i, // Chrome/OmniWeb/Arora/Dolphin - ], ['name', 'version', 'major'], [ - /android.+crmo\/((\d+)?[\w\.]+)/i, // Chrome for Android - ], [['name', 'Chrome'], 'version', 'major'], [ - /(mobile\ssafari|safari|konqueror)\/((\d+)?[\w\.]+)/i, // Safari/Konqueror - /(applewebkit|khtml)\/((\d+)?[\w\.]+)/i, - - // Gecko based - /(iceweasel|camino|fennec|maemo|minimo)[\/\s]?((\d+)?[\w\.\+]+)/i, // Iceweasel/Camino/Fennec/Maemo/Minimo - /(firefox|seamonkey|netscape|navigator|k-meleon|icecat|iceape)\/((\d+)?[\w\.]+)/i, - // Firefox/SeaMonkey/Netscape/K-Meleon/IceCat/IceApe - /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla - - // Other - /(lynx|dillo|icab)[\/\s]?((\d+)?[\w\.]+)/i, // Lynx/Dillo/iCab - ], ['name', 'version', 'major']); - }; - - this.getEngine = function (uastring) { - - return regxMap(uastring || ua, [ - - /(presto)\/([\w\.]+)/i, // Presto - /([aple]*webkit|trident)\/([\w\.]+)/i, // Webkit/Trident - /(khtml)\/([\w\.]+)/i // KHTML - ], ['name', 'version'], [ - - /rv\:([\w\.]+).*(gecko)/i // Gecko - ], ['version', 'name']); - }; - - this.getOS = function (uastring) { - - return regxMap(uastring || ua, [ - - // Windows based - /(windows\sphone\sos|windows)\s+([\w\.\s]+)*/i, // Windows - ], ['name', ['version', /(nt\s[\d\.]+)/gi, mapper.os.win]], [ - - // Mobile/Embedded OS - /(blackberry).+version\/([\w\.]+)/i, // Blackberry - /(android|symbianos|symbos|webos|palm\os|qnx|bada|rim\stablet\sos)[\/\s-]?([\w\.]+)*/i, - // Android/Symbian/WebOS/Palm/QNX/Bada/RIM - /(nintendo|playstation)\s([wids3portable]+)/i, // Nintendo/Playstation - - // GNU/Linux based - /(mint)[\/\s\(]?(\w+)*/i, // Mint - /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i, - // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware - // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk - /(gnu|linux)\s?([\w\.]+)*/i // Other GNU/Linux - ], ['name', 'version'], [ - - /cros\s([\w\.\s]+)/i // Chromium OS - ], [['name', 'Chromium OS'], 'version'],[ - - // Solaris - /sunos\s?([\w\.\s]+)*/i // Solaris - ], [['name', 'Solaris'], 'version'], [ - - // BSD based - /\s(\w*bsd|dragonfly)\s?([\w\.]+)*/i, // FreeBSD/NetBSD/OpenBSD/DragonFly - ], ['name', 'version'],[ - - /(ip[honead]+).*os\s*([\w]+)*\slike\smac/i // iOS - ], [['name', /.+/g, 'iOS'], ['version', /_/g, '.']], [ - - /(mac\sos)\sx\s([\w\s\.]+)/i, // Mac OS - ], ['name', ['version', /_/g, '.']], [ - - // Other - /(macintosh|unix|minix|beos)[\/\s]?()*/i - ], ['name', 'version']); - }; - - this.getDevice = function (uastring) { - - return regxMap(uastring || ua, [ - - /\((ip[honead]+|playbook);/i, // iPod/iPhone/iPad/PlayBook - /(blackberry)[\s-]?(\w+)/i, // BlackBerry - /(blackberry|benq|nokia|palm(?=\-)|sonyericsson)[\s-]?([\w-]+)*/i, // BenQ/Nokia/Palm/Sony-Ericsson - /(hp)\s([\w\s]+)/i, // HP iPAQ - /(hp).+(touchpad)/i, // HP TouchPad - /(kindle)\/([\w\.]+)/i, // Kindle - /(lg)[e;\s-]+(\w+)*/i, // LG - /(nintendo|playstation)\s([wids3portable]+)/i // Nintendo/Playstation - ], ['name', 'version'], [ - - /(htc)[;_\s-]+([\w\s]+(?=\))|[\w]+)*/i, // HTC - /(zte)-([\w]+)*/i - ], ['name', ['version', /_/g, ' ']], [ - - /\s(milestone|mz601|droid[2x]?|xoom)[globa\s]*\sbuild\//i, // Motorola - /mot[\s-]?(\w+)*/i - ], [['name', 'Motorola'], 'version'], [ - - /(s[cgp]h-\w+|gt-\w+|galaxy\snexus)/i, // Samsung - /sam[sung]*[\s-]*(\w+-?[\w-]*)*/i, - /sec-(sgh\w+)/i - ], [['name', 'Samsung'], 'version'], [ - - /sie-(\w+)*/i // Siemens - ], [['name', 'Siemens'], 'version']); - }; - - this.setUA = function (uastring) { - ua = uastring || ua; - return this.result = { - browser : this.getBrowser(), - engine : this.getEngine(), - os : this.getOS(), - device : this.getDevice() + return result; }; - }; - this.setUA(ua); -}; + var mapper = { + os : { + win: function (str, match) { + switch (match.toLowerCase()) { + case 'nt 5.0': + return '2000'; + case 'nt 5.1': + case 'nt 5.2': + return 'XP'; + case 'nt 6.0': + return 'Vista'; + case 'nt 6.1': + return '7'; + case 'nt 6.2': + return '8'; + default: + return match; + }; + } + } + }; + + this.getBrowser = function (uastring) { + + return regxMap(uastring || ua, [ + + // Mixed + /(kindle)\/((\d+)?[\w\.]+)/i, // Kindle + /(lunascape|maxthon|netfront|jasmine)[\/\s]?((\d+)?[\w\.]+)/i, // Lunascape/Maxthon/Netfront/Jasmine + + // Presto based + /(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini + /(opera\smobi)\/((\d+)?[\w\.-]+)/i, // Opera Mobile + /(opera).*\/((\d+)?[\w\.]+)/i, // Opera + + // Trident based + /(avant\sbrowser|iemobile|slimbrowser)[\/\s]?((\d+)?[\w\.]*)/i, // Avant/IEMobile/SlimBrowser + /ms(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer + + // Webkit/KHTML based + /(chromium|flock|rockmelt|midori|epiphany)\/((\d+)?[\w\.]+)/i, // Chromium/Flock/RockMelt/Midori/Epiphany + /(chrome|omniweb|arora|dolfin)\/((\d+)?[\w\.]+)/i, // Chrome/OmniWeb/Arora/Dolphin + ], ['name', 'version', 'major'], [ + /android.+crmo\/((\d+)?[\w\.]+)/i, // Chrome for Android + ], [['name', 'Chrome'], 'version', 'major'], [ + /(mobile\ssafari|safari|konqueror)\/((\d+)?[\w\.]+)/i, // Safari/Konqueror + /(applewebkit|khtml)\/((\d+)?[\w\.]+)/i, + + // Gecko based + /(iceweasel|camino|fennec|maemo|minimo)[\/\s]?((\d+)?[\w\.\+]+)/i, // Iceweasel/Camino/Fennec/Maemo/Minimo + /(firefox|seamonkey|netscape|navigator|k-meleon|icecat|iceape)\/((\d+)?[\w\.]+)/i, + // Firefox/SeaMonkey/Netscape/K-Meleon/IceCat/IceApe + /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla + + // Other + /(lynx|dillo|icab)[\/\s]?((\d+)?[\w\.]+)/i, // Lynx/Dillo/iCab + ], ['name', 'version', 'major']); + }; + + this.getEngine = function (uastring) { + + return regxMap(uastring || ua, [ + + /(presto)\/([\w\.]+)/i, // Presto + /([aple]*webkit|trident)\/([\w\.]+)/i, // Webkit/Trident + /(khtml)\/([\w\.]+)/i // KHTML + ], ['name', 'version'], [ + + /rv\:([\w\.]+).*(gecko)/i // Gecko + ], ['version', 'name']); + }; + + this.getOS = function (uastring) { + + return regxMap(uastring || ua, [ + + // Windows based + /(windows\sphone\sos|windows)\s+([\w\.\s]+)*/i, // Windows + ], ['name', ['version', /(nt\s[\d\.]+)/gi, mapper.os.win]], [ + + // Mobile/Embedded OS + /(blackberry).+version\/([\w\.]+)/i, // Blackberry + /(android|symbianos|symbos|webos|palm\os|qnx|bada|rim\stablet\sos)[\/\s-]?([\w\.]+)*/i, + // Android/Symbian/WebOS/Palm/QNX/Bada/RIM + /(nintendo|playstation)\s([wids3portable]+)/i, // Nintendo/Playstation + + // GNU/Linux based + /(mint)[\/\s\(]?(\w+)*/i, // Mint + /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i, + // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware + // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk + /(gnu|linux)\s?([\w\.]+)*/i // Other GNU/Linux + ], ['name', 'version'], [ + + /cros\s([\w\.\s]+)/i // Chromium OS + ], [['name', 'Chromium OS'], 'version'],[ + + // Solaris + /sunos\s?([\w\.\s]+)*/i // Solaris + ], [['name', 'Solaris'], 'version'], [ + + // BSD based + /\s(\w*bsd|dragonfly)\s?([\w\.]+)*/i, // FreeBSD/NetBSD/OpenBSD/DragonFly + ], ['name', 'version'],[ + + /(ip[honead]+).*os\s*([\w]+)*\slike\smac/i // iOS + ], [['name', /.+/g, 'iOS'], ['version', /_/g, '.']], [ + + /(mac\sos)\sx\s([\w\s\.]+)/i, // Mac OS + ], ['name', ['version', /_/g, '.']], [ + + // Other + /(macintosh|unix|minix|beos)[\/\s]?()*/i + ], ['name', 'version']); + }; + + this.getDevice = function (uastring) { + + return regxMap(uastring || ua, [ + + /\((ip[honead]+|playbook);/i, // iPod/iPhone/iPad/PlayBook + /(blackberry)[\s-]?(\w+)/i, // BlackBerry + /(blackberry|benq|nokia|palm(?=\-)|sonyericsson)[\s-]?([\w-]+)*/i, // BenQ/Nokia/Palm/Sony-Ericsson + /(hp)\s([\w\s]+)/i, // HP iPAQ + /(hp).+(touchpad)/i, // HP TouchPad + /(kindle)\/([\w\.]+)/i, // Kindle + /(lg)[e;\s-]+(\w+)*/i, // LG + /(nintendo|playstation)\s([wids3portable]+)/i // Nintendo/Playstation + ], ['name', 'version'], [ + + /(htc)[;_\s-]+([\w\s]+(?=\))|[\w]+)*/i, // HTC + /(zte)-([\w]+)*/i + ], ['name', ['version', /_/g, ' ']], [ + + /\s(milestone|mz601|droid[2x]?|xoom)[globa\s]*\sbuild\//i, // Motorola + /mot[\s-]?(\w+)*/i + ], [['name', 'Motorola'], 'version'], [ + + /(s[cgp]h-\w+|gt-\w+|galaxy\snexus)/i, // Samsung + /sam[sung]*[\s-]*(\w+-?[\w-]*)*/i, + /sec-(sgh\w+)/i + ], [['name', 'Samsung'], 'version'], [ + + /sie-(\w+)*/i // Siemens + ], [['name', 'Siemens'], 'version']); + }; + + this.setUA = function (uastring) { + ua = uastring || ua; + this.result = { + browser : this.getBrowser(), + engine : this.getEngine(), + os : this.getOS(), + device : this.getDevice() + }; + return this; + }; + + this.setUA(ua); + }; + + var parser = new UAParser(); + + // check whether script is running inside node.js export as module + if (typeof exports !== 'undefined' && this.toString() !== '[object DOMWindow]') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = parser; + } + exports.UAParser = parser; + } else { + this['UAParser'] = parser; + } +})(); From 9bc93dc0589be0dd09daa18d384f68d35e477f7e Mon Sep 17 00:00:00 2001 From: Faisalman Date: Sun, 29 Jul 2012 02:25:52 +0700 Subject: [PATCH 9/9] Remove duplicated --- readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/readme.md b/readme.md index be54f75..35f9d44 100644 --- a/readme.md +++ b/readme.md @@ -17,7 +17,6 @@ Get detailed type and version of web browser, layout engine, operating system, a * `getDevice([uastring])` * `getEngine([uastring])` * `getOS([uastring])` -* `getDevice([uastring])` * `setUA(uastring)` ## Properties