colors: Add 'colorize-full-matches'.

* guix/colors.scm (colorize-full-matches): New procedure.
This commit is contained in:
Ludovic Courtès 2022-04-09 20:09:58 +02:00
parent 00dcfb261b
commit d08e4d52a3
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -36,6 +36,7 @@ (define-module (guix colors)
highlight/warn
dim
colorize-full-matches
color-rules
color-output?
isatty?*
@ -153,6 +154,27 @@ (define highlight (coloring-procedure (color BOLD)))
(define highlight/warn (coloring-procedure (color BOLD MAGENTA)))
(define dim (coloring-procedure (color DARK)))
(define (colorize-full-matches rules)
"Return a procedure that, given a string, colorizes according to RULES.
RULES must be a list of regexp/color pairs; the whole match of a regexp is
colorized with the corresponding color."
(define proc
(lambda (str)
(if (string-index str #\nul)
str
(let loop ((rules rules))
(match rules
(()
str)
(((regexp . color) . rest)
(match (regexp-exec regexp str)
(#f (loop rest))
(m (string-append (proc (match:prefix m))
(colorize-string (match:substring m)
color)
(proc (match:suffix m)))))))))))
proc)
(define (colorize-matches rules)
"Return a procedure that, when passed a string, returns that string
colorized according to RULES. RULES must be a list of tuples like: