duoshuo-ua.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /* 多说UserAgent插件
  2. * 作者:Gerald <gera2ld@163.com>
  3. */
  4. duoshuoQuery.pluginUA=function(duoshuo_id, getUAString){
  5. function getRule(str,rules){
  6. var res=null,cls=null;
  7. rules.some(function(rule){
  8. return rule[1].some(function(r){
  9. var m;
  10. if(r[0].slice) r[0].some(function(r){
  11. m=str.match(r);
  12. return !!m;
  13. }); else m=str.match(r[0]);
  14. if(m) {
  15. if(r[1]) res=r[1](m);
  16. else res=m[0];
  17. cls=rule[0];
  18. return true;
  19. } else return false;
  20. });
  21. });
  22. return [res,cls];
  23. }
  24. function parseAgent(a){
  25. var rules_os=[
  26. ['windows',[
  27. [/Windows ?([^;)]*)/i,function(m){
  28. var ver={
  29. '4.90':'ME',
  30. 'NT3.51':'NT 3.11',
  31. 'NT4.0':'NT 4.0',
  32. 'NT 5.0':'2000',
  33. 'NT 5.1':'XP',
  34. 'NT 5.2':'XP',
  35. 'NT 6.0':'Vista',
  36. 'NT 6.1':'7',
  37. 'NT 6.2':'8',
  38. 'NT 6.3':'8.1',
  39. 'NT 6.4':'10',
  40. 'ARM':'RT',
  41. }[m[1]];
  42. return 'Windows'+(ver?' '+ver:'山寨版');
  43. }],
  44. [/Windows Phone(?: OS)? ?([^; )]*)/i],
  45. ]],
  46. ['mac',[
  47. [/iPhone|iPod|iPad/i],
  48. [/Mac OS X/i],
  49. ]],
  50. ['android',[
  51. [/Android ?([^; )]*)/i],
  52. ]],
  53. ['linux',[
  54. [/Linux/i],
  55. ]],
  56. ],rules_br=[
  57. ['opera',[
  58. [/Opera Mini\/\d+/i,function(m){
  59. return m[0].replace('/',' ');
  60. }],
  61. [[/OPR\/(\S+)/i,/Presto\/.*?Version\/(\S+)/i],function(m){
  62. return 'Opera '+m[1];
  63. }],
  64. ]],
  65. ['maxthon',[
  66. [/Maxthon\/(\S+)/i,function(m){
  67. return m[0].replace('/',' ');
  68. }],
  69. ]],
  70. ['chrome',[
  71. [/Chrome\/(\S+)/i,function(m){
  72. return m[0].replace('/',' ');
  73. }],
  74. ]],
  75. ['safari',[
  76. [/Version\/(\S+) .*?Safari\//i,function(m){
  77. return 'Safari '+m[1];
  78. }],
  79. ]],
  80. ['firefox',[
  81. [/Firefox\/(\S+)/i,function(m){
  82. return m[0].replace('/',' ');
  83. }],
  84. ]],
  85. ['ie',[
  86. [/MSIE (\d+)\.0/i,function(m){
  87. return 'Internet Explorer '+m[1];
  88. }],
  89. [/Trident\/(\d+)\.0/i,function(m){
  90. return 'Internet Explorer '+(m[1]+4);
  91. }],
  92. ]],
  93. ],result={os:'山寨系统',os_cls:'other',br:'山寨浏览器',br_cls:'other'},r;
  94. r=getRule(a,rules_os);if(r[0]) {result.os=r[0];result.os_cls=r[1];}
  95. r=getRule(a,rules_br);if(r[0]) {result.br=r[0];result.br_cls=r[1];}
  96. return result;
  97. }
  98. function callBefore(local,e){
  99. local.agent=parseAgent(e.post.agent);
  100. local.webmaster=e.post.author_id==duoshuo_id;
  101. }
  102. function callAfter(local,e){
  103. var r=local.result,a=local.agent,
  104. i=r.indexOf('<div class="ds-comment-header">'),
  105. j=r.indexOf('</div>',i);
  106. local.result=r.slice(0,j)+getUAString(local)+r.slice(j);
  107. }
  108. if(!getUAString) getUAString=function(local){
  109. var a=local.agent;
  110. return '<div class="ds-os ds-os-'+a.os_cls+'">'+a.os+'</div>'+
  111. '<div class="ds-br ds-br-'+a.br_cls+'">'+a.br+'</div>'+
  112. (local.webmaster?'<div class=ds-webmaster>天下第一帅的站长</div>':'');
  113. };
  114. return function(){
  115. var post=DUOSHUO.templates.post;
  116. DUOSHUO.templates.post=function(e){
  117. var local={};
  118. callBefore.call(this,local,e);
  119. local.result=post.call(this,e);
  120. callAfter.call(this,local,e);
  121. return local.result;
  122. }
  123. };
  124. };