V2EX Topic Preview

None

  1. // ==UserScript==
  2. // @name V2EX Topic Preview
  3. // @namespace http://www.v2ex.com/member/icedx
  4. // @version 0.2333
  5. // @description None
  6. // @author openroc@V2EX,Alex Hsiao
  7. // @match *://www.v2ex.com/go/*
  8. // @match *://www.v2ex.com/?tab=*
  9. // @match *://www.v2ex.com/
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. /*
  14. v2ex.com.js for chrome extension dotjs, have fun, :)
  15. */
  16. var map = {};
  17. var comment_template = [
  18. '<div id="r_2127958" class="cell">',
  19. '<table cellpadding="0" cellspacing="0" border="0" width="100%">',
  20. '<tbody><tr>',
  21. '<td width="48" valign="top" align="center"><img src="_{{_avatar_normal_}}_" class="avatar" border="0" align="default"></td>',
  22. '<td width="10" valign="top"></td>',
  23. '<td width="auto" valign="top" align="left"><div class="fr"><span class="no">_{{_seq_}}_</span></div>',
  24. '<div class="sep3"></div>',
  25. '<strong><a href="/member/_{{_username_}}_" class="dark">_{{_username_}}_</a></strong>&nbsp; &nbsp;<span class="fade small">_{{_dt_}}_</span> <span class="small fade"></span>',
  26. '<div class="sep5"></div>',
  27. '<div class="reply_content">_{{_content_rendered_}}_</div>',
  28. '</td>',
  29. '</tr>',
  30. '</tbody></table>',
  31. '</div>',
  32. ].join('');
  33. function replace(src, map) {
  34. var rc = src;
  35. for(var key in map) {
  36. rc = rc.replace(new RegExp("_{{_"+key+"_}}_","g"), map[key]);
  37. }
  38. return rc;
  39. }
  40. function getTopicId(url) {
  41. return (/\/t\/(\d+)/i.test(url)? RegExp.$1 : undefined);
  42. }
  43. function getTS(s) {
  44. var rc = '';
  45. if(s<60) {
  46. rc = Math.floor(s) + '秒前';
  47. } else if( s>=60 && s<3600) {
  48. rc = Math.floor(s/60) + '分钟前';
  49. } else if( s>=3600 && s<3600*24) {
  50. rc = Math.floor(s/3600) + '小时前';
  51. } else if( s>=3600*24) {
  52. rc = Math.floor(s/(3600*24)) + '天前';
  53. }
  54. return rc;
  55. }
  56. function closeContent(host, tid) {
  57. map[tid] = {status:0, host: host};
  58. host.find('.injection').remove();
  59. $('html, body').animate({scrollTop: host.offset().top}, 50);
  60. }
  61. function showContent(host, tid) {
  62. for(var id in map) {
  63. if(map[id].status == 1) closeContent(map[id].host, id);
  64. }
  65. $('html, body').animate({scrollTop: host.offset().top}, 50);
  66. map[tid] = {status:1, host: host};
  67. var wrapper = $('<div class="injection" style=""></div>');
  68. var content = $('<div class="topic_content markdown_body" style="margin:10px 0;">loading....</div>');
  69. var comments = $('<div class="" style="border-top:1px solid #ccc; background-color:#f9f9f9; margin-left:50px;"></div>');
  70. wrapper.append(content);
  71. wrapper.append(comments);
  72. host.append(wrapper);
  73. $.get('/api/topics/show.json?id='+tid, function(data){
  74. content.html(data[0].content_rendered);
  75. });
  76. $.get('/api/replies/show.json?topic_id='+tid, function(data){
  77. for(var n=0, len=data.length; n<len; ++n) {
  78. var kv = {
  79. content_rendered: data[n].content_rendered,
  80. username: data[n].member.username,
  81. avatar_normal: data[n].member.avatar_normal,
  82. cid: data[n].id,
  83. uid: data[n].member.id,
  84. dt: getTS(Date.now()/1000-data[n].created),
  85. seq: n+1,
  86. };
  87. comments.append(replace(comment_template, kv));
  88. host.find('.imgly').css('max-width', '530px');
  89. }
  90. });
  91. }
  92. function onItemClick(self) {
  93. var tid = getTopicId(self.find('.item_title a').attr('href'));
  94. if(map[tid] && map[tid].status == 1) {
  95. closeContent(self, tid);
  96. } else {
  97. showContent(self, tid);
  98. }
  99. }
  100. // for dynamic url, such as /?tab=tech
  101. $('div.cell.item').click(function(){
  102. onItemClick($(this));
  103. });
  104. // for static url, such as /go/share
  105. $('#TopicsNode .cell').click(function(){
  106. onItemClick($(this));
  107. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址