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

在GKD网页审查工具复制规则后,弹出提示框,让用户修改规则名称和描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         GKD网页审查工具规则复制增强
// @namespace    https://blog.adproqwq.xyz
// @version      0.4.1
// @description  在GKD网页审查工具复制规则后,弹出提示框,让用户修改规则名称和描述
// @author       Adpro
// @match        https://i.gkd.li/snapshot/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        unsafeWindow
// @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);
  unsafeWindow.onload = () => {
    layer = layui.layer;
    form = layui.form;
    element = layui.element;
    if(unsafeWindow.localStorage.getItem('categories') === null) unsafeWindow.localStorage.setItem('categories','');
  };

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

  function modifyRule(){
    let isSelectorCopyButtonExist = document.querySelector('[title=\"复制规则\"]');
    if(isSelectorCopyButtonExist !== null){
      document.querySelector('[title=\"复制规则\"]') = isSelectorCopyButtonExist;
      isSelectorCopyButtonExist.onclick = () => {
        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;
                unsafeWindow.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="app模式" lay-filter="mode-filter" checked>
                        <input type="radio" name="mode" value="1" title="groups模式" lay-filter="mode-filter">
                        <input type="radio" name="mode" value="2" 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">规则组名称:</label>
                        <div class="layui-input-block">
                          <input type="text" name="Rname" placeholder="${rule.groups[0].name}" 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="没有描述不填" 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 + '-';
          });
          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'){
      navigator.clipboard.writeText(JSON5.stringify(rule,null,2)).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
    else if(mode == '1'){
      navigator.clipboard.writeText(JSON5.stringify(rule.groups[0],null,2)).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
    else if(mode == '2'){
      navigator.clipboard.writeText(JSON5.stringify(rule.groups[0].rules[0],null,2)).then(()=>{
        layer.msg('注入修改成功',{icon: 1});
      });
    }
  }

  function categories(){
    let categories = unsafeWindow.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);
      });
    }
  }
  
  let body = document.body;
  let config = {
    childList: true
  };
  let callback = (mutationsList)=>{
    mutationsList.forEach(() => {
      modifyRule();
    });
  };
  
  let observer = new MutationObserver(callback);
  observer.observe(body,config);

})();