GitHub JsDelivr Link

open github jsdelivr link

// ==UserScript==
// @name         GitHub JsDelivr Link
// @namespace    https://github.com/hungtcs
// @version      2024-12-10
// @description  open github jsdelivr link
// @author       hungtcs
// @license      MIT
// @match        https://github.com/**/*
// @icon         https://camo.githubusercontent.com/6a5d2046028682a99b5fa88ef0f3399c9bced1d514179686a3973a323bccbf44/68747470733a2f2f7777772e6a7364656c6976722e636f6d2f69636f6e5f323536783235362e706e67
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const iconUrl = 'https://camo.githubusercontent.com/6a5d2046028682a99b5fa88ef0f3399c9bced1d514179686a3973a323bccbf44/68747470733a2f2f7777772e6a7364656c6976722e636f6d2f69636f6e5f323536783235362e706e67'

    function run() {
        const copyPathButton = document.querySelector('button[aria-label="Copy path"]');
        if (!copyPathButton) {
            return;
        }

        const url = new URL(window.location.href);
        const { pathname } = url;
        const isFile = pathname.includes('/blob/')
        const isFolder = pathname.includes('/tree/')

        let link;
        if (isFolder) {
            const index = pathname.indexOf('/tree/');
            const author = pathname.slice(1, index);
            let rest = pathname.slice(index + 6);
            const version = rest.slice(0, rest.indexOf('/'))
            const filepath = rest.slice(rest.indexOf('/'));
            link = `https://cdn.jsdelivr.net/gh/${ author }@${version}${filepath}/`;
        } else if (isFile) {
            const index = pathname.indexOf('/blob/');
            const author = pathname.slice(1, index);
            let rest = pathname.slice(index + 6);
            const version = rest.slice(0, rest.indexOf('/'))
            const filepath = rest.slice(rest.indexOf('/'));
            link = `https://cdn.jsdelivr.net/gh/${ author }@${version}${filepath}`;
        } else {
            return;
        }

        let actionButton = document.querySelector('button[aria-label="Open JsDelivr Link"]')
        if (!actionButton) {
            const copyPathButtonWrapper = copyPathButton.parentElement;
            const container = copyPathButtonWrapper.parentElement
            const actionNode = copyPathButtonWrapper.cloneNode(true)
            actionButton = actionNode.querySelector('button')
            actionButton.setAttribute('title', 'Open JsDelivr Link')
            actionButton.setAttribute('aria-label', 'Open JsDelivr Link')
            actionButton.innerHTML = `<img src=${iconUrl} style="height: 16px;" />`;
            container.appendChild(actionNode);
        }


        actionButton.onclick = () => {
            window.open(link);
        };
    }

    setInterval((event) => {
        run();
    }, 1000);
})();