HKGalden Board Filter

於吹水臺隱藏指定討論區的主題

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        HKGalden Board Filter
// @namespace   https://userscripts.org/scripts/show/177479
// @description 於吹水臺隱藏指定討論區的主題
// @author      HKGalden 小磁怪
// @license     MIT License
// @include     https://hkgalden.com/topics/BW*
// @include     http://hkgalden.com/topics/BW*
// @version     140728
// @icon        https://hkgalden.com/favicon.ico
// @grant       none
// ==/UserScript==

/* ********* 更新記錄 *********
版本140728
 - 連結修正
 - 修正在Tampermonkey環境下無法運行的問題
版本140725
 - 硬件臺+軟件臺=科技臺
 - 加入內務臺
 - 改用localStorage,更新至這版本後需要重新設定封鎖列表
版本140308
 - 改善程式碼
版本140307
 - 更改版本號規則,避免更新時出現降級提示
 - CSS修正
版本060314
 - CSS修正
版本031213
 - 「xx台」改為「xx臺」
 - 當滑鼠指向「Board Filter設定」時會顯示被隱藏的主題列表
版本151013-2
 - 「手機台」改為「電話台」
版本151013
 - 「手機遊戲台」改為「App台」
版本091013
 - 修正在 http://hkgalden.com/ 下無法運作的問題
版本071013
 - 修正無法更改設置的問題
 - 更新至這版本後需要重新設定封鎖列表
版本150913
 - 修正在Scriptish環境下無法運行的問題
 - 加入隱藏已封鎖用戶帖子的功能
 - 更換「設定已儲存, 自動F5中」提示的樣式
*************************** */

/*jslint browser: true, devel: true, plusplus: true, es5: true,  white: true */
/*jshint browser: true, devel: true, jquery: true, multistr: true, globalstrict: true */
/*global Storage, $*/
'use strict';

var bf_version = '140728';

var blocked_list = [];
var blocked_count = 0;
var bd = [];
	bd.p = function (p, c, n) { bd.push({'prefix': p.toLowerCase(), 'color': c, 'name': n}); };
	bd.p('BW', '#457cb0', '吹水臺');
	bd.p('ET', '#9952a1', '娛樂臺');
	bd.p('CA', '#198964', '時事臺');
	bd.p('FN', '#557f11', '財經臺');
	bd.p('GM', '#1d7acc', '遊戲臺');
	bd.p('AP', '#2090bb', 'App臺');
	bd.p('IT', '#5e6a7e', '科技臺');
	bd.p('MP', '#5762b0', '電話臺');
	bd.p('SP', '#993f50', '體育臺');
	bd.p('LV', '#c6325d', '感情臺');
	bd.p('SY', '#7f706a', '講故臺');
	bd.p('ED', '#3e903e', '飲食臺');
	bd.p('TM', '#c04611', '蕃茄臺');
	bd.p('TR', '#607752', '旅遊臺');
	bd.p('AN', '#ac4da0', '動漫臺');
	bd.p('TO', '#955f2d', '玩具臺');
	bd.p('MU', '#575bcd', '音樂臺');
	bd.p('VI', '#7a4d7f', '影視臺');
	bd.p('DC', '#366677', '攝影臺');
	bd.p('ST', '#887090', '學術臺');
	bd.p('TS', '#c52e40', '汽車臺');
	bd.p('MB', '#7c55c7', '站務臺');
	bd.p('IA', '#83aa38', '內務臺');
	bd.p('AC', '#974a70', '活動臺');
	bd.p('EP', '#9a705b', '創意臺');
	bd.p('BLK', '#666666', '已封鎖的用戶');

function g(p) {
	var i;
	for (i=0; i<bd.length; i++) {
		if (bd[i].prefix.toUpperCase()===p.toUpperCase()) {
			return bd[i].name;
		}
	}
	return '???';
}

Array.prototype.exist = function(e) {
	return !!~this.indexOf(e);
};
Array.prototype.pushIfNotExist = function(e) {
	if (!!!~this.indexOf(e)) {this.push(e);}
};
Array.prototype.remove = function(e) {
	for (var i = 0; i < this.length; i++) {
		if (this[i]==e) {this.splice(i, 1);}
	}
};

function JSONparse(s) {
	var obj = null;
	try {
		obj = JSON.parse(s);
		return obj;
	}
	catch(e){
		return null;
	}
}

//載入設定
var stored_settings, have_storage;
have_storage = (Storage !== undefined);
if (have_storage) {
	stored_settings = localStorage.getItem('bf_settings');
	if (!stored_settings) {
		localStorage.setItem('bf_settings', '[]');
	} else {
		blocked_list = JSONparse(stored_settings);
	}
} else {
	console.log('HKGalden Board Filter : No localStorage support');
}

$(function() {
	//Block台
	var blocked_title_list = [];
	blocked_title_list.p = function(r,t,l){blocked_title_list.push({'reason':'['+g(r)+']','title':t,'link':l});}
	var this_i = null;
	var is_lt = true;
	$('table#tpli.nxt tr').slice(1).each(function() {
		if ($(this).children('td.tic').length) {
			this_i = $(this).children('td.tic').children('i');
			for (var i = 0; i < blocked_list.length; i++) {
				if (this_i.hasClass(blocked_list[i].toLowerCase())) {
					$(this).hide();
					blocked_title_list.p(blocked_list[i], $(this).find('td.tnm > A').html(), $(this).find('td.tnm > A').prop('href'));
					blocked_count++;
				}
			}
		} else {
			if ($(this).hasClass('blked') && blocked_list.exist('blk')) {
				$(this).hide();
				var blk_name = $(this).find('td a').html();
				if (/^\/\/\s(\w+\s){3}(.+)\s\/\/$/.test(blk_name)) {
					blocked_title_list.p('blk', blk_name.match(/^\/\/\s(\w+\s){3}(.+)\s\/\/$/)[2], '#');
				} else {
					blocked_title_list.p('blk', '(無法辨識用戶名稱)', '#');
				}
				blocked_count++;
			}
		}
		if ($(this).is(':visible')) {
			$(this).removeClass('lt dt').addClass(is_lt?'lt':'dt');
			is_lt = !is_lt;
		}
	});
	
	//Board Filter設定面版
	$('span#xpndruls')
		.before('<div class="bf_panel nxt"></div>&nbsp;<span class="bf_panel_show">Board Filter設定<div class="bf_panel_tooltip nxt"></div></span>');
	$('div.bf_panel_tooltip')
		.css({
			'cursor'	: 'auto',
			'display'	: 'none',
			'z-index'	: '1',
			'font-size'	: '12px'
			})
		.html('已隱藏 ' + blocked_count + ' 個主題')
		.click(function(e) {
			e.stopPropagation();
		});
	$('span.bf_panel_show')
		.css({
			'cursor'		: 'pointer'
		})
		.hover(
			function () {
				var t = '';
				for (var i=0; i<blocked_title_list.length; i++) {
					t += blocked_title_list[i]['reason'] + '&nbsp;<a href="' + blocked_title_list[i]['link'] + '" target="_blank">' + blocked_title_list[i]['title'] + '</a><br />';
				}
				$('div.bf_panel_tooltip')
					.html('<div style="font-size:12pt;font-weight:bolder">已隱藏 ' + blocked_count + ' 個主題</div>' + t)
					.css({
						'display'	: 'block',
						'position'	: 'absolute',
						'padding'	: '5px',
						'left'		: $(this).position().left
					});
			}, 
			function () {
				$('div.bf_panel_tooltip')
					.css({
						'display'	: 'none'
					});
			}
		)
		.click(function() {
			if (!$('.bf_panel').is(':visible')) {
				if (have_storage) {
					$('.bf_panel').fadeIn(100);
				} else {
					alert('你的瀏覽器不支援 localStorage,無法更改設定');
				}
			}
		});
	$('.bf_panel')
		.css({
			'width'				: '400px',
			'height'			: '240px',
			'padding'			: '10px 10px 10px 10px',
			'z-index'			: '2046',
			'position'			: 'fixed',
			'top'				: '50%',
			'left'				: '50%',
			'margin-top'		: '-120px',
			'margin-left'		: '-200px',
			'box-shadow'		: '3px 3px 4px #888888',
			'box-sizing'		: 'border-box',
			'-moz-box-sizing'	: 'border-box'
		})
		.hide()
		.draggable({containment:'window'})
		.html('<span class="bf_title">Board Filter設定面版</span><div class="bf_options"></div><button class="bf_save bf_btn">儲存</button><button class="bf_cancel bf_btn">取消</button><span class="bf_about">版本 '+bf_version+'</span>');
	$('.bf_panel *')
		.css({
			'box-sizing'		: 'content-box',
			'-moz-box-sizing'	: 'content-box'
		})
	$('.bf_options')
		.css({
			'padding'		: '10px 15px 2px 15px'
		});
	for (var j = 1; j < bd.length+1; j++) {
		$('.bf_options')
			.append('<label class="bf_l '+bd[j-1].prefix+'" style="color:'+bd[j-1].color+';"><input type="checkbox" class="bf_o '+bd[j-1].prefix+'" value="'+bd[j-1].prefix+'" />'+bd[j-1].name+'</label>');
		if (j%4==0){
			$('.bf_options').append('<br />');
		}
	}
	$('.bf_title')
		.css({
			'font-weight'		: 'bolder'
		});
	$('.bf_l')
		.css({
			'padding-right'		: '18px',
			'font-weight'		: 'normal',
			'margin-bottom'		: '0'
		});
	$('.bf_o')
		.click(function() {
			if ($(this).prop('checked')) {
				blocked_list.pushIfNotExist($(this).prop('value'));
			} else {
				blocked_list.remove($(this).prop('value'));
			}
		})
		.each(function() {
			if (!!~blocked_list.indexOf($(this).prop('value'))) {
				$(this).prop('checked', true);
			} else {
				$(this).prop('checked', false);
			}
		})
		.css({
			'margin'		: '0px 4px 0px'
		});
	$('.bf_about')
		.css({
			'font-size'		: '12px',
			'position'		: 'absolute',
			'right'			: '15px',
			'bottom'		: '10px',
			'cursor'		: 'pointer'
		})
		.click(function() {
			window.open('https://greasyfork.org/scripts/3619-hkgalden-board-filter');
		});
	$('.bf_save')
		.css({
			'position'		: 'absolute',
			'left'			: '5px',
			'bottom'		: '5px',
			'cursor'		: 'pointer'
		})
		.click(function() {
			localStorage.setItem('bf_settings', JSON.stringify(blocked_list));
			$('.bf_about')
				.css({
					'color'		: 'red'
				})
				.html('設定已儲存, 自動F5中...');
			window.setTimeout(function(){location.reload(false);}, 300);
		});
	$('.bf_cancel')
		.css({
			'position'		: 'absolute',
			'left'			: '65px',
			'bottom'		: '5px',
			'cursor'		: 'pointer'
		})
		.click(function() {
			$('.bf_panel').fadeOut(100);
		});
});