ApolloConfigSearch

用于进行配置系统apollo的Key的快速搜索和定位

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         ApolloConfigSearch
// @namespace    https://apollo.com/
// @version      0.3
// @description  用于进行配置系统apollo的Key的快速搜索和定位
// @author       AustinYoung
// @match        https://*/config.html
// @grant        unsafeWindow
// @license      MIT
// ==/UserScript==
// 用于进行appllo系统的 Key内容的快速搜索和定位
// 支持用空格分割关键字对输入内容进行“与”方式搜索
// 全局变量保存基础信息
var CurrIndex = 0; // 当前查询到的位置
var ArrlIndex = []; // 总共的位置集合
let PreObj = null;  // 前一个获取对象
let PreSearchKey = '';  // 前一个获取对象
var ArrObj = [];   // 文字和td对象数组
// 全局变量结束
(function () {
    'use strict';
    addButton()
    // Your code here...
})();
// 返回表格中每一行中 Key的内容,形成数组
function getKeys(objTrs, index) {
    //let text,obj;
    let objArr = []
    objTrs.forEach(x => {
        let obj = x.querySelector('td:nth-child(' + (index + 1) + ')')
        if (obj == null) {
            return;
        }
        let txt = obj.innerText.toLowerCase(); // 无视大小写
        objArr.push({ obj, txt })
    })
    return objArr;
}

function addButton() {
    var strControlHTML = `
    <div style="padding:2px;position:fixed;top:40px;left:2px;z-index:99999" id="myselfFloat">
    <div  style="background-color:rgb(208, 227, 245);opacity: 0.8;">
        <span style="cursor:pointer;" onclick="showList()">🔎</span>
        <span id="searchBar">
            <input id="mySearchKey" size="20" placeholder="请输入回车搜索Key 可空格分割多条件"/>
            <span style="cursor:pointer;" id="btPre">▲</span> <span style="cursor:pointer;" id="btNext">▼</span>
            <span id="searchHint"></span>
        </span>
    </div>
  </div>
  `;
    var oNode = document.createElement('div');
    oNode.innerHTML = strControlHTML;
    document.body.append(oNode);
    setTimeout( function(){
        getAllKeys()
        btPre.onclick= function(){
            doSearch(-1)
            return false
        }
        btNext.onclick= function(){
            doSearch(1)
            return false
        }
        mySearchKey.onkeypress = function(){
            doSearch(window.event)
        }
    },1)
}
unsafeWindow.showList = function () {
    searchBar.style.display = searchBar.style.display == '' ? 'none' : ''
}
function doSearch(e) {
    if (e.keyCode == 13) {
        // 默认为往下收缩
        e = 1
    }
    // 只有当e不是事件时才执行搜索
    if (e.keyCode == null) {
        // 获取输入内容
        let currKeys = mySearchKey.value.trim();
        // 不输入内容,则表示清空
        if(currKeys =='')
        {
            CurrIndex = 0;
            ArrlIndex = [];
            showHint('请输入内容!','red')
            return;
        }
        if (currKeys != PreSearchKey) {
            // 重新搜索
            searchTxt(currKeys)
            PreSearchKey = currKeys;
        }
        if (e == 1) {
            //console.log('doSearch')
            searchFocus(e)
        } else if (e == -1) {
            //console.log('doSearch back')
            searchFocus(e)
        }
    }
}
function getAllKeys() {
    if (ArrObj.length > 0) {
        //console.log('getAllKeys.len:',getAllKeys.length)
        return;
    }
    var allTableDiv = document.querySelectorAll('.namespace-view-table table')
    allTableDiv.forEach(x => {
        // 要获取判断第几列是 Key
        if (x.className.indexOf('hide') > -1) {
            return
        }
        let ths = Array.from(x.querySelectorAll('th'))
        let keyCol = 2; // 默认第二列
        ths.find((v, i) => {
            let txt = v.innerText;
            if (txt.indexOf('Key') > -1) {
                keyCol = i;
                return true;
            }
        })
        ArrObj.push(...getKeys(x.querySelectorAll('tr'), keyCol))
    })
    //console.log("getAllKeys ",ArrObj)
}
// 搜索内容并复位相关标记
function searchTxt(keyword) {
    if (ArrObj.length == 0) {
        getAllKeys();
    }
    CurrIndex = 0;
    ArrlIndex = [];
    // 无视大小写
    let arrKey=keyword.toLowerCase().split(/\s+/);
    ArrObj.forEach((x, i) => {
        // 核心搜索
        let hasFound = arrKey.every(y=>{
            return (x.txt.indexOf(y) > -1) 
        })
        if (hasFound) {
            ArrlIndex.push(i)
        }
    })
    // console.log(ArrlIndex)
}
// 根据当前搜索内容,定位到需要的位置
function searchFocus(flag) {
    let curr = CurrIndex
    curr += flag
    let extHint = ''
    let color = 'blue'
    if (curr < 0) {
        extHint = '到达顶部,从尾部开始'
        curr = ArrlIndex.length - 1
    } else if (curr >= ArrlIndex.length) {
        extHint = '到达尾部,从头开始'
        curr = 0
    }
    // 在范围以内
    CurrIndex = curr
    // 清除上次的标记
    if (PreObj != null) {
        PreObj.style.borderColor = ''
    }
    let realIndex = ArrlIndex[CurrIndex]
    if(ArrlIndex.length==0)
    {
        extHint ='未搜索到任何信息!'
        showHint(extHint,'Magenta')
        return;
    }
    let realObj = ArrObj[realIndex]
    if(realObj==null){
        extHint ='对象不存在!'
        color = 'red'
    }else{
        showFocus(realObj.obj)
    }
    showHint(extHint,color)
}
// 显示提示信息
function showHint(txt,color)
{
    searchHint.innerHTML = `当前${CurrIndex+1}/${ArrlIndex.length} <span style="color:${color}">${txt}<span>`
}
// 高亮搜索到的内容并滚动到当前
function showFocus(obj) {
    //console.log(obj)
    obj.style.borderColor = 'red'
    obj.scrollIntoView({ behavior: "instant", block: "center", inline: "nearest" })
    PreObj = obj;
}