58 lines
2.2 KiB
Racket
58 lines
2.2 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 copied 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 "<"))
|
|
(regexp-replace* #rx">" z ">"))
|
|
|
|
(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))
|