Greasy Fork

Greasy Fork is available in English.

visualstudio中快速地下载特定版本,支持打开Trae和Cursor

Seamlessly and quickly download specific versions of plugins in VsCode, supporting opening Cursor and Trae.(在VsCode中无缝且快速地下载特定版本的插件,支持打开Cursor和Trae。)

当前为 2025-06-06 提交的版本,查看 最新版本

// ==UserScript==
// @name         visualstudio中快速地下载特定版本,支持打开Trae和Cursor
// @version      2025-06-06
// @description  Seamlessly and quickly download specific versions of plugins in VsCode, supporting opening Cursor and Trae.(在VsCode中无缝且快速地下载特定版本的插件,支持打开Cursor和Trae。)
// @author       是东山呀
// @match        https://marketplace.visualstudio.com/items*
// @icon         data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzQ4NDE2MTI2ODQwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjUwNDIiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNNTA3LjEzNiA1MTQuOTQ0YzMuMDcyLTQuMzYyNjY3IDcuMjEwNjY3LTcuOTI1MzMzIDEyLjAzMi0xMC4zMTQ2NjdhMzcuMzY1MzMzIDM3LjM2NTMzMyAwIDAgMSA0Ni42MzQ2NjcgNi4xNDRsOTcuNDE4NjY2IDEwMi43OTQ2NjdhMzIgMzIgMCAwIDEtNDYuNDQyNjY2IDQ0LjAyMTMzM0w1NjUuMzMzMzMzIDYwMy4zMTczMzNWODUzLjMzMzMzM2EzMiAzMiAwIDEgMS02NCAwVjYwOC43NTczMzNsLTUyLjYxODY2NiA1MC4wMTZhMzIgMzIgMCAwIDEtNDQuMDk2LTQ2LjRsMTAyLjUxNzMzMy05Ny40MjkzMzN6TTUxMiAxMzguNjY2NjY3YzEyMy4wMTg2NjcgMCAyMjguMjEzMzMzIDg1LjY5NiAyNTkuNDI0IDIwNC40NjkzMzNDODY0LjI5ODY2NyAzNDQuNzM2IDkzOC42NjY2NjcgNDIyLjc1MiA5MzguNjY2NjY3IDUxOC4yMTg2NjcgOTM4LjY2NjY2NyA2MTQuNjg4IDg2Mi43NTIgNjkzLjMzMzMzMyA3NjguNTMzMzMzIDY5My4zMzMzMzNhMzIgMzIgMCAwIDEgMC02NEM4MjYuODkwNjY3IDYyOS4zMzMzMzMgODc0LjY2NjY2NyA1NzkuODQgODc0LjY2NjY2NyA1MTguMjE4NjY3YzAtNjEuNjEwNjY3LTQ3Ljc3Ni0xMTEuMTA0LTEwNi4xMzMzMzQtMTExLjEwNC01Ljg1NiAwLTExLjYyNjY2NyAwLjQ5MDY2Ny0xNy4zMDEzMzMgMS40NjEzMzNhMzIgMzIgMCAwIDEtMzcuMDI0LTI2LjY2NjY2N0M2OTguMzQ2NjY3IDI3OS4wNCA2MTIuNzE0NjY3IDIwMi42NjY2NjcgNTEyIDIwMi42NjY2NjdjLTczLjgzNDY2NyAwLTE0MC45MjggNDEuMDY2NjY3LTE3Ny4zNzYgMTA2LjYxMzMzM2EzMiAzMiAwIDAgMS0zMC4xMjI2NjcgMTYuMzczMzMzYy0zLjE2OC0wLjIxMzMzMy02LjM1NzMzMy0wLjMyLTkuNTY4LTAuMzJDMjE0Ljc4NCAzMjUuMzMzMzMzIDE0OS4zMzMzMzMgMzkzLjE0MTMzMyAxNDkuMzMzMzMzIDQ3Ny4zMzMzMzNTMjE0Ljc4NCA2MjkuMzMzMzMzIDI5NC45MzMzMzMgNjI5LjMzMzMzM2EzMiAzMiAwIDEgMSAwIDY0QzE3OC45MTIgNjkzLjMzMzMzMyA4NS4zMzMzMzMgNTk2LjM3MzMzMyA4NS4zMzMzMzMgNDc3LjMzMzMzM2MwLTExNi45Mzg2NjcgOTAuMjkzMzMzLTIxMi41NTQ2NjcgMjAzLjQ1Ni0yMTUuOTA0QzMzOC4wOTA2NjcgMTg1LjY5NiA0MjEuMDEzMzMzIDEzOC42NjY2NjcgNTEyIDEzOC42NjY2Njd6IiBmaWxsPSIjMTI5NmRiIiBwLWlkPSI1MDQzIj48L3BhdGg+PC9zdmc+
// @grant        none
// @license      GPL
// @namespace http://greasyfork.icu/users/1475771
// ==/UserScript==

(function() {
    'use strict';

    const url = window.location.href;
    const urlParams = new URLSearchParams(window.location.search);
    const itemName = urlParams.get('itemName');
    if (!itemName) {
        console.error('无法从URL中获取itemName');
        return;
    }

    const observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.addedNodes && mutation.addedNodes.length > 0) {
                // 检查是否加载了版本历史表格
                const versionTable = document.querySelector('.version-history-table');
                if (versionTable && !versionTable.hasAttribute('data-enhanced')) {
                    enhanceVersionTable(versionTable);
                    versionTable.setAttribute('data-enhanced', 'true');
                }
            }
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });

    window.addEventListener('load', function() {
        const installButtonContainer = document.querySelector('.ux-oneclick-install-button-container');
        if (installButtonContainer && !installButtonContainer.hasAttribute('data-enhanced')) {
            setTimeout(function() {
                enhanceInstallButtons(installButtonContainer);
                installButtonContainer.setAttribute('data-enhanced', 'true');
            }, 1000);
        }
    });

    function enhanceInstallButtons(container) {

        const originalButton = container.querySelector('a');
        if (!originalButton) return;
        const extensionId = itemName;

        // 创建Cursor打开按钮
        const cursorButton = originalButton.cloneNode(true);
        cursorButton.href = `cursor:extension/${itemName}`;
        cursorButton.setAttribute('data-is-focusable', 'true');
        cursorButton.title = '在Cursor中安装';
        cursorButton.innerHTML = '在Cursor中安装';
        cursorButton.style.marginLeft = '10px';
        cursorButton.style.lineHeight = '2';

        const traeButton = originalButton.cloneNode(true);
        
        traeButton.href = `trae:extension/${itemName}`;
        traeButton.setAttribute('data-is-focusable', 'true');
        traeButton.title = '在Trae中安装';
        traeButton.innerHTML = '在Trae中安装';
        traeButton.style.marginLeft = '10px';
        traeButton.style.lineHeight = '2';

        // 添加按钮到容器中
        container.appendChild(cursorButton);
        container.appendChild(traeButton);
    }

    // 监听版本历史按钮的点击事件
    document.addEventListener('click', function(e) {
        if (e.target.id === 'versionHistory' || e.target.closest('#versionHistory')) {
            setTimeout(checkForVersionTable, 500);
        }
    });

    function checkForVersionTable() {
        const versionTable = document.querySelector('.version-history-table');
        if (versionTable) {
            if (!versionTable.hasAttribute('data-enhanced')) {
                enhanceVersionTable(versionTable);
                versionTable.setAttribute('data-enhanced', 'true');
            }
        } else {
            // 如果表格还没加载,继续等待
            setTimeout(checkForVersionTable, 500);
        }
    }

    function enhanceVersionTable(table) {
        const headerRow = table.querySelector('thead tr');
        if (headerRow) {
            const downloadHeader = document.createElement('th');
            downloadHeader.className = 'version-history-container-column';
            downloadHeader.textContent = '下载';
            headerRow.appendChild(downloadHeader);
        }

        const rows = table.querySelectorAll('tbody tr');

        const [fieldA, fieldB] = itemName.split('.');
        rows.forEach(row => {
            // 获取版本号
            const versionCell = row.querySelector('td:first-child');
            if (versionCell) {
                const version = versionCell.textContent.trim();
                const downloadUrl = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${fieldA}/vsextensions/${fieldB}/${version}/vspackage`;

                const downloadCell = document.createElement('td');
                downloadCell.className = 'version-history-container-column';
 
                const downloadLink = document.createElement('a');
                downloadLink.href = downloadUrl;
                downloadLink._blank = true;
                downloadLink.innerHTML = '下载';
                downloadLink.style.cursor = 'pointer';
                downloadCell.appendChild(downloadLink);
                row.appendChild(downloadCell);
            }
        });
    }
})();