2ch Colorized Links

Раскрашивает ссылки на посты разными цветами для более простого визуального восприятия. Дает ссылкам на один пост один и тот же цвет.

// ==UserScript==
// @name         2ch Colorized Links
// @description  Раскрашивает ссылки на посты разными цветами для более простого визуального восприятия. Дает ссылкам на один пост один и тот же цвет.
// @namespace    http://tampermonkey.net/
// @version      0.1.4
// @author       Anonymous
// @match        https://2ch.hk/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function forEachChildWithClass(el, klass, f) {
        Array.from(el.getElementsByClassName(klass)).forEach(f);
    }

    function hasClass(el, klass) {
        return el.classList && el.classList.contains(klass);
    }

    // https://stackoverflow.com/a/4382138/6879054
    var kelly_colors_hex = [
        "#FFB300", // Vivid Yellow
        "#803E75", // Strong Purple
        "#FF6800", // Vivid Orange
        "#A6BDD7", // Very Light Blue
        "#C10020", // Vivid Red
        "#CEA262", // Grayish Yellow
        "#817066", // Medium Gray

        // The following don't work well for people with defective color vision
        "#007D34", // Vivid Green
        "#F6768E", // Strong Purplish Pink
        "#00538A", // Strong Blue
        "#FF7A5C", // Strong Yellowish Pink
        "#53377A", // Strong Violet
        "#FF8E00", // Vivid Orange Yellow
        "#B32851", // Strong Purplish Red
        "#F4C800", // Vivid Greenish Yellow
        "#7F180D", // Strong Reddish Brown
        "#93AA00", // Vivid Yellowish Green
        "#593315", // Deep Yellowish Brown
        "#F13A13", // Vivid Reddish Orange
        "#232C16", // Dark Olive Green
    ];

    function colorizeReplyLink(elem) {
        var num = parseInt(elem.textContent.replace(/^>>/, "").replace(/ \(OP\)$/, ""));
        elem.style.color = kelly_colors_hex[num % kelly_colors_hex.length];
    }

    function colorizePostNumber(elem) {
        elem.style.color = kelly_colors_hex[parseInt(elem.textContent) % kelly_colors_hex.length];
    }

    window.onload = function() {
        forEachChildWithClass(document, "post-reply-link", colorizeReplyLink);
        forEachChildWithClass(document, "postbtn-reply-href", colorizePostNumber);
    };

    document.addEventListener(
        "DOMNodeInserted",
        function(e) {
            var el = e.target;

            // новые и всплывающие по наведению мыши посты
            if (hasClass(el, "post-wrapper") || hasClass(el, "post")) {
                forEachChildWithClass(el, "post-reply-link", colorizeReplyLink);
                forEachChildWithClass(el, "postbtn-reply-href", colorizePostNumber);

            // первая ссылка на ответ к посту
            } else if (hasClass(el, "ABU-refmap")) {
                forEachChildWithClass(el, "post-reply-link", colorizeReplyLink);

            // остальные ссылки на ответы к посту
            } else if (hasClass(el, "post-reply-link")) {
                colorizeReplyLink(el);
            }
        },
        false);
})();