// ==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);
}
}
}),
{}
);
});
})();
})();