const MASTODON_ACCOUNT_ID = '109285376472065471' const MASTODON_HOST = 'social.sd.ai' async function copyElementTextToClipboard(e) { const text = e.textContent await navigator.clipboard.writeText(text) e.classList.add('tootClick'); setTimeout(() => { e.classList.remove('tootClick'); }, 600); } function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function renderMastodonContent(toots, parentElement, showLink) { parentElement.innerHTML = '' if (!Array.isArray(toots) || toots.length === 0) { document.getElementById('mastodon-comments-list').innerHTML = "
No comments (yet)!
" return } for (const toot of toots) { if (toot.sensitive) { continue } toot.account.display_name = escapeHtml(toot.account.display_name) toot.account.emojis.forEach(emoji => { toot.account.display_name = toot.account.display_name.replace(`:${emoji.shortcode}:`, `Emoji ${emoji.shortcode}`); }) toot.emojis.forEach(emoji => { toot.content = toot.content.replace(`:${emoji.shortcode}:`, `Emoji ${emoji.shortcode}`); }) const comment = `
${escapeHtml(toot.account.display_name)}'s avatar
${toot.content} ${toot.uri}
` const child = DOMPurify.sanitize(comment, {'RETURN_DOM_FRAGMENT': true}); const links = child.querySelectorAll('.tootlink'); for (const link of links) { link.onclick = function() { return copyElementTextToClipboard(this); } } parentElement.appendChild(child); } } let MASTODON_POST_ID document.addEventListener("DOMContentLoaded", async (event) => { let url, isComments const isBot = /bot|google|baidu|bing|msn|teoma|slurp|yandex/i .test(navigator.userAgent) if (document.getElementsByClassName('gh-sidebar').length > 0) { url = `https://${MASTODON_HOST}/api/v1/accounts/${MASTODON_ACCOUNT_ID}/statuses?exclude_replies=true&exclude_reblogs=true` } if (MASTODON_POST_ID && !isBot) { url = `https://${MASTODON_HOST}/api/v1/statuses/${MASTODON_POST_ID}/context` isComments = true } const element = document.getElementById('mastodon-comments-list') if (url && element) { const linkElement = document.getElementById('toot-link-top') const clipElement = document.getElementById('toot-link-clip') const tootUrl = `https://${MASTODON_HOST}/@s/${MASTODON_POST_ID}` if (linkElement) { linkElement.href = tootUrl } if (clipElement) { clipElement.innerText = tootUrl } const response = await fetch(url) let content = await response.json() if (isComments) { content = content.descendants } const header = document.getElementById('mastodon-comments-header') if (header) { header.style.display = '' } return renderMastodonContent(content, element, isComments) } })