Habrahabr collapsible comments

Скрипт позволяет сворачивать неинтересные ветки комментариев на geektimes.com и habr.com

  1. // ==UserScript==
  2. // @name Habrahabr collapsible comments
  3. // @namespace habrahabrcc
  4. // @version 0.3.2
  5. // @description Скрипт позволяет сворачивать неинтересные ветки комментариев на geektimes.com и habr.com
  6. // @author Roman Akhmadullin edited Anton Zr.
  7. // @match *://habrahabr.ru/*
  8. // @match *://geektimes.com/*
  9. // @match *://habr.com/*
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13.  
  14. (function() {
  15.  
  16. // Уровень комментариев, на котором они будут скрыты
  17. var HIDE_LEVEL = 2;
  18.  
  19. // Основная функция скрытия-раскрытия комментариев
  20. var toggleHide = function(item,first_run,speed) {
  21. item = $(item);
  22. var item_info = item.find('> .comment > .comment__head > .inline-list > .inline-list__item');
  23. var comments_container = item.find('> .content-list_nested-comments');
  24. var replies_count = comments_container.find('.comment').length;
  25. var has_new_replies = comments_container.find('.comment__head.comment__head_new-comment').length;
  26.  
  27. if ((first_run === true && has_new_replies === 0) || first_run === false) { // При первой загрузке не скрывать посты с новыми ответами
  28. comments_container.slideToggle(speed);
  29. }
  30.  
  31. // Кнопка-элемент, кликая на которую, раскрываются комментарии
  32. var comments_count_element = item_info.find('> a.comments_count');
  33. console.log('rc='+replies_count +' '+ comments_count_element.length);
  34. if (comments_container.css('display') === 'none' || (parseInt(comments_container.css('height')) > 1 && first_run === false)) {
  35. item.css('marginBottom',20);
  36. comments_count_element.text('Скрыто комментариев: ' + replies_count);
  37. } else {
  38. item.css('marginBottom',null);
  39. comments_count_element.text('Скрыть комментарии');
  40. }
  41. };
  42.  
  43. // Добавим комментариям новую кнопочку-сворачивалку-разворачивалку
  44. var all_page_comments = $('.js-comment');
  45. all_page_comments.each(function(){
  46. var replies_count = $(this).find('> .content-list_nested-comments .js-comment').length;
  47. if (replies_count > 0) { // Если ответов больше 0, то добавим специальную кнопочку
  48. // Класс .link_to_comment добавлен для того, чтобы перенять стили Хабра
  49. var item_info = $(this).find('> .comment > .comment__head > .inline-list > .inline-list__item');
  50. item_info.find('> .icon_comment-anchor').parent().after('<li class="inline-list__item inline-list__item_comment-nav" style="line-height:13px"><a href="#" class="comments_count defination-list__link">Скрыть комментарии</a></li>');
  51. }
  52. });
  53.  
  54. // Навесим обработчик нажатия на кнопку
  55. $('.comments_count').on('click',function(){
  56. toggleHide($(this).closest('.js-comment'),false);
  57. return false;
  58. });
  59.  
  60. var disable_first_hide = false;
  61.  
  62. if (window.location.search.indexOf('reply_to') > -1) {
  63. // Видимо, страница загружена из почты, и ожидается, что
  64. // человек собирается ответить на комментарий.
  65. // отключим изначальное скрытие
  66. disable_first_hide = true;
  67. }
  68.  
  69. if (window.location.hash.indexOf('comment_') > -1) {
  70. // Надо найти какой-то конкретный комментарий,
  71. // выключим автоскрытие в этом случае также
  72. disable_first_hide = true;
  73. }
  74.  
  75. // Скроем все комментарии уровня 3 и выше при загрузке страницы,
  76. // если нет никаких причин этого не делать
  77. if (disable_first_hide === false) {
  78.  
  79. var hide_comments = function(comments_list,level){
  80. if (level < HIDE_LEVEL) {
  81. hide_comments(comments_list.find('> .content-list_nested-comments'),level+1);
  82. } else {
  83. comments_list.find('> .js-comment').each(function(){
  84. toggleHide(this,true,0);
  85. });
  86. }
  87. }
  88.  
  89. hide_comments($('.content-list_comments'),1);
  90.  
  91. /*
  92. $('.content-list_comments > .js-comment').each(function(){
  93. $(this).find('> .reply_comments > .comment_item').each(function(){
  94. toggleHide(this,true,0);
  95. });
  96. });
  97. */
  98. }
  99.  
  100. })();