// ==UserScript== // @name Enhanced word highlight // @name:en Enhanced word highlight // @namespace http://userscripts.org/users/86496 // @description 在搜索引擎和任意网页获得增强的高亮! // @description:en Enhanced keywords highlight for Search Engines and All ! // @match *://*/* // @exclude http://maps.google.com/* // @exclude https://maps.google.com/* // @grant GM_log // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_openInTab // @grant GM_registerMenuCommand // @license GNU GPLv3 // @version 1.6.4 // @downloadURL none // ==/UserScript== // great credit for original script wright os0x [http://userscripts.org/scripts/show/43419] // hzhbest modded | detail in http://userscripts.org/scripts/show/64877 // 164: add fading animation to indicator bar, mod config box, skip word list //console.time("highlight"); //var l = function(){var len = arguments.length; var tx=''; for(i=0;i // #### Config I #### --------------------------{{ // List of url patterns; Array('NAME', 'KEYWORD_PREFIX', 'URL_PATTERN') urlArr[0] = ['Google', 'q=', 'www.google.']; urlArr[1] = ['Yahoo', 'p=', 'search.yahoo.c']; urlArr[2] = ['Baidu', 'wd=', 'www.baidu.com']; urlArr[3] = ['Baidu', 'word=', '.baidu.com']; urlArr[4] = ['Ask', 'q=', 'www.ask.com']; urlArr[5] = ['Bing', 'q=', '.bing.com']; urlArr[6] = ['Youdao', 'q=', 'www.youdao.com']; urlArr[7] = ['cnki', 'keyValue=', 'kns.cnki.net']; // List of IDs of query input boxes; Array('#SEARCHBOX_ID#', 'SEARCHPAGE SPEC_URL') queryArr[0] = ['query', '/search']; // most common queryArr[1] = ['search', '']; // most common queryArr[2] = ['script_q', 'userscripts.org/scripts/search']; // userscripts.org queryArr[3] = ['top-search-input', 'www.verycd.com/search/folders']; // verycd.com queryArr[4] = ['search-q', '/search']; // addons.mozilla.org // keybinds var KEY_NEXT = 'n'; // "n" Next occurrence var KEY_PREV = 'N'; // "Shift-n" Previous occurrence var KEY_SEARCH = 'M-/'; // "Alt-/" Add keywords var KEY_OFF = 'M-,'; // "Alt-," Suspend highlight var KEY_CLOSE = 'C-M-/'; // "Ctrl-Alt-/" Disable highlight var KEY_EDIT = 'M-.'; // "Alt-." Edit highlight var KEY_REFRESH = 'r'; // "r" Refresh highlight // delay of highlighting (ms) var delay = 500; // instant highlight selected keywords var instant = true; // restore focus and scroll position after closing keyword input box with shortcut key? // mainly useful for keyboard navigation, not recommend for mouse navigation. var refocus = false; // minimize the panel initially? var panel_hide = false; // #### Config I #### --------------------------}} //} if (window.top != window.self) panel_hide = true; //hide panel in iframes //{ Config II > // #### Config II #### --------------------------{{ // What's your main auto-pager tool? // 0 - Autopagerize (GM script) // 1 - AuroPager (Firefox Extension) // 2 - Other (Other auto-pager scripts, site-specific scripts, bookmarklets, etc.) // From top option to botom one, the compatibility of the script // will be strengthened while the performance of highlight will be lower. var ap_option = 0; // turn off short keywords (one or two letters or number) by default? // 0-no, 1-one letter, 2-one or two letters var off_short_words = 1; // skip highlighting word list var skip_word_list = "the to in on among between and a an of by with".split(' '); // Stop auto-highlight on supported pages? // 0-no, 1-yes, 2-only those from search results, 3-only search results var no_auto_hili = 0; // sort keywords? 0-no, 1-yes // Setting this to "yes" will produce better highlight result, // while "no" will perform faster and support ReExp input better. var sort_keywords = 1; // save panel position? var save_panel_pos = false; // show indicator bar when navigating? var show_indc_bar = true; // #### Config II #### --------------------------}} //} // var config = { // key: {next:'n', prev:'N', srch:'C-/', off:'M-.', clos:'C-M-/', edit:'M-/', rfsh:'r'}, // delay:500, // instant:true, // refocus:false, // ap_comp: { // name: '', // val: getv('ap_comp', 0), // dom: {label:'LABLE', type:'radio', set:['set1','set2','set3']} // }, // short_w: { // name: '', // val: getv('short_w', 1), // dom: {label:'LABLE', type:'radio', set:['set1','set2','set3']} // }, // sort_kw: { // name: '', // val: getv('sort_kw', true), // dom: {label:'LABLE', type:'checkbox', set:['set1']} // } // } // GM APIs available? if (typeof GM_getValue == "function") var gm_ok = true; // Configs if (!gm_ok) { // var Ewh_configs = [ap_option, off_short_words, no_auto_hili, sort_keywords, save_panel_pos, show_indc_bar]; } else { var Ewh_configs = GM_getValue(CO_PRE, '0|1|0|1|0|0').split('|'); } for (i in Ewh_configs) {Ewh_configs[i] = Number(Ewh_configs[i]);} // Locked keywords if (gm_ok) var keyword_store = GM_getValue(ST_PRE); // Saved position var panel_pos_arr = ['right:-1px;','bottom:-1px;']; if (Ewh_configs[4] && gm_ok) panel_pos_arr = GM_getValue(PO_PRE, panel_pos_arr.join('|')).split('|'); // Configs menu if (gm_ok) window.addEventListener('load', function(){GM_registerMenuCommand(_di.confT[_L], config_box);}, false); if (gm_ok) { unsafeWindow.EWH_iSearch = function() {instant_search(false, null);}; unsafeWindow.EWH_cClose = function() {command_close();}; } // main process init_keyboard(); if (load_keyword() !== false || init_keyword() !== false) { //window.addEventListener('load', go, false); setTimeout(go, delay); } // var oldurl = window.location.href; // window.addEventListener('DOMNodeInserted', function(e){ l(window.location.href); // if (window.location.href !== oldurl) { // if (load_keyword() !== false || init_keyword() !== false) { // setTimeout(go, delay*2); // } // } // }, false); function go(){ setup(); /* // CHECK FOR UPDATE // if (gm_ok) {var SUC_script_num = 64877; try{function updateCheck(forced){if ((forced) || (parseInt(GM_getValue('SUC_last_update', '0')) + 86400000 <= (new Date().getTime()))){try{GM_xmlhttpRequest({method: 'GET',url: 'http://userscripts.org/scripts/source/'+SUC_script_num+'.meta.js?'+new Date().getTime(),headers: {'Cache-Control': 'no-cache'},onload: function(resp){var local_version, remote_version, rt, script_name;rt=resp.responseText;GM_setValue('SUC_last_update', new Date().getTime()+'');remote_version=parseInt(/@uso:version\s*(.*?)\s*$/m.exec(rt)[1]);local_version=parseInt(GM_getValue('SUC_current_version', '-1'));if(local_version!=-1){script_name = (/@name\s*(.*?)\s*$/m.exec(rt))[1];GM_setValue('SUC_target_script_name', script_name);if (remote_version > local_version){if(confirm(_di.update[_L][0]+script_name+_di.update[_L][1])){GM_openInTab('http://userscripts.org/scripts/show/'+SUC_script_num);GM_setValue('SUC_current_version', remote_version);}}else if (forced)alert(_di.update[_L][2]+script_name+_di.update[_L][3]);}else GM_setValue('SUC_current_version', remote_version+'');}});}catch (err){if (forced)alert(_di.update[_L][4]+err);}}}GM_registerMenuCommand(GM_getValue('SUC_target_script_name', 'BPT') + _di.update[_L][5], function(){updateCheck(true);});updateCheck(false);}catch(err){} }*/ } // Functions function highlight(doc, ext_word) { var _words = words.filter(function(w,i){return !words_off[i];}); if (_words.length <= 0) return; var _index; if (ext_word && ext_word.words) { _words = ext_word.words; _index = ext_word.index; } var exd_words, xw; if (_words.length === 1 && _words[0].exp) { exd_words = _words.map(function(e){return e.exp;}); xw = ''; } else { exd_words = _words.map(function(w){return w.test ? w : new RegExp('(' + w.replace(/\W/g,'\\$&') + ')(?!##)', 'ig');}); xw = ' and (' + _words.map(function(w){return ' contains(translate(self::text(),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ"),'+escapeXPathExpr(w.toUpperCase())+') ';}).join(' or ') + ') '; } $X('descendant::text()[string-length(normalize-space(self::text())) > 0 ' + xw +' and not(ancestor::textarea or ancestor::script or ancestor::style or ancestor::aside)]', doc).forEach(function(text_node) { var df, text = text_node.nodeValue, id_index = 0, parent = text_node.parentNode, range = document.createRange(), replace_strings = [], new_text = reduce(exd_words, function(text,ew,i) { var _i = _index || i; return text.replace(ew,function($0,$1) { replace_strings[id_index] = '' + $1 + ''; return '##'+(id_index++)+'##'; }); }, text). replace(/&/g, '&').replace(//g, '>'). replace(/##(\d+)##/g, function($0,$1) { return replace_strings[$1] || ''; }); if (replace_strings.length) { try { if (isChromium) { range.selectNodeContents(htmlDoc.documentElement); } else { range.selectNode(text_node); } df = range.createContextualFragment(new_text); if (df.firstChild) parent.replaceChild(df, text_node); range.detach(); } catch (e) { error(e); } } }); } function addsheet() { if (!main_sheet) { var hilistyles = STYLE_COLOR.map(function(rgb,i){ return 'span.' + PRE + '_word'+i+',.' + PRE + '_item'+i+'{background:'+rgb+'!important;}'; }); var borderstyles = BORDER_COLOR.map(function(rgb,i){ return 'li.' + PRE + '_item'+i+'{outline:1px solid '+rgb+'!important;}'; }); sheet = addCSS([ //Additional Style 'span[class^="' + PRE + '_word"]{color:black!important;font:inherit!important;display:inline!important;margin:0!important;padding:0!important;text-align:inherit!important;float:none!important;position:static!important;}', //vertical-align:inherit !important; '#' + PRE + '_words, #' + PRE + '_words *{font-family: Arial ;}', '#' + PRE + '_words{line-height:1;position:fixed;z-index:60000;opacity:0.8;list-style-type:none;margin:0;padding:0;width:auto;max-width:100%;' + panel_pos_arr[0] + panel_pos_arr[1] +'}', '#' + PRE + '_words > section{clear:right;line-height:1;border:1px solid #666;/*border-left-width:10px;*/background:#fff;display:block;position:relative;}', '#' + PRE + '_words * {margin:0;padding:0;width:auto;height:auto;}', '#' + PRE + '_words:hover{opacity:1;}', '#' + PRE + '_words:hover > section{opacity:1;border-color:#333;}', '#' + PRE + '_words #_ewh_handle{background:#666;width:10px;cursor:move;}', '#' + PRE + '_words:hover #_ewh_handle{background:#333;}', '#' + PRE + '_words.ewh_hide #_ewh_handle{cursor:pointer;}', // '#' + PRE + '_words.ewh_hide:hover #_ewh_handle{width:10px;}', // '#' + PRE + '_words.ewh_hide > section form.' + PRE + '_ctrl > input.c_b{display:none;}', '#' + PRE + '_words > nav{display:none;width:100%;padding:3px;position:relative;}', '#' + PRE + '_words > nav > canvas.backport{background:rgba(0,0,0,0.5);cursor:pointer;position:absolute;right:6px;z-index:3;}', '#' + PRE + '_words > nav > canvas.viewport{background:rgba(79,168,255,0.7);cursor:default;position:absolute;bottom:0px;right:6px;}',//outline:6px solid rgba(79,168,255,0.7); // '#' + PRE + '_words > nav:hover > canvas.backport{background:rgba(0,0,0,0.5);}', '#' + PRE + '_words:hover > nav{display:block;}', '#' + PRE + '_words > nav._locked{display:block;}', '#' + PRE + '_words:hover > nav > canvas.backport{bottom:0px;}', '#' + PRE + '_words > nav._locked > canvas.backport{bottom:0px;}', '#' + PRE + '_words.ewh_edit{opacity:1;}', '#' + PRE + '_words.ewh_edit #' + PRE + '_word_inputs_list{display:none;}', '#' + PRE + '_words form.' + PRE + '_editor{display:none;}', '#' + PRE + '_words.ewh_edit form.' + PRE + '_editor{display:inline-block;}', '#' + PRE + '_words.ewh_edit form.' + PRE + '_editor input{min-width:80px;}', '#' + PRE + '_words li{display:inline-block;margin:0.1em 0.2em;line-height:1.3em;font-size:medium;}', '#' + PRE + '_words > section > * {vertical-align:middle;}', '#' + PRE + '_words > section td {border:none;}', '#' + PRE + '_words > section > h3.' + PRE + '_title{display:inline-block;background:#333;color:#fff;padding:0.1em 0.3em;border:none;margin:0 0.2em;}', '#' + PRE + '_words > section form.' + PRE + '_ctrl{display:inline-block;}', '#' + PRE + '_words > section form.' + PRE + '_ctrl > input{display:inline;width:1.3em;margin:0.1em 0.1em;background:'+ but_c +';border:1px solid '+ but_cb +';cursor:pointer;font-size:10pt;color:black;}', '#' + PRE + '_words > section form.' + PRE + '_ctrl > input._active{background:'+ but_ca +';}', '#' + PRE + '_words > section form.' + PRE + '_ctrl > input._disable{background:'+ but_cd +' !important;cursor:default;}', '#' + PRE + '_words > section form.' + PRE + '_ctrl > input:hover{outline:1px solid '+ but_cb +'!important;}', '#' + PRE + '_word_inputs_list {padding:0!important;margin:0.2em!important;display:inline-block;border:none!important;}', '#' + PRE + '_word_inputs_list > li{position:relative;padding:0 4px;}', '#' + PRE + '_word_inputs_list > li.ewh_disable{background:white!important;outline:1px solid #999!important;}', '#' + PRE + '_word_inputs_list > li > label{cursor:pointer;color:black!important;}', '#' + PRE + '_word_inputs_list > li > input{cursor:pointer;}', // '#' + PRE + '_word_inputs_list > li > label > input[type=image]{vertical-align:top;padding:0;height:12px;}', '#' + PRE + '_word_inputs_list > li > input[type=checkbox]{display:none;position:absolute;right:0px;top:0px;opacity:0.7;}', '#' + PRE + '_word_inputs_list > li:hover{outline-width:2px!important;}', '#' + PRE + '_word_inputs_list > li:hover > input[type=checkbox]{display:block;}', '#' + PRE + '_word_inputs_list > li > input[type=checkbox]:hover{opacity:1;}', '#' + PRE + '_words > section td+td+td > input {display:inline;width:1.3em;margin:0.1em 0.1em;background:#FAFAFA;border:1px solid #aaaaaa;cursor:pointer;font-size:10pt;color:black;}', '@keyframes fadeit {from {opacity:1;} to {opacity:0;}}', ].concat(hilistyles, borderstyles).join('\n')); main_sheet = true; } if (!move_sheet) addmovesheet() } function addmovesheet() { addCSS('.wordhighlight_em{outline:4px solid #FF7B00;-webkit-outline:4px solid #FF7B00;text-decoration:blink;}'); move_sheet = true; } function setup(init) { setuped = true; addsheet(); // build ui aside = creaElemIn('aside', document.body); aside.id = PRE + '_words'; section = creaElemIn('section', aside); var table_COL = creaElemIn('table', section); table_COL.setAttribute('style', 'border:0;margin:0;padding:0;border-spacing:2px;border-collapse:separate!important;'); table_COL.setAttribute('cellspacing', '0'); table_COL.setAttribute('cellpadding', '0'); var tbdy_COL = creaElemIn('tbody', table_COL); var tr_COL = creaElemIn('tr', tbdy_COL); td0 = creaElemIn('td', tr_COL); td0.id = '_ewh_handle'; td0.title = _ti.td0[_L]; var td1 = creaElemIn('td', tr_COL); td1.setAttribute('style', 'border-right: 1px solid black; padding:0.2em 0.3em 0 0;vertical-align:top;');//width:7.2em; var td2 = creaElemIn('td', tr_COL); var td3 = creaElemIn('td', tr_COL); var editor = creaElemIn('form', td2); editor.className = PRE + '_editor'; text_input = creaElemIn('input', editor); text_input.type = 'text'; var ctrl = creaElemIn('form', td1); ctrl.className = PRE + '_ctrl'; var close_button = creaElemIn('input', ctrl); close_button.type = 'button'; close_button.className = 'c_b'; close_button.value = 'X'; close_button.title = _ti.close[_L]; off = creaElemIn('input', ctrl); off.type = 'button'; off.value = 'O'; off.title = _ti.off[_L]; lock = creaElemIn('input', ctrl); lock.type = 'button'; lock.value = 'L'; edit = creaElemIn('input', ctrl); edit.type = 'button'; edit.value = 'E'; edit.title = _ti.edit[_L]; word_inputs_list = creaElemIn('ul', td2); word_inputs_list.id = PRE + '_word_inputs_list'; word_inputs_list.className = PRE + '_inputs'; var maplock = creaElemIn('input', td3); maplock.type = 'button'; maplock.value = '<'; maplock.title = _ti.mapl[_L]; // add interactivity edit.addEventListener('click',command_edit,false); off.addEventListener('click',command_off,false); close_button.addEventListener('click',command_close,false); editor.addEventListener('submit',function(e){ command_edit(); e.preventDefault(); },false); if (gm_ok) { lock.title = _ti.lock[_L]; lock.className = (keyword_store)? '_active' : ''; lock.addEventListener('click',function(){ if (aside.className == 'ewh_edit') return; if (keyword_store) { lock.className = ''; lock.title = _ti.lock[_L]; GM_setValue(ST_PRE, ''); keyword_store = ''; // lock.value = 'Lock: Off'; } else { lock.className = '_active'; lock.title = _ti.lock_a[_L] + ' ' + keyword; GM_setValue(ST_PRE, keyword); keyword_store = keyword; // lock.value = 'Lock: On'; } },false); } else { lock.title = _ti.lock_u[_L]; lock.className = '_disable'; } td0.addEventListener('dblclick',function(evt){//l(panel_hide,window.innerWidth - aside.offsetLeft,1); if (panel_hide) {//l('O'); aside.style.right = '0px'; aside.className = ''; panel_hide = false; this.title = _ti.td0[_L]; }else{//l(panel_hide); aside.style.right = (14 - aside.offsetWidth) +'px'; aside.className = 'ewh_hide'; panel_hide = true;//l(panel_hide,3); this.title = _ti.td0_a[_L]; } }, false); maplock.addEventListener('click',function(){ if(!nav.className) {nav.className = '_locked'; this.value = '>';} else {nav.className = ''; this.value = '<';} },false); // enable drag var drag = endrag(aside,{x:'right',y:'bottom'}); drag.hook('__drag_begin', function(e){ if (this.element && ((this.element.className === 'ewh_edit') || (this.element.className === 'ewh_hide'))) // || /^canvas$/i.test(e.target.localName) || /^lable$/i.test(e.target.localName)) return false; }); // build map nav = document.createElement('nav'); aside.insertBefore(nav,aside.firstChild); canvas = creaElemIn('canvas', nav); canvas.className='backport'; cw = creaElemIn('canvas', nav); cw.className='viewport'; var c2 = c2context = canvas.getContext('2d'); // /+drag codes by grea // scrolling per events perf = 2, perfic = 0; moveTo = function(evt){ if (perfic++ % perf || !window.drgg) return; var x = (evt.offsetX || evt.layerX)/ratio - root.clientWidth/2; var y = (evt.offsetY || evt.layerY)/ratio - root.clientHeight/2; window.scrollTo(x, y); } with(canvas){ addEventListener('mousedown', function(e){ window.drgg = true; moveTo(e); },false); addEventListener('mousemove', function(e){ moveTo(e); },false); addEventListener('mouseup', function(e){ window.drgg = false; moveTo(e); },false); addEventListener('mouseout', function(e){ window.drgg = false; moveTo(e); },false); } // +/codes end // add AutoPager page change detector if (Ewh_configs[0]) { this.pagef = 5, this.pagefic = 0; var docHeight = document.body.scrollHeight, pageChanged; this.checkpage = function(){ if ((pagefic++ % pagef == 0) && (document.body.scrollHeight > docHeight)) { switch (Ewh_configs[0]) { case 1: after_load(); break; case 2: resetup(); break; } docHeight = document.body.scrollHeight; } } } // sync with map & check page window.addEventListener('scroll',function(){ var x = window.pageXOffset * ratio; var y = window.pageYOffset * ratio; cw.style.bottom = (canvas.height - cw.height - y) + 'px'; cw.style.right = (-x + 6) + 'px'; if (Ewh_configs[0]) checkpage(); },false); // go to highlight highlight(document.body); word_lists = create_inputlist(words); layers = xp_all.get(); draw_wordmap(); if (!Ewh_configs[0]) init_autopager(); if (panel_hide && !init){ aside.style.right = (14 - aside.offsetWidth) +'px'; aside.className = 'ewh_hide'; td0.title = _ti.td0_a[_L]; } } function restore_words(words) { (words||xp_all.get()).forEach(function(layer,i){ var parent = layer.parentNode; while (layer.firstChild){ parent.insertBefore(layer.firstChild, layer); } parent.removeChild(layer); }); } function draw_wordmap() { var c2 = c2context; var _height = root.clientHeight * 0.7; if (_height > CanvasWidth * (root.scrollHeight/root.scrollWidth)) { canvas.width = CanvasWidth; canvas.height = CanvasWidth * (root.scrollHeight/root.scrollWidth); ratio = CanvasWidth / root.scrollWidth; } else { canvas.height = _height; canvas.width = _height * (root.scrollWidth/root.scrollHeight); ratio = _height / root.scrollHeight; } cw.width = root.clientWidth * ratio; cw.height = root.clientHeight * ratio; cw.style.bottom = (canvas.height - cw.height - window.pageYOffset * ratio)+'px'; c2.clearRect(0,0,window.innerWidth,window.innerHeight); c2.beginPath(); word_lists.forEach(function(item,i){ if(!words_off[i]) { c2.fillStyle = STYLE_COLOR[i%10]; item.get_w().forEach(function(ly,j){ var recs = ly.getClientRects(); for (var i = 0, l = recs.length;i < l;++i){ var rec = recs[i]; var x = Math.max(ratio*(root.scrollLeft + rec.left), 2); var y = Math.max(ratio*(root.scrollTop + rec.top), 2); var width = Math.max(ratio*(rec.width ||(rec.right-rec.left)), 2); var height = Math.max(ratio*(rec.height||(rec.bottom-rec.top)), 2); c2.fillRect(x, y, width, height); } }); } }); c2.fill(); } function add_word(word) { word_tmp = init_words(word); var word_tmp_len = word_tmp.length, words_len = words.length; for (var m=0;m 14)){ // section.className = ''; // panel_hide = false; // } self.__drag_end(e); }; document.addEventListener('mouseup', this.drag_end, false); }; endrag.proto.prototype = { __drag_begin:function(e){ if (e.button == 0) { var _c = this.computed_style; this.isDragging = isDragging = true; this.position = { _x:parseFloat(_c[this.x]), _y:parseFloat(_c[this.y]), x:e.pageX, y:e.pageY }; e.preventDefault(); } }, __dragging:function(e){ if (!this.isDragging) return; var x = Math.floor(e.pageX), y = Math.floor(e.pageY), p = this.position; // prevent moving out of window var x_border = window.innerWidth - 40, y_border = window.innerHeight - 20; if (x - window.pageXOffset > x_border) x = window.pageXOffset + x_border; if (y - window.pageYOffset > y_border) y = window.pageYOffset + y_border; p._x = p._x + (p.x - x) * this.xd; p._y = p._y + (p.y - y) * this.yd; this.style[this.x] = p._x + 'px'; this.style[this.y] = p._y + 'px'; p.x = x; p.y = y; }, __drag_end:function(e){ if (e.button == 0) { if (this.isDragging) this.isDragging = isDragging = false; } }, hook:function(method,func){ if (typeof this[method] === 'function') { var o = this[method]; this[method] = function(){ if (func.apply(this,arguments) === false) return; o.apply(this,arguments); }; } } }; return endrag(element,opt); } function load_keyword() { if (keyword_store) { keyword = keyword_store; prep_keyword(); return true; }else { return false; } } function init_keyword() { if (Ewh_configs[2] == 1) return false; var name = window.name; var host = location.host, q = document.location.search.slice(1), e = -1; if (Ewh_configs[2] == 2 || name == (PRE + '::CLOSED::')) var _no_refer = true; if (Ewh_configs[2] != 3) init_KW_SR(); //l(101,keyword); if (!keyword) init_KW_IH(); //l(102,keyword); if (!_no_refer && !keyword) init_KW_RF(); //l(103,keyword); if (Ewh_configs[2] != 3 && !keyword) init_KW_SRo(); //l(104,keyword); keyword = trim(keyword); if (keyword) { window.name = PRE + '::' + encodeURIComponent(keyword); prep_keyword();//l(104,keyword); return true; } else { return false; } } function init_KW_SR() { //for Search Results var host = location.host, q = document.location.search.slice(1), e = -1; for (i = 0; i < urlArr.length; i++) { if (host.indexOf(urlArr[i][2]) != -1 && q.indexOf(urlArr[i][1]) != -1) e = i;//l(e); } if (e >= 0) { keyword = get_KW_from_URL(q, e);//l(keyword); } } function init_KW_SRo() { //for other search result pages var locationhref = escape(document.location.href); for (var z = 0; z < queryArr.length; z++) { var input_query = document.getElementById(queryArr[z][0]); if (!input_query || locationhref.indexOf(queryArr[z][1]) == -1) continue; if (input_query.tagName.toLowerCase() == "input") keyword = clean(input_query.value); if (keyword) break; } } function init_KW_RF() { //for Pages from Results var host = location.host, ref = document.referrer, e = -1; for (i = 0; i < urlArr.length; i++) { if (Ewh_configs[2] == 3 && host.indexOf(urlArr[i][2]) != -1) return; if (ref.indexOf(urlArr[i][2]) != -1 && ref.indexOf(urlArr[i][1]) != -1) e = i;//l(e); } if (e >= 0) { var _a = document.createElement('a'); _a.href = ref; var q = _a.search.slice(1); keyword = get_KW_from_URL(q, e);//l(keyword); } } function init_KW_IH() { //look for keywords in name if (name.indexOf(PRE) == 0 && name != (PRE + '::CLOSED::')) { keyword = (new RegExp(PRE + '\\d*::(.+)').exec(decodeURIComponent(window.name))[1]) || ''; } } function get_KW_from_URL(urlsearch, _e) { if (urlArr[_e][0] =='Google' && urlsearch.indexOf('&url=') != -1) urlsearch = urlsearch.replace(/%25/g,'%'); // if it is from Google's redirect link var qspairs = urlsearch.split('&'), kwtmp; for (k = 0; k < qspairs.length; k++) { if (qspairs[k].indexOf(urlArr[_e][1]) == 0) {KW = qspairs[k].substring(urlArr[_e][1].length).replace(/\+/g,' '); break;} }//l(KW); if (urlArr[_e][0] =='Baidu' && urlsearch.indexOf('ie=utf-8') == -1 && urlsearch.indexOf('ie=UTF-8') == -1) kwtmp = urlDecode(KW); // 如果是百度且非utf-8 //2017-5-27百度似乎已经主用utf-8 //20170922 helloBibo 增加了“&& urlsearch.indexOf('ie=UTF-8') == -1” /*else*/ kwtmp = decodeURIComponent(KW); return clean(kwtmp); } function prep_keyword() { words = init_words(keyword); } function trim(str) { return str.replace(/[\n\r]+/g,' ').replace(/^\s+|\s+$/g,'').replace(/\.+\s|\.+$/g,''); } function clean(str) { return str.replace(/(?:(?:\s?(?:site|(?:all)?in(?:url|title|anchor|text)):|(?:\s|^)-)\S*|(\s)(?:OR|AND)\s|[()])/g,'$1'); } function uniq(arr) { var a = [], o = {}, i, v, len = arr.length; if (len < 2) {return arr;} for (i = 0; i < len; i++) { v = arr[i]; if (o[v] !== 1) { a.push(v); o[v] = 1; } } return a; }; function word_length_Comp(a,b) { return (b.length - a.length); }; function init_words(word) { var erg = word.match(new RegExp("^ ?/(.+)/([gim]+)?$")); if (erg) { var ew = erg[1], flag = erg[2] || ''; var word_s = [{exp:new RegExp('(' + ew + ')(?!##)', flag), text:ew, toString:function(){return ew;}}]; } else if (word) { var ret=[], eword = word.replace(/"([^"]+)"/g,function($0,$1){$1 && ret.push($1);return '';}); var word_s = eword.split(/[\+\s:\|#]/).filter(function(w){return !!w;}).concat(ret); word_s = (Ewh_configs[3])? uniq(word_s).sort(word_length_Comp) : uniq(word_s); if (Ewh_configs[1]) { for (var i in word_s) { if (/^[a-z0-9]$/i.test(word_s[i]) || (Ewh_configs[1] == 2 && /^[a-z0-9]{2}$/i.test(word_s[i]))) { words_off[i] = true; } else { words_off[i] = false; } } } if (skip_word_list.length) { for (i in word_s) { for (var j in skip_word_list) { if (word_s[i].toLowerCase() == skip_word_list[j]) words_off[i] = true; } } } }//l(word_s[0].exp); return word_s; } function init_minibuffer() { if (window.Minibuffer) document.removeEventListener('keypress', keyhandler, false); var mini = window.Minibuffer; mini.addCommand({ name: 'keyword-search', command: function(stdin){ keyword += ' ' + this.args.join(' '); keyword = trim(keyword); prep_keyword(); if (setuped) resetup(); else setup(); return stdin; } }); mini.addShortcutkey({ key:KEY_NEXT, command:next, description: 'emphasis next keyword' }); mini.addShortcutkey({ key:KEY_PREV, command:prev, description: 'emphasis prev keyword' }); mini.addShortcutkey({ key:KEY_SEARCH, command:function(e){ instant_search(); }, description: 'emphasis prev keyword' }); } function next(index,_layers) { _layers || (_layers = (layers || (layers = xp_all.get()) )); index || (index = 0); move(_layers[++positions[index]] || (positions[index] = 0, _layers[positions[index]])); position_box(index); } function prev(index,_layers) { _layers || (_layers = (layers || (layers = xp_all.get()) )); index || (index = 0); move(_layers[--positions[index]] || (positions[index] = _layers.length - 1, _layers[positions[index]])); position_box(index); } function position_box(index) { if (!posi_tip) { posi_tip = creaElemIn('div', section); posi_tip.setAttribute('style', 'background:white;color:black;border:1px solid black;text-align:center;position:absolute;left:30px;z-index:1025;font-size:16px;height:20px;top:-20px;width:40px;-moz-box-shadow:0 2px 4px #444444;-Webkit-box-shadow:0 2px 4px #444444;'); } clearTimeout(posi_tip_timer); posi_tip.style.display = 'block'; posi_tip.innerHTML = positions[index]+1; if (index == 0) posi_tip.style.left = '30px'; else posi_tip.style.left = (word_lists[index-1].item.offsetLeft + (word_lists[index-1].item.clientWidth - 40)/2) + 'px'; posi_tip_timer = setTimeout(function(){posi_tip.style.display = 'none';},3000); } function init_keyboard() { if (isOpera) { } else if (window.Minibuffer) { init_minibuffer(); return; } else { window.addEventListener('GM_MinibufferLoaded', init_minibuffer, false); } if (!window.chromium && false) { document.addEventListener('keypress', keyhandler, false); } else { document.addEventListener('keydown', keyhandler, false); } } function get_key(evt) { var key = String.fromCharCode(evt.which), ctrl = evt.ctrlKey ? 'C-' : '', meta = (evt.metaKey || evt.altKey) ? 'M-' : ''; if (!evt.shiftKey){ key = key.toLowerCase(); } if (evt.ctrlKey && evt.which >= 186 && evt.which < 192) { key = String.fromCharCode(evt.which - 144); } if (evt.key && evt.key !== 'Enter' && !/^U\+/.test(evt.key) ) { key = evt.key; } else if ( evt.which !== evt.keyCode ) { key = keyCodeStr[evt.keyCode] || whichStr[evt.which] || key; } else if (evt.which <= 32) { key = keyCodeStr[evt.keyCode] || whichStr[evt.which]; } return ctrl+meta+key; } function keyhandler(evt) { //console.log(evt); if (evt.target.id == PRE + '_textinput') var _r = true; else if (/^(?:input|textarea)$/i.test(evt.target.localName)) return; var fullkey = get_key(evt); //console.log(fullkey); if (setuped){ switch (fullkey) { case KEY_NEXT: next(); break; case KEY_PREV: prev(); break; case KEY_OFF: command_off(); break; case KEY_CLOSE: command_close(); break; case KEY_EDIT: command_edit(); break; case KEY_REFRESH: resetup(); break; } } switch (fullkey) { case KEY_SEARCH: evt.preventDefault(); evt.stopPropagation(); instant_search(_r, evt.target); break; } } function command_close() { document.body.removeChild(aside); if (document.getElementById(PRE + '_textinputbox')) document.body.removeChild(inputBOX); instant_search.input = null; restore_words(); // sheet.disable = true; if (addCSS.__style.parentNode) addCSS.__root.removeChild(addCSS.__style); window.name = PRE + '::CLOSED::'; word_lists = []; // _words = []; setuped = false; highlight_reset(); } function command_off() { if (aside.className == 'ewh_edit') return; if (!highlight_off) { restore_words(); for (var i in word_lists) { word_lists[i].check.checked = false; word_lists[i].item.className += ' ewh_disable' } off.className = '_active' highlight_off = true; } else { word_lists = []; word_inputs_list.innerHTML = ''; resetup(); for (i in word_lists) { word_lists[i].check.checked = true; word_lists[i].item.className = word_lists[i].item.className.replace(' ewh_disable', ''); } off.className = ''; highlight_off = false; } draw_wordmap(); } function command_edit() { if (aside.className == 'ewh_edit') { // aside.style.width = 'auto'; // edit.value = 'Edit'; edit.className = ''; edit.title = _ti.edit[_L]; if (gm_ok) lock.className = lock.className.replace(' _disable',''); off.className = ''; highlight_off = false; aside.className = ''; keyword = trim(text_input.value); prep_keyword(); window.name = PRE + '::' + encodeURIComponent(keyword); resetup(); } else { var _aside_w = aside.offsetWidth; // edit.value = 'Set'; edit.className = '_active'; edit.title = _ti.edit_a[_L]; if (gm_ok) lock.className += ' _disable'; off.className += ' _disable'; aside.className = 'ewh_edit'; text_input.value = keyword; text_input.focus(); var t_width = (Math.max(320,_aside_w) - 135) +'px'; text_input.style = 'width:'+t_width+';height:22px;margin:2px 0;font-size:15px;'; // aside.style.width = Math.max(320,_aside_w) +'px'; } } function instant_search(_r, e_target) { var input_cancel = function(){ if (refocus) { var top = document.body.scrollTop || document.documentElement.scrollTop; var left = document.body.scrollLeft || document.documentElement.scrollLeft; } document.body.removeChild(inputBOX); instant_search.input = null; if (refocus && e_target) { e_target.focus(); document.body.scrollTop = document.documentElement.scrollTop = top; document.body.scrollLeft = document.documentElement.scrollLeft = left; } }; var input_position = function(){ inputBOX.style.bottom = '30px' ;//window.innerHeight - aside.offsetTop + 4 + 'px'; } var input_comfirm = function(text, bAdd){ if (!text && setuped) return; if (bAdd) { keyword = trim(((setuped)?keyword:'') + ' ' + text); prep_keyword(); if (setuped) { if (Ewh_configs[3]) resetup(); else add_word(text); } else setup(true); } else { keyword = trim(text); prep_keyword(); if (setuped) { resetup(); } else setup(true); } window.name = PRE + '::' + encodeURIComponent(keyword); if (instant_search.input) {input_position(); instant_search.input.select();} }; if (_r) {input_cancel(); return;} var selectedText = getSelection(); if (instant && selectedText.toString()) { input_comfirm(selectedText.toString(), true); return; } if (instant_search.input) { (instant_search.input.value = selectedText) && instant_search.input.select(); // instant_search.input.focus(); return; } if (!inst_sheet) { addCSS([ '#' + PRE + '_textinputbox input[type=button]{padding:0;display:inline;margin:0.1em 0.2em;background:'+ but_c +';border:1px solid #996666;cursor:pointer;font-size:12pt;color:black;}', '#' + PRE + '_textinputbox label{padding:0;display:inline;}', '#' + PRE + '_textinputbox{border:1px solid #333;margin:0px;padding:0px;position:fixed;bottom:34px;left:5%;z-index:1023;background:#fff;-moz-box-shadow: #333 3px 3px 2px;color:#000;-Webkit-box-shadow: #333 3px 3px 2px;color:#000;font-weight:bold;max-width:70%;font-size:16pt;height:auto;opacity:0.95;}', '#' + PRE + '_textinputbox,#' + PRE + '_textinputbox *{font-family: Arial;}', '#' + PRE + '_textinput{border:none;margin:0 0 0 5px;padding:0px;max-width:80%;height:100%;background:#fff;color:#000;font-weight:bold;font-size:inherit;}' ].join('\n')); inst_sheet = true; } if (!move_sheet) addmovesheet(); inputBOX = creaElemIn('div', document.body); inputBOX.id = PRE + '_textinputbox'; inputBOX.setAttribute('class', PRE + '_inbox'); if (setuped) { input_position(); } var inputCHECK = creaElemIn('input', inputBOX); inputCHECK.type = 'checkbox'; inputCHECK.checked = addKeyword; inputCHECK.title = _ti.ad_nw[_L]; var inputCHECKlabel = creaElemIn('label', inputBOX); inputCHECKlabel.textContent = (addKeyword) ? 'Add':'New'; inputCHECKlabel.title = inputCHECK.title; var i_C_id = inputCHECK.id = 'Add_Check'; inputCHECKlabel.htmlFor = i_C_id; var input = instant_search.input = creaElemIn('input', inputBOX); input.id = PRE + '_textinput'; var go_button = creaElemIn('input', inputBOX); go_button.type = 'button'; go_button.value = '\u2192'; go_button.title = _ti.subm[_L]; var close_button = creaElemIn('input', inputBOX); close_button.type = 'button'; close_button.value = 'X'; close_button.title = _ti.clos[_L]; inputCHECK.addEventListener('change', function(){ inputCHECKlabel.textContent = (this.checked) ? 'Add':'New'; addKeyword = this.checked; input.focus(); },false); go_button.addEventListener('click', function(){input_comfirm(input.value, addKeyword);}, false); close_button.addEventListener('click', input_cancel, false); input.addEventListener('keypress',function(evt){ var fullkey = get_key(evt); switch (fullkey) { case 'RET': evt.preventDefault(); evt.stopPropagation(); input_comfirm(this.value, addKeyword); break; case 'ESC': input_cancel(); } },false); input.addEventListener('input',function(e) { var text = input.value.toUpperCase(); if (!/\S/.test(text) || text.length <2) return; var x = 'descendant::text()[contains(translate(self::text(),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ"),'+escapeXPathExpr(text)+') and not(ancestor::textarea) and not(ancestor::script) and not(ancestor::style)]/parent::*'; var node = document.evaluate(x, document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (node) move(node); },false); if (selectedText.toString()) { input.value = selectedText.toString(); input.select(); } else if (keyword && !setuped) { input.value = keyword; input.select(); } else input.focus(); } function config_box() { var confBOXBack = creaElemIn('div', document.body); confBOXBack.setAttribute('style', 'background:white;position:fixed;top:0;left:0;width:100%;height:100%;text-align:center;z-index:30000;'); var confBOX = creaElemIn('div', confBOXBack); confBOX.setAttribute('style', 'line-height:1;border:1px solid #333;border-left-width:10px;width:600px;margin:130px auto auto auto;padding:5px;'); var confTitle = creaElemIn('h3', confBOX); confTitle.setAttribute('style', 'font-weight:800;border-bottom:1px solid black;width:100%;margin:15px auto 10px auto;'); confTitle.innerHTML = _di.confT[_L]; var confP = creaElemIn('p', confBOX); confP.setAttribute('style', 'text-align:left;'); var conf = [], confR = [], confL = [], opt; for (var n=0; n<3; n++) { conf[n] = document.createTextNode(_di.conf[_L][n]); confP.appendChild(conf[n]); creaElemIn('br', confP); confR[n] = []; confL[n] = []; opt = 3; if (n == 2) opt = 4; for (var r=0; r]=?|[\(\[|,=+-])|([@$])/g; var TERM = 1, OPERATOR = 2, MODIFIER = 3; var tokenType = OPERATOR; prefix += ':'; function replacer(token, identifier, suffix, term, operator, modifier) { if (suffix) { tokenType = (suffix == ':' || (suffix == '::' && (identifier == 'attribute' || identifier == 'namespace'))) ? MODIFIER : OPERATOR; } else if (identifier) { if (tokenType == OPERATOR && identifier != '*') { token = prefix + token; } tokenType = (tokenType == TERM) ? OPERATOR : TERM; } else { tokenType = term ? TERM : operator ? OPERATOR : MODIFIER; } return token; } return xpath.replace(tokenPattern, replacer); } // http://d.hatena.ne.jp/amachang/20090917/1253179486 function escapeXPathExpr(text) { var matches = text.match(/[^"]+|"/g); function esc(t) { return t == '"' ? ('\'' + t + '\'') : ('"' + t + '"'); } if (matches) { if (matches.length == 1) { return esc(matches[0]); } else { var results = []; for (var i = 0, len = matches.length; i < len; i ++) { results.push(esc(matches[i])); } return 'concat(' + results.join(', ') + ')'; } } else { return '""'; } } function $X(exp, context, resolver, result_type) { context || (context = document); var Doc = context.ownerDocument || context; var result = Doc.evaluate(exp, context, resolver, result_type || XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); if (result_type) return result; for (var i = 0, len = result.snapshotLength, res = new Array(len); i < len; i++) { res[i] = result.snapshotItem(i); } return res; } // reduce https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce#Compatibility function reduce(arr, fun) { var len = arr.length, i = 0, rv; if (arguments.length >= 3) rv = arguments[2]; else {do { if (i in arr) { rv = arr[i++];break; } if (++i >= len) throw new TypeError(); } while (true)}; for (; i < len; i++) if (i in arr) rv = fun.call(null, rv, arr[i], i, arr); return rv; } function error(e) { if (isOpera) { opera.postError(e); } else if (window.console) { console.error(e); } } function addCSS(css) { var sheet, self = arguments.callee; if (document.createStyleSheet) { // for IE sheet = document.createStyleSheet(); sheet.cssText = css; return sheet; } else if (!self.__style || !self.__root) { sheet = document.createElement('style'); sheet.type = 'text/css'; self.__style = sheet; self.__root = document.getElementsByTagName('head')[0] || document.documentElement; } sheet = self.__style.cloneNode(false); sheet.textContent = css; return self.__root.appendChild(sheet).sheet; } function getY(oElement) { var iReturnValue = 0; while (oElement != null) { iReturnValue += oElement.offsetTop; oElement = oElement.offsetParent; } return iReturnValue; } function creaElemIn(tagname, destin) { var theElem = destin.appendChild(document.createElement(tagname)); return theElem; } /** Get elements by className * @function getElementsByClassName * @param string className * @param optional string tag restrict to specified tag * @param optional node restrict to childNodes of specified node * @return Array of nodes * @author Jonathan Snook, http://www.snook.ca/jonathan * @author Robert Nyman, http://www.robertnyman.com */ function getElementsByClassName(className, tag, elm) { var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)"); var tag = tag || "*"; var elm = elm || document; var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag); var returnElements = []; var current; var length = elements.length; for(var i=0; i 0x7f) { ret += asc2str(parseInt("0x" + asc+str.substring(i+4, i+6))); i += 5; } else { ret += asc2str(parseInt("0x"+asc)); i += 2; } } else { ret += chr; } } return ret; } //{ // function target_google(doc,index){ // var as = $X('descendant::a[@href and not(starts-with(@href,"javascript:") or starts-with(@href,"#"))]',doc); // as.forEach(function(a,i){ // if (a.target != 'self') // a.target = PRE + (i + (index || 0) * as.length) + '::' + encodeURIComponent(keyword); // }); // } // alert(urlDecode("%B9%E9%B8%F9%BD%E1%B5%D7")); //} // l(keyword); })(); //console.timeEnd("highlight"); // Bench: http://www.google.com/search?hl=en&q=HTML+5+Markup+Language