GitHub菜单

为GitHub头添加仓库菜单。

目前為 2020-03-16 提交的版本,檢視 最新版本

// ==UserScript==
// @name         GitHub菜单
// @name:en      GitHub Menu
// @name:zh      GitHub菜单
// @name:zh-CN   GitHub菜单
// @namespace    https://gf.qytechs.cn/zh-CN/users/331591
// @version      1.0.0
// @description  为GitHub头添加仓库菜单。
// @description:zh  为GitHub头添加仓库菜单。
// @description:zh-CN  为GitHub头添加仓库菜单。
// @description:en  Add the repositories menu fot GitHub.
// @author       Hale Shaw
// @match        https://github.com/*
// @match        https://github.wdf.sap.corp/*
// @icon         https://github.githubassets.com/favicon.ico
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const menuClassName1 = "d-flex flex-column flex-lg-row flex-self-stretch flex-lg-self-auto";
    const menuClassName2 = "d-flex";

    let menu = {};
    let exploreText = "";
    let menuItemClassName = "";
    let flag = false;
    let domainName;

    const accountName = getAccountName();
    getMenu();
    addMenuItem();

    /**
     * get the menu object by different class name.
     */
    function getMenu() {
        if (document.getElementsByClassName(menuClassName1) && document.getElementsByClassName(menuClassName1)[0] != undefined) {
            menu = document.getElementsByClassName(menuClassName1)[0];
            exploreText = menu.children[4].innerText;
            menuItemClassName = "js-selected-navigation-item Header-link mr-0 mr-lg-3 py-2 py-lg-0 border-top border-lg-top-0 border-white-fade-15";
            flag = true;
        }
        else if (document.getElementsByClassName(menuClassName2) && document.getElementsByClassName(menuClassName2)[0] != undefined) {
            const menus = document.getElementsByClassName(menuClassName2);
            for (let i = 0; i < menus.length; i++) {
                const labelValue = menus[i].getAttribute("aria-label");
                if ("Global" == labelValue) {
                    menu = menus[i];
                    break;
                }
            }
            if (isEnterprise()) {
                exploreText = menu.children[2].innerText;
            }
            else {
                exploreText = menu.children[3].innerText;
            }
            menuItemClassName = "js-selected-navigation-item Header-link mr-3";
            flag = true;
        }
    }

    /**
     * add menu item.
     */
    function addMenuItem() {
        if (flag) {
            let repoText = "Repositories";
            let watchText = "Watching";
            let starText = "Stars";
            let setText = "Settings"
            if ("探索" == exploreText) {
                repoText = "仓库";
                watchText = "关注";
                starText = "点赞";
                setText = "设置";
            }
            let repoUrl;
            let starUrl;
            const watchUrl = "https://" + domainName + "/watching";
            const settingUrl = "https://" + domainName + "/settings/profile";

            if ("" == accountName) {
                repoUrl = "https://" + domainName + "/HaleShaw?tab=repositories";
                starUrl = "https://" + domainName + "/HaleShaw?tab=stars";
            } else {
                repoUrl = "https://" + domainName + "/" + accountName + "?tab=repositories";
                starUrl = "https://" + domainName + "/" + accountName + "?tab=stars";
            }

            createMenuItem(repoText, repoUrl, menu);
            createMenuItem(watchText, watchUrl, menu);
            createMenuItem(starText, starUrl, menu);
            createMenuItem(setText, settingUrl, menu);
        }
    }

    /**
     * create menu item.
     * @param {String} name
     * @param {String} url
     * @param {Object} menu
     */
    function createMenuItem(name, url, menu) {
        const menuItem = document.createElement("a");
        menuItem.text = name;
        menuItem.className = menuItemClassName;
        menuItem.href = url;
        menu.appendChild(menuItem);
    }

    /**
     * get account name.
     */
    function getAccountName() {
        const dropdownClassName = "dropdown-item";
        let accountName = "";
        if (document.getElementsByClassName(dropdownClassName) && document.getElementsByClassName(dropdownClassName)[0] != undefined) {
            console.log("There is already an account logged in.");
            let accountHref;

            const dropdownItems = document.getElementsByClassName(dropdownClassName);
            for (let i = 0; i < dropdownItems.length; i++) {
                const profileAttrValue = "Header, go to profile, text:your profile";

                const attrValue = dropdownItems[i].getAttribute("data-ga-click");
                if (profileAttrValue == attrValue) {
                    accountHref = dropdownItems[i].href;
                    break;
                }
            }

            const splitArr = accountHref.split("/");
            accountName = splitArr[splitArr.length - 1];
            console.log("The account is " + accountName);
        }
        return accountName;
    }

    /**
     * check if the domain is enterprise.
     */
    function isEnterprise() {
        domainName = document.domain;
        if ("github.com" == domainName) {
            return false;
        }
        console.log("This is enterprise GitHub.");
        return true;
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址