[s4s] Enhancer

Highlights dubs - Never miss your chance to check em again!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        [s4s] Enhancer
// @namespace   https://userscripts.org/users/532546
// @email       [email protected]
// @description Highlights dubs - Never miss your chance to check em again!
// @include     https://boards.4chan.org/*
// @include     http://boards.4chan.org/*
// @author      le fun css man AKA Doctor Worse Than Hitler
// @version     1.32
// ==/UserScript==

// NOTE:
// This is a copy that works on all 4chan subs. I haven't edited anything but the includes.


initialize(); 
addCSS();               // add the css
highlightDubs();        // highlight dubs
changePosts();           // color and replace text


// if this page is a thread, then we need to periodically check for updates brought in by the auto-update
//if(document.URL.indexOf("res") != -1)
//{
    setInterval(function(){checkIfUpdated()}, 5000);   // check if the thread is updated every 5 seconds  
//}
function initialize()
{
    window.lastNo = 0;         // used to make sure we don't check posts twice
    window.lastMessage = 0;    // don't want to check texts twice either
    window.replaceLimit = 10;  // limits number of times an individual emote can be used
    window.totalLimit   = 50; // limits total number of emotes per post. These limits are too prevent errors like  "unresponsive script"
    window.posts = getPosts();
    // Replaces ":key:" with the image"
    window.replaceList = {
        doge:       'http://i.imgur.com/5XD1CYW.png',
        kek:        'http://i.imgur.com/lblY5Sn.png',
        checkem:    'http://i.imgur.com/PwAtIwi.png',
        froge:      'http://i.imgur.com/j8uUz62.png',
        lel:        'http://i.imgur.com/1DfcjLb.png',
        thinchin:   'http://i.imgur.com/SwNA28g.png',
        ptree:      'http://i.imgur.com/rUDbkXw.png',
        btree:      'http://i.imgur.com/M2kjuLL.png',
        pktree:     'http://i.imgur.com/GWepwsJ.png',
        rtree:      'http://i.imgur.com/l5fKXY7.png',
        ruse:       'http://i.imgur.com/8XBt7yF.png',
        mot:        'http://i.imgur.com/IfMpxw1.png',
        a:          'http://i.imgur.com/q8hHbwQ.gif',
        b:          'http://i.imgur.com/03xYJTU.gif',
        c:          'http://i.imgur.com/9UxS7ej.gif',
        d:          'http://i.imgur.com/gJezGs5.gif',
        e:          'http://i.imgur.com/J9df7FB.gif',
        f:          'http://i.imgur.com/XgufMCh.gif',
        g:          'http://i.imgur.com/BDKY6vy.gif',
        h:          'http://i.imgur.com/JWRrUUO.gif',
        i:          'http://i.imgur.com/gZLK7Dc.gif',
        j:          'http://i.imgur.com/BiZ3dqk.gif',
        k:          'http://i.imgur.com/15DDVOh.gif',
        l:          'http://i.imgur.com/p0HyNUw.gif',
        m:          'http://i.imgur.com/JX55XPt.gif',
        n:          'http://i.imgur.com/XhUUK36.gif',
        o:          'http://i.imgur.com/04fvVIM.gif',
        p:          'http://i.imgur.com/TlWblXt.gif',
        q:          'http://i.imgur.com/aEGHWjg.gif',
        r:          'http://i.imgur.com/PD6x0Uh.gif',
        s:          'http://i.imgur.com/wirH3pL.gif',
        t:          'http://i.imgur.com/hsKlJrv.gif',
        u:          'http://i.imgur.com/Xpf1VnM.gif',
        v:          'http://i.imgur.com/g3INSef.gif',
        w:          'http://i.imgur.com/cF6pbpj.gif',
        x:          'http://i.imgur.com/UVbdagZ.gif',
        y:          'http://i.imgur.com/2BJaMA3.gif',
        z:          'http://i.imgur.com/itOUZ85.gif',
        
    }
}
function highlightDubs()
{
    // grabs the elements that contain "No. <postno>"
    var postNum = document.getElementsByClassName("postNum");
    // iterate through all post numbers and check for dubs
    for(var i = window.lastNo; i < postNum.length; i++)
    {
        // get the post number
        var no = postNum[i].children[1].innerHTML;
        // check for dubs, but only if this isn't already highlighted
        if(no.charAt(no.length - 1) == no.charAt(no.length - 2))
        {
            // highlight it
            postNum[i].children[1].className += " dubsHighlight";
        }
    }
    window.lastNo = postNum.length;  //last number we checked
}

function addCSS()
{
    var css = document.createElement("style");
    css.type = "text/css";
    css.innerHTML = ".dubsHighlight { background-color: orange;" +
                    "padding: 0 1px; }";
    document.head.appendChild(css);
}

function getPosts()
{
    return document.getElementsByClassName("replyContainer").length
}


/* function colorText() colors the text in a post based on < > [] {} etc
 * This code is a modification of Chest54's extension
 *   http://userscripts.org/scripts/source/177986
 */
function colorText(postMessage)
{
        var checkora = postMessage.innerHTML.replace('<span class="fortune"','<br><span class="fortune"').split('<br>');
        for(j = 0; j < checkora.length; j++)
        {
        	temp = checkora[j].replace('\n','');
        	if(temp.length-temp.lastIndexOf('&lt;') == 4 && temp.indexOf('&lt;') !=-1)
        	{
        		checkora[j] = '<span style="color:orange">' + checkora[j] + '</span>';
        	}
        	else if(temp.indexOf('&lt;')==0)
        	{
        		checkora[j] = '<span style="color:red">' + checkora[j] + '</span>';
        	}
        	else if(temp.length-temp.lastIndexOf(' ]')== 2 && temp.indexOf(' ]') != -1)
        	{
        		if(temp.indexOf('[ ') == 0)
        		{
        			checkora[j] = '<span style="color:blue;font-family:monospace;font-weight:bold">' + checkora[j] + '</span>';
        		}
        	}
        	else if(temp.length-temp.lastIndexOf(' }') == 2 && temp.indexOf(' }') !=-1)
        	{
        		if(temp.indexOf('{ ') == 0)
        		{
        			checkora[j] = '<span style="color:purple;font-family:monospace;font-weight:bold">' + checkora[j] + '</span>';
        		}
        	}
        	if(temp.indexOf('[spoiler]') + 1 && temp.indexOf('[/spoiler]'))
        	{
        		if(temp.indexOf('[spoiler]')<temp.indexOf('[/spoiler]'))
        		{
        			checkora[j]=checkora[j].replace('[spoiler]','<span class="spoiler">');
        			checkora[j]=checkora[j].replace('[/spoiler]','</span>');
        		}
    	   }
        }
        var checkorb = checkora.join('<br>').replace('<br><span class="fortune"','<span class="fortune"');
        postMessage.innerHTML=checkorb;
} 
 
 
// handles post modifcations such as colorText() and replaceText()
function changePosts()
{
    var postMessage=document.getElementsByClassName('postMessage'); // get all post messages
    for(i = window.lastMessage; i < postMessage.length; i++)
    {
        colorText(postMessage[i]);
        replaceText(postMessage[i]);
    }
    window.lastMessage = postMessage.length;
}

function replaceText(postMessage)
{
    var totalCount = 0;  // count replaced stuff so we don't overdo it
    // replace everything in the replace list
    for(var key in window.replaceList)
    {
        var singleCount = 0;
        while(singleCount < window.replaceLimit && postMessage.innerHTML.indexOf(':'+key+':') != -1)
        {
            singleCount++;
            postMessage.innerHTML = postMessage.innerHTML.replace(':' + key + ':', '<img class="emote" src="' + window.replaceList[key] +
                                            '" alt="' + key + '" title="' + key + '" />');
        }
        totalCount += singleCount;
        if(totalCount >= window.totalLimit)
            break;
    }
}

// supposed to do stuff after a page is updated
function checkIfUpdated()
{
    //console.log("checked!");
    // if there are new posts, thread has been updated!
    if(window.posts < getPosts())
    {
        window.posts = getPosts();
        updateCare();       // update stuff!
    }
}

// things to do on thread update
function updateCare()
{
    highlightDubs();    // highlight new post dubs
    changePosts();      // update posts
}