hightlight-keywords-nyaa

高亮关键词,可设置关键词的样式,支持正则匹配,自行修改脚本配置

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         hightlight-keywords-nyaa
// @namespace    https://github.com/mudssky/highlight-keywords
// @version      0.2.2
// @license 	MIT
// @description  高亮关键词,可设置关键词的样式,支持正则匹配,自行修改脚本配置
// @author       mudssky
// @include       *://sukebei.nyaa.si/*
// @grant        GM_openInTab 
// @homepageURL https://github.com/mudssky/highlight-keywords
// @supportURL        https://github.com/mudssky/highlight-keywords/issues
// ==/UserScript==


"use strict";
// 因为是用的@require 方法引用脚本,就和页面引入js一样是会阻塞线程的导致页面加载不出,这边onload等页面加载完再执行
// window.onload = function () {
//   setTimeout(() => {
//     main()
//   }, 3000)
// }
;
(function () {
    // const defaultStyleText = 'background:gold;'
    // interface RuleList
    var RuleList = [
        {
            keyword: '成年コミック',
            // color: 'yellow',
            styleText: 'background:gold;',
            matchUrl: 'sukebei.nyaa.si',
        },
        {
            keyword: '月刊',
            // color: 'yellow',
            styleText: 'background:red;',
            matchUrl: 'nyaa.si',
        },
        {
            keyword: '週刊',
            // color: 'yellow',
            styleText: 'background:gold;',
            matchUrl: 'nyaa.si',
        },
    ];
    // 筛选匹配当前页面的规则
    var matchedRuleList = RuleList.filter(function (rule) {
        // 检查是否存在matchUrl选项,如果没有直接报错,默认当作匹配所有网站处理,直接通过过滤
        if (!rule.matchUrl) {
            console.error('this rule should have a match url');
            return rule;
        }
        // 存在matchUrl选项,则过滤匹配当前页面的rule
        if (rule.matchUrl) {
            var urlPattern = new RegExp(rule.matchUrl);
            if (urlPattern.test(window.location.href)) {
                return rule;
            }
        }
    });
    // 这个变量存放最后修改后的html
    var lastHtml = document.body.innerHTML;
    // console.log(matchedRuleList)
    // 使用innerhtml 替换的方式,替换关键词为带高亮style的html
    for (var i in matchedRuleList) {
        // 作为中间变量,每次循环从上次的结果基础上进行。
        var currentHtml = lastHtml;
        var htmlPattern = new RegExp("(<[^>]+>[^<>]*?)" + matchedRuleList[i].keyword + "([^<>]*?<[^>]+>)", 'g');
        lastHtml = currentHtml.replaceAll(htmlPattern, "$1<em data-hightlight=\"true\" style=\"" + matchedRuleList[i].styleText + "\">" + matchedRuleList[i].keyword + "</em>$2");
    }
    document.body.innerHTML = lastHtml;
    document.body.insertAdjacentHTML('beforeend', "<button id=\"hightlight-batchopen\" style=\"position:fixed;top:30vh;\">\n  \u6279\u91CF\u6253\u5F00\u9AD8\u4EAE\u94FE\u63A5\n  </button>");
    var bacthOpenBtn = document.querySelector('#hightlight-batchopen');
    bacthOpenBtn.onclick = function () {
        // alert('批量打开')
        var excuteStartTime = 0;
        var delay = 1000;
        var urlList = [];
        document.querySelectorAll('a em[data-hightlight=true]').forEach(function (emDom) {
            var link = emDom.parentNode.href;
            if (link && !urlList.includes(link))
                urlList.push(link);
        });
        console.log('open url', urlList);
        urlList.forEach(function (url) {
            // window.open((emDom.parentNode as HTMLLinkElement).href, '_blank')
            setTimeout(function () {
                // eslint-disable-next-line @typescript-eslint/ban-ts-comment
                // @ts-ignore
                GM_openInTab(url);
            }, excuteStartTime);
            excuteStartTime += delay;
            // console.log('2w', url)
        });
    };
})();