import * as hashtagify from './commonmark-hashtag.js'; const k_code_classes = 'w3-theme-l4 w3-theme-border w3-round'; function image(node, entering) { if ( node.firstChild?.type === 'text' && node.firstChild.literal.startsWith('video:') ) { if (entering) { this.lit( ''); } } else if ( node.firstChild?.type === 'text' && node.firstChild.literal.startsWith('audio:') ) { if (entering) { this.lit( ''); } } else { if (entering) { if (this.disableTags === 0) { this.lit( '
' ); if (this.options.safe && potentiallyUnsafe(node.destination)) { this.lit(''); } } } } function code(node) { let attrs = this.attrs(node); attrs.push(['class', k_code_classes]); this.tag('code', attrs); this.out(node.literal); this.tag('/code'); } function attrs(node) { let result = commonmark.HtmlRenderer.prototype.attrs.bind(this)(node); if (node.type == 'block_quote') { result.push(['class', 'w3-theme-d1']); } else if (node.type == 'code_block') { result.push(['class', k_code_classes]); } return result; } export function markdown(md) { let reader = new commonmark.Parser({safe: true}); let writer = new commonmark.HtmlRenderer(); writer.image = image; writer.code = code; writer.attrs = attrs; let parsed = reader.parse(md || ''); parsed = hashtagify.transform(parsed); let walker = parsed.walker(); let 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}`; }