Files
audio-library-manager/private/report.rkt
T
2026-06-08 17:20:12 +02:00

58 lines
2.1 KiB
Racket

#lang racket/base
(require racket/list
racket/string
"util.rkt")
(provide make-empty-summary
summary-inc
summary-set
summary-ref
summary->lines
html-report)
(define summary-keys '(seen processed new changed unchanged ok converted removed skipped errors dry-run))
(define (make-empty-summary)
(append (for/list ([k (in-list summary-keys)]) (cons k 0))
(list (cons 'error-list '()))))
(define (summary-ref summary key [default 0])
(alist-ref/default summary key default))
(define (summary-set summary key value)
(alist-set summary key value))
(define (summary-inc summary key [amount 1])
(summary-set summary key (+ (summary-ref summary key 0) amount)))
(define (summary->lines summary)
(for/list ([k (in-list summary-keys)])
(format "~a: ~a" k (summary-ref summary k 0))))
(define (html-escape s)
(define x (format "~a" s))
(define y (regexp-replace* #rx"&" x "&"))
(define z (regexp-replace* #rx"<" y "&lt;"))
(regexp-replace* #rx">" z "&gt;"))
(define (html-report title summary errors)
(define rows
(apply string-append
(for/list ([k (in-list summary-keys)])
(format "<tr><th style=\"text-align:left;padding:4px 10px 4px 0\">~a</th><td style=\"text-align:right;padding:4px\">~a</td></tr>"
(html-escape k) (summary-ref summary k 0)))))
(define error-html
(if (null? errors)
"<p>No errors were reported.</p>"
(string-append
"<h2>Errors</h2><table border=\"1\" cellspacing=\"0\" cellpadding=\"4\"><tr><th>File</th><th>Error</th></tr>"
(apply string-append
(for/list ([e (in-list errors)])
(format "<tr><td>~a</td><td><pre style=\"white-space:pre-wrap\">~a</pre></td></tr>"
(html-escape (alist-ref/default e 'file ""))
(html-escape (alist-ref/default e 'message "")))))
"</table>")))
(format "<!doctype html><html><head><meta charset=\"utf-8\"><title>~a</title></head><body><h1>~a</h1><h2>Summary</h2><table>~a</table>~a</body></html>"
(html-escape title) (html-escape title) rows error-html))