forked from cory/tildefriends
		
	Forgot this file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4635 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										71
									
								
								apps/wiki/handler.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								apps/wiki/handler.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| import * as utils from './utils.js'; | ||||
| import * as commonmark from './commonmark.min.js'; | ||||
|  | ||||
| function markdown(md) { | ||||
| 	var reader = new commonmark.Parser({safe: true}); | ||||
| 	var writer = new commonmark.HtmlRenderer(); | ||||
| 	var parsed = reader.parse(md || ''); | ||||
| 	let walker = parsed.walker(); | ||||
| 	let event; | ||||
| 	while ((event = walker.next())) { | ||||
| 		let node = event.node; | ||||
| 		if (event.entering) { | ||||
| 			if (node.type === 'link') { | ||||
| 				if (node.destination.indexOf(':') == -1 && | ||||
| 					node.destination.indexOf('/') == -1) { | ||||
| 					node.destination = `#${this.wiki?.name}/${node.destination}`; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return writer.render(parsed); | ||||
| } | ||||
|  | ||||
| async function main() { | ||||
| 	let slash = request.path.indexOf('/'); | ||||
| 	if (slash != -1) { | ||||
| 		let wiki_name = request.path.substring(0, slash); | ||||
| 		let wiki_doc_name = request.path.substring(slash + 1); | ||||
|  | ||||
| 		let ids = Object.keys(await ssb.following(await ssb.getOwnerIdentities(), 1)); | ||||
| 		let [max_row_id, wikis] = await utils.collection(ids, 'wiki', null, -1, {}); | ||||
| 		let wiki; | ||||
| 		for (let w of Object.values(wikis)) { | ||||
| 			if (w.name === wiki_name && !w.tombstone) { | ||||
| 				wiki = w; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		let wiki_doc; | ||||
| 		if (wiki) { | ||||
| 			let [max_row_id, wiki_docs] = await utils.collection(ids, 'wiki-doc', wiki.id, -1, {}); | ||||
| 			for (let w of Object.values(wiki_docs)) { | ||||
| 				if (w.name === wiki_doc_name && !w.tombstone) { | ||||
| 					wiki_doc = w; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		let md; | ||||
| 		if (wiki_doc?.blob) { | ||||
| 			md = utf8Decode(await ssb.blobGet(wiki_doc.blob)); | ||||
| 		} | ||||
|  | ||||
| 		await respond({ | ||||
| 			data: ` | ||||
| 				<h1>${wiki_name}: ${wiki_doc_name}</h1> | ||||
| 				<pre>${markdown(md)}</pre> | ||||
| 			`, | ||||
| 			content_type: 'text/html', | ||||
| 			status_code: 200, | ||||
| 		}); | ||||
| 	} else { | ||||
| 		await respond({ | ||||
| 			data: '<h1>File not found</h1>', | ||||
| 			content_type: 'text/html', | ||||
| 			status_code: 404, | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
| main(); | ||||
		Reference in New Issue
	
	Block a user