一鍵複製 lkml.org 信件正文到剪貼簿。
当前为
// ==UserScript==
// @name LKML 內文複製器
// @namespace https://abc0922001.github.io/lkml-userscripts
// @version 1.1
// @description 一鍵複製 lkml.org 信件正文到剪貼簿。
// @author abc0922001
// @match https://lkml.org/lkml/*
// @grant none
// @license MIT
// ==/UserScript==
(() => {
'use strict';
/** 等待指定元素出現 */
function waitForElement(selector, timeout = 5000) {
return new Promise((resolve, reject) => {
const hit = document.querySelector(selector);
if (hit) return resolve(hit);
const ob = new MutationObserver(() => {
const el = document.querySelector(selector);
if (el) {
ob.disconnect();
resolve(el);
}
});
ob.observe(document.body, { childList: true, subtree: true });
setTimeout(() => {
ob.disconnect();
reject(new Error(`等待元素「${selector}」超時(${timeout}ms)`));
}, timeout);
});
}
/** 提示訊息 */
const showAlert = msg => window.alert(msg);
/** 複製到剪貼簿 */
function copyToClipboard(txt) {
navigator.clipboard.writeText(txt)
.then(() => showAlert('✅ 內文已複製到剪貼簿!'))
.catch(err => showAlert(`❌ 複製失敗:${err.message}`));
}
/** 建立按鈕 */
function createCopyButton() {
const btn = document.createElement('button');
btn.textContent = '📋 複製內文';
Object.assign(btn.style, {
position: 'fixed',
top: '10px',
right: '10px',
zIndex: 1000,
padding: '6px 10px',
fontSize: '14px',
backgroundColor: '#2b7de9',
color: '#fff',
border: 'none',
borderRadius: '4px',
cursor: 'pointer'
});
btn.addEventListener('click', () => {
const selector = 'pre[itemprop="articleBody"]';
waitForElement(selector)
.then(el => copyToClipboard(el.textContent)) // 要 HTML 改成 el.innerHTML
.catch(() => showAlert('⚠️ 找不到內文區塊。'));
});
document.body.appendChild(btn);
}
/* 🚀 啟動 */
createCopyButton();
})();