Enhance github repository link with badges
// ==UserScript== // @name Github anchor enhance // @namespace https://github.com/NateScarlet/Scripts/tree/master/user-script // @description Enhance github repository link with badges // @grant GM.xmlHttpRequest // @run-at document-end // @include * // @version 2023.08.27+d1f0a919 // ==/UserScript== "use strict"; (() => { var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/github-anchor-enhance.user.ts var reservedUsername = /* @__PURE__ */ new Set([ "topics", "search", "ghost", "pulls", "issues", "marketplace", "explore", "discover", "notifications", "new", "organizations", "settings", "site", "about", "contact", "pricing", "apps", "features", "password_reset", "trending", "collections", "events", "stars", "codespaces", "sponsors", "logout", "account" ]); var allBadgeClasses = ["added-stars-badge", "added-last-commit-badge"]; var current = parseURL(location.href); function parseURL(rawURL) { const u = new URL(rawURL, document.baseURI); if (u.hostname !== "github.com") { return; } const match = /^\/([^/]+?)\/([^/]+?)(?:.git)?\/?$/.exec(u.pathname); if (!match) { return; } const owner = match[1]; const repo = match[2]; if (owner === (current == null ? void 0 : current.owner) && repo === current.repo) { return; } if (reservedUsername.has(owner)) { return; } return { owner, repo }; } function appendBadge(el, className, url) { return __async(this, null, function* () { if (el.classList.contains(className)) { return; } return new Promise((resolve, reject) => { GM.xmlHttpRequest({ method: "GET", url, onload: (resp) => { if (resp.status === 200) { if (!el.classList.contains(className)) { const img = document.createElement("img"); img.src = `data:image/svg+xml;base64,${btoa(resp.response)}`; const containerClassNames = [ "natescarlet-gmail-com", "badge-container" ]; const selector = containerClassNames.map((i) => "." + i).join(""); const container = el.querySelector(selector) || document.createElement("span"); el.appendChild(container); container.classList.add(...containerClassNames); container.append(img); img.style.order = allBadgeClasses.indexOf(className).toString(); container.style.display = "inline-flex"; el.classList.add(className); } resolve(); } reject(`${resp.status}: ${url}`); }, onerror: reject }); }); }); } function appendStarsBadge(el, res) { return __async(this, null, function* () { yield appendBadge( el, "added-stars-badge", `https://img.shields.io/github/stars/${res.owner}/${res.repo}.svg?style=social` ); }); } function appendLastCommitBadge(el, res) { return __async(this, null, function* () { yield appendBadge( el, "added-last-commit-badge", `https://img.shields.io/github/last-commit/${res.owner}/${res.repo}.svg` ); }); } (function() { return __async(this, null, function* () { document.addEventListener( "mouseover", (e) => __async(this, null, function* () { if (e.target instanceof HTMLAnchorElement) { const el = e.target; const res = parseURL(el.href); if (!res) { return; } try { yield Promise.all([ appendStarsBadge(el, res), appendLastCommitBadge(el, res) ]); } catch (err) { console.error(err); } } }), {} ); }); })(); })();