| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | import * as linkify from './commonmark-linkify.js'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-12 21:47:15 -05:00
										 |  |  | var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i; | 
					
						
							|  |  |  | var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i; | 
					
						
							| 
									
										
										
										
											2024-11-13 18:58:09 -05:00
										 |  |  | var potentiallyUnsafe = function (url) { | 
					
						
							| 
									
										
										
										
											2024-11-12 21:47:15 -05:00
										 |  |  | 	return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | function image(node, entering) { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 	if ( | 
					
						
							|  |  |  | 		node.firstChild?.type === 'text' && | 
					
						
							|  |  |  | 		node.firstChild.literal.startsWith('video:') | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 		if (entering) { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 			this.lit( | 
					
						
							|  |  |  | 				'<video style="max-width: 100%; max-height: 480px" title="' + | 
					
						
							|  |  |  | 					this.esc(node.firstChild?.literal) + | 
					
						
							|  |  |  | 					'" controls>' | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 			this.lit('<source src="' + this.esc(node.destination) + '"></source>'); | 
					
						
							|  |  |  | 			this.disableTags += 1; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			this.disableTags -= 1; | 
					
						
							|  |  |  | 			this.lit('</video>'); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 	} else if ( | 
					
						
							|  |  |  | 		node.firstChild?.type === 'text' && | 
					
						
							|  |  |  | 		node.firstChild.literal.startsWith('audio:') | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 		if (entering) { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 			this.lit( | 
					
						
							|  |  |  | 				'<audio style="height: 32px; max-width: 100%" title="' + | 
					
						
							|  |  |  | 					this.esc(node.firstChild?.literal) + | 
					
						
							|  |  |  | 					'" controls>' | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 			this.lit('<source src="' + this.esc(node.destination) + '"></source>'); | 
					
						
							|  |  |  | 			this.disableTags += 1; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			this.disableTags -= 1; | 
					
						
							|  |  |  | 			this.lit('</audio>'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		if (entering) { | 
					
						
							|  |  |  | 			if (this.disableTags === 0) { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				this.lit( | 
					
						
							|  |  |  | 					'<div class="img_caption">' + | 
					
						
							|  |  |  | 						this.esc(node.firstChild?.literal || node.destination) + | 
					
						
							|  |  |  | 						'</div>' | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 				if (this.options.safe && potentiallyUnsafe(node.destination)) { | 
					
						
							|  |  |  | 					this.lit('<img src="" alt="'); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					this.lit('<img src="' + this.esc(node.destination) + '" alt="'); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			this.disableTags += 1; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			this.disableTags -= 1; | 
					
						
							|  |  |  | 			if (this.disableTags === 0) { | 
					
						
							|  |  |  | 				if (node.title) { | 
					
						
							|  |  |  | 					this.lit('" title="' + this.esc(node.title)); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				this.lit('" />'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function markdown(md) { | 
					
						
							| 
									
										
										
										
											2024-11-12 20:43:03 -05:00
										 |  |  | 	var reader = new commonmark.Parser(); | 
					
						
							|  |  |  | 	var writer = new commonmark.HtmlRenderer({safe: true}); | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 	writer.image = image; | 
					
						
							|  |  |  | 	var parsed = reader.parse(md || ''); | 
					
						
							|  |  |  | 	parsed = linkify.transform(parsed); | 
					
						
							|  |  |  | 	var walker = parsed.walker(); | 
					
						
							|  |  |  | 	var event, node; | 
					
						
							|  |  |  | 	while ((event = walker.next())) { | 
					
						
							|  |  |  | 		node = event.node; | 
					
						
							|  |  |  | 		if (event.entering) { | 
					
						
							|  |  |  | 			if (node.type == 'link') { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				if ( | 
					
						
							|  |  |  | 					node.destination.startsWith('@') && | 
					
						
							|  |  |  | 					node.destination.endsWith('.ed25519') | 
					
						
							|  |  |  | 				) { | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 					node.destination = '#' + node.destination; | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				} else if ( | 
					
						
							|  |  |  | 					node.destination.startsWith('%') && | 
					
						
							|  |  |  | 					node.destination.endsWith('.sha256') | 
					
						
							|  |  |  | 				) { | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 					node.destination = '#' + node.destination; | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				} else if ( | 
					
						
							|  |  |  | 					node.destination.startsWith('&') && | 
					
						
							|  |  |  | 					node.destination.endsWith('.sha256') | 
					
						
							|  |  |  | 				) { | 
					
						
							| 
									
										
										
										
											2023-08-31 00:12:18 +00:00
										 |  |  | 					node.destination = '/' + node.destination + '/view'; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} else if (node.type == 'image') { | 
					
						
							|  |  |  | 				if (node.destination.startsWith('&')) { | 
					
						
							|  |  |  | 					node.destination = '/' + node.destination + '/view'; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return writer.render(parsed); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function human_readable_size(bytes) { | 
					
						
							|  |  |  | 	let v = bytes; | 
					
						
							|  |  |  | 	let u = 'B'; | 
					
						
							|  |  |  | 	for (let unit of ['kB', 'MB', 'GB']) { | 
					
						
							|  |  |  | 		if (v > 1024) { | 
					
						
							|  |  |  | 			v /= 1024; | 
					
						
							|  |  |  | 			u = unit; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return `${Math.round(v * 10) / 10} ${u}`; | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | } |