diff --git a/apps/blog.json b/apps/blog.json index 8fbf41e4..b3e771e2 100644 --- a/apps/blog.json +++ b/apps/blog.json @@ -1,5 +1,5 @@ { "type": "tildefriends-app", "emoji": "🪵", - "previous": "&7Ch5DjIMAEbJm05ofH1U/+wlzn9kr65DChcKKgurE8E=.sha256" + "previous": "&k+K+38dqVUjSDSspsyQhFkZexug/umccp20SSrsUq3o=.sha256" } \ No newline at end of file diff --git a/apps/blog/blog.js b/apps/blog/blog.js index 0958f96b..c5cfee7e 100644 --- a/apps/blog/blog.js +++ b/apps/blog/blog.js @@ -8,6 +8,39 @@ function escapeAttribute(text) { return (text ?? '').replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", '''); } +export async function get_blog_message(id) { + let message; + await ssb.sqlAsync( + 'SELECT author, timestamp, content FROM messages WHERE id = ?', + [id], + function(row) { + let content = JSON.parse(row.content); + message = { + author: row.author, + timestamp: row.timestamp, + blog: content?.blog, + title: content?.title, + }; + }); + if (message) { + await ssb.sqlAsync( + ` + SELECT json_extract(content, '$.name') AS name + FROM messages + WHERE author = ? + AND json_extract(content, '$.type') = 'about' + AND json_extract(content, '$.about') = author + AND name IS NOT NULL + ORDER BY sequence DESC LIMIT 1 + `, + [message.author], + function(row) { + message.name = row.name; + }); + } + return message; +} + export function markdown(md) { let reader = new commonmark.Parser({safe: true}); let writer = new commonmark.HtmlRenderer(); @@ -20,7 +53,7 @@ export function markdown(md) { if (node.destination?.startsWith('&')) { node.destination = '/' + node.destination + '/view?filename=' + node.firstChild?.literal; } else if (node.destination?.startsWith('@') || node.destination?.startsWith('%')) { - node.destination = '/~core/ssb/#' + node.destination; + node.destination = '/~core/ssb/#' + escape(node.destination); } } } @@ -32,9 +65,11 @@ export async function render_blog_post_html(blog_post) { return ` + 🪵Tilde Friends Blog - ${markdown(blog_post.title)} +

🪵Tilde Friends Blog

${escape(blog_post.name)} ${escape(new Date(blog_post.timestamp).toString())}
${markdown(blob)}
diff --git a/apps/blog/handler.js b/apps/blog/handler.js index cca61442..ef14b62b 100644 --- a/apps/blog/handler.js +++ b/apps/blog/handler.js @@ -3,22 +3,9 @@ import * as blog from './blog.js'; async function main() { if (request.path.startsWith('%') && request.path.endsWith('.sha256')) { let id = request.path.startsWith('%25') ? '%' + request.path.substring(3) : request.path; - let blob = await ssb.messageContentGet(id); - if (blob) { - let content = JSON.parse(utf8Decode(blob)); - let md = content?.text; - if (content?.type == 'blog') { - md = utf8Decode(await ssb.blobGet(content?.blog)); - } - respond({data: ` - - - - - - ${blog.markdown(md)} - - `, content_type: 'text/html; charset=utf-8'}); + let message = await blog.get_blog_message(id); + if (message) { + respond({data: await blog.render_blog_post_html(message), content_type: 'text/html; charset=utf-8'}); } else { respond({data: `Message ${id} not found.`, content_type: 'text/html; charset=utf-8'}); }