您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Highlight Words
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/535935/1588732/highlightWords.js
- function escapeRegex(string) {
- return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
- }
- function highlightWords(words, highlightClass = 'highlight') {
- if (!words || words.length === 0) return;
- // Create patterns for words and phrases
- const patterns = words.map(word => {
- const trimmed = word.trim();
- if (trimmed.includes(' ')) {
- // Handle phrases
- const parts = trimmed.split(/\s+/);
- const escapedParts = parts.map(escapeRegex);
- const pattern = escapedParts.map(part => `\\b${part}\\b`).join('\\s+');
- return { pattern, numWords: parts.length };
- } else {
- // Handle single words
- const escaped = escapeRegex(trimmed);
- const pattern = `\\b${escaped}\\b`;
- return { pattern, numWords: 1 };
- }
- });
- // Sort patterns by number of words descending to match longer phrases first
- patterns.sort((a, b) => b.numWords - a.numWords);
- // Create the regex pattern by joining all patterns with '|'
- const regexPattern = patterns.map(p => p.pattern).join('|');
- const regex = new RegExp(regexPattern, 'gi');
- // Select text nodes excluding script, style, and already highlighted elements
- const xpath = `//text()[not(ancestor::script) and not(ancestor::style) and not(ancestor::*[contains(concat(" ", normalize-space(@class), " "), " ${highlightClass} ")])]`;
- const textNodes = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (let i = 0; i < textNodes.snapshotLength; i++) {
- const textNode = textNodes.snapshotItem(i);
- const text = textNode.nodeValue;
- const matches = [...text.matchAll(regex)];
- if (matches.length > 0) {
- const fragment = document.createDocumentFragment();
- let lastIndex = 0;
- for (const match of matches) {
- const offset = match.index;
- if (offset > lastIndex) {
- fragment.appendChild(document.createTextNode(text.slice(lastIndex, offset)));
- }
- const span = document.createElement('span');
- span.className = highlightClass;
- span.textContent = match[0];
- fragment.appendChild(span);
- lastIndex = offset + match[0].length;
- }
- if (lastIndex < text.length) {
- fragment.appendChild(document.createTextNode(text.slice(lastIndex)));
- }
- textNode.parentNode.replaceChild(fragment, textNode);
- }
- }
- }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址