您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
网页英文前部加粗脚本
当前为
// ==UserScript== // @name 英文前部加粗 // @namespace https://github.com/itorr/bionic-reading.user.js // @version 0.8.1 // @description 网页英文前部加粗脚本 // @author itorr // @match *://*/* // @grant none // @license MIT // @run-at document-idle // @supportURL https://github.com/itorr/bionic-reading.user.js/issues // ==/UserScript== const enCodeHTML = s=> s.replace(/[\u00A0-\u9999<>\&]/g,w=>'&#'+w.charCodeAt(0)+';'); let body = document.body; if(/weibo/.test(location.hostname)){ const wbMainEl = document.querySelector('.WB_main'); if(wbMainEl) body = wbMainEl; // 修复旧版微博自定义样式失效 bug const customStyleEl = document.querySelector('#custom_style'); if(customStyleEl)customStyleEl.removeAttribute('id'); } const styleEl = document.createElement('style'); styleEl.innerHTML = ` bbb{ font-weight:bold; } a spann{ pointer-events: none; } `; const excludeTagNames = [ 'script','style','xmp', 'input','textarea','select', 'pre','code', 'h1','h2','h3','h4', 'b','strong' ].map(a=>a.toUpperCase()); const gather = el=>{ let textEls = []; el.childNodes.forEach(el=>{ if(el.isEnB) return; if(el.nodeType === 3){ textEls.push(el); }else if(el.childNodes){ if(excludeTagNames.includes(el.tagName)) return; // Skip DIV Code Frame if(el.getAttribute && el.getAttribute('class') && el.getAttribute('class').includes('highlight')) return; textEls = textEls.concat(gather(el)) } }) return textEls; }; const engRegexi = /[a-z][a-z0-9]+/i; const engRegexig = /[a-z][a-z0-9]+/ig; let replaceTextByEl = el=>{ const text = el.data; if(!engRegexi.test(text))return; const spanEl = document.createElement('spann'); spanEl.isEnB = true; spanEl.innerHTML = enCodeHTML(text).replace(engRegexig,word=>{ let halfLength; if(/ing$/.test(word)){ halfLength = word.length - 3; }else if(word.length<5){ halfLength = Math.floor(word.length/2); }else{ halfLength = Math.ceil(word.length/2); } return '<bbb>'+word.substr(0,halfLength)+'</bbb>'+word.substr(halfLength) }) el.after(spanEl); el.remove(); }; // replaceTextByEl = el=>{ // el.data = el.data.replace(engRegexig,word=>{ // let halfLength; // if(/ing$/.test(word)){ // halfLength = word.length - 3; // }else if(word.length<5){ // halfLength = Math.floor(word.length/2); // }else{ // halfLength = Math.ceil(word.length/2); // } // const a = word.substr(0,halfLength). // replace(/[a-z]/g,w=>'\uD835' + String.fromCharCode(w.charCodeAt(0)+56717)). // replace(/[A-Z]/g,w=>'\uD835' + String.fromCharCode(w.charCodeAt(0)+56723)); // const b = word.substr(halfLength). // replace(/[a-z]/g,w=> String.fromCharCode(55349,w.charCodeAt(0)+56665)). // replace(/[A-Z]/g,w=> String.fromCharCode(55349,w.charCodeAt(0)+56671)); // return a + b; // }) // } const bionic = _=>{ const textEls = gather(body); textEls.forEach(replaceTextByEl); document.head.appendChild(styleEl); } const lazy = (func,ms = 0)=> { return _=>{ clearTimeout(func.T) func.T = setTimeout(func,ms) } }; lazy(bionic)(); if(window.ResizeObserver){ (new ResizeObserver(lazy(bionic,100))).observe(body); }else{ const {open,send} = XMLHttpRequest.prototype; XMLHttpRequest.prototype.open = function(){ this.addEventListener('load',lazy(bionic)); return open.apply(this,arguments); }; document.addEventListener('click',lazy(bionic)); window.addEventListener('load',lazy(bionic)); document.addEventListener("DOMContentLoaded",lazy(bionic)); }