您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ship some ChatGPT conversions to HackMD
当前为
// ==UserScript== // @name ChatGPT 2 HackMD // @namespace https://github.com/EastSun5566 // @version 0.0.9 // @description Ship some ChatGPT conversions to HackMD // @author Michael Wang (https://github.com/EastSun5566) // @license MIT // @homepageURL https://github.com/EastSun5566 // @match https://chat.openai.com/** // @icon https://www.google.com/s2/favicons?sz=64&domain=hackmd.io // @grant none // ==/UserScript== // @ts-check (function () { /** @see {@link https://www.reddit.com/r/ChatGPT/comments/zm237o/save_your_chatgpt_conversation_as_a_markdown_file} */ function h(html) { return html.replace(/<p>/g, '\n\n') .replace(/<\/p>/g, '') .replace(/<b>/g, '**') .replace(/<\/b>/g, '**') .replace(/<i>/g, '_') .replace(/<\/i>/g, '_') .replace(/<code[^>]*>/g, (match) => { const lm = match.match(/class="[^"]*language-([^"]*)"/); return lm ? `\n\`\`\`${lm[1]}\n` : '```'; }) .replace(/<\/code[^>]*>/g, '```') .replace(/<[^>]*>/g, '') .replace(/Copy code/g, '') .replace(/This content may violate our content policy. If you believe this to be in error, please submit your feedback — your input will aid our research in this area./g, '') .trim(); } function ship() { const messages = document.querySelectorAll('.text-base'); let text = ''; for (const message of messages) { const warp = message.querySelector('.whitespace-pre-wrap'); if (warp) { text += `**${message.querySelector('img') ? 'You' : 'ChatGPT'}**: ${h(warp.innerHTML)}\n\n`; } } const output = [ `[${document.title}](${window.location.href})`, '', `\`${new Date().toLocaleString()}\``, ...text.split(/\n/g).map((t) => ` > ${t}`), '', ].join('\n'); window.open(`https://hackmd.io/new?title=${encodeURIComponent(output)}`); } const BUTTON_ID = 'ship-to-hackmd'; function mountButton() { const presentation = document.querySelector('[role=presentation]'); if (!presentation) return; if (presentation.querySelector(`#${BUTTON_ID}`)) return; const button = document.createElement('button'); button.id = BUTTON_ID; button.title = 'Ship to HackMD'; button.style.position = 'absolute'; button.style.top = '0'; button.style.right = '0'; button.addEventListener('click', ship); const icon = document.createElement('img'); icon.src = 'https://www.google.com/s2/favicons?sz=64&domain=hackmd.io'; icon.style.width = '1.5rem'; button.appendChild(icon); presentation.appendChild(button); } const observer = new MutationObserver(() => mountButton()); observer.observe(document.body, { subtree: true, childList: true }); }());