Reddit Search Tab on Google

Adds a Reddit tab on Google search pages with various settings options for site and keyword search.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Reddit Search Tab on Google
// @version      1.0
// @description  Adds a Reddit tab on Google search pages with various settings options for site and keyword search.
// @namespace    https://github.com/JrdnRgrs/reddit-search-tab-on-google
// @author       Jordan Rogers
// @match        *://*.google.com/search*
// @icon         https://www.redditstatic.com/desktop2x/img/favicon/favicon-32x32.png
// @run-at       document-end
// @grant        GM_setValue
// @grant        GM_getValue
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Settings: Change these to configure the script behavior
    const tabOnly = false; // Set to true if you want only the tab that adds "site:reddit.com"
    const tabDropdown = true; // Set to true if you want the settings displayed as a basic dropdown when the Reddit tab is clicked
    const caretDropdown = false; // Set to true if you want the settings displayed when the caret is clicked
    const iconDropdown = false; // Set to true if you want the settings displayed when the settings icon is clicked

    function addRedditTab() {
        const searchTabsContainer = document.querySelectorAll('[role="list"]');

        if (searchTabsContainer.length > 0) {
            const searchTabs = searchTabsContainer[0];

            // Create the Reddit tab container
            const redditTabContainer = document.createElement('div');
            redditTabContainer.setAttribute('role', 'listitem');
            redditTabContainer.style.position = 'relative';
            redditTabContainer.style.display = 'flex';
            redditTabContainer.style.alignItems = 'center';

            // Create Reddit button
            const redditButton = document.createElement('a');
            redditButton.href = '#';
            redditButton.className = 'nPDzT T3FoJb';
            redditButton.role = 'link';
            redditButton.innerHTML = `
                <div class="YmvwI">
                    <img src="https://www.redditstatic.com/desktop2x/img/favicon/favicon-32x32.png" alt="Reddit" style="height:16px;margin-right:5px;">
                    Reddit
                </div>
            `;
            redditTabContainer.appendChild(redditButton);

            if (tabOnly) {
                // Add click event to the Reddit button to perform the search with "site:reddit.com"
                redditButton.addEventListener('click', function(e) {
                    e.preventDefault();
                    const currentUrl = new URL(window.location.href);
                    const queryParams = currentUrl.searchParams;
                    const currentQuery = queryParams.get('q');

                    if (!currentQuery.includes('site:reddit.com')) {
                        queryParams.set('q', `${currentQuery} site:reddit.com`);
                    }
                    currentUrl.search = queryParams.toString();
                    window.location.href = currentUrl.toString();
                });
            }

            if (tabDropdown) {
                // Create the dropdown container
                const redditDropdown = document.createElement('div');
                redditDropdown.className = 'SF7xd';
                redditDropdown.setAttribute('role', 'listitem');
                redditDropdown.innerHTML = `
                    <g-popup jsname="V68bde" class="CzKhHb" jscontroller="DPreE" jsaction="A05xBd:IYtByb;EOZ57e:WFrRFb;">
                        <div jsname="oYxtQd" class="CcNe6e" aria-expanded="false" aria-haspopup="true" role="button" tabindex="0" jsaction="WFrRFb;keydown:uYT2Vb" style="display: inline-flex; align-items: center; padding: 0 10px; cursor: pointer;">
                            <div class="Lu57id" style="display: inline-flex; align-items: center;">
                                <span style="height:16px;line-height:16px;width:16px;margin-right:5px;" class="z1asCe SaPW2b">
                                    <img src="https://www.redditstatic.com/desktop2x/img/favicon/favicon-32x32.png" alt="Reddit" style="height:16px;">
                                </span>
                                Reddit
                            </div>
                        </div>
                        <div jsname="V68bde" class="UjBGL iRQHZe" style="z-index: 200; display: none; position: absolute; top: 35px;">
                            <div jsname="xl07Ob" class="CybWFf" tabindex="-1">
                                <div class="LtmTod">
                                    <div role="listitem" data-hveid="CD8QAA">
                                        <a href="#" class="LatpMc d4DFfb nPDzT T3FoJb" role="link">
                                            <div class="eJWNqc YmvwI" jsname="bVqjv">Site</div>
                                        </a>
                                    </div>
                                </div>
                                <div class="LtmTod">
                                    <div role="listitem" data-hveid="CEEQAA">
                                        <a href="#" class="LatpMc d4DFfb nPDzT T3FoJb" role="link">
                                            <div class="eJWNqc YmvwI" jsname="bVqjv">Keyword</div>
                                        </a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </g-popup>
                `;

                // Add event listeners for the dropdown toggle
                const dropdownButton = redditDropdown.querySelector('[aria-haspopup="true"]');
                const dropdownMenu = redditDropdown.querySelector('.UjBGL');

                dropdownButton.addEventListener('click', function() {
                    const isExpanded = dropdownButton.getAttribute('aria-expanded') === 'true';
                    dropdownButton.setAttribute('aria-expanded', !isExpanded);
                    dropdownMenu.style.display = !isExpanded ? 'block' : 'none';
                });

                // Add event listeners for the dropdown items
                const siteLink = redditDropdown.querySelector('.LtmTod:first-child a');
                const keywordLink = redditDropdown.querySelector('.LtmTod:last-child a');

                siteLink.addEventListener('click', function(e) {
                    e.preventDefault();
                    const currentUrl = new URL(window.location.href);
                    const queryParams = currentUrl.searchParams;
                    const currentQuery = queryParams.get('q');

                    if (!currentQuery.includes('site:reddit.com')) {
                        queryParams.set('q', `${currentQuery} site:reddit.com`);
                        currentUrl.search = queryParams.toString();
                        window.location.href = currentUrl.toString();
                    }
                });

                keywordLink.addEventListener('click', function(e) {
                    e.preventDefault();
                    const currentUrl = new URL(window.location.href);
                    const queryParams = currentUrl.searchParams;
                    const currentQuery = queryParams.get('q');

                    if (!currentQuery.includes('reddit')) {
                        queryParams.set('q', `${currentQuery} reddit`);
                        currentUrl.search = queryParams.toString();
                        window.location.href = currentUrl.toString();
                    }
                });

                // Append the Reddit dropdown to the search tabs container
                searchTabs.appendChild(redditDropdown);
            }

            if (caretDropdown) {
                // Create caret icon
                const caretIcon = document.createElement('span');
                caretIcon.textContent = '▼';
                caretIcon.style.marginLeft = '5px';
                caretIcon.style.cursor = 'pointer';
                redditTabContainer.appendChild(caretIcon);

                // Create dropdown for the caret
                const settingsDropdown = document.createElement('div');
                settingsDropdown.style.position = 'absolute';
                settingsDropdown.style.backgroundColor = 'var(--gZl0ff, #303134)';
                settingsDropdown.style.color = '#e8eaed';
                settingsDropdown.style.border = '1px solid var(--p9J9c, #5f6368)';
                settingsDropdown.style.padding = '5px 10px';
                settingsDropdown.style.display = 'none';
                settingsDropdown.style.zIndex = '300';
                settingsDropdown.style.top = '100%';
                settingsDropdown.style.left = '0';
                settingsDropdown.innerHTML = `
                    <label>
                        <input type="radio" name="reddit-search-mode" value="site" ${GM_getValue('searchMode', 'site') === 'site' ? 'checked' : ''}>
                        Use site:reddit.com
                    </label><br>
                    <label>
                        <input type="radio" name="reddit-search-mode" value="keyword" ${GM_getValue('searchMode', 'site') === 'keyword' ? 'checked' : ''}>
                        Use keyword "reddit"
                    </label>
                `;
                redditTabContainer.appendChild(settingsDropdown);

                // Toggle dropdown on caret icon click
                caretIcon.addEventListener('click', function(e) {
                    e.stopPropagation();
                    e.preventDefault();
                    settingsDropdown.style.display = settingsDropdown.style.display === 'none' ? 'block' : 'none';
                });

                // Save selected option and update the Reddit tab click behavior
                settingsDropdown.querySelectorAll('input[name="reddit-search-mode"]').forEach(radio => {
                    radio.addEventListener('change', function() {
                        GM_setValue('searchMode', this.value);
                        settingsDropdown.style.display = 'none';
                    });
                });

                // Close dropdown if clicking outside
                document.addEventListener('click', function(e) {
                    if (!redditTabContainer.contains(e.target)) {
                        settingsDropdown.style.display = 'none';
                    }
                });
            }

            if (iconDropdown) {
                // Add settings icon next to the Reddit tab
                const settingsButton = document.createElement('span');
                settingsButton.innerHTML = '⚙️';
                settingsButton.style.cursor = 'pointer';
                settingsButton.style.marginLeft = '10px';
                redditTabContainer.appendChild(settingsButton);

                // Create settings popup
                const settingsPopup = document.createElement('div');
                settingsPopup.style.position = 'absolute';
                settingsPopup.style.backgroundColor = 'var(--gZl0ff, #303134)';
                settingsPopup.style.color = '#e8eaed';
                settingsPopup.style.border = '1px solid var(--p9J9c, #5f6368)';
                settingsPopup.style.padding = '10px';
                settingsPopup.style.display = 'none';
                settingsPopup.style.zIndex = '300';
                settingsPopup.innerHTML = `
                    <label>
                        <input type="radio" name="reddit-search-mode" value="site" ${GM_getValue('searchMode', 'site') === 'site' ? 'checked' : ''}>
                        Use site:reddit.com
                    </label><br>
                    <label>
                        <input type="radio" name="reddit-search-mode" value="keyword" ${GM_getValue('searchMode', 'site') === 'keyword' ? 'checked' : ''}>
                        Use keyword "reddit"
                    </label>
                `;

                // Toggle settings popup on icon click
                settingsButton.addEventListener('click', function() {
                    settingsPopup.style.display = settingsPopup.style.display === 'none' ? 'block' : 'none';
                });

                // Save selected option and update the Reddit tab click behavior
                settingsPopup.querySelectorAll('input[name="reddit-search-mode"]').forEach(radio => {
                    radio.addEventListener('change', function() {
                        GM_setValue('searchMode', this.value);
                        settingsPopup.style.display = 'none';
                    });
                });

                // Position the popup correctly
                settingsButton.addEventListener('click', function() {
                    const rect = settingsButton.getBoundingClientRect();
                    settingsPopup.style.left = `${rect.left}px`;
                    settingsPopup.style.top = `${rect.bottom + window.scrollY}px`;
                });

                // Append settings popup to body
                document.body.appendChild(settingsPopup);
            }
            if (tabOnly || caretDropdown || iconDropdown) {

                // Add click event to the Reddit tab to perform the search based on the selected mode
                redditButton.addEventListener('click', function(e) {
                    e.preventDefault();
                    const searchMode = GM_getValue('searchMode', 'site');
                    const currentUrl = new URL(window.location.href);
                    const queryParams = currentUrl.searchParams;
                    const currentQuery = queryParams.get('q');

                    if (searchMode === 'site') {
                        if (!currentQuery.includes('site:reddit.com')) {
                            queryParams.set('q', `${currentQuery} site:reddit.com`);
                        }
                    } else {
                        if (!currentQuery.includes('reddit')) {
                            queryParams.set('q', `${currentQuery} reddit`);
                        }
                    }
                    currentUrl.search = queryParams.toString();
                    window.location.href = currentUrl.toString();
                });

                searchTabs.appendChild(redditTabContainer);
            }
        }
    }

    // Run the function to add the Reddit tab
    addRedditTab();
})();