function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function toot_active(toot, what) { var count = toot[what+'_count']; return count > 0 ? 'active' : ''; } function toot_count(toot, what) { var count = toot[what+'_count']; return count > 0 ? count : ''; } function user_account(account) { var result =`@${account.acct}`; if (account.acct.indexOf('@') === -1) { var domain = new URL(account.url) result += `@${domain.hostname}` } return result; } function render_toots(toots, in_reply_to, depth) { var tootsToRender = toots .filter(toot => toot.in_reply_to_id === in_reply_to) .sort((a, b) => a.created_at.localeCompare(b.created_at)); tootsToRender.forEach(toot => render_toot(toots, toot, depth)); } function render_toot(toots, toot, depth) { 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}`); }); if (!blockedToots.includes(toot.url)) { mastodonComment = `
${toot.created_at.substr(0, 10)} ${toot.created_at.substr(11, 8)}
${toot.content}
${toot.media_attachments.map(attachment => { if (attachment.type === 'image') { return `${attachment.description}`; } else if (attachment.type === 'video') { return ``; } else if (attachment.type === 'gifv') { return ``; } else if (attachment.type === 'audio') { return ``; } else { return `${attachment.type}`; } }).join('')}
`; document.getElementById('mastodon-comments-list').appendChild(DOMPurify.sanitize(mastodonComment, {'RETURN_DOM_FRAGMENT': true})); } render_toots(toots, toot.id, depth + 1) } function loadComments() { if (commentsLoaded) return; document.getElementById("mastodon-comments-list").innerHTML = "Loading comments from the Fediverse..."; console.log('Comment URL: https://' + host + '/api/v1/statuses/' + id + '/context'); fetch('https://' + host + '/api/v1/statuses/' + id + '/context') .then(function(response) { return response.json(); }) .then(function(data) { if(data['descendants'] && Array.isArray(data['descendants']) && data['descendants'].length > 0) { document.getElementById('mastodon-comments-list').innerHTML = ""; render_toots(data['descendants'], id, 0) } else { document.getElementById('mastodon-comments-list').innerHTML = "

No comments found

"; } commentsLoaded = true; }); } function respondToVisibility(element, callback) { var options = { root: null, }; var observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.intersectionRatio > 0) { callback(); } }); }, options); observer.observe(element); }