ua-parser.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* User-Agent parser
  2. * @author Gerald <gera2ld@163.com>
  3. */
  4. var mapper={
  5. reg:function(s,maps){
  6. return s.replace(maps[0],maps[1]);
  7. },
  8. str:function(s,maps){
  9. return (s in maps)?maps[s]:maps[''];
  10. },
  11. ieVer:function(s){
  12. return parseInt(s)+4;
  13. },
  14. };
  15. var maps={
  16. winVer:{
  17. '4.90':'ME',
  18. 'NT3.51':'NT 3.11',
  19. 'NT4.0':'NT 4.0',
  20. 'NT 5.0':'2000',
  21. 'NT 5.1':'XP',
  22. 'NT 5.2':'XP',
  23. 'NT 6.0':'Vista',
  24. 'NT 6.1':'7',
  25. 'NT 6.2':'8',
  26. 'NT 6.3':'8.1',
  27. 'NT 6.4':'10',
  28. 'ARM':'RT',
  29. '':'山寨版',
  30. },
  31. };
  32. var NAME='name',VERSION='version',CLASS='cls';
  33. var CLS_WIN=[CLASS,'windows'];
  34. var rules={
  35. os:[
  36. // Windows
  37. [/(Windows Phone)(?: OS)? ?([^; )]*)/i,[NAME,VERSION,CLS_WIN]],
  38. [/(Windows) ([^;)]*)/i,[NAME,[VERSION,mapper.str,maps.winVer],CLS_WIN]],
  39. [/\b(Windows)\b/i,[NAME,[VERSION,'超级山寨版'],CLS_WIN]],
  40. // Mac
  41. [/(iPhone|iPod|iPad|Mac OS X)/i,[NAME,[CLASS,'mac']]],
  42. // Android
  43. [/(Android) ?([^; )]*)/i,[NAME,VERSION,[CLASS,'android']]],
  44. // Linux
  45. [/(Linux)/i,[NAME,[CLASS,'linux']]],
  46. [/()/i,[[NAME,'山寨操作系统'],[CLASS,'other']]],
  47. ],
  48. browser:[
  49. // Opera
  50. [/(Opera Mini)\/(\d+)/i,[NAME,VERSION]],
  51. [[/(OPR)\/(\S+)/i,/(Presto)\/.*?Version\/(\S+)/i],[[NAME,'Opera'],VERSION]],
  52. [[
  53. // Maxthon
  54. /(Maxthon)\/(\S+)/i,
  55. // Vivaldi
  56. /(Vivaldi)\/(\S+)/i,
  57. // Chrome
  58. /(Chrome)\/(\S+)/i,
  59. ],[NAME,VERSION]],
  60. // UC/QQ
  61. [/(UC|QQ)Browser\/(\S+)/i,[[NAME,mapper.reg,[/$/,'浏览器']],VERSION]],
  62. // Safari
  63. [/Version\/(\S+) .*?(Safari)\//i,[VERSION,NAME]],
  64. // Firefox
  65. [/(Firefox)\/(\S+)/i,[NAME,VERSION]],
  66. // IE
  67. [/MS(IE) (\d+)\.0/i,[[NAME,'Internet Explorer'],VERSION]],
  68. [/(Trident)\/(\d+)\.0/i,[[NAME,'Internet Explorer'],[VERSION,mapper.ieVer]]],
  69. [/()/i,[[NAME,'山寨浏览器']]],
  70. ],
  71. };
  72. function getResult(matches,keys){
  73. var r={};
  74. keys.forEach(function(k,i){
  75. var m=matches[i+1];
  76. if(Array.isArray(k)){
  77. if(typeof k[1]=='function') r[k[0]]=k[1](m,k[2]);
  78. else r[k[0]]=k[1];
  79. } else r[k]=m;
  80. });
  81. return r;
  82. }
  83. function parseAgent(a){
  84. var k,v,result={};
  85. for(k in rules) {
  86. v=rules[k];
  87. v.some(function(rule){
  88. var reg=rule[0],keys=rule[1],m=null;
  89. if(Array.isArray(reg)) reg.some(function(reg){
  90. return m=a.match(reg);
  91. }); else m=a.match(reg);
  92. if(m) result[k]=getResult(m,keys);
  93. return m;
  94. });
  95. }
  96. return result;
  97. }