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);
})();