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