HKGalden Quote Folder

縮短引用、縮小引用內圖片

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        HKGalden Quote Folder
// @namespace   https://userscripts.org/scripts/show/406097
// @description 縮短引用、縮小引用內圖片
// @author      HKGalden 小磁怪
// @license     MIT License
// @include     https://hkgalden.com/view/*
// @include     http://hkgalden.com/view/*
// @version     140728
// @icon        https://hkgalden.com/favicon.ico
// @grant       none
// ==/UserScript==

/* ********* 更新記錄 *********
版本140728
 - 連結修正
版本140725
 - 沒有更新
版本140310
 - 修復一個會令「快速引用」不能正常彈出的BUG
版本140309
 - 改善程式碼
 - 以圖示取代原有的文字按鈕
 - 在所有引用層加入暫時縮短功能
版本140307-1
 - 走位修正
*************************** */

/*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 qf_version = '140728';

//載入設定
var show_level, img_height, have_storage, tmp;
have_storage = (Storage !== undefined);
if (have_storage) {
	tmp = localStorage.getItem('qf_settings_show_level');
	if (!tmp) {
		localStorage.setItem('qf_settings_show_level', 3);
		show_level = 3;
	} else {
		show_level = parseInt(tmp, 10);
		console.log('HKG Quote Folder : localStorage Quote Level = ' + show_level);
	}
	tmp = localStorage.getItem('qf_settings_img_height');
	if (!tmp) {
		localStorage.setItem('qf_settings_img_height', 150);
		img_height = 150;
	} else {
		img_height = parseInt(tmp, 10);
		console.log('HKG Quote Folder : localStorage Image Max Height = ' + img_height);
	}
} else {
	show_level = 3;
	img_height = 150;
	console.log('HKG Quote Folder : No localStorage support');
}

//判斷A<=x<=B的簡便方法
//http://indisnip.wordpress.com/2010/08/26/quicktip-check-if-a-number-is-between-two-numbers/
Number.prototype.between = function (first, last) {
	return (first < last ? this >= first && this <= last : this >= last && this <= first);
};

$(function () {

	//修正Firefox按鈕虛線外框問題,此項CSS無法透過jQuery.fn.css方法添加
	//http://www.karlrixon.co.uk/writing/remove-button-focus-outline-using-css/
	$('head').append('<style type="text/css"> \
						button[class^="qf_btn_"]::-moz-focus-inner { \
							border: 0; \
						} \
						</style> \
					');

	//圖示
	//Tango Icon Library | https://www.iconfinder.com/search/?q=iconset:tango-icon-library
	var icon_plus = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABzklEQVRIie2UvWuTURTGf+fNR41iRWxV/FgU3QQXVxEcFJyEDo6dHATFzdEU/AMsrh10EAQt/QvaDg6uOpRu6pDUxqavxIbqmzf3PA5JNNFoXkFBpA/c5d5zz/Oc+5xzYQf/PSxr4PlbTx9Gke0CMClZnp2aBtOoe/msBFcvnL5y8tjEBMDrSn1zef+MUebPEWAQNxMEo7P2IfqNWAAkCO5/h0ACZODZixj6RBdvzz8qjOVKg7tWEIYANytcSs7OcWfhK1H6OYSl2anr3+ca2kX3F15tnDjaMVQIZLhE3EyRYN/uPC5DEi4hweqbWu3e9LnDGSqQJa2XXom3QR1DJSN4J1EaYHMrpR1E20UIIjh82EqGGvMjQXnG4uZlL5RKyCGIrkrjXZzgwMHxIi4RXLg6MR8/tUJGgrt6cfPZY8tVi/3bZ04dumbFvZMSVNc36qtv3z8xfRs0dyXDCDJP8o0Hz6s2Nn5EgtZ2Y22usXSccnlkv2ZpUwNy7o4ELnAXrKxkEvezSY6AXPc8B0TtICuoZ7gbi4t7gBRoAwHIaPIgQW/lK2uxTR5I111Srd6ISNMCg7/G0F/kV2VGXQFR3+rFq6u4p7w9LPkO/g18ATeq4QJygwMsAAAAAElFTkSuQmCC)';
	//FS Icons Ubuntu | https://www.iconfinder.com/search/?q=iconset:fs-icons-ubuntu-by-franksouza-
	var icon_minus = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADhSURBVDiN7dRBSgNBFITh/3WcEXSrLlWI5/FArryA9/EOHkDwAAaUKEJIGKe7yoUG02QUN9nI1O5R3R80NC9ss4uknagjPMKD2dscZjeXR23y/vaxZTWtBqoSjc6ubmeDcDu9uMvz53MwCWPrs/ABWGDAorEJjGSiNUUC0ioiTmwvtuB+/lL6h3uaScLx8zPXVQJssEznVHkVnLNQV/BEv8KbsUHFmFTdqOE+s+wyXQqCv8nGFEGmVB+hgh+fXq/fDo9PkbAxCL62lEohHBbiuwdJgHBEBt7XVozbbYT/AfwBNxB4sYl2bPoAAAAASUVORK5CYII=)';

	//摺疊按鈕
	$('head').append('<style type="text/css"> \
						div.qf_fold_btn { \
							width: 30px; \
							height: 30px; \
							background-repeat: no-repeat; \
							cursor: pointer; \
							position: absolute; \
							display: inherit; \
							margin-left: -27px; \
							opacity: 0; \
						} \
						div.qf_btn_plus { \
							background-image: ' + icon_plus + ' \
						} \
						div.qf_btn_minus { \
							background-image: ' + icon_minus + ' \
						} \
					</style>');

	//根據顯示層數產生Selector
	function quote_selector(n) {
		var i, r = 'div.ctn';
		for (i = 1; i <= show_level; i++) {
			r += ' > blockquote' + (n===true?' > div':'');
		}
		return r;
	}

	//產生摺疊按鈕
	function create_fold_btn() {
		$('div.ctn').find('blockquote')
			.each(function (index) {
				if ((!$(this).hasClass('qf_quote_mod'))) {
					$(this)
						.addClass('qf_quote_mod qf_quote_' + index)
						.wrapInner('<div class="qf_content"></div>')
						.prepend('<div class="qf_fold_btn qf_btn_minus"></div>');
				}
			});
		$('div.ctn > blockquote')
			.off('mouseover mouseout')
			.on('mouseover mouseout', function (e) {
				e.stopPropagation();
				var target = $(e.target),
					target_bq = (target.prop('tagName') === 'BLOCKQUOTE') ? target : target.parent('blockquote'),
					target_btn = target_bq.children('.qf_fold_btn').first();
				if (e.type === 'mouseover') {
					target_btn.fadeTo(100, 1).clearQueue();
				} else {
					if (target_btn.hasClass('qf_btn_minus')) {
						target_btn.fadeTo(100, 0).clearQueue();
					}
				}
				if (target.hasClass('qf_fold_btn')) {
					if (e.type === 'mouseover') {
						if (target_bq.children('div.qf_content').first().is(':visible')) {
							target_bq.css('outline', '1px dotted black');
						}
					} else {
						target_bq.css('outline', 'none');
						if (target.hasClass('qf_btn_minus')) {
							target.fadeTo(100, 0).clearQueue();
						}
					}
				}
			});
		$('.qf_fold_btn')
			.unbind('click') 
			.click(function (e, d) {
				if (d === undefined) {d = false;}
				var blockquote = $(this).closest('blockquote');
				if ($(this).hasClass('qf_btn_minus')) {
					if (!(d && blockquote.hasClass('qf_d'))) {
						blockquote
							.css({
								'outline'	: 'none',
								'height'	: '20px'
							})
							.children('div.qf_content').first().hide();
						$(this)
							.removeClass('qf_btn_minus').addClass('qf_btn_plus');
					}
					if (d) {
						$(this).fadeTo(0, 1).clearQueue();
						blockquote
							.addClass('qf_d');
					}
				} else if (!d && $(this).hasClass('qf_btn_plus')) {
					blockquote
						.css({
							'outline'		: '1px dotted black',
							'height'		: 'auto'
						})
						.children('div.qf_content').first().show();
					$(this)
						.removeClass('qf_btn_plus').addClass('qf_btn_minus');
				}
			});
		$(quote_selector(true) + '.qf_fold_btn')
			.trigger('click', [true]);
	}

	if (img_height >= 1) {
		$('blockquote').find('img').css('max-height', img_height + 'px');
	}
	if (show_level >= 1) {
		create_fold_btn();
		$(document).ajaxComplete(function (event, xhr, settings) {
			if (settings.url === '/ajax/loadReplies') {
				console.log('HKG Quote Folder : ajaxComplete');
				create_fold_btn();
			}
		});
	}

	//設定面版
	$('section.gpt.author > div > div > div.ract')
		.prepend('<span class="qf_panel_show">引用縮短設定</span>');
	$('div#main > article')
		.before('<div class="qf_panel nxt"></div>');
	$('span.qf_panel_show')
		.click(function () {
			if (!$('.qf_panel').is(':visible')) {
				if (have_storage) {
					$('.qf_panel').fadeIn(100);
				} else {
					alert('你的瀏覽器不支援 localStorage,無法更改設定');
				}
			}
		});
	$('.qf_panel')
		.css({
			'width'				: '325px',
			'height'			: '210px',
			'padding'			: '10px 10px 10px 10px',
			'z-index'			: '2046',
			'position'			: 'fixed',
			'top'				: '50%',
			'left'				: '50%',
			'margin-top'		: '-105px',
			'margin-left'		: '-162px',
			'box-shadow'		: '3px 3px 4px #888888',
			'box-sizing'		: 'border-box',
			'-moz-box-sizing'	: 'border-box'
		})
		.hide()
		.draggable({containment: 'window'})
		.html('<span class="qf_title">引用縮短設定</span><br /> \
				<div class="qf_options"> \
					顯示層數<br />預設3,最小1(隱藏引用),0關閉<br /> \
					<input type="number" class="qf_panel_level" name="qf_panel_level" min="0" max="100"></input><br /> \
					引用圖片最大高度(px),0關閉<br /> \
					<input type="number" class="qf_panel_imgh" name="qf_panel_imgh" min="1" max="10000"></input><br /> \
				</div> \
				<button class="qf_save qf_btn">儲存</button> \
				<button class="qf_cancel qf_btn">取消</button> \
				<span class="qf_about">版本 ' + qf_version + '</span>'
		);
	$('.qf_panel *')
		.css({
			'box-sizing'		: 'content-box',
			'-moz-box-sizing'	: 'content-box'
		});
	$('.qf_options')
		.css({
			'padding'			: '10px 15px 2px 15px'
		});
	$('.qf_options input')
		.css({
			'border-style'		: 'dotted',
			'border-width'		: '1px',
			'width'				: '240px'
		});
	$('.qf_panel_level')
		.val(show_level);
	$('.qf_panel_imgh')
		.val(img_height);
	$('.qf_title')
		.css({
			'padding'			: '10px 0 0 10px',
			'font-weight'		: 'bolder'
		});
	$('.qf_about')
		.css({
			'font-size'			: '12px',
			'position'			: 'absolute',
			'right'				: '15px',
			'bottom'			: '10px',
			'cursor'			: 'pointer'
		})
		.click(function () {
			window.open('https://greasyfork.org/scripts/3620-hkgalden-quote-folder');
		});
	$('.qf_save')
		.css({
			'position'			: 'absolute',
			'left'				: '5px',
			'bottom'			: '5px',
			'cursor'			: 'pointer'
		})
		.click(function () {
			if (parseInt($('.qf_panel_level').val(), 10).between(0, 100)) {
				if (parseInt($('.qf_panel_imgh').val(), 10).between(0, 10000)) {
					localStorage.setItem('qf_settings_show_level', parseInt($('.qf_panel_level').val(), 10));
					localStorage.setItem('qf_settings_img_height', parseInt($('.qf_panel_imgh').val(), 10));
					$('.qf_about')
						.css({
							'color'		: 'red'
						})
						.html('設定已儲存, 自動F5中...');
					window.setTimeout(function () { location.reload(false); }, 200);
				} else {
					alert('圖片高度範圍必須為0-10000px');
				}
			} else {
				alert('引用層數必須為0-100');
			}
		});
	$('.qf_cancel')
		.css({
			'position'			: 'absolute',
			'left'				: '65px',
			'bottom'			: '5px',
			'cursor'			: 'pointer'
		})
		.click(function () {
			$('.qf_panel').fadeOut(100);
		});

});