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