GreasyFork Search

To search scripts using Google Search

目前为 2023-07-15 提交的版本。查看 最新版本

// ==UserScript==
// @name         GreasyFork Search
// @namespace    http://tampermonkey.net/
// @version      0.3.1
// @description  To search scripts using Google Search
// @author       CY Fung
// @match        https://greasyfork.org/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    let input = document.querySelector('form input[name="q"]');
    if (!(input instanceof HTMLInputElement)) return;
    let form = input.closest('form');
    if (!(form instanceof HTMLFormElement)) return;


    let locales = [...document.querySelectorAll('select#language-selector-locale > option')].map(x => x.value)


    form.addEventListener('submit', function (evt) {

        let form = evt.target;
        if (!(form instanceof HTMLFormElement)) return;
        let input = form.querySelector('input[name="q"]');
        if (!(input instanceof HTMLInputElement)) return;

        let value = input.value;
        let oldValue = value;
        const lang = document.documentElement.lang || '';

        let useLang = false;


        let u = 0;
        let isGoogleSearch = false;

        let sites = [];

        const split = value.split(/\s+/);
        let reformedSplit = [];
        for (const s of split) {

            if (!isGoogleSearch && /^[a-z][a-z0-9_-]{2,}(\.[a-z][a-z0-9_-]{2,})*(\.[a-z-]{2,4})+$/.test(s)) {
                sites.push(s);
            } else if (u === 0 && s === 'g') {
                isGoogleSearch = true;
            } else if (locales.indexOf(s) >= 0 || s === lang) {
                useLang = s;
            } else {
                reformedSplit.push(s);
            }
            u++;
        }

        value = reformedSplit.join(' ')


        if (isGoogleSearch && value) {
            let q = value.replace('g ', '');

            let m = "-inurl%3A%22%2Fusers%2F%22+-inurl%3A%22%2Fdiscussions%22-inurl%3A%22%2Fstats%22+-inurl%3A%22%2Ffeedback%22+-inurl%3A%22%2Fcode%22+-inurl%3A%22q%3D%22+-inurl%3A%22%2Fby-site%2F%22+inurl%3A%22%2Fscripts%2F%22+site%3Agreasyfork.org";



            let lr = useLang ? `&lr=lang_${useLang}` : '';
            evt.preventDefault();
            location.href = `https://www.google.com/search?q=${encodeURIComponent(q)}+${m}${lr}`

        } else if (value) {

            if (!form.querySelector('input[name="site"]')) {
                input.parentNode.insertBefore(Object.assign(document.createElement('input'), {
                    type: 'hidden',
                    name: 'site',
                    value: ''
                }
                ), input.nextSibiling);
            }
            const site = form.querySelector('input[name="site"]');


            value = value.replace(/\s+/g, ' ');
            if (sites.length === 1) {
                site.value = sites[0];
            }
            else site.value == '';

            if (form.getAttribute('action') === `/${lang}/scripts` && useLang && useLang !== lang) {

                form.setAttribute('action', `/${useLang}/scripts`)
            }

            if (site.value === '') site.remove();


            if (value !== oldValue) input.value = value;

        

        } else {
            evt.preventDefault();
        }

    })

    // Your code here...
})();