Skip to content

Instantly share code, notes, and snippets.

@Howard3
Last active May 3, 2023 01:20
Show Gist options
  • Save Howard3/8559d643e6a9ace6b49a35450ee97d18 to your computer and use it in GitHub Desktop.
Save Howard3/8559d643e6a9ace6b49a35450ee97d18 to your computer and use it in GitHub Desktop.
userscript - Github: Add "Copy" button next to package tags
// ==UserScript==
// @name GitHub Docker Image Tag Copy Button
// @description Adds a "copy" icon next to each Docker image tag on GitHub pages that list published Docker images.
// @version 2
// @match https://github.com/*
// @grant GM_setClipboard
// @require https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/js/all.min.js
// @license MIT
// @author Howard D. Lince III
// @supportURL https://twitter.com/HowardL3
// @namespace https://github.com/howard3
// ==/UserScript==
(function() {
'use strict';
function addCopyButton(tagEl) {
// Create a "copy" button with an icon
const copyBtn = document.createElement('button');
copyBtn.classList.add('btn', 'btn-sm');
copyBtn.style.marginRight = '10px';
copyBtn.style.cursor = 'pointer';
const copyIcon = document.createElement('i');
copyIcon.classList.add('fas', 'fa-copy');
copyIcon.style.marginRight = '5px';
// Add the icon to the button
copyBtn.appendChild(copyIcon);
// Add a click event listener to copy the tag text to the clipboard
copyBtn.addEventListener('click', () => {
GM_setClipboard(tagEl.textContent.trim());
});
// Insert the "copy" button next to the Docker image tag
tagEl.parentNode.insertBefore(copyBtn, tagEl.nextSibling);
}
function addCopyButtons(node) {
// Find all elements that contain Docker image tags with links
const tagEls = node.querySelectorAll('.Box-row a.Label');
if (tagEls.length > 0) {
// Loop through each Docker image tag element and add a "copy" button with an icon
tagEls.forEach(addCopyButton);
}
}
// Add copy buttons when the page first loads
addCopyButtons(document);
// Watch for changes to the DOM using a MutationObserver
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
for (const addedNode of mutation.addedNodes) {
// Query the added node for Docker image tags with links and add copy buttons to them
addCopyButtons(addedNode);
}
}
}
});
observer.observe(document.body, { childList: true, subtree: true });
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment