Make blogs semi-navigable.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4753 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
2024-01-11 00:33:53 +00:00
parent a0af058f5e
commit 576e58b1e3
3 changed files with 40 additions and 18 deletions

View File

@ -8,6 +8,39 @@ function escapeAttribute(text) {
return (text ?? '').replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#39;');
}
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 `<!DOCTYPE html>
<html>
<head>
<title>🪵Tilde Friends Blog - ${markdown(blog_post.title)}</title>
<base target="_top">
</head>
<body>
<h1><a href="./">🪵Tilde Friends Blog</a></h1>
<div>
<div><a href="../ssb/#${escapeAttribute(blog_post.author)}">${escape(blog_post.name)}</a> ${escape(new Date(blog_post.timestamp).toString())}</div>
<div>${markdown(blob)}</div>