Google RHS Order

Sort RHS in Google

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        Google RHS Order
// @namespace   Violentmonkey Scripts
// @match       https://www.google.*/*
// @version     1.1.1
// @license     MIT
// @author      Benature
// @description Sort RHS in Google
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_registerMenuCommand
// @icon        https://www.google.com/images/branding/googleg/1x/googleg_standard_color_128dp.png
// @homepageURL https://github.com/Benature
// ==/UserScript==

(function() {
    'use strict';

    // 定义默认设置
    const defaultSettings = {
        substrings: ['Obsidian', 'cubox', 'diigo', 'c4g', 'monica']
    };

    // 读取用户设置
    const settings = GM_getValue('userSettings', defaultSettings);

    // 注册菜单命令以允许用户更改设置
    GM_registerMenuCommand('Change Substrings', function() {

        console.log('substrings: ', settings.substrings);
        // 这里可以添加代码来弹出一个对话框,让用户输入新的子字符串
        // 例如,使用prompt()函数来获取用户输入
        const newSubstrings = prompt('Enter new substrings (comma-separated):', settings.substrings.join(', '));

        // 保存新的设置
        GM_setValue('userSettings', {
            substrings: newSubstrings.split(',').map(sub => sub.trim())
        });

        // 重新加载脚本以应用新的设置
        GM_notification('Substrings updated.', 'Substrings have been updated. Please reload the page to apply changes.');
    });


    // 自定义排序函数
    function customSort(a, b) {
        const substrings = settings.substrings;
        // 获取子元素的ID
        var aId = a.id;
        var bId = b.id;

        // 检查子元素的ID是否包含子字符串
        var aMatches = substrings.filter(sub => aId.includes(sub));
        var bMatches = substrings.filter(sub => bId.includes(sub));
        console.log(a, b)
        console.log(aMatches, bMatches)

        // 如果a和b都包含子字符串,比较子字符串的索引
        if (aMatches.length && bMatches.length) {
            var aIndex = substrings.indexOf(aMatches[0]);
            var bIndex = substrings.indexOf(bMatches[0]);

            // 如果索引相同,比较ID的自然顺序
            if (aIndex === bIndex) {
                return aId.localeCompare(bId);
            }
            return aIndex - bIndex;
        }

        // 如果a包含子字符串而b不包含,a在前
        if (aMatches.length && !bMatches.length) {
            return -1;
        }

        // 如果b包含子字符串而a不包含,b在前
        if (!aMatches.length && bMatches.length) {
            return 1;
        }

        // 如果都不包含子字符串,比较ID的自然顺序
        return aId.localeCompare(bId);
    }



    function sortChildrenById(containerId) {
        // 获取包含子元素的div
        var container = document.getElementById(containerId);

        // 检查div是否存在
        if (container) {
            // 获取所有具有id属性的子元素
            // var childrenWithId = Array.from(container.querySelectorAll('[id]'));
            var childrenWithId = Array.from(container.children).filter(child => child.id); // 只获取有id的子元素

            // 移除所有子元素
            container.innerHTML = '';

            // 根据ID对子元素进行排序
            childrenWithId.sort(customSort);

            // 重新插入排序后的子元素
            childrenWithId.forEach(function(child) {
                container.appendChild(child);
            });
        }
    }

    // 等待DOM完全加载后再运行排序函数
    function waitForDomReady() {
        // 检查DOM是否已经加载完成
        if (document.readyState === 'complete') {
            // 如果DOM已经加载完成,执行排序函数
            sortChildrenById('rhs');
        } else {
            // 如果DOM还未加载完成,等待100ms后再次检查
            setTimeout(waitForDomReady, 100);
        }
    }

    // 开始等待DOM加载
    waitForDomReady();
})();