emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/geiser-racket c9008a6 091/191: [WIP] Draw images inline in


From: Philip Kaludercic
Subject: [nongnu] elpa/geiser-racket c9008a6 091/191: [WIP] Draw images inline in the Racket REPL.
Date: Sun, 1 Aug 2021 18:32:06 -0400 (EDT)

branch: elpa/geiser-racket
commit c9008a6e0b7fddefbcd2a937b41e83773a71f46b
Author: Michael W <gcr@sneakygcr.net>
Commit: Michael W <gcr@sneakygcr.net>

    [WIP] Draw images inline in the Racket REPL.
    
    On the racket side, we use a custom print handler to print
    images (convertible? values; see file/convertible) in a special format:
    #<Image: filename>
    
    On the geiser side, we add a comint post-output hook to search for
    that filename and replace it with inline images.
---
 geiser/user.rkt | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/geiser/user.rkt b/geiser/user.rkt
index c8cca24..38eefd8 100644
--- a/geiser/user.rkt
+++ b/geiser/user.rkt
@@ -14,7 +14,10 @@
 (provide init-geiser-repl run-geiser-server start-geiser)
 
 (require (for-syntax racket/base)
+         file/convertible
          mzlib/thread
+         racket/file
+         racket/pretty
          racket/tcp
          geiser
          geiser/enter
@@ -88,10 +91,30 @@
 (define (geiser-prompt-read prompt)
   (make-repl-reader (geiser-read prompt)))
 
+(define (geiser-save-tmpimage imgbytes)
+  ;; Save imgbytes to a new temporary file and return the filename
+  (define filename (make-temporary-file "geiser-img-~a.png"))
+  (with-output-to-file filename #:exists 'truncate
+    (lambda () (display imgbytes)))
+  filename)
+
+(define (geiser-maybe-print-image value)
+  (cond
+   [(and (convertible? value)
+         (convert value 'png-bytes))
+    => (lambda (pngbytes)
+         ;; (The above could be problematic if a future version of racket
+         ;; suddenly decides it can "convert" strings to picts)
+         (printf "#<Image: ~a>\n" (geiser-save-tmpimage pngbytes)))]
+   [else
+    (unless (void? value)
+      (pretty-print value))]))
+
 (define (init-geiser-repl)
   (compile-enforce-module-constants #f)
   (current-load/use-compiled geiser-loader)
-  (current-prompt-read (geiser-prompt-read geiser-prompt)))
+  (current-prompt-read (geiser-prompt-read geiser-prompt))
+  (current-print geiser-maybe-print-image))
 
 (define (run-geiser-repl in out enforce-module-constants)
   (parameterize [(compile-enforce-module-constants enforce-module-constants)
@@ -99,7 +122,8 @@
                  (current-output-port out)
                  (current-error-port out)
                  (current-load/use-compiled geiser-loader)
-                 (current-prompt-read (geiser-prompt-read geiser-prompt))]
+                 (current-prompt-read (geiser-prompt-read geiser-prompt))
+                 (current-print geiser-maybe-print-image)]
     (read-eval-print-loop)))
 
 (define server-channel (make-channel))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]