View difference between Paste ID: qdDGcMjB and sKhjS7Da
SHOW: | | - or go back to the newest paste.
1
// ==UserScript==
2
// @name         Hide thread iichan
3
// @namespace    http://iichan.hk/
4
// @license      WTFPL
5
// @version      0.1
6
// @description  adds hide thread feature to iichan
7
// @author       Cirno
8
// @match        http://iichan.hk/*
9
// @grant        none
10
// ==/UserScript==
11
12
(function() {
13
    'use strict';
14
15
    var THREAD_TITLE_LENGTH = 50;  // Сколько первых символов из поста показывать в заголовке скрытого треда
16
17
    function removeClass(element, className) {
18
        var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
19
        element.className = element.className.replace(reg, ' ');
20
    }
21
22
    function addHideBtns() {
23
        var threads = document.querySelectorAll('[id^=thread]');
24
        for (var i = threads.length - 1; i >= 0; i--) {
25
            var thread = threads[i];
26
            var label = thread.querySelector('label');
27
            if (!label) continue;
28
            var btn = document.createElement('a');
29
            btn.innerHTML = '[-]';
30
            btn.className = 'iichan-hide-thread-btn';
31
            btn.title = 'Скрыть тред';
32-
            btn.addEventListener('click', function() {hideThread(thread.id);});
32+
            btn.threadId = thread.id;
33
            btn.addEventListener('click', function() {hideThread(this.threadId);});
34
            thread.insertBefore(btn, label.nextSibling);
35
        }
36
    }
37
38
    function unHideThread(threadId) {
39
        var hiddenThreads = JSON.parse(window.localStorage.getItem('iichan_hidden_threads') || "[]");
40
        var index = hiddenThreads.indexOf(threadId);
41
        if (index === -1) {
42
            return;
43
        }
44
        hiddenThreads.splice(index, 1);
45
        window.localStorage.setItem('iichan_hidden_threads', JSON.stringify(hiddenThreads));
46
47
        var thread = document.getElementById(threadId);
48
        if(!thread) {
49
            return;
50
        }
51
        removeClass(thread, 'iichan-thread-hidden');
52
        var placeholder = document.getElementById('iichan-hidden-' + threadId);
53
        if (placeholder) {
54
            placeholder.parentElement.removeChild(placeholder);
55
        }
56
    }
57
58
    function hideThread(threadId) {
59
        var thread = document.getElementById(threadId);
60
        if(!thread) {
61
            return;
62
        }
63
        var parent = thread.parentNode;
64
        var threadHiddenDiv = document.createElement('div');
65
        var threadNo = threadId.split('-')[1];
66
        var threadTitle = thread.querySelector('.filetitle').innerText || thread.querySelector('blockquote').innerText || 'картинка';
67
        threadTitle = threadTitle.substr(0, THREAD_TITLE_LENGTH);
68
        threadHiddenDiv.innerHTML = 'Тред №' + threadNo + ' скрыт (' + threadTitle + ')';
69
        threadHiddenDiv.id = 'iichan-hidden-' + threadId;
70
        threadHiddenDiv.className = 'reply iichan-hidden-thread-placeholder';
71
        threadHiddenDiv.addEventListener('click', function() {unHideThread(threadId);});
72
        thread.className += ' iichan-thread-hidden';
73
        parent.insertBefore(threadHiddenDiv, thread);
74
75
        // save result
76
        var hiddenThreads = JSON.parse(window.localStorage.getItem('iichan_hidden_threads') || "[]");
77
        if (hiddenThreads.indexOf(threadId) === -1) {
78
            hiddenThreads.push(threadId);
79
            window.localStorage.setItem('iichan_hidden_threads', JSON.stringify(hiddenThreads));
80
        }
81
    }
82
83
    function hideAllHiddenThreads() {
84
        var hiddenThreads = JSON.parse(window.localStorage.getItem('iichan_hidden_threads') || "[]");
85
        for (var i = hiddenThreads.length - 1; i >= 0; i--) {
86
            hideThread(hiddenThreads[i]);
87
        }
88
    }
89
90
    function appendCSS() {
91
        var css = document.createElement('style');
92
        css.type = 'text/css';
93
        css.innerHTML =  '\
94
.iichan-hidden-thread-placeholder {\
95
cursor: pointer;\
96
}\
97
.iichan-hidden-thread-placeholder:hover + div, .iichan-hidden-thread-placeholder:hover + div + br {\
98
display: block !important;\
99
}\
100
.iichan-thread-hidden {\
101
display: none;\
102
}\
103
.iichan-thread-hidden + br {\
104
display: none;\
105
}\
106
.iichan-hide-thread-btn {\
107
margin-left: 0.2em;\
108
cursor: pointer;\
109
}\
110
';
111
        document.body.appendChild(css);
112
    }
113
114
    appendCSS();
115
    addHideBtns();
116
    hideAllHiddenThreads();
117
})();