|
@@ -1,102 +1,97 @@
|
|
|
/* User-Agent parser
|
|
|
* @author Gerald <gera2ld@163.com>
|
|
|
*/
|
|
|
-function getRule(str,rules){
|
|
|
- var res=null,cls=null;
|
|
|
- rules.some(function(rule){
|
|
|
- return rule[1].some(function(r){
|
|
|
- var m;
|
|
|
- if(r[0].slice) r[0].some(function(r){
|
|
|
- m=str.match(r);
|
|
|
- return !!m;
|
|
|
- }); else m=str.match(r[0]);
|
|
|
- if(m) {
|
|
|
- if(r[1]) res=r[1](m);
|
|
|
- else res=m[0];
|
|
|
- cls=rule[0];
|
|
|
- return true;
|
|
|
- } else return false;
|
|
|
- });
|
|
|
+var mapper={
|
|
|
+ reg:function(s,maps){
|
|
|
+ return s.replace(maps[0],maps[1]);
|
|
|
+ },
|
|
|
+ str:function(s,maps){
|
|
|
+ return (s in maps)?maps[s]:maps[''];
|
|
|
+ },
|
|
|
+ ieVer:function(s){
|
|
|
+ return parseInt(s)+4;
|
|
|
+ },
|
|
|
+};
|
|
|
+var maps={
|
|
|
+ winVer:{
|
|
|
+ '4.90':'ME',
|
|
|
+ 'NT3.51':'NT 3.11',
|
|
|
+ 'NT4.0':'NT 4.0',
|
|
|
+ 'NT 5.0':'2000',
|
|
|
+ 'NT 5.1':'XP',
|
|
|
+ 'NT 5.2':'XP',
|
|
|
+ 'NT 6.0':'Vista',
|
|
|
+ 'NT 6.1':'7',
|
|
|
+ 'NT 6.2':'8',
|
|
|
+ 'NT 6.3':'8.1',
|
|
|
+ 'NT 6.4':'10',
|
|
|
+ 'ARM':'RT',
|
|
|
+ '':'山寨版',
|
|
|
+ },
|
|
|
+};
|
|
|
+var NAME='name',VERSION='version',CLASS='cls';
|
|
|
+var CLS_WIN=[CLASS,'windows'];
|
|
|
+var rules={
|
|
|
+ os:[
|
|
|
+ // Windows
|
|
|
+ [/(Windows Phone)(?: OS)? ?([^; )]*)/i,[NAME,VERSION,CLS_WIN]],
|
|
|
+ [/(Windows) ([^;)]*)/i,[NAME,[VERSION,mapper.str,maps.winVer],CLS_WIN]],
|
|
|
+ [/\b(Windows)\b/i,[NAME,[VERSION,'超级山寨版'],CLS_WIN]],
|
|
|
+ // Mac
|
|
|
+ [/(iPhone|iPod|iPad|Mac OS X)/i,[NAME,[CLASS,'mac']]],
|
|
|
+ // Android
|
|
|
+ [/(Android) ?([^; )]*)/i,[NAME,VERSION,[CLASS,'android']]],
|
|
|
+ // Linux
|
|
|
+ [/(Linux)/i,[NAME,[CLASS,'linux']]],
|
|
|
+ [/()/i,[[NAME,'山寨操作系统'],[CLASS,'other']]],
|
|
|
+ ],
|
|
|
+ browser:[
|
|
|
+ // Opera
|
|
|
+ [/(Opera Mini)\/(\d+)/i,[NAME,VERSION]],
|
|
|
+ [[/(OPR)\/(\S+)/i,/(Presto)\/.*?Version\/(\S+)/i],[[NAME,'Opera'],VERSION]],
|
|
|
+ [[
|
|
|
+ // Maxthon
|
|
|
+ /(Maxthon)\/(\S+)/i,
|
|
|
+ // Vivaldi
|
|
|
+ /(Vivaldi)\/(\S+)/i,
|
|
|
+ // Chrome
|
|
|
+ /(Chrome)\/(\S+)/i,
|
|
|
+ ],[NAME,VERSION]],
|
|
|
+ // UC/QQ
|
|
|
+ [/(UC|QQ)Browser\/(\S+)/i,[[NAME,mapper.reg,[/$/,'浏览器']],VERSION]],
|
|
|
+ // Safari
|
|
|
+ [/Version\/(\S+) .*?(Safari)\//i,[VERSION,NAME]],
|
|
|
+ // Firefox
|
|
|
+ [/(Firefox)\/(\S+)/i,[NAME,VERSION]],
|
|
|
+ // IE
|
|
|
+ [/MS(IE) (\d+)\.0/i,[[NAME,'Internet Explorer'],VERSION]],
|
|
|
+ [/(Trident)\/(\d+)\.0/i,[[NAME,'Internet Explorer'],[VERSION,mapper.ieVer]]],
|
|
|
+ [/()/i,[[NAME,'山寨浏览器']]],
|
|
|
+ ],
|
|
|
+};
|
|
|
+function getResult(matches,keys){
|
|
|
+ var r={};
|
|
|
+ keys.forEach(function(k,i){
|
|
|
+ var m=matches[i+1];
|
|
|
+ if(Array.isArray(k)){
|
|
|
+ if(typeof k[1]=='function') r[k[0]]=k[1](m,k[2]);
|
|
|
+ else r[k[0]]=k[1];
|
|
|
+ } else r[k]=m;
|
|
|
});
|
|
|
- return [res,cls];
|
|
|
-}
|
|
|
-function getBrower(m){
|
|
|
- return m[0].replace('/',' ');
|
|
|
+ return r;
|
|
|
}
|
|
|
function parseAgent(a){
|
|
|
- var rules_os=[
|
|
|
- ['windows',[
|
|
|
- [/Windows Phone(?: OS)? ?([^; )]*)/i],
|
|
|
- [/Windows ([^;)]*)/i,function(m){
|
|
|
- var ver={
|
|
|
- '4.90':'ME',
|
|
|
- 'NT3.51':'NT 3.11',
|
|
|
- 'NT4.0':'NT 4.0',
|
|
|
- 'NT 5.0':'2000',
|
|
|
- 'NT 5.1':'XP',
|
|
|
- 'NT 5.2':'XP',
|
|
|
- 'NT 6.0':'Vista',
|
|
|
- 'NT 6.1':'7',
|
|
|
- 'NT 6.2':'8',
|
|
|
- 'NT 6.3':'8.1',
|
|
|
- 'NT 6.4':'10',
|
|
|
- 'ARM':'RT',
|
|
|
- }[m[1]];
|
|
|
- return 'Windows'+(ver?' '+ver:'山寨版');
|
|
|
- }],
|
|
|
- [/\bWindows\b/i,function(m){
|
|
|
- return m[0]+'超级山寨版';
|
|
|
- }],
|
|
|
- ]],
|
|
|
- ['mac',[
|
|
|
- [/iPhone|iPod|iPad/i],
|
|
|
- [/Mac OS X/i],
|
|
|
- ]],
|
|
|
- ['android',[
|
|
|
- [/Android ?([^; )]*)/i],
|
|
|
- ]],
|
|
|
- ['linux',[
|
|
|
- [/Linux/i],
|
|
|
- ]],
|
|
|
- ],rules_br=[
|
|
|
- ['opera',[
|
|
|
- [/Opera Mini\/\d+/i,getBrower],
|
|
|
- [[/OPR\/(\S+)/i,/Presto\/.*?Version\/(\S+)/i],function(m){
|
|
|
- return 'Opera '+m[1];
|
|
|
- }],
|
|
|
- ]],
|
|
|
- ['maxthon',[
|
|
|
- [/Maxthon\/(\S+)/i,getBrower],
|
|
|
- ]],
|
|
|
- ['vivaldi',[
|
|
|
- [/Vivaldi\/(\S+)/i,getBrower],
|
|
|
- ]],
|
|
|
- ['chrome',[
|
|
|
- [/Chrome\/(\S+)/i,getBrower],
|
|
|
- ]],
|
|
|
- ['uc',[
|
|
|
- [/UCBrowser\/(\S+)/i,function(m){
|
|
|
- return 'UC '+m[1];
|
|
|
- }],
|
|
|
- ]],
|
|
|
- ['safari',[
|
|
|
- [/Version\/(\S+) .*?Safari\//i,function(m){
|
|
|
- return 'Safari '+m[1];
|
|
|
- }],
|
|
|
- ]],
|
|
|
- ['firefox',[
|
|
|
- [/Firefox\/(\S+)/i,getBrower],
|
|
|
- ]],
|
|
|
- ['ie',[
|
|
|
- [/MSIE (\d+)\.0/i,function(m){
|
|
|
- return 'Internet Explorer '+m[1];
|
|
|
- }],
|
|
|
- [/Trident\/(\d+)\.0/i,function(m){
|
|
|
- return 'Internet Explorer '+(parseInt(m[1])+4);
|
|
|
- }],
|
|
|
- ]],
|
|
|
- ],result={os:'山寨系统',os_cls:'other',br:'山寨浏览器',br_cls:'other'},r;
|
|
|
- r=getRule(a,rules_os);if(r[0]) {result.os=r[0];result.os_cls=r[1];}
|
|
|
- r=getRule(a,rules_br);if(r[0]) {result.br=r[0];result.br_cls=r[1];}
|
|
|
+ var k,v,result={};
|
|
|
+ for(k in rules) {
|
|
|
+ v=rules[k];
|
|
|
+ v.some(function(rule){
|
|
|
+ var reg=rule[0],keys=rule[1],m=null;
|
|
|
+ if(Array.isArray(reg)) reg.some(function(reg){
|
|
|
+ return m=a.match(reg);
|
|
|
+ }); else m=a.match(reg);
|
|
|
+ if(m) result[k]=getResult(m,keys);
|
|
|
+ return m;
|
|
|
+ });
|
|
|
+ }
|
|
|
return result;
|
|
|
}
|