You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
7.8 KiB
216 lines
7.8 KiB
7 years ago
|
// uaparser by lindsey simon,
|
||
|
// ported to node by tobie
|
||
|
// https://github.com/tobie/ua-parser/
|
||
|
|
||
|
// browserized by paul irish
|
||
|
|
||
|
(function(exports){
|
||
|
|
||
|
exports.uaparse = parse;
|
||
|
|
||
|
function parse(ua) {
|
||
|
for (var i=0; i < parsers.length; i++) {
|
||
|
var result = parsers[i](ua);
|
||
|
if (result) { return result; }
|
||
|
}
|
||
|
return new UserAgent();
|
||
|
}
|
||
|
|
||
|
function UserAgent(family) {
|
||
|
this.family = family || 'Other';
|
||
|
}
|
||
|
|
||
|
UserAgent.prototype.toVersionString = function() {
|
||
|
var output = '';
|
||
|
if (this.major != null) {
|
||
|
output += this.major;
|
||
|
if (this.minor != null) {
|
||
|
output += '.' + this.minor;
|
||
|
if (this.patch != null) {
|
||
|
output += '.' + this.patch;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
|
||
|
UserAgent.prototype.toString = function() {
|
||
|
var suffix = this.toVersionString();
|
||
|
if (suffix) { suffix = ' ' + suffix; }
|
||
|
return this.family + suffix;
|
||
|
};
|
||
|
|
||
|
|
||
|
var regexes = [
|
||
|
{"pattern":"^(Opera)/(\\d+)\\.(\\d+) \\(Nintendo Wii",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Wii"},
|
||
|
{"pattern":"(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Firefox ($1)"},
|
||
|
{"pattern":"(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Firefox ($1)"},
|
||
|
{"pattern":"(SeaMonkey|Fennec|Camino)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Flock)/(\\d+)\\.(\\d+)(b\\d+?)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Fennec)/(\\d+)\\.(\\d+)(pre)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Netscape"},
|
||
|
{"pattern":"(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Netscape"},
|
||
|
{"pattern":"(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Netscape"},
|
||
|
{"pattern":"(MyIBrow)/(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"My Internet Browser"},
|
||
|
{"pattern":"(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"MicroB"},
|
||
|
{"pattern":"(Opera)/9.80.*Version\\/(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Swiftfox"},
|
||
|
{"pattern":"(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Swiftfox"},
|
||
|
{"pattern":"(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Konqueror"},
|
||
|
{"pattern":"(Jasmine|ANTGalio|Midori|Fresco|Lobo|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Vodafone|NetFront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|Iron|Iris)/(\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Bolt|Jasmine|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Iron|Space Bison|Stainless|Orca)/(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(iCab|Lunascape|Opera|Android) (\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(IEMobile) (\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"IE Mobile"},
|
||
|
{"pattern":"(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Obigo"},
|
||
|
{"pattern":"(MAXTHON|Maxthon) (\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Maxthon"},
|
||
|
{"pattern":"(Maxthon|MyIE2|Uzbl|Shiira)",
|
||
|
"v1_replacement":"0",
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(PLAYSTATION) (\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"PlayStation"},
|
||
|
{"pattern":"(PlayStation Portable)[^\\d]+(\\d+).(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Opera)/(\\d+)\\.(\\d+).*Opera Mobi",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Opera Mobile"},
|
||
|
{"pattern":"(POLARIS)/(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Polaris"},
|
||
|
{"pattern":"(BonEcho)/(\\d+)\\.(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Bon Echo"},
|
||
|
{"pattern":"(iPhone) OS (\\d+)_(\\d+)(?:_(\\d+))?",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Avant)",
|
||
|
"v1_replacement":"1",
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Nokia)[EN]?(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Black[bB]erry)(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Blackberry"},
|
||
|
{"pattern":"(OmniWeb)/v(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Blazer)/(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Palm Blazer"},
|
||
|
{"pattern":"(Pre)/(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Palm Pre"},
|
||
|
{"pattern":"(Links) \\((\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(QtWeb) Internet Browser/(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Safari"},
|
||
|
{"pattern":"(OLPC)/Update(\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(OLPC)/Update()\\.(\\d+)",
|
||
|
"v1_replacement":"0",
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(SamsungSGHi560)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Samsung SGHi560"},
|
||
|
{"pattern":"^(SonyEricssonK800i)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"Sony Ericsson K800i"},
|
||
|
{"pattern":"(Teleca Q7)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":null},
|
||
|
{"pattern":"(MSIE) (\\d+)\\.(\\d+)",
|
||
|
"v1_replacement":null,
|
||
|
"family_replacement":"IE"}
|
||
|
|
||
|
];
|
||
|
|
||
|
var parsers = regexes.map(function(obj) {
|
||
|
var regexp = new RegExp(obj.pattern),
|
||
|
famRep = obj.family_replacement,
|
||
|
v1Rep = obj.v1_replacement;
|
||
|
|
||
|
function parser(ua) {
|
||
|
var m = ua.match(regexp);
|
||
|
|
||
|
if (!m) { return null; }
|
||
|
|
||
|
var familly = famRep ? famRep.replace('$1', m[1]) : m[1];
|
||
|
|
||
|
var obj = new UserAgent(familly);
|
||
|
obj.major = parseInt(v1Rep ? v1Rep : m[2]);
|
||
|
obj.minor = m[3] ? parseInt(m[3]) : null;
|
||
|
obj.patch = m[4] ? parseInt(m[4]) : null;
|
||
|
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
return parser;
|
||
|
});
|
||
|
|
||
|
|
||
|
})(window);
|
||
|
|
||
|
|