summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2021-09-27 01:25:42 +0530
committerArun Isaac2021-09-27 01:25:42 +0530
commitc7de85c7b8dc038145d4b30b7207f764729a898e (patch)
tree7a57190a8a4b7147466a684e40a7ece4fadfa4cd
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.
-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]