pincong colorify

品葱页面彩色化油猴脚本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         pincong colorify
// @namespace    http://tampermonkey.net/
// @version      2.1.6 "Dead Deer"
// @description 品葱页面彩色化油猴脚本
// @author       "rebecca" on Pincong.rocks (original author) - upload to this site by others
// @include      *pincong.rocks
// @include      *pincong.rocks*
// @include      *mohu.rocks
// @include      *mohu.rocks*
// @grant        GM_openInTab
// ==/UserScript==

// pincong colorify plugin
// by rebecca 2020/03/05

(()=>{
    var gebcn = e=> cn=>e.getElementsByClassName(cn)
    var print = console.log
    var foreach = a=> f=>{var r=[];for(var i=0;i<a.length;i++){r.push(f(a[i]))}return r}

    var cap = i=>Math.min(Math.max(i,0), 1)
    var rgbify = a=>`rgb(${a.join(',')})`

    function colormap(i){ // i within -1..1
        var red = [255,200,162,.65] // reddish
        var green = [235, 255, 229, 0.65] // greenish
        var c = i>=0?green:red
        i = (i>=0?i:-i)
        c[3] *= cap(i)
        return rgbify(c)
    }

    function colormap2(i){ // different shades of yellow
        var yellow = [255,255,100, 0.5]
        yellow[3]*=i
        return rgbify(yellow)
    }


    function vote2col(v){
        if(v>0){
            v = Math.log10(v+1)
        }else if (v<0) {
            v = -Math.log10(-v+1)
        }else{
            v = 0
        }
        v *= 0.6
        v = Math.max(v,-1)
        v = Math.min(v, 1)
        return colormap(v)
    }

    function mark_everything(){

        var colorize = ans=>{

            // calculate color based on votecount
            var votecount = gebcn(ans)('count')
            if(votecount.length){
                votecount = parseInt(votecount[0].innerHTML)
                // print('vote',votecount)
                ans.style.backgroundColor = vote2col(votecount)
                return
            }

            // otherwise calculate color based on reactiveness
            var replies = gebcn(ans)('aw-small-text')

            if(replies.length){
                // things in aw-small-text might not be what we want
                // so we have to filter thru each of them
                for(var j=0;j<replies.length;j++){
                    var line = replies[j].innerHTML
                    var res = line.match('.*?(\\d+).*?(\\d+).*?')
                    if(res){
                        if(res.length!=3){
                            continue
                        }else{
                            var nreplies = parseInt(res[1])
                            var views = parseInt(res[2])
                            var hotness=0
                            if(views==0){
                                hotness = 0
                            }else{
                                hotness = nreplies/views
                                hotness = cap(hotness*20)
                                ans.style.backgroundColor = colormap2(hotness)
                            }
                            return
                        }
                    }
                }
            }
        }

        var div_awitem = gebcn(document)('aw-item')
        // print(`[Brexit] Got ${div_awitem.length} item(s).`)

        foreach(div_awitem)(colorize)
        foreach(gebcn(document)('aw-mod aw-question-detail'))(colorize)

        // user profile page show UID
        var namediv = gebcn(document)('mod-head')
        if(namediv.length>0){
            namediv = namediv[0]
            var uid = null
            var scripts = document.scripts
            //print(scripts)
            foreach(scripts)(s=>{
                uid = uid || s.innerHTML.match(/questions\/uid-(\d{0,9})'/)
            })
            if(uid!==null){
                if(uid.length==2){
                    uid = uid[1]
                    namediv.innerHTML = `(uid:${uid}) ` + namediv.innerHTML
                }
            }
        }

        // username add UID and reputation
        var reputify = d=>{
            //print(d)
            if(d.innerHTML.includes('img src')){
                return
            }
            var da = d.attributes
            if(da){
                var dai = da['data-id']
                var dar = da['data-reputation']
                if(dai && dar){
                    var uid = dai.value
                    var rep = dar.value
                    d.innerHTML += ` (UID:${uid} 声望:${rep})`
                }
            }
        }
        foreach(gebcn(document)('aw-user-name'))(reputify)
        foreach(gebcn(document)('aw-user-name author'))(reputify)
    }

    mark_everything()

    // press F8 to send selected text to google with site:pincong.rocks
    // press F9 to ... without site:pincong.rocks
    function getSelectionText() {
        var text = "";
        if (window.getSelection) {
            text = window.getSelection().toString();
        } else if (document.selection && document.selection.type != "Control") {
            text = document.selection.createRange().text;
        }
        return text;
    }
    function open_in_new_tab(t, insite){
        if (t.length){
            GM_openInTab(`https://www.google.com/search?q=${insite?'site%3Apincong.rocks+':''}"${t}"`,{active:true})
        }
    }
    //119 for F8
    //120 for F9
    document.addEventListener("keyup", event => {
        if (event.isComposing || event.keyCode === 229) {
            return;
        }
        var ek = event.keyCode
        if (ek==119){
            open_in_new_tab(getSelectionText(), true)
        }else if (ek==120){
            open_in_new_tab(getSelectionText(), false)
        }
    });
})()