12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /* User-Agent parser
- * @author Gerald <gera2ld@163.com>
- */
- 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 r;
- }
- function parseAgent(a){
- 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;
- }
|