您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
一个快速在github仓库页面跳转到DeepWiki的脚本;A script to quickly jump to DeepWiki from the GitHub repository page
- // ==UserScript==
- // @name GitHub to DeepWiki Link
- // @name_zh GitHub 到 DeepWiki 链接
- // @namespace https://github.com/worryzyy/fast2deepwiki
- // @version 0.1
- // @description 一个快速在github仓库页面跳转到DeepWiki的脚本;A script to quickly jump to DeepWiki from the GitHub repository page
- // @author weilei
- // @match https://github.com/*
- // @grant none
- // @license MIT
- // ==/UserScript==
- ;(function () {
- 'use strict'
- // Generate a unique page instance ID to ensure each page's script runs independently
- const PAGE_INSTANCE_ID =
- 'deepwiki_' + Math.random().toString(36).substring(2, 15)
- // Add page ID to debug logs to distinguish between multiple pages
- function debugLog(message, obj = null) {
- const debug = false; // Set to true to enable debugging
- if (debug) {
- console.log(`[DeepWiki Debug ${PAGE_INSTANCE_ID}] ${message}`, obj || '')
- }
- }
- // Add page ID prefix to ensure DOM element IDs are unique across pages
- const BUTTON_ID = `deepwiki-button-${PAGE_INSTANCE_ID}`
- const STYLES_ID = `deepwiki-styles-${PAGE_INSTANCE_ID}`
- // Main function - add DeepWiki link to the page
- function addDeepWikiLink() {
- // First check if we're on a GitHub repository page
- const repoInfo = getRepositoryInfo()
- if (!repoInfo) {
- debugLog('Not a valid repository page')
- return
- }
- debugLog('Repository info detected', repoInfo)
- // Create DeepWiki link URL
- const deepWikiUrl = `https://deepwiki.com/${repoInfo.owner}/${repoInfo.repo}`
- // Add custom CSS styles to the page
- addCustomCSS()
- // Check if button already exists (avoid duplicate buttons)
- if (document.getElementById(BUTTON_ID)) {
- debugLog('Button already exists, skipping')
- return
- }
- // Create DeepWiki button
- const deepWikiButton = createDeepWikiButton(deepWikiUrl)
- // Find README link as insertion point
- const readmeLink = document.querySelector('a[href*="readme-ov-file"]')
- if (readmeLink) {
- debugLog('README link found')
- // Insert button after README link
- deepWikiButton.style.marginLeft = '10px'
- readmeLink.insertAdjacentElement('afterend', deepWikiButton)
- }
- debugLog('No suitable insertion point found')
- }
- // Create DeepWiki button element
- function createDeepWikiButton(url) {
- // Create button link directly
- const link = document.createElement('a')
- link.id = BUTTON_ID
- link.href = url
- link.target = '_blank'
- link.className = 'btn btn-sm'
- link.style.display = 'inline-flex'
- link.style.alignItems = 'center'
- link.style.justifyContent = 'center'
- link.style.position = 'relative'
- link.style.overflow = 'hidden'
- link.style.background = 'linear-gradient(90deg, #2188ff 0%, #43e97b 100%)'
- link.style.border = 'none'
- link.style.transition = 'all 0.2s cubic-bezier(.4,0,.2,1)'
- link.style.marginLeft = '8px'
- link.style.borderRadius = '6px'
- link.style.padding = '4px 14px'
- link.style.color = '#fff'
- link.style.fontWeight = '500'
- link.style.boxShadow = '0 1px 2px rgba(33,136,255,0.08)'
- // Add hover and click effects to the button
- link.addEventListener('mouseover', () => {
- link.style.background = 'linear-gradient(90deg, #0366d6 0%, #3bce6f 100%)'
- link.style.boxShadow = '0 4px 12px rgba(33,136,255,0.18)'
- link.style.transform = 'translateY(-1px)'
- })
- link.addEventListener('mouseout', () => {
- link.style.background = 'linear-gradient(90deg, #2188ff 0%, #43e97b 100%)'
- link.style.boxShadow = '0 1px 2px rgba(33,136,255,0.08)'
- link.style.transform = 'translateY(0)'
- })
- link.addEventListener('mousedown', () => {
- link.style.transform = 'scale(0.98) translateY(0)'
- link.style.boxShadow = '0 1px 3px rgba(33,136,255,0.12)'
- })
- link.addEventListener('mouseup', () => {
- link.style.transform = 'scale(1) translateY(-1px)'
- link.style.boxShadow = '0 4px 12px rgba(33,136,255,0.18)'
- })
- // Set button content
- link.innerHTML = `
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" style="margin-right: 8px;" class="deepwiki-icon">
- <path fill="currentColor" d="M12 0C5.372 0 0 5.372 0 12s5.372 12 12 12 12-5.372 12-12S18.628 0 12 0zm0 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm-3 5v2h3.586L7.293 14.293l1.414 1.414L14 10.414V14h2V7H9z"/>
- </svg>
- <span>DeepWiki</span>
- `
- return link
- }
- // Get repository information from current page
- function getRepositoryInfo() {
- // Extract repository info from URL
- const path = window.location.pathname.substring(1).split('/')
- // Check if there are enough path segments to represent a repository
- if (path.length < 2) return null
- // Check path parts are not GitHub special pages
- const nonRepoPathParts = [
- 'settings',
- 'trending',
- 'new',
- 'organizations',
- 'marketplace',
- 'explore',
- 'topics'
- ]
- if (
- nonRepoPathParts.includes(path[0]) ||
- nonRepoPathParts.includes(path[1])
- ) {
- return null
- }
- return {
- owner: path[0],
- repo: path[1]
- }
- }
- // Add custom CSS to the page
- function addCustomCSS() {
- if (document.getElementById(STYLES_ID)) return
- const styleElement = document.createElement('style')
- styleElement.id = STYLES_ID
- styleElement.textContent = `
- #${BUTTON_ID}::after {
- content: '';
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: linear-gradient(to right, transparent, rgba(255, 255, 255, 0.1), transparent);
- transform: translateX(-100%);
- transition: transform 0.6s ease;
- }
- #${BUTTON_ID}:hover::after {
- transform: translateX(100%);
- }
- @keyframes pulse {
- 0% { transform: scale(1); opacity: 1; }
- 50% { transform: scale(1.1); opacity: 0.8; }
- 100% { transform: scale(1); opacity: 1; }
- }
- .deepwiki-icon {
- animation: pulse 2s infinite;
- filter: drop-shadow(0 0 1px rgba(255,255,255,0.5));
- }
- `
- document.head.appendChild(styleElement)
- }
- // Enhanced page observation
- function observePageChanges() {
- // Monitor URL changes - for SPA page navigation
- let lastUrl = location.href
- const urlChecker = setInterval(() => {
- if (location.href !== lastUrl) {
- lastUrl = location.href
- debugLog('URL changed, attempting to add button')
- setTimeout(addDeepWikiLink, 500) // Delay execution to wait for DOM updates
- }
- }, 1000)
- // Monitor DOM changes - for asynchronously loaded content
- const domObserver = new MutationObserver((mutations) => {
- if (!document.getElementById(BUTTON_ID)) {
- // Determine if changes are significant enough to retry adding the button
- const significantChanges = mutations.some((mutation) => {
- // Only retry when new nodes are added
- return mutation.addedNodes.length > 0
- })
- if (significantChanges) {
- debugLog('DOM changes detected, attempting to add button')
- addDeepWikiLink()
- }
- }
- })
- domObserver.observe(document.body, {
- childList: true,
- subtree: true
- })
- // Initial execution
- addDeepWikiLink()
- // Delayed retry in case DOM is not fully ready on initial load
- setTimeout(addDeepWikiLink, 1000)
- }
- // Start monitoring when page is loaded
- window.addEventListener('load', observePageChanges)
- // Also execute once when DOM is loaded
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', addDeepWikiLink)
- } else {
- addDeepWikiLink()
- }
- })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址