Habrahabr collapsible comments

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

目前为 2016-12-10 提交的版本。查看 最新版本

// ==UserScript==
// @name         Habrahabr collapsible comments
// @namespace    habrahabrcc
// @version      0.3.1
// @description  Скрипт позволяет сворачивать неинтересные ветки комментариев на geektimes.ru и habrahabr.ru 
// @author       Roman Akhmadullin edited Anton Zr.
// @match        https://habrahabr.ru/*
// @match        https://geektimes.ru/*
// @match        http://habrahabr.ru/*
// @match        http://geektimes.ru/*
// @grant        none
// ==/UserScript==


(function() {
    
    // Уровень комментариев, на котором они будут скрыты
    var HIDE_LEVEL = 2;
    
    // Основная функция скрытия-раскрытия комментариев
    var toggleHide = function(item,first_run,speed) {
        item = $(item);
        var item_info = item.find('> .comment_body > .info > .comment-item__controls');
        var comments_container = item.find('> .reply_comments');
        var replies_count = comments_container.find('.comment_item').length;
        var has_new_replies = comments_container.find('.info.is_new').length;
        
        if ((first_run === true && has_new_replies === 0) || first_run === false) { // При первой загрузке не скрывать посты с новыми ответами
            comments_container.slideToggle(speed);
        }
        
        // Кнопка-элемент, кликая на которую, раскрываются комментарии
        var comments_count_element = item_info.find('> a.comments_count');
        
        if (comments_container.css('display') === 'none' || (parseInt(comments_container.css('height')) > 1 && first_run === false)) {
            item.css('marginBottom',20);
            comments_count_element.text('Скрыто комментариев: ' + replies_count);
        } else {
            item.css('marginBottom',null);
            comments_count_element.text('Скрыть комментарии');
        }
    };
    
    // Добавим комментариям новую кнопочку-сворачивалку-разворачивалку
    var all_page_comments = $('.comment_item');
    all_page_comments.each(function(){
        var replies_count = $(this).find('> .reply_comments .comment_item').length;
        if (replies_count > 0) { // Если ответов больше 0, то добавим специальную кнопочку
            // Класс .link_to_comment добавлен для того, чтобы перенять стили Хабра
	        var item_info = $(this).find('> .comment_body > .info > .comment-item__controls');
            item_info.find('> .icon_comment-anchor').after('<a href="#" class="comments_count .icon_comment-anchor">Скрыть комментарии</a>');
        }
    });
    
    // Навесим обработчик нажатия на кнопку
    $('.comments_count').on('click',function(){
    	toggleHide($(this).closest('.comment_item'),false);
        return false;
    });
    
    var disable_first_hide = false;
    
    if (window.location.search.indexOf('reply_to') > -1) {
        // Видимо, страница загружена из почты, и ожидается, что 
        // человек собирается ответить на комментарий.
        // отключим изначальное скрытие
        disable_first_hide = true;
    }
    
    if (window.location.hash.indexOf('comment_') > -1) {
        // Надо найти какой-то конкретный комментарий,
        // выключим автоскрытие в этом случае также
        disable_first_hide = true;
    }
    
    // Скроем все комментарии уровня 3 и выше при загрузке страницы,
    // если нет никаких причин этого не делать
    if (disable_first_hide === false) {
        
        var hide_comments = function(comments_list,level){
            if (level < HIDE_LEVEL) {
                hide_comments(comments_list.find('> .comment_item > .reply_comments'),level+1);
            } else {
                comments_list.find('> .comment_item').each(function(){
                    toggleHide(this,true,0);
                });
            }
        }
        
        hide_comments($('.comments_list'),1);
        
        /*
    	$('.comments_list > .comment_item').each(function(){
            $(this).find('> .reply_comments > .comment_item').each(function(){
	            toggleHide(this,true,0);
            });
        });
        */
    }
    
})();