forked from cory/tildefriends
		
	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:
		@@ -1,5 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
  "type": "tildefriends-app",
 | 
			
		||||
  "emoji": "🪵",
 | 
			
		||||
  "previous": "&7Ch5DjIMAEbJm05ofH1U/+wlzn9kr65DChcKKgurE8E=.sha256"
 | 
			
		||||
  "previous": "&k+K+38dqVUjSDSspsyQhFkZexug/umccp20SSrsUq3o=.sha256"
 | 
			
		||||
}
 | 
			
		||||
@@ -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 `<!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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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: `<!DOCTYPE html>
 | 
			
		||||
			<html>
 | 
			
		||||
				<head>
 | 
			
		||||
					<base target="_top">
 | 
			
		||||
				</head>
 | 
			
		||||
				<body>
 | 
			
		||||
					${blog.markdown(md)}
 | 
			
		||||
				</body>
 | 
			
		||||
			</html>`, 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'});
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user