NeoGAF - Hide Forum Threads Mobile

Hides threads in Vbulletin boards.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name NeoGAF - Hide Forum Threads Mobile
// @namespace ThreadFilter
// @description Hides threads in Vbulletin boards.
// @require http://code.jquery.com/jquery-latest.min.js
// @require http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js
// @include http://m.neogaf.com/*
// @version 0.2
// ==/UserScript==

var sThreadTitle;
nShownCount = 0;
nOriginalPageCount = GetNextPage();
nPageCount = nOriginalPageCount;
nAdditionalThreadCount = 0;

$(document).ready(function() {
    IgnoreList = GetListFromLocalStorage('IgnoreList');
    
    if (IsMobile())
        {
         //$('#jumpToLogIn').after("<div style='display:none;'><select id='ThreadFilter' onchange='UpdateThreads();'><option value='Unignored' selected='true'>Show Unignored Only</option><option value='Ignored'>Show Ignored Only</option><option value='All'>Show All</option></select></div>");
    	 $('#jumpToLogIn').after("<a class='jumpTo' id='ShowUnignored'><span>Show Unignored Only</span></a><a class='jumpTo'  id='ShowIgnored'><span>Show Ignored Only</span></a><a  class='jumpTo'  id='ShowAll'><span>Show All</span></a>");
    	 $('#ShowUnignored').click(function() { localStorage.setItem('ThreadFilter','Unignored'); UpdateThreads();});
    	 $('#ShowIgnored').click(function() { localStorage.setItem('ThreadFilter','Ignored'); UpdateThreads();});
    	 $('#ShowAll').click(function() { localStorage.setItem('ThreadFilter','All'); UpdateThreads();});
            
    	   $(".listItemAnchor").each(function( index ) {
        nThreadID = $(this).attr('href').replace('showthread.php?t=','');
    
	    $(this).attr('id',nThreadID);
      	$(this).parent().on("swiperight",{param1: nThreadID, param2: 'IgnoreList', param3: UpdateThreads},IgnoreItem);
    	$(this).parent().on("swipeleft",{param1: nThreadID, param2: 'IgnoreList', param3: UpdateThreads},IgnoreItem);
        //$(this).parent().on("swiperight",SwipeHandler);
        //$(this).parent().on("swipeleft",SwipeHandler);
        
        //return;
        //$(this).append("<br /><a id='RemoveThread" + nThreadID + "' href=javascript:IgnoreThread('" + nThreadID + "');>" + sIgnoreText + "</a>");
		});
    
    
    	//$('div.listItem').on("swiperight",function (event) { IgnoreThread($(this).find('.listItemAnchor').attr('href').replace('showthread.php?t=',''));});
    	//$('div.listItem').on("swipeleft",function (event) { IgnoreThread($(this).find('.listItemAnchor').attr('href').replace('showthread.php?t=',''));});
    
    	//$('div.listItem').on("swiperight",{param1: $(this).find('.listItemAnchor').attr('href').replace('showthread.php?t=',''), param2: 'IgnoreList', param3: UpdateThreads},IgnoreItem);
    	}
    else
    {
    var sHideThreadStyle = 'margin-left: -11px;  margin-top: -38px;';
    var sHideThreadStyle2 = 'padding-left:10px; margin-left:-45px;  margin-top:-2px;';
    
    var sRemoveStyle = '<style>';
    sRemoveStyle += '.threadbit > td > a[id^="RemoveThread"]:before {  content: "x";  font-size: 15pt;}';
    sRemoveStyle += '.threadbit > td > a[id^="RemoveThread"] {  position: absolute !important;  ' + (navigator.userAgent.search("Chrome") >= 0 ? sHideThreadStyle : sHideThreadStyle2) + '  font-size: 0pt;  visibility: hidden !important;}';
    sRemoveStyle += '.threadbit > td:hover > a[id^="RemoveThread"] {  visibility: visible !important; } ';
    
    sRemoveStyle += '.threadbit > td > a[id^="RemoveUser"]:before {  content: "x";  font-size: 15pt;} ';
    sRemoveStyle += '.threadbit > td > a[id^="RemoveUser"] {  position: absolute !important;   padding-left:10px; margin-left:-25px;  margin-top:-2px;   font-size: 0pt;  visibility: hidden !important;} ';
    sRemoveStyle += '.threadbit > td:hover > a[id^="RemoveUser"] {  visibility: visible !important; } ';
    sRemoveStyle += '</style>';
    
    $("body").append("<link rel='stylesheet' href='//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css'>");
    $("body").append(sRemoveStyle);        
    
  	var sControlPanel = "<div id='tabs' style='display:none;'>";
  	sControlPanel += "<ul>";
  	sControlPanel += "<li><a href='#tabs-1'>Word Filter</a></li>";
    sControlPanel += "<li><a href='#tabs-2'>Ignored Threads</a></li>"; 
    sControlPanel += "<li><a href='#tabs-3'>Ignored Users</a></li>"; 
    sControlPanel += "<li><a href='#tabs-4'>Settings</a></li>";
    sControlPanel += "</ul>";
  	sControlPanel += "<div id='tabs-1'>";
    sControlPanel += CreateWordFilter();
    sControlPanel += "</div>";
    sControlPanel += "<div id='tabs-2'>";
    sControlPanel += "<div id='RecentlyIgnoredListing'></div>";
    sControlPanel += "</div>";
    sControlPanel += "<div id='tabs-3'>";
    sControlPanel += CreateIgnoredUserTab();
    sControlPanel += "</div>";
  	sControlPanel += "<div id='tabs-4'>";
    sControlPanel += CreateSettingsOptions();
    sControlPanel += "</div>";
	sControlPanel += "</div>";

    $('.large-button:first').parent().append("<select id='ThreadFilter'><option value='Unignored' selected='true'>Show Unignored Only</option><option value='Ignored'>Show Ignored Only</option><option value='All'>Show All</option></select>&nbsp;");
	$('.large-button:first').parent().append(sControlPanel);
    $('.large-button:first').parent().append($('<a id="OpenFilterCP" class="large-button submit">Filter CP</a>'));

	    $('#ThreadFilter').change(UpdateThreads); 
    $('#OpenFilterCP').click(OpenFilterCP);
	$('#AddWordButton').click(AddToWordFilter);
    $('#AddIgnoredUserButton').click(AddToIgnoredUserList);
    $('#SearchAdditional').change(function() { localStorage.setItem('SearchAdditional', this.checked); }); 
	
	$("td[id*='td_threadstatusicon_']").each(function( index,value ) { AddHideLink(this);});

    document.getElementById("ThreadFilter").value = CheckThreadFilterValue(localStorage.getItem("ThreadFilter"));
    
    if (localStorage.getItem("SearchAdditional"))
        $("#SearchAdditional").attr("checked", localStorage.getItem("SearchAdditional") == "true" ? true : false);
    else
        localStorage.setItem("SearchAdditional", "true");

    }

	UpdateThreads();

});

function UpdateThreads()
    {
      nShownCount = 0;
        
      if (IsMobile())
        {
            $(".listItemAnchor").each(function(index) 
        	{
    		 nThreadID = $(this).attr('href').replace('showthread.php?t=','');
    		 //sThreadTitle = $(this).find('.listItemTitle')[0].text();
             console.log(sThreadTitle);
                
             if (CheckThreadHidden(nThreadID,sThreadTitle))
                 $(this).hide();
             else
             {
                 nShownCount++;
                 $(this).show();
             }
    		});
        }
        else
        {
            $('#ThreadFilter').blur();
          	localStorage.setItem('ThreadFilter',document.getElementById("ThreadFilter").value);
      
            $("td[id*=td_threadstatusicon_]").each(function(index) 
        	{
    		 nThreadID = $(this).attr('id').replace('td_threadstatusicon_','');
    		 sThreadTitle = $('#thread_title_' + nThreadID).text();
             sUserID = $(this).siblings().find('a[href*="member.php?u="]')[0].href.replace("http://www.neogaf.com/forum/member.php?u=","");
             
             if (CheckThreadHidden(nThreadID,sThreadTitle,sUserID))
                 $(this).parent().hide();
             else
             {
                 nShownCount++;
                 $(this).parent().show();
             }
	    	});
            
            if (localStorage.getItem("SearchAdditional") == "true")
        	{
            	GetAdditionalThreads();
        	}
        }
        
} 



function GetAdditionalThreads()
{
    if (nShownCount < 40 && nPageCount <= nOriginalPageCount + 5)
    {
        var jqxhr = $.get(window.location.href + "&order=desc&page=" + nPageCount, ProcessAdditionalThread)
    	.done(function() {
        nPageCount ++;
        
        GetAdditionalThreads();
  		});
    }
}

function ProcessAdditionalThread(data)
{
	    var lastThread = $("td[id*='td_threadstatusicon_']").last();
    
        $(data).find("td[id*='td_threadstatusicon_']").each(function(index, value) 
       	{
            nThreadID = $(this).attr('id').replace('td_threadstatusicon_','');
        	sThreadTitle = $(data).find('#thread_title_' + nThreadID).text();
        	sUserID = $(this).siblings().find('a[href*="member.php?u="]')[0].href.replace("http://www.neogaf.com/forum/member.php?u=","");
            
        	nAdditionalThreadCount = nAdditionalThreadCount + 1;
        	
        	if (!CheckThreadHidden(nThreadID, sThreadTitle, sUserID) && nShownCount < 40)
            	{
    	            $(lastThread).parent().after($(this).parent().clone().wrap('<p>').parent().html());
    	    		AddHideLink($("td[id*=td_threadstatusicon_" + nThreadID + "]"));    	
            		nShownCount++;
            	}
           
    	});
}

function CheckThreadFilterValue(sFilterValue)
{
    if (sFilterValue != "Unignored" && sFilterValue != "Ignored" && sFilterValue != "All")
        sFilterValue = "Unignored";
    
    return sFilterValue;
}

function IgnoreItem(event) { 
    var nCurrentID = event.data.param1;
    var sList = event.data.param2;
    var addItem = {};
    addItem.ID = nCurrentID;
    
    if (sList == "IgnoreList")
        addItem.Title = $('#thread_title_' + nCurrentID).text();
    else if (sList == "IgnoredUserList")
        addItem.Username = $('a[href="member.php?u=' + nCurrentID + '"]').attr("title");
    
    CurrentList = GetListFromLocalStorage(sList);
    nFoundIndex = containsObject(nCurrentID,CurrentList);
    
    if (nFoundIndex == -1) 
    	CurrentList.push(addItem); 
    else 
    	CurrentList.splice(nFoundIndex,1); 
        
    
	localStorage.setItem(sList, JSON.stringify(CurrentList));
    
    if (event.data.param3)
    	event.data.param3();
    
    return 0;
}

function AddHideLink(currentThread)
{
    	nThreadID = $(currentThread).attr('id').replace('td_threadstatusicon_','');
        MemberLink = $(currentThread).siblings().find('a[href*="member.php?u="]')[0];
    	nUserID = MemberLink.href.replace("http://www.neogaf.com/forum/member.php?u=","");
    
    	var RemoveUserLinks = $('a[id*=RemoveUser' + nUserID + ']').toArray();
    
    	sUserIDReference = (RemoveUserLinks.length > 0) ? nUserID + RemoveUserLinks.length : nUserID;
    
    	//if (RemoveUserLinks.length > 0)
          //  console.log('multiple references to ' + nUserID);
    
        $(MemberLink).before("<a id='RemoveUser" + sUserIDReference + "'>Remove User</a>");
    	$('#RemoveUser' + sUserIDReference).click({param1: nUserID, param2: 'IgnoredUserList', param3: UpdateThreads}, IgnoreItem); 
	
    	if ($(currentThread).has("a[id*='RemoveThread" + nThreadID + "']").length == 0)
	    {
    	    $('<a></a>', {
	  	    id: "RemoveThread" + nThreadID
			}).appendTo(currentThread);
        
    	    $('#RemoveThread' + nThreadID).click({param1: nThreadID, param2: 'IgnoreList', param3: UpdateThreads}, IgnoreItem); 
    	}
}


function CheckThreadHidden(nThreadID, sThreadTitle,sUserID)
{
    		var sThreadFilterVal = CheckThreadFilterValue(localStorage.getItem("ThreadFilter"));
    		var bWordFilterApplies = false;
    		var bUserFilterApplies = false;
    
    		IgnoreList = GetListFromLocalStorage('IgnoreList');
    		nThreadIndex = containsObject(nThreadID,IgnoreList);
    		
    		var bThreadIgnored = (nThreadIndex == -1) ? false : true;
    
             if (bThreadIgnored && sThreadFilterVal == 'Unignored' )
             {
                 return true;
             }
             else
             {
                 bWordFilterApplies = WordFilterApplies(sThreadTitle);
                 
                 if (bWordFilterApplies && sThreadFilterVal == 'Unignored')
             		{
                 		return true;
             		}
                else 
                 	{
                        bUserFilterApplies = containsObject(sUserID,GetListFromLocalStorage('IgnoredUserList')) != -1 ? true : false;   
                      
                      if (bUserFilterApplies && sThreadFilterVal == 'Unignored')
             			{
                            return true;
             			}
                     else if (!bThreadIgnored && !bWordFilterApplies && !bUserFilterApplies && sThreadFilterVal == 'Ignored')
             			{
                 			return true;
             			}
                 	}
             	
             }
    
    return false;
}

function WordFilterApplies(sThreadTitle)
{
    var bFilterApplies = false;
	WordList = GetListFromLocalStorage('WordList');
            
    jQuery.each(WordList,function (index)
	{
        if (this.Type == 'plaintext')
		{
			sFragments = this.Word.split('*');
		
			bMatchesPattern = true;
			jQuery.each(sFragments, function(index)
			{
				if (sThreadTitle.toLowerCase().indexOf(this.toLowerCase()) == -1)
				{
					bMatchesPattern = false;
				}
			});
		
			if (bMatchesPattern === true)
            	{
                    bFilterApplies = true;
					return 0;
            	}
		}
		else if (this.Type == 'regularexpression')
		{
			sRegExMatches = sThreadTitle.match(this.Word);
			
			if (sRegExMatches)
            {
                bFilterApplies = true;
                return 0;
            }
		}
    });
	
    return bFilterApplies;
 }   
 

function AddToWordFilter(event) {
    newWord = $('#AddWordText').val();

    var addWord = {};
    addWord.Word = newWord;
    addWord.Type = $('input[name*=AddWordType]:checked').val();

    WordList = GetListFromLocalStorage('WordList');
    nWordIndex = containsObject(addWord.Word, WordList);

    if (nWordIndex == -1) {

        WordList.push(addWord);
    }

    localStorage.setItem('WordList', JSON.stringify(WordList));
    $('#AddWordText').val('');
    
    UpdateListing('WordListing', 'WordList');
}

function AddToIgnoredUserList(event) {
    newIgnoredUserText = $('#AddIgnoredUserText').val();

    var addIgnoredUser = {};
    addIgnoredUser.Username = newIgnoredUser;

    IgnoredUserList = GetListFromLocalStorage('IgnoredUserList');
    nIgnoredUserIndex = containsObject(addIgnoredUser.Username, IgnoredUserList);

    if (nIgnoredUserIndex == -1) {
        IgnoredUserList.push(addIgnoredUser);
    }

    localStorage.setItem('IgnoredUserList', JSON.stringify(IgnoredUserList));
    $('#AddIgnoredUserText').val('');
    
    UpdateListing('IgnoredUserListing', 'IgnoredUserList');
}

function CreateWordFilter()
{
    sWordFilter = "<div id='WordFilter'>";
    sWordFilter += "<strong>Add New Word:</strong>&nbsp;<input id='AddWordText'><input type='button' id='AddWordButton' value='Add'><br /><input type='radio' name='AddWordType' value='plaintext' checked>Plain Text (* supported)<input type='radio' name='AddWordType' value='regularexpression'>Regular Expression<br /><br /><hr width='100%' color='black'><div id='WordListing'></div>";
    sWordFilter += "</div>";
    
    return sWordFilter;
}

function CreateIgnoredUserTab()
{
    sIgnoredUserTab = "<hr width='100%' color='black'><div id='IgnoredUserListing'></div>";
    
    return sIgnoredUserTab;
}

function CreateSettingsOptions()
{
    sCreateSettings = "<input type='checkbox' id='SearchAdditional' checked='true'>Search additional pages for threads</input>";
    
    return sCreateSettings;
}

function OpenFilterCP()
    {
    	UpdateListing('WordListing', 'WordList');
        UpdateListing('RecentlyIgnoredListing', 'IgnoreList');
        UpdateListing('IgnoredUserListing', 'IgnoredUserList');
        
        $('#tabs').tabs();
        $('#tabs').dialog();
        $('#tabs').bind('dialogclose', function(event) { UpdateThreads();});
    	$('#tabs').dialog({ title: "Filter Control Panel"});
        $("#tabs").dialog("option", "width", $("#tabs").dialog( "option", "width" ) + 200);
    }

function UpdateListing(sListingDiv, sListName)
{
	$('#' + sListingDiv).empty();
    CurrentList = GetListFromLocalStorage(sListName);
 
    if (sListName == 'IgnoreList' || sListName == 'IgnoredUserList')
        CurrentList.reverse();
    
    var sListingText;

	if (sListName == 'IgnoredUserList')    
    	sColumnHeadings = '<td align="center" width="300px"><strong>Username</strong></td>';
    else if (sListName == 'IgnoreList')
        sColumnHeadings = '<td align="center" width="300px"><strong>Title</strong></td>';
    else if (sListName == 'WordList')
        sColumnHeadings = '<td align="center" width="200px"><strong>Word</strong></td><td align="center" width="200px"><strong>Type</strong></td>';
    
    sListingText = '<table width="100%"><tr>' + sColumnHeadings + '<td>&nbsp;</td></tr>';
	
    
  	jQuery.each(CurrentList,function (index) 
	{	
        if (sListName == 'IgnoredUserList')    
        	sListingText += '<tr><td align="center"><div style="word-wrap:break-word;width:300px"><a href="http://www.neogaf.com/forum/member.php?u=' + this.ID + '" target="_blank">' + this.Username + '</a></div></td><td><input type=button id="RemoveIgnoredUser' + this.ID + '" value=Unignore /></td></tr>';
    	else if (sListName == 'IgnoreList')
        	sListingText += '<tr><td align="center"><div style="word-wrap:break-word;width:300px"><a href="http://www.neogaf.com/forum/showthread.php?t=' + this.ID + '" target="_blank">' + this.Title + '</a></div></td><td><input type=button id="RemoveRecentlyIgnored' + this.ID + '" value=Unignore /></td></tr>';
    	else if (sListName == 'WordList')
        	sListingText += '<tr><td align="center"><div style="word-wrap:break-word;width:200px">' + this.Word + '</div></td><td align="center">' + this.Type + '</td><td><input type=button id="RemoveWord' + index + '" value=Remove /></td></tr>';
    
	});
    
    sListingText += '</table>';
    
    $('#' + sListingDiv).append(sListingText);
        
    jQuery.each(CurrentList,function (index) 
                {
                    if (sListName == 'IgnoredUserList')    
                        $('#RemoveIgnoredUser' + this.ID).click({sCurrentID: this.ID, sListName: 'IgnoredUserList', sListDiv: 'IgnoredUserListing'}, RemoveIgnored);
			    	else if (sListName == 'IgnoreList')
        	            $('#RemoveRecentlyIgnored' + this.ID).click({sCurrentID: this.ID, sListName: 'IgnoreList', sListDiv: 'RecentlyIgnoredListing'}, RemoveIgnored);
    				else if (sListName == 'WordList')
                        $('#RemoveWord' + index).click({sCurrentID: this.Word, sListName: 'WordList', sListDiv: 'WordListing'}, RemoveIgnored);
                    
                });
}


function RemoveIgnored(event) { 
    IgnoreList = GetListFromLocalStorage(event.data.sListName);
    nCurrentIndex = containsObject(event.data.sCurrentID,IgnoreList);
    IgnoreList.splice(nCurrentIndex,1); 
    localStorage.setItem(event.data.sListName, JSON.stringify(IgnoreList));
    
    UpdateListing(event.data.sListDiv,event.data.sListName);
}

function containsObject(id, list) {
	    var i;
	    for (i = 0; i < list.length; i++) {
		    if (list[i].ID == id || list[i].Word == id) {
    			return i;
    			}
    		}

    	return -1;
	}

function GetNextPage()
{
    var str = window.location.href; 
	var res = str.match("page=[0-9]+");
    
    if (res)
        	return parseInt(res[0].replace("page=","")) + 1;
    else
            return 2;
                        
}

function GetListFromLocalStorage(sListName)
{
     return localStorage.getItem(sListName) ? JSON.parse(localStorage.getItem(sListName)) : [];
}

function IsMobile()
{
    return window.location.href.indexOf('m.neogaf') != -1 ? true : false;
}