您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a beautiful floating copy button for code blocks on perplexity.ai, positioned further to the right
- // ==UserScript==
- // @name Perplexity AI Enhanced Floating Copy Button
- // @namespace http://tampermonkey.net/
- // @version 1.7
- // @description Adds a beautiful floating copy button for code blocks on perplexity.ai, positioned further to the right
- // @match https://www.perplexity.ai/*
- // @icon https://play-lh.googleusercontent.com/6STp0lYx2ctvQ-JZpXA1LeAAZIlq6qN9gpy7swLPlRhmp-hfvZePcBxqwVkqN2BH1g
- // @author Chirooon (https://github.com/Chirooon)
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- const floatingButton = document.createElement('button');
- floatingButton.setAttribute('aria-label', 'Copy Code');
- floatingButton.setAttribute('type', 'button');
- floatingButton.innerHTML = `
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
- <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
- <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
- </svg>
- `;
- floatingButton.style.cssText = `
- position: fixed;
- bottom: 70px;
- right: 21px;
- z-index: 9998;
- display: none;
- align-items: center;
- justify-content: center;
- width: 40px;
- height: 40px;
- background-color: #4a4a4a;
- color: #ffffff;
- border: none;
- border-radius: 50%;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
- `;
- document.body.appendChild(floatingButton);
- let currentCodeBlock = null;
- function updateButtonVisibility() {
- const codeBlocks = document.querySelectorAll('pre');
- let visible = false;
- for (const codeBlock of codeBlocks) {
- const rect = codeBlock.getBoundingClientRect();
- if (rect.top < window.innerHeight && rect.bottom > 0) {
- visible = true;
- currentCodeBlock = codeBlock;
- break;
- }
- }
- floatingButton.style.display = visible ? 'flex' : 'none';
- }
- floatingButton.addEventListener('click', () => {
- if (currentCodeBlock) {
- const codeText = currentCodeBlock.textContent;
- navigator.clipboard.writeText(codeText).then(() => {
- floatingButton.style.backgroundColor = '#2ecc71';
- floatingButton.innerHTML = `
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
- <polyline points="20 6 9 17 4 12"></polyline>
- </svg>
- `;
- setTimeout(() => {
- floatingButton.style.backgroundColor = '#4a4a4a';
- floatingButton.innerHTML = `
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
- <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
- <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
- </svg>
- `;
- }, 2000);
- });
- }
- });
- floatingButton.addEventListener('mouseover', () => {
- floatingButton.style.transform = 'scale(1.1)';
- floatingButton.style.backgroundColor = '#5a5a5a';
- });
- floatingButton.addEventListener('mouseout', () => {
- floatingButton.style.transform = 'scale(1)';
- floatingButton.style.backgroundColor = '#4a4a4a';
- });
- window.addEventListener('scroll', updateButtonVisibility);
- window.addEventListener('resize', updateButtonVisibility);
- updateButtonVisibility();
- })();