// ==UserScript== // @name Eagle's Eye // @namespace http://tampermonkey.net/ // @version 1.4 // @description shuiyuan // @author 5ur01 // @match https://shuiyuan.sjtu.edu.cn/* // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net // @grant GM_log // @grant GM_addStyle // @require https://unpkg.com/pinyin-pro // @run-at document-idle // @license MIT // @downloadURL none // ==/UserScript== let { pinyin } = pinyinPro; function match(string, pattern, contextLength) { let patternStr = pattern.join('') let index = string.indexOf(patternStr) if (index != -1) { return Array.from({ length: pattern.length }, (_, i) => index + i) } let stringPos = 0 let patternPos = 0 let prevIsNotLetter = true let matchedPos = [] while(true){ if (patternPos == pattern.length) { if (pattern.length == 0 || contextLength <= 0 || stringPos - matchedPos[0] <= contextLength) { break } else { GM_log(matchedPos) stringPos = matchedPos[0] + 1 patternPos = 0 matchedPos = [] prevIsNotLetter = false continue } } if (stringPos == string.length) { return [] } let stringCur = string[stringPos].toLowerCase() let patternCur = pattern[patternPos] let isChinese = pinyin(stringCur) != stringCur let matchOne = (prevIsNotLetter || isChinese) ? pinyin(stringCur, { multiple: true, type: "array", pattern: "initial" }).some(c => c == patternCur) :false function isLetter(c) { return c.toLowerCase() != c.toUpperCase(); } let isLetterCur = isLetter(stringCur) if (matchOne) { matchedPos.push(stringPos) stringPos = stringPos + 1 patternPos = patternPos + 1 prevIsNotLetter = !isLetterCur } else { stringPos = stringPos + 1 prevIsNotLetter = !isLetterCur } } return matchedPos } function makeBold(string, pattern, contextLength) { let array = match(string, pattern, contextLength) let starts = [0].concat(array.map(value => value + 1)) let ends = array.concat([string.length]) return [array.length != 0, array.map((v, i, a) => string.substring(starts[i], ends[i]) + "" + string[v] + "").concat(string.substring(starts.at(-1), ends.at(-1))).join('')] } function divHoverme(content) { return "" + content + "" } function divShowme(content) { return "