Github mirror/cdn

在Github官网和镜像网站进行转换

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

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

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

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.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         Github mirror/cdn
// @namespace    dmsrs
// @version      1.0
// @description  在Github官网和镜像网站进行转换 
// @author       HuanZhi
// @match        https://github.com/*
// @grant        unsafewindow
// @license      MIT
// @run-at       document-start
// ==/UserScript==
(function(){
    function parseGitHubUrl(url) {
        if (typeof url !== 'string' || !url.trim()) return null;
        // 匹配 GitHub URL 的正则表达式
        const regex = /https?:\/\/github\.com\/([^\/]+)\/([^\/]+)(?:\/(?:tree|blob)\/([^\/]+)(?:\/(.*))?)?/;
        const match = url.match(regex);

        try {
            if (!match) return null;
        } catch (error) {
            console.error('Error parsing GitHub URL:', error);
            return null;
        }

        const repo = `${match[1]}/${match[2]}`;
        const branch = match[3] || (url.includes('github.com') ? 'main' : null);
        const file = match[4] || '';

        return { repo, branch, file };
    }

    var btn = document.createElement("button");
    btn.setAttribute('style', "position:absolute; z-index:1000; right:15px; top:55px; height:28px; background-color:#3E8CD0; border:none; color:white; font-size:16px; cursor:pointer; border-radius:1em;");
    btn.setAttribute('id', "btn");
    document.body.appendChild(btn);

    const URL_PREFIX = 'https://cdn.jsdelivr.net/gh'
    btn.onmouseover = function() {
        this.style.backgroundColor="#e9686b"
    };
    btn.onmouseout = function() {
        this.style.backgroundColor="#3E8CD0"
    };

    var url = window.location.href;
    if (url.includes("github")) {
        let { repo, branch, file }=parseGitHubUrl(window.location.href)
        let newUrl =`${URL_PREFIX}/${repo}@${branch}/${file}`;
        btn.innerText = "Goto jsdelivr";
        btn.title =newUrl
        btn.onclick=gotoJsdelivr
    } else if (url.includes("jsdelivr")) {
        btn.innerText = "当前镜像网站,别登录账号";
        btn.onclick=JumpToGitOrigin;
    }
    function gotoJsdelivr(){
        console.log(this.title)
        window.open(this.title)
    }
    function JumpToGitOrigin(){
        alert('Not Support,欢迎提交PR')
    }

}
)()