Habrahabr collapsible comments

helps read habrahabr comments

// ==UserScript==
// @name         Habrahabr collapsible comments
// @namespace    http://vk.com/believerufa
// @version      0.4
// @description  helps read habrahabr comments
// @author       Roman Akhmadullin
// @match        https://habrahabr.ru/*
// @match        https://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');
        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, то добавим специальную кнопочку

	        var item_info = $(this).find('> .comment_body > .info');

            // Класс .icon_comment-anchor добавлен для того, чтобы перенять стили Хабра
            item_info.find('> .comment-item__controls').after('<a href="#" class="comments_count icon_comment-anchor">Скрыть комментарии</a>');
        }
    });

    // Навесим обработчик нажатия на кнопку
    $('body').on('click', '.comments_count', 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;
    }

    function hideComments(comments_list,level) {

        if (level < HIDE_LEVEL) {
            hideComments(comments_list.find('> .comment_item > .reply_comments'),level+1);
        } else {
            comments_list.find('> .comment_item').each(function(){
                toggleHide(this,true,0);
            });
        }
    }

    // Скроем все комментарии уровня 3 и выше при загрузке страницы,
    // если нет никаких причин этого не делать
    if (disable_first_hide === false) {
        hideComments($('#comments-list'),1);
    }

})();