diff --git a/create_post.js b/create_post.js index 3c5246a..0c5d900 100644 --- a/create_post.js +++ b/create_post.js @@ -44,8 +44,68 @@ const fs = require('node:fs/promises'); } } + let parsedPostContent = ""; + let tags = []; + + let chars = Array.from(postContent); + for ( let i = 0; i < chars.length; i++ ) { + if ( chars[i] !== "@" ) + parsedPostContent = `${parsedPostContent}${chars[i]}`; + if ( chars[i] === "@" ) { + let potentialMentionUsername = ""; + let fulfilledPotentialMention = false; + let fulfilledReallyLikelyPotentialMention = false; + let potentialMentionDomain = ""; + let lameDuckSpacing = ""; + i++; + while ( i < chars.length && fulfilledPotentialMention === false ) { + if ( chars[i] !== "@" ) { + potentialMentionUsername = `${potentialMentionUsername}${chars[i]}`; + } + if ( chars[i] === "@" ) { + fulfilledPotentialMention = true; + i++ + while ( i < chars.length && fulfilledReallyLikelyPotentialMention === false ) { + potentialMentionDomain = `${potentialMentionDomain}${chars[i]}`; + if ( chars[i].match(/\s/) ) { + fulfilledReallyLikelyPotentialMention = true; + lameDuckSpacing = chars[i]; + } else { + i++; + } + } + } + if ( chars[i].match(/\s/) ) { + fulfilledPotentialMention = true; + } + i++; + } + if ( fulfilledPotentialMention ) { + if ( fulfilledReallyLikelyPotentialMention || i === chars.length ) { + const allowTag = await confirm({message: `Tag @${potentialMentionUsername}@${potentialMentionDomain}`, default: true}); + if ( allowTag ) { + // TODO: Parse this at post creation time, rather than rely on dynamic content. + // In order to accomplish this, we'll need to be able to create a stub user and signed HTTP requests. + parsedPostContent = `${parsedPostContent}[@${potentialMentionUsername}](https://${domain}/resolveUser?user=${potentialMentionUsername}&domain=${potentialMentionDomain})`; + // TODO: Finger the user at post creation time, rather than rely on dynamic content. + tags.push(`https://${domain}/resolveWebfinger?user=${potentialMentionUsername}&domain=${potentialMentionDomain}`); + } else { + parsedPostContent = `${parsedPostContent}@${potentialMentionUsername}@${potentialMentionDomain}`; + } + if ( fulfilledReallyLikelyPotentialMention ) { + parsedPostContent = `${parsedPostContent}${lameDuckSpacing}`; + } + } else { + parsedPostContent = `${parsedPostContent}@${potentialMentionUsername}`; + } + } else { + parsedPostContent = `${parsedPostContent}@${potentialMentionUsername}`; + } + } + } + // TODO: Support attachments. - let postContentHtml = (new commonmark.HtmlRenderer()).render(new commonmark.Parser().parse(postContent)).replace(/\n$/, ""); + let postContentHtml = (new commonmark.HtmlRenderer()).render(new commonmark.Parser().parse(parsedPostContent)).replace(/\n$/, ""); let timestamp = Date.now(); let postId = `${timestamp}`; @@ -71,7 +131,8 @@ const fs = require('node:fs/promises'); "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ - `https://${domain}/users/${user}/followers` + `https://${domain}/users/${user}/followers`, + ...tags ], "sensitive": false, "content": postContentHtml,