duoshuo-ua.js 1.8 KB

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