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