ApolloConfigSearch

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

// ==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;
}