您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a copy button to GitHub repos to copy the repo link in markdown format
- // ==UserScript==
- // @name GitHub Repo Markdown Link Copier
- // @namespace https://dvel.me/github-repo-markdown-link-copier
- // @version 1.0
- // @description Add a copy button to GitHub repos to copy the repo link in markdown format
- // @author Dvel
- // @match https://github.com/*/*
- // @grant GM_setClipboard
- // ==/UserScript==
- (function() {
- 'use strict';
- // SVG图标
- const copyIconSVG = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg>`;
- const checkedIconSVG = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-check2" viewBox="0 0 16 16"><path d="M13.854 3.646a.5.5 0 0 0-.708 0L7 9.793 3.854 6.646a.5.5 0 1 0-.708.708l3.5 3.5a.5.5 0 0 0 .708 0l6.5-6.5a.5.5 0 0 0 0-.708z"/></svg>`;
- // 使用MutationObserver监听DOM变化
- const observer = new MutationObserver(mutations => {
- mutations.forEach(mutation => {
- if (mutation.addedNodes.length > 0 || mutation.type === 'childList') {
- const navList = document.querySelector('nav[role="navigation"][aria-label="Page context"] ul');
- const existingButton = document.querySelector('#custom-copy-button');
- if (navList && !existingButton) {
- addCopyButton();
- }
- }
- });
- });
- // 观察器配置:观察子节点的变化
- const config = { childList: true, subtree: true };
- // 监听页面加载事件,然后开始观察DOM变化
- window.addEventListener('load', () => {
- observer.observe(document.body, config);
- });
- function addCopyButton() {
- // 定位到GitHub页面导航栏的ul元素
- const navList = document.querySelector('nav[role="navigation"][aria-label="Page context"] ul');
- if (!navList) return;
- // 获取仓库的用户名和名称
- const pathParts = document.location.pathname.split('/').filter(Boolean);
- const repoFullName = document.location.pathname.substring(1);
- const repoUrl = window.location.href;
- // 创建按钮和设置样式
- const listItem = document.createElement('li');
- listItem.id = 'custom-copy-button'; // 确保按钮唯一性
- const copyButton = document.createElement('button');
- copyButton.innerHTML = `${copyIconSVG} Copy`;
- styleButton(copyButton); // 应用样式
- // 点击按钮复制Markdown链接
- copyButton.onclick = function() {
- const markdownLink = `[${pathParts[0]}/${pathParts[1]}](${repoUrl})`;
- GM_setClipboard(markdownLink);
- copyButton.innerHTML = `${checkedIconSVG} Copied!`;
- setTimeout(() => { copyButton.innerHTML = `${copyIconSVG} copy`; }, 10000);
- };
- listItem.appendChild(copyButton);
- navList.appendChild(listItem);
- }
- // 应用按钮样式,模仿GitHub风格
- function styleButton(button) {
- button.style.padding = '5px 10px';
- button.style.fontSize = '12px';
- button.style.fontWeight = '600';
- button.style.lineHeight = '20px';
- button.style.color = '#24292e';
- button.style.backgroundColor = '#eff3f6';
- button.style.border = '1px solid rgba(27,31,35,.15)';
- button.style.borderRadius = '6px';
- button.style.cursor = 'pointer';
- button.style.marginLeft = '8px';
- button.style.display = 'flex';
- button.style.alignItems = 'center';
- button.style.gap = '5px';
- button.onmouseover = function() {
- this.style.backgroundColor = '#e1e4e8';
- };
- button.onmouseout = function() {
- this.style.backgroundColor = '#eff3f6';
- };
- }
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址