// ==UserScript== // @name 增强型书签按钮和文本收集器 // @namespace http://tampermonkey.net/ // @version 0.9 // @description 在页面左上角添加书签按钮,并提供跨页面文本收集功能 // @match *://*/* // @grant GM_setClipboard // @grant GM_setValue // @grant GM_getValue // @run-at document-end // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/513413/%E5%A2%9E%E5%BC%BA%E5%9E%8B%E4%B9%A6%E7%AD%BE%E6%8C%89%E9%92%AE%E5%92%8C%E6%96%87%E6%9C%AC%E6%94%B6%E9%9B%86%E5%99%A8.user.js // @updateURL https://update.greasyfork.icu/scripts/513413/%E5%A2%9E%E5%BC%BA%E5%9E%8B%E4%B9%A6%E7%AD%BE%E6%8C%89%E9%92%AE%E5%92%8C%E6%96%87%E6%9C%AC%E6%94%B6%E9%9B%86%E5%99%A8.meta.js // ==/UserScript== (function() { 'use strict'; // 创建书签按钮 function createBookmarkButton() { const button = document.createElement('div'); button.id = 'bookmark-button'; button.style.cssText = ` position: fixed; top: 10px; left: 0; width: 12px; height: 25px; border-radius: 0 12px 12px 0; background-color: rgba(144, 238, 144, 0.5); cursor: pointer; z-index: 9999999; display: flex; justify-content: flex-end; align-items: center; font-size: 14px; color: rgba(0, 0, 0, 0.6); transition: all 0.3s ease; overflow: hidden; `; button.innerHTML = ''; button.addEventListener('mouseenter', function() { this.style.width = '25px'; this.style.justifyContent = 'center'; this.innerHTML = '❐+'; }); button.addEventListener('mouseleave', function() { this.style.width = '12px'; this.style.justifyContent = 'flex-end'; this.innerHTML = ''; }); button.addEventListener('click', function() { const title = document.title; const url = decodeURI(window.location.href); const markdown = `[${title}](${url})`; GM_setClipboard(markdown); alert('已复制到剪贴板!'); }); document.body.appendChild(button); } // 创建文本收集框 function createTextCollector() { const collector = document.createElement('div'); collector.id = 'text-collector'; collector.style.cssText = ` position: fixed; bottom: 10px; right: 10px; width: 300px; height: 200px; background-color: rgba(30, 30, 30, 0.9); // 暗黑模式背景 border: 1px solid #444; // 暗黑模式边框 border-radius: 5px; padding: 10px; font-size: 14px; color: #fff; // 暗黑模式字体颜色 z-index: 9999999; display: none; flex-direction: column; `; // 创建清空按钮 const clearButton = document.createElement('div'); clearButton.innerHTML = '🗑️'; // 使用垃圾桶符号 clearButton.style.cssText = ` position: absolute; top: 5px; right: 30px; // 放在关闭按钮左边 cursor: pointer; font-size: 16px; color: #fff; // 暗黑模式字体颜色 `; clearButton.addEventListener('click', () => { textArea.value = ''; // 清空文本内容 GM_setValue('collectedText', ''); // 清空存储的文本 // alert('已清空所有内容!'); }); // 创建关闭按钮 const closeButton = document.createElement('div'); closeButton.innerHTML = '✖'; closeButton.style.cssText = ` position: absolute; top: 5px; right: 5px; cursor: pointer; font-size: 16px; color: #fff; // 暗黑模式字体颜色 `; closeButton.addEventListener('click', () => { collector.style.display = 'none'; GM_setValue('collectorVisible', false); }); const textArea = document.createElement('textarea'); textArea.style.cssText = ` flex-grow: 1; resize: none; border: none; outline: none; background-color: transparent; color: #fff; // 暗黑模式字体颜色 `; // 从存储中加载文本 textArea.value = GM_getValue('collectedText', ''); // 监听文本变化并保存 textArea.addEventListener('input', () => { GM_setValue('collectedText', textArea.value); }); // 将清空按钮、关闭按钮和文本框添加到收集框 collector.appendChild(clearButton); collector.appendChild(closeButton); collector.appendChild(textArea); document.body.appendChild(collector); // 恢复收集框的可见状态 if (GM_getValue('collectorVisible', false)) { collector.style.display = 'flex'; } return { collector, textArea }; } // 初始化 createBookmarkButton(); const { collector, textArea } = createTextCollector(); // 监听键盘事件 document.addEventListener('keydown', function(e) { if (e.ctrlKey && e.key === 'x') { e.preventDefault(); // 阻止默认的剪切行为 const selectedText = window.getSelection().toString().trim(); if (selectedText) { if (collector.style.display === 'none') { collector.style.display = 'flex'; GM_setValue('collectorVisible', true); textArea.value += (textArea.value ? '\n' : '') + selectedText; } else { textArea.value += '\n' + selectedText; } GM_setValue('collectedText', textArea.value); GM_setClipboard(textArea.value); } } }); })();