import * as linkify from './commonmark-linkify.js'; var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i; var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i; var potentiallyUnsafe = function (url) { return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url); }; function image(node, entering) { if ( node.firstChild?.type === 'text' && node.firstChild.literal.startsWith('video:') ) { if (entering) { this.lit( '<video style="max-width: 100%; max-height: 480px" title="' + this.esc(node.firstChild?.literal) + '" controls>' ); this.lit('<source src="' + this.esc(node.destination) + '"></source>'); this.disableTags += 1; } else { this.disableTags -= 1; this.lit('</video>'); } } else if ( node.firstChild?.type === 'text' && node.firstChild.literal.startsWith('audio:') ) { if (entering) { this.lit( '<audio style="height: 32px; max-width: 100%" title="' + this.esc(node.firstChild?.literal) + '" controls>' ); 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) { this.lit( '<div class="img_caption">' + this.esc(node.firstChild?.literal || node.destination) + '</div>' ); 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) { var reader = new commonmark.Parser(); var writer = new commonmark.HtmlRenderer({safe: true}); 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') { if ( node.destination.startsWith('@') && node.destination.endsWith('.ed25519') ) { node.destination = '#' + node.destination; } else if ( node.destination.startsWith('%') && node.destination.endsWith('.sha256') ) { node.destination = '#' + node.destination; } else if ( node.destination.startsWith('&') && node.destination.endsWith('.sha256') ) { 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}`; }