ship some chatGPT conversions to HackMD
当前为
// ==UserScript==
// @name ChatGPT 2 HackMD
// @namespace https://github.com/EastSun5566
// @version 0.0.7
// @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 () {
// eslint-disable-next-line no-console
console.log('Hi from ChatGPT 2 HackMD');
/** @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()}\`\n\n`,
...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 });
}());