Reading Blinds

By SUCCESS Last update Oct 6, 2008 — Installed 1,115 times. Daily Installs: 4, 2, 3, 1, 2, 2, 2, 4, 1, 2, 2, 7, 1, 4, 3, 5, 3, 1, 2, 4, 4, 3, 2, 1, 4, 3, 4, 5, 4, 1, 3, 5

There are 4 previous versions of this script.

// ==UserScript==
// @name           Reading Blinds
// @namespace      http://userscripts.org/
// @author         SUCCESS
// @description    护眼聚焦。“盖住”网页中不必要的区域,然后打开一扇适度的“阅读之窗”。
// @include        *
// @version        3
// ==/UserScript==

var showed = false;
var visible = false;
var size = window.innerHeight * 0.2; // 默认阅读区高度是窗口高度的 20%
var top_cover, bottom_cover;
var clientY;

var setShortcutKeysAction = '';
var show_hide_keycode, show_hide_shift, show_hide_ctrl, show_hide_alt; // 显示/隐藏 快捷键
var increase_keycode, increase_shift, increase_ctrl, increase_alt; // 扩大阅读区域 快捷键
var decrease_keycode, decrease_shift, decrease_ctrl, decrease_alt; // 缩小阅读区域 快捷键
var code2keyTable={'65':'A','66':'B','67':'C','68':'D','69':'E','70':'F','71':'G','72':'H','73':'I','74':'J','75':'K','76':'L','77':'M','78':'N','79':'O','80':'P','81':'Q','82':'R','83':'S','84':'T','85':'U','86':'V','87':'W','88':'X','89':'Y','90':'Z','48':'0','49':'1','50':'2','51':'3','52':'4','53':'5','54':'6','55':'7','56':'8','57':'9','96':'Numpad 0','97':'Numpad 1','98':'Numpad 2','99':'Numpad 3','100':'Numpad 4','101':'Numpad 5','102':'Numpad 6','103':'Numpad 7','104':'Numpad 8','105':'Numpad 9','106':'Numpad *','107':'Numpad +','108':'Numpad Enter','109':'Numpad -','110':'Numpad .','111':'Numpad /','112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12','8':'BackSpace','9':'Tab','12':'Clear','13':'Enter','16':'Shift','17':'Control','18':'Alt','20':'Cape Lock','27':'Esc','32':'Spacebar','33':'Page Up','34':'Page Down','35':'End','36':'Home','37':'Left Arrow','38':'Up Arrow','39':'Right Arrow','40':'Down Arrow','45':'Insert','46':'Delete','144':'Num Lock','186':';:','187':'=+','188':',<','189':'-_','190':'.>','191':'/?','192':'`~','219':'[{','220':'\|','221':']}','222':'"'};

// 注册 【设置 显示/隐藏 快捷键】 菜单
GM_registerMenuCommand('Reading Blinds - 设置 显示/隐藏 快捷键', function(){
	if(visible) hide();
    setShortcutKeysAction = 'show_hide';
    showShortcutKeySettings();
});

// 注册 【设置 扩大阅读区域 快捷键】 菜单
GM_registerMenuCommand('Reading Blinds - 设置 扩大阅读区域 快捷键', function(){
	if(visible) hide();
    setShortcutKeysAction = 'increase';
    showShortcutKeySettings();
});

// 注册 【设置 缩小阅读区域 快捷键】 菜单
GM_registerMenuCommand('Reading Blinds - 设置 缩小阅读区域 快捷键', function(){
	if(visible) hide();
    setShortcutKeysAction = 'decrease';
    showShortcutKeySettings();
});

// 初始化。读取各快捷键。
function init(){
    var keycodes, array;
	
	// 读取 显示/隐藏 快捷键
    keycodes = GM_getValue('show_hide', 'alt+116');
    array = keycodes.split('+');
    show_hide_keycode = array[array.length - 1];
    show_hide_shift = keycodes.indexOf('shift') > -1;
    show_hide_ctrl = keycodes.indexOf('ctrl') > -1;
    show_hide_alt = keycodes.indexOf('alt') > -1;
	
	// 读取 扩大阅读区域 快捷键
    keycodes = GM_getValue('increase', '107');
    array = keycodes.split('+');
    increase_keycode = array[array.length - 1];
    increase_shift = keycodes.indexOf('shift') > -1;
    increase_ctrl = keycodes.indexOf('ctrl') > -1;
    increase_alt = keycodes.indexOf('alt') > -1;
	
	// 读取 缩小阅读区域 快捷键
    keycodes = GM_getValue('decrease', '109');
    array = keycodes.split('+');
    decrease_keycode = array[array.length - 1];
    decrease_shift = keycodes.indexOf('shift') > -1;
    decrease_ctrl = keycodes.indexOf('ctrl') > -1;
    decrease_alt = keycodes.indexOf('alt') > -1;
}

// 显示设置快捷键的界面
function showShortcutKeySettings(){
	var cover = document.getElementById('setShortcutKey');
	var message = document.getElementById('message');
	if (!cover) {
		var cover = document.createElement('div');
		cover.setAttribute('id', 'setShortcutKey');
		cover.setAttribute('style', 'display: table; background: black; color: white; text-align: center; position: fixed; top:0; left:0; width:100%; height: 100%; opacity: .9; z-index:100;');
		var message = document.createElement('div');
		message.setAttribute('id', 'message');
		message.setAttribute('style', 'font-size: 200%; line-height: 1.5em; text-align: center; display: table-cell; vertical-align: middle; padding: 1em;');
	}
	switch (setShortcutKeysAction) {
		case 'show_hide':
			message.innerHTML = '功能:显示/隐藏<br />当前快捷键:<font color="red">' + parse2keys(GM_getValue('show_hide','alt+116')) + '</font><br />按 ESC 键保存当前设置并退出';
			break;
		case 'increase':
			message.innerHTML = '功能:扩大阅读区域<br />当前快捷键:<font color="red">' + parse2keys(GM_getValue('increase','107')) + '</font><br />按 ESC 键保存当前设置并退出';
			break;
		case 'decrease':
			message.innerHTML = '功能:缩小阅读区域<br />当前快捷键:<font color="red">' + parse2keys(GM_getValue('decrease','109')) + '</font><br />按 ESC 键保存当前设置并退出';
			break;
	}
    cover.appendChild(message);
    document.body.appendChild(cover);
}

// 关闭设置快捷键的界面
function hideShortcutKeySettings(){
    var cover = document.getElementById('setShortcutKey');
    cover.parentNode.removeChild(cover);
    setShortcutKeysAction = '';
}

// 将 keycode 转换成按键名称
function parse2keys(keycodes){
	var array = keycodes.split('+');
	array[array.length-1]=code2keyTable[array[array.length-1]] || '';
	return array.join('+');
}

// 打开 护眼聚焦
function show(){
    if (!showed) {
        top_cover = document.createElement('div');
        top_cover.setAttribute('style', 'background: black; width: 100%; position: fixed; left: 0; top: 0; opacity: .85; overflow: hidden; z-index: 100;');
        bottom_cover = document.createElement('div');
        bottom_cover.setAttribute('style', 'background: black; width: 100%; position: fixed; left: 0; bottom: 0; opacity: .85; overflow: hidden; z-index: 100;');
        var message = document.createElement('div');
        message.setAttribute('id', 'msgtip');
        message.setAttribute('style', 'text-align: right; padding: 1em; color: white;');
        message.innerHTML = '移动鼠标选择阅读区域。 “' + parse2keys(GM_getValue('increase', '107')) + '/' + parse2keys(GM_getValue('decrease', '109')) + '” 扩大/缩小阅读区域。 “' + parse2keys(GM_getValue('show_hide', 'alt+116')) + '” 显示/隐藏。';
        top_cover.appendChild(message);
        document.body.appendChild(top_cover);
        document.body.appendChild(bottom_cover);
        
        // 将阅读区移动到当前鼠标位置
        render(clientY);
        
        showed = true;
    }
    else {
        var message = document.getElementById('msgtip');
        message.innerHTML = '移动鼠标选择阅读区域。 “' + parse2keys(GM_getValue('increase', '107')) + '/' + parse2keys(GM_getValue('decrease', '109')) + '” 扩大/缩小阅读区域。 “' + parse2keys(GM_getValue('show_hide', 'alt+116')) + '” 显示/隐藏。';
        top_cover.style.display = '';
        bottom_cover.style.display = '';
        
        // 将阅读区移动到当前鼠标位置
        render(clientY);
    }
	
    // 移动鼠标选择阅读区域
    document.body.addEventListener('mousemove', function(event){
        clientY = event.clientY;
        if (visible) 
            render(clientY);
    }, false);
    
    visible = true;
}

// 关闭 护眼聚焦
function hide(){
    top_cover.style.display = 'none';
    bottom_cover.style.display = 'none';
    visible = false;
}

// 绘制阅读区域
function render(clientY){
    top_cover.style.height = clientY - size / 2 + 'px';
    bottom_cover.style.height = window.innerHeight - clientY - size / 2 + 'px';
}

// 设置快捷键
window.addEventListener('keydown', function(event){
    switch (setShortcutKeysAction) {
		// 显示/隐藏
        case 'show_hide':
            // ESC 退出
            if (event.keyCode == 27) {
				hideShortcutKeySettings();
                break;
            }

            show_hide_keycode = event.keyCode;
			show_hide_shift = event.shiftKey;
			show_hide_ctrl = event.ctrlKey;
			show_hide_alt = event.altKey;
			
            var Keys = '';
            if (show_hide_shift) {
                Keys += 'shift+';
            }
            if (show_hide_ctrl) {
                Keys += 'ctrl+';
            }
            if (show_hide_alt) {
                Keys += 'alt+';
            }
            
			var message = document.getElementById('message');
			message.innerHTML = '功能:显示/隐藏<br />当前快捷键:<font color="red">' + Keys + (code2keyTable[show_hide_keycode] || '') + '</font><br />按 ESC 键保存当前设置并退出';
			Keys += String(event.keyCode);
            GM_setValue('show_hide', Keys);
            break;
		// 扩大阅读区域
        case 'increase':
            // ESC 退出
            if (event.keyCode == 27) {
				hideShortcutKeySettings();
                break;
            }

            increase_keycode = event.keyCode;
			increase_shift = event.shiftKey;
			increase_ctrl = event.ctrlKey;
			increase_alt = event.altKey;
			
            var Keys = '';
            if (increase_shift) {
                Keys += 'shift+';
            }
            if (increase_ctrl) {
                Keys += 'ctrl+';
            }
            if (increase_alt) {
                Keys += 'alt+';
            }
            
			var message = document.getElementById('message');
			message.innerHTML = '功能:扩大阅读区域<br />当前快捷键:<font color="red">' + Keys + (code2keyTable[increase_keycode] || '') + '</font><br />按 ESC 键保存当前设置并退出';
			Keys += String(event.keyCode);
            GM_setValue('increase', Keys);
            break;
		// 缩小阅读区域
        case 'decrease':
            // ESC 退出
            if (event.keyCode == 27) {
				hideShortcutKeySettings();
                break;
            }

            decrease_keycode = event.keyCode;
			decrease_shift = event.shiftKey;
			decrease_ctrl = event.ctrlKey;
			decrease_alt = event.altKey;
			
            var Keys = '';
            if (decrease_shift) {
                Keys += 'shift+';
            }
            if (decrease_ctrl) {
                Keys += 'ctrl+';
            }
            if (decrease_alt) {
                Keys += 'alt+';
            }
            
			var message = document.getElementById('message');
			message.innerHTML = '功能:缩小阅读区域<br />当前快捷键:<font color="red">' + Keys + (code2keyTable[decrease_keycode] || '') + '</font><br />按 ESC 键保存当前设置并退出';
			Keys += String(event.keyCode);
            GM_setValue('decrease', Keys);
            break;
    }
}, true);

window.addEventListener('keyup', function(event){
    if (setShortcutKeysAction != '') return;
    // 显示/隐藏
    if ((event.altKey == show_hide_alt) && (event.ctrlKey == show_hide_ctrl) && (event.shiftKey == show_hide_shift) && (event.keyCode == show_hide_keycode)){
        if (!visible) {
            show();
        }
        else {
            hide();
        }
	} 
    
    // 调整阅读区域大小
    // 放大阅读区域
    else 
        if (visible && (event.altKey == increase_alt) && (event.ctrlKey == increase_ctrl) && (event.shiftKey == increase_shift) && (event.keyCode == increase_keycode)) {
            if (size < window.innerHeight / 2) {
                size += 5;
				render(clientY);
            }
        }
        // 缩小阅读区域
        else 
            if (visible && (event.altKey == decrease_alt) && (event.ctrlKey == decrease_ctrl) && (event.shiftKey == decrease_shift) && (event.keyCode == decrease_keycode)) {
                if (size > 10) {
                    size -= 5;
				render(clientY);
                }
            }
}, true);

init();