duoshuo-ua.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /* 多说User-Agent插件
  2. * 作者:Gerald <gera2ld@163.com>
  3. * @require ua-parser.js
  4. */
  5. function getUAString(local){
  6. var a=local.agent;
  7. return '<div class="ds-os ds-os-'+a.os_cls+'">'+a.os+'</div>'+
  8. '<div class="ds-br ds-br-'+a.br_cls+'">'+a.br+'</div>'+
  9. (local.webmaster?'<div class=ds-webmaster>站长</div>':'');
  10. }
  11. function callBefore(local,args){
  12. var e=args[0],id,myIds=duoshuoQuery.myIds||[];
  13. if(args.length==1) // embed.unstable.js
  14. e=e.post;
  15. local.agent=parseAgent(e.agent);
  16. id=e.author_id;
  17. if(!myIds.indexOf) myIds=[myIds];
  18. local.webmaster=myIds.indexOf(id)<0?0:id;
  19. }
  20. function callAfter(local,args){
  21. var r=local.result,
  22. i=r.indexOf('<div class="ds-comment-header">'),
  23. j=r.indexOf('</div>',i),
  24. func=duoshuoQuery.getUAString||getUAString;
  25. local.result=r.slice(0,j)+func(local)+r.slice(j);
  26. }
  27. function init(){
  28. var post=DUOSHUO.templates.post;
  29. DUOSHUO.templates.post=function(){
  30. var local={},args=arguments;
  31. callBefore.call(this,local,args);
  32. local.result=post.apply(this,args);
  33. callAfter.call(this,local,args);
  34. return local.result;
  35. }
  36. }
  37. function observeProperty(item,key,callback){
  38. function callbackOnce(){
  39. var cb=callback;
  40. if(cb) {
  41. callback=null;
  42. cb();
  43. }
  44. }
  45. var value=undefined;
  46. if(item[key]) callbackOnce();
  47. else Object.defineProperty(item,key,{
  48. get:function(){return value;},
  49. set:function(val){
  50. value=val;
  51. callbackOnce();
  52. },
  53. configurable:true,
  54. });
  55. }
  56. function observePropertyChain(item,keys,callback){
  57. function observe(){
  58. observeProperty(item,key,function(){
  59. item=item[key];
  60. if(key=keys.shift()) observe();
  61. else callback();
  62. });
  63. }
  64. var key=keys.shift();
  65. observe();
  66. }
  67. observePropertyChain(window,['DUOSHUO','templates','post'],init);