Colorfull reddit usernames (CRU)

Colorizes usernames on reddit comments

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name            Colorfull reddit usernames (CRU)
// @version         0.6
// @description     Colorizes usernames on reddit comments
// @namespace       [email protected]
// @grant           GM_config
// @grant           GM_registerMenuCommand
// @include         *.reddit.com/r/*/comments/*
// @require         http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require         https://greasyfork.org/libraries/GM_config/20131122/GM_config.js

// ==/UserScript==

/*
    Features:
    - Colors are assigned so that a username will always have the same color, even in different comments and posts.
    - OPs username highlighter
         (If OP's username color is red text on yellow background, that indicates OP has answered a comment in his post or made a comment. If the color is something else OP did not participate in his post so far.)
    - VIP username highlighter 
        (a simple GUI to add as many usernames you want to be highlighted) (Open the script options to open it)
 */

//make jquerry available 
//var $ = unsafeWindow.jQuery;

// Add config style
function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}
addGlobalStyle('#GM_config { width: 700px ! important; height: 280px ! important;}');

// add configuration options
GM_config.init('Colorfull reddit usernames Options',

        {
            'vip_users':
            {
                'section': ['Highlight Usernames','Add usernames you wish to be highlighted'],
                'label': 'Usernames to highlight (seperated by space):',
                'type': 'text',
                'cols': '50',
                'default': 'xNotch rocket2guns' // Dont add your VIPs here. There is a GUI to add them
            },
            'vip_color_bg':
            {
                'section': ['Highlight Colors','Customize the highligt color. ( <a target="_blank" href="http://www.w3schools.com/html/html_colornames.asp">Available Colors</a> )'],
                'label': 'Background color of highlighted users:',
                'type': 'text',
                'default': 'yellow' // Dont add your VIPs here. There is a GUI to add them
            },
            'vip_color_border':
            {
                'label': 'Border color of highlighted users:',
                'type': 'text',
                'default': 'red' // Dont add your VIPs here. There is a GUI to add them
            }
        },
        '#GM_config_header { text-align: center ! important; } \
        #GM_config_wrapper label { margin-left: 4px; } \
        #GM_config_wrapper input { position: absolute; right: 10px; width: 400px;} \
        .config_var { margin-top: 4px; } \
        .section_header_holder { }'
);

GM_registerMenuCommand("CRU - Options", function(){GM_config.open();}, "");

var GM_U;
window.addEventListener ("load", function () {
        //console.log("Ping");
        var username = GM_config.get('vip_users');
        var vipColorBg = GM_config.get('vip_color_bg');
        var vipColorBorder = GM_config.get('vip_color_border');

        GM_U = new GM_UserColor (username, vipColorBg, vipColorBorder);
    },
    false
);

function GM_UserColor (username, vipColorBg, vipColorBorder) {
    //console.log(username);
    var vip_users=0;
    vip_users=username.split(" ");
    highlighted_users = [];

  
    function add_colors () {
      
        var authors = $('a.author');

        // Check if the link submitter has posted
        var submitter = $('.author.submitter');

        if (submitter.length > 0 ) {
            submitter = submitter.eq(0).text();
        }

        // Logged in user
        var loggedInUser = $('span.user a').text();

        for (var i = 0; i < authors.length; i++) {
            var elem = authors.eq(i);
            var author = elem.text();

            //elem.textContent = "";

            // Get character sum
            var sum = 0;
            for (var j = 0; j < author.length; j++)
                sum += author.charCodeAt(j);

            // get random color 
            var color = generate_color(sum);

            elem.attr('style', 'color: ' + getContrastYIQ (color) + '; border-width: 0px;' + ' padding: 1px 3px; border-radius: 4px; background-color:' + color + ' !important;');
        
            //Add special look to vip users, OP, and highlighted users
            if ( author==submitter || (vip_users.indexOf(author) > -1) ||
                    (highlighted_users.indexOf (author) > -1) ) {

                elem.attr('style', 'color: ' + vipColorBorder + ' !important; border-width: 1px;' + ' padding: 1px 3px; border-color: red; border-style: solid; border-width: 1px; background-color:' + vipColorBg + ' !important; text-align: justify;');
            }

            elem.parent().css({'padding': '2px'});
            
            // Add temp highlight button
            var hightlightButton = $('<a>')
                .addClass('GM_highlight')
                .attr({
                    'name': author,
                    'href': '#'
                })
                .text('[h]');


            if (elem.parent().hasClass('tagline')) {
                if ( ( elem.parent().children().eq(2).text() != "[h]") &&
                    ( author != submitter )  && ( author != loggedInUser ) ) {
                    elem.after(hightlightButton);
                }
            }
            
        }
    }

     // add a new user to the highlighted user array
    function add_highlighted_user (user) {

        if (highlighted_users.indexOf (user) == -1) {
            highlighted_users.push(user);
        } else {
            highlighted_users.remove(user);
        }
        add_colors();
    }

    Array.prototype.remove = function() {
        var what, a = arguments, L = a.length, ax;
        while (L && this.length) {
            what = a[--L];
            while ((ax = this.indexOf(what)) !== -1) {
                this.splice(ax, 1);
            }
        }
        return this;
    };

    // generate random color but skip white
    function generate_color (sum) {
        
        var colorcode = ((1<<24)*sum/1000|0).toString(16);
        
        if (colorcode.length > 6)
            colorcode = colorcode.substring(colorcode.length-6,colorcode.length);
        
        if (colorcode == "ffffff")
            colorcode = "654f76";
        
        colorcode = colorLuminance(colorcode, 0);
        
        return colorcode;
    }

    // calculate the contrast of a color to decide if white or black text color should be used
    function getContrastYIQ (hexcolor){
            if (hexcolor.length > 6)
            hexcolor = hexcolor.substring(hexcolor.length-6,hexcolor.length);
            
            var r = parseInt(hexcolor.substr(0,2),16);
            var g = parseInt(hexcolor.substr(2,2),16);
            var b = parseInt(hexcolor.substr(4,2),16);
            var yiq = ((r*299)+(g*587)+(b*114))/1000;
            return (yiq >= 128) ? 'black' : 'white';
    }

    // Calculates lighter or darker colors
    //http://www.sitepoint.com/javascript-generate-lighter-darker-color/
    function colorLuminance (hex, lum) {
            // validate hex string
            hex = String(hex).replace(/[^0-9a-f]/gi, '');
            if (hex.length < 6) {
                    hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
            }
            lum = lum || 0;
            // convert to decimal and change luminosity
            var rgb = "#", c, i;
            for (i = 0; i < 3; i++) {
                    c = parseInt(hex.substr(i*2,2), 16);
                    c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
                    rgb += ("00"+c).substr(c.length);
            }
            return rgb;
    }

    add_colors ();

    // Add "load more comments" links onclick even
    $('.commentarea').on('click', 'a.button', function() {
        setTimeout( function() {add_colors();}, 3000 );
    });

    //Add highlighted users onclick even
    $('.commentarea').on('click', 'a.GM_highlight', function(event) {
        event.preventDefault();
        var user = $(this).attr('name');
        add_highlighted_user(user);
    });
}