GKD网页审查工具规则复制增强

在GKD网页审查工具复制规则后,弹出菜单,让用户自定义部分内容

目前為 2024-03-04 提交的版本,檢視 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         GKD网页审查工具规则复制增强
// @namespace    https://blog.adproqwq.xyz
// @version      1.1.0
// @description  在GKD网页审查工具复制规则后,弹出菜单,让用户自定义部分内容
// @author       Adpro
// @match        https://i.gkd.li/snapshot/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/index.min.js
// @license      MIT
// ==/UserScript==

(function() {
  'use strict';
  var layer, form, element;
  let layuiScript = document.createElement('script');
  layuiScript.src = 'https://www.layuicdn.com/layui/layui.js';
  let layuiCss = document.createElement('link');
  layuiCss.rel = 'stylesheet';
  layuiCss.href = 'https://www.layuicdn.com/layui/css/layui.css';
  document.body.appendChild(layuiScript);
  document.head.appendChild(layuiCss);
  window.onload = () => {
    layer = layui.layer;
    form = layui.form;
    element = layui.element;
    if(window.localStorage.getItem('categories') === null) window.localStorage.setItem('categories','');
  };

  document.onreadystatechange = () => {
    if(document.readyState == 'complete') setTimeout(()=>{
      searchClickFunc();
    },500);
  };
  function searchClickFunc(){
    let inputGroup = document.getElementsByClassName('n-input-group')[0];
    let searchButton = inputGroup.getElementsByClassName('n-button n-button--default-type n-button--medium-type')[0];
    searchButton.onclick = () => {
      let eachSearchResultActionBar = document.getElementsByClassName('n-collapse-item__header-extra');
      if(eachSearchResultActionBar.length != 0){
        for(let i = 0;i < eachSearchResultActionBar.length;i++){
          eachSearchResultActionBar[i].getElementsByClassName('n-button n-button--default-type n-button--small-type')[0].onclick = () => {
            modifyRule();
          };
        }
      }
    };
  }

  var mode = '0', cate = '';

  function modifyRule(){
    navigator.clipboard.readText().then((a)=>{
      let rule = JSON5.parse(a);
      layer.open({
        type: 1,
        title: '菜单',
        area: 'auto',
        shadeClose: true,
        success: (layero, index, that) => {
          document.getElementsByName('copy')[0].onclick = ()=>{
            let ruleName = document.getElementsByName('Rname')[0].value;
            let ruleDesc = document.getElementsByName('Rdesc')[0].value;

            if(ruleName != '') rule.groups[0].name = cate + '-' + ruleName;
            else{
              if(cate != '') rule.groups[0].name = cate;
            }

            if(ruleDesc == '') delete rule.groups[0].desc;
            else rule.groups[0].desc = ruleDesc;

            copyRule(rule, mode);

            layer.close(index);
          };

          document.getElementsByName('saveSettings')[0].onclick = ()=>{
            let categories = document.getElementsByName('categories')[0].value;
            window.localStorage.setItem('categories',categories);
            layer.msg('保存成功',{icon: 6});
            categories();
          };

          categories();
        },
        content: `
          <div class="layui-tab layui-tab-brief" lay-filter="tab-filter">
            <ul class="layui-tab-title">
              <li class="layui-this" lay-id="info">信息配置</li>
              <li lay-id="settings">设置</li>
            </ul>
            <div class="layui-tab-content">
              <div class="layui-tab-item layui-show">
                <div class="layui-form">
                  <div class="layui-form-item">
                    <label class="layui-form-label">选择模式:</label>
                    <input type="radio" name="mode" value="0" title="ts模式" lay-filter="mode-filter">
                    <input type="radio" name="mode" value="1" title="app模式" lay-filter="mode-filter" checked>
                    <input type="radio" name="mode" value="2" title="groups模式" lay-filter="mode-filter">
                    <input type="radio" name="mode" value="3" title="rules模式" lay-filter="mode-filter">
                  </div>
                  <div id="categories" class="layui-form-item">
                    <label class="layui-form-label">选择分类:</label>
                  </div>
                  <div class="layui-form-item">
                    <label class="layui-form-label">修改key为:</label>
                    <div class="layui-input-group">
                      <input type="number" name="Rkey" lay-affix="ok" lay-filter="ok" class="layui-input">
                      <div class="layui-input-suffix">
                        <i class="layui-icon layui-icon-tips"></i> app模式和groups模式修改groups内的key;rules模式修改rules内的key。记得点勾!
                      </div>
                    </div>
                  </div>
                  <div class="layui-form-item">
                    <label class="layui-form-label">规则组名称:</label>
                    <div class="layui-input-block">
                      <input type="text" name="Rname" placeholder="${rule.groups[0].name}" autocomplete="off" lay-affix="clear" class="layui-input">
                    </div>
                  </div>
                  <div class="layui-form-item">
                    <label class="layui-form-label">规则组描述:</label>
                    <div class="layui-input-block">
                      <input type="text" name="Rdesc" placeholder="没有描述不填" autocomplete="off" lay-affix="clear" class="layui-input">
                    </div>
                  </div>
                  <div class="layui-btn-container">
                    <button type="button" name="copy" class="layui-btn">确定</button>
                  </div>
                </div>
              </div>
              <div class="layui-tab-item">
                <div class="layui-form">
                  <div class="layui-form-item">
                    <label class="layui-form-label">分类:</label>
                    <div class="layui-input-block">
                      <textarea name="categories" cols=50 rows=15 placeholder="多个{key, name}组成的数组,支持JSON5语法" class="layui-textarea"></textarea>
                    </div>
                  </div>
                  <div class="layui-btn-container">
                    <button type="button" name="saveSettings" class="layui-btn">保存</button>
                  </div>
                </div>
              </div>
            </div>
          </div>
        `,
      });
      layui.use(()=>{
        form.render();
        element.render('tab', 'tab-filter');
      });
      form.on('radio(mode-filter)', (data)=>{
        let elem = data.elem;
        mode = elem.value;
      });
      form.on('radio(cate-filter)', (data)=>{
        let elem = data.elem;
        cate = elem.value;
      });
      form.on('input-affix(ok)', function(data){
        let elem = data.elem;
        let value = elem.value;
        if(value != ''){
          if(mode == '0' || mode =='1') rule.groups[0].key = Number(value);
          else rule.groups[0].rules[0]['key'] = Number(value);
          layer.msg('修改成功',{icon: 1});
        }
      });
      element.on('tab(tab-filter)',(data)=>{
        console.log(this); // 当前 tab 标题所在的原始 DOM 元素
        console.log(data.index); // 得到当前 tab 项的所在下标
        console.log(data.elem); // 得到当前的 tab 容器
      });
    });
  };

  function copyRule(rule, mode){
    if(mode == '0'){
      const tsFile = `import { defineAppConfig } from '../types';\r\rexport default defineAppConfig(${JSON5.stringify(rule,null,2)});\r`;
      navigator.clipboard.writeText(tsFile).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
    else if(mode == '1'){
      navigator.clipboard.writeText(JSON5.stringify(rule,null,2)).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
    else if(mode == '2'){
      navigator.clipboard.writeText(JSON5.stringify(rule.groups[0],null,2)).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
    else if(mode == '3'){
      navigator.clipboard.writeText(JSON5.stringify(rule.groups[0].rules[0],null,2)).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
  }

  function categories(){
    let categories = window.localStorage.getItem('categories');
    let CateChoo = document.getElementById('categories');
    if(categories != ''){
      categories = JSON5.parse(categories);
      categories.forEach((b)=>{
        let TInput = document.createElement('input');
        TInput.type = 'radio';
        TInput.name = 'RCate';
        TInput.value = b.name;
        TInput.title = b.name;
        TInput.setAttribute('lay-filter','cate-filter');
        CateChoo.appendChild(TInput);
      });
    }
  }

})();