搜索语法插件

更便捷地使用搜索引擎语法,以实现一些过滤功能

// ==UserScript==

// @namespace         https://greasyfork.org/zh-CN/users/106222-qxin-i

// @name              搜索语法插件
// @name:en           search engine grammer plugins
// @name:zh           搜索语法插件

// @description       更便捷地使用搜索引擎语法,以实现一些过滤功能
// @description:en    More convenient use of search engine syntax to achieve some filtering functions
// @description:zh    更便捷地使用搜索引擎语法,以实现一些过滤功能

// @license           MIT

// @include         /*://\w+\.google\.\w+$/
// @include         /*://\w+\.google\.\w+/search.*/
// @include         /*://\w+\.bing\.\w+$/
// @include         /*://\w+\.bing\.\w+/search.*/
// @match           *://www.google.com*
// @match           *://*.bing.com*
// @match           *://*.bing.com/search*

// @version 0.0.1.20241022085438
// ==/UserScript==

(function(){

    /** 搜索框输入元素 */
    const getBingInputElement = () => document.querySelector("#sb_form_q")
    const getGoogleInputElement = () => document.querySelector("#APjFqb")

    /** 
     * 搜索引擎语法 的文本
     * TODO 准备通过 UI 来接收用户输入
     */
    let textPatch = ""

    /** 基本功能测试 */
    class Test{

        appendText = " 我"

        static testGetText() {
            document.body.onkeyup = (ev) => {
                let code = ev.code
                console.log(code);
                if (code == "F1") {
                    alert(getBingInputElement().value)
                }
            }
        }

        /**
         * 输入内容时,添加搜索语法
         */
        static modifyText() {
            getBingInputElement().oninput = (ev) => {
                let e = getBingInputElement()
                let v = e.value
                if (!v.endsWith(appendText)) {
                    e.value += appendText
                    console.log("appended! ", e.value);
                }else{
                    console.log(e.value)
                }
            }
        }

    }


    /**
     * 双向触发的输入值修改
     * 双向:输入内容 与 搜索选项文本补丁
     */
    class Main {
        
        static start(){
            textPatch = " "
            textPatch += "-site:csdn.net"
            textPatch += " -site:zhihu.com"

            Main.addInputListener(getBingInputElement)
            Main.addInputListener(getGoogleInputElement)
        }

        /** 
         * 输入内容 触发的输入值修改
         */
        static addInputListener(getElementFunc){
            let element = getElementFunc()
            if (element === undefined || element === null) {
                console.log("WARN: 无输入元素");
                return
            }
            element.oninput = (ev) => {
                let e = getElementFunc()

                let cursorStart = e.selectionStart  // 光标初始位置
                let v = e.value

                if (!v.endsWith(textPatch)) {
                    e.value += textPatch

                    // 重新定位光标
                    e.selectionStart = cursorStart
                    e.selectionEnd = cursorStart

                    console.log(`appended:[${e.value}]    cursorIndex:[${cursorStart}]`);
                }else{
                    // console.log(e.value)
                }
            }
        }
    }

    Main.start()

 })();