hacg script

enter something useful

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         hacg script
// @namespace    http://your.homepage/
// @version      0.2.1
// @description  enter something useful
// @author       You
// @require      https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.8/clipboard.min.js
// @include      *://*.hacg.*/*
// @include      *://hacg.*/*
// ==/UserScript==

/* jshint esnext: true */

// Your code here...
(function () {
    // body...
    var $ = jQuery;

    var tool = $('<div class="cbj-hacg-tool"></div>');
    $('body').append(tool);

    tool.css({
        backgroundImage: "url('/favicon.ico')",
        backgroundSize: '100% 100%',
        cursor: 'pointer',
        position: 'fixed',
        right: '20px',
        bottom: '20px',
        width: '20px',
        height: '20px',
        backgroundColor: 'white'
    });

    var content = $('article').html() + $('#comments .commentList').html();
    content = content.replace('本站不提供下载', '');
    var clipboard;
    tool.click(function () {
        var links = match(content, /[A-Za-z0-9]{40}/g).map(m => `magnet:?xt=urn:btih:${m}`);
        var specialLinks = match(content, /[A-Z2-9]{32}/g).map(m => `magnet:?xt=urn:btih:${decodeBase32(m)}`);
        var baiduReg = /(\/s\/\w+) (\w+)/g;
        var result, baiduLinks = [];
        while ((result = baiduReg.exec(content)) !== null) {
            result = baiduReg.exec(content);
            baiduLinks.push(`<a href="http://pan.baidu.com${result[1]}">${result[1]}</a> ${result[2]}`);
        }

        if ($('.cbj-abstract').length === 0) {
            buildAbstract(links.concat(baiduLinks), specialLinks);
        } else {
            clipboard.destroy();
            $('.cbj-abstract').remove();
        }
    });

    function match(content, reg) {
        var result = content.match(reg);
        return result || [];
    }

    function buildAbstract(links, specialLinks) {
        links = [...new Set(links)];
        var icon = 'https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/svgs/fi-page-copy.svg';
        var list = links.map((m, i) => `<li><span>${m}</span><button class="copy"><img src="${icon}" alt="Copy to clipboard"></button></li>`).join('');
        var specialList = specialLinks.map((m, i) => `<li><span style='color: red'>${m}</span><button class="copy"><img src="${icon}" alt="Copy to clipboard"></button></li>`).join('');
        var div = $(`<div class="cbj-abstract"><ul>${list}${specialList}</ul></div>`);
        $('.entry-content').prepend(div);

        var buttonStyle = {
            position: 'relative',
            display: 'inline-block',
            margin: '4px 8px',
            height: '22px',
            padding: '0',
            fontSize: '13px',
            fontWeight: 'bold',
            lineHeight: '20px',
            color: '#333',
            whiteSpace: 'nowrap',
            verticalAlign: 'middle',
            cursor: 'pointer',
            backgroundColor: '#eee',
            backgroundImage: 'linear-gradient(#fcfcfc, #eee)',
            border: '1px solid #d5d5d5',
            borderRadius: '3px'
        };
        $('button.copy').css(buttonStyle);
        $('button.copy img').css({
            width: '20px',
            height: '20px'
        });
        div.find('li').css('background-color', 'rgb(50,50,50)');
        clipboard = new Clipboard('button.copy', {
            target: button => button.previousSibling
        });
    }

    function decodeBase32(text) {
        var base32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".split("");
        var result = "";
        for (var i = 0; i < text.length; i++) {
            var t = base32.indexOf(text[i]);
            var e1, e2, e3, e4, e5;
            var temp;
            switch (i % 4) {
                case 0:
                    e1 = t >> 1;
                    temp = (t & 0b1) << 3;
                    break;
                case 1:
                    e2 = temp | t >> 2;
                    temp = (t & 0b11) << 2;
                    break;
                case 2:
                    e3 = temp | t >> 3;
                    temp = (t & 0b111) << 1;
                    break;
                case 3:
                    e4 = temp | t >> 4;
                    e5 = t & 0b1111;
                    result = result + [e1, e2, e3, e4, e5].map(x => x.toString(16)).join("");
                    break;
            }
        }
        return result;
    }

})();