summaryrefslogtreecommitdiff
path: root/gnbug
diff options
context:
space:
mode:
authorArun Isaac2021-09-27 01:25:42 +0530
committerArun Isaac2021-09-27 01:25:42 +0530
commitc7de85c7b8dc038145d4b30b7207f764729a898e (patch)
tree7a57190a8a4b7147466a684e40a7ece4fadfa4cd /gnbug
parent54127be75fefeab5d7132315cdd6bedb306f5c9f (diff)
downloadgn-gemtext-c7de85c7b8dc038145d4b30b7207f764729a898e.tar.gz
gnbug: Syntax highlight output of `gnbug show'.
* gnbug: Import (srfi srfi-17 gnu). (bold): New function. (gnbug-show): Syntax highlight output.
Diffstat (limited to 'gnbug')
-rwxr-xr-xgnbug49
1 files changed, 45 insertions, 4 deletions
diff --git a/gnbug b/gnbug
index fbd3c50..eb8bbe5 100755
--- a/gnbug
+++ b/gnbug
@@ -8,6 +8,7 @@
(srfi srfi-26)
(srfi srfi-37)
(srfi srfi-171)
+ (srfi srfi-171 gnu)
(ice-9 ftw)
(ice-9 match)
(ice-9 popen)
@@ -266,6 +267,8 @@ there is no such commit."
terminal."
(format #f "~a[~am~a~a[0m" #\esc code str #\esc))
+(define bold (cut color 1 <>))
+
(define red (cut color 31 <>))
(define green (cut color 32 <>))
(define yellow (cut color 33 <>))
@@ -432,10 +435,48 @@ Show the text of issue #ISSUE-NUMBER.
"
(command-line-program)))
((issue-number)
- (put-string (current-output-port)
- (call-with-input-file (issue-file (list-ref (issues)
- (1- (string->number issue-number))))
- get-string-all)))))
+ (call-with-input-file (issue-file (list-ref (issues)
+ (1- (string->number issue-number))))
+ (lambda (port)
+ (port-transduce
+ (compose
+ ;; Detect preformatted text blocks.
+ (tfold (match-lambda*
+ (((pre? . _) line)
+ (cons (if (string-prefix? "```" line)
+ (not pre?)
+ pre?)
+ line)))
+ (cons #f #f))
+ (tmap (lambda (pre?+line)
+ (match pre?+line
+ ((pre? . line)
+ (cond
+ ;; Print headlines in bold.
+ ((string-prefix? "#" line)
+ (display (bold line)))
+ ;; Print lists in cyan.
+ ((string-prefix? "*" line)
+ (display (cyan line)))
+ ;; Print links in cyan, but only the actual
+ ;; link, and not the => prefix or the label.
+ ((string-match "^(=>[ \t]*)([^ ]*)([^\n]*)" line)
+ => (lambda (m)
+ (display (match:substring m 1))
+ (display (cyan (match:substring m 2)))
+ (display (match:substring m 3))))
+ ;; Print preformatted text backticks in
+ ;; magenta.
+ ((string-prefix? "```" line)
+ (display (magenta line)))
+ (else
+ ;; If part of preformatted block, print in
+ ;; magenta. Else, print in default color.
+ (display (if pre? (magenta line) line))))))
+ (newline))))
+ (const #t)
+ get-line-dos-or-unix
+ port))))))
(define (print-usage)
(format #t "Usage: ~a COMMAND [OPTIONS] [ARGS]