#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 "<")) (regexp-replace* #rx">" z ">")) (define (html-report title summary errors) (define rows (apply string-append (for/list ([k (in-list summary-keys)]) (format "~a~a" (html-escape k) (summary-ref summary k 0))))) (define error-html (if (null? errors) "

No errors were reported.

" (string-append "

Errors

" (apply string-append (for/list ([e (in-list errors)]) (format "" (html-escape (alist-ref/default e 'file "")) (html-escape (alist-ref/default e 'message ""))))) "
FileError
~a
~a
"))) (format "~a

~a

Summary

~a
~a" (html-escape title) (html-escape title) rows error-html))