[racket-dev] Feature request: allow 2htdp/image bitmap function to load from URL

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Mon Jun 14 11:36:59 EDT 2010

Eventually we hope to add a 'url'-form to require, at which point it
will make a lot of sense to support that it bitmap. In the meantime, I
think the best thing is probably to make a new form, say bitmap-url,
and put it into a separate teachpack.

Robby

On Sunday, June 13, 2010, Nadeem Abdul Hamid <nadeem at acm.org> wrote:
> Below is a quick hack I did to allow loading a 2htdp/image bitmap from a url like this:
>
>     (bitmap (url "http://docs.racket-lang.org/teachpack/4e85791a5.png"))
>
> There's no error checking, and I was too lazy to do a diff, but I've marked the three pieces that I added with "; .nah." comments. Would it be possible to add this feature to the library? This would have been a little easier maybe if bitmap% provided load from ports, but I see that's an open PR (9335).
>
> Thanks,
> --- nadeem
>
>
> (define-syntax (bitmap stx)
>   (syntax-case stx ()
>     [(_ arg)
>      (let* ([arg (syntax->datum #'arg)]
>             [url? (and (pair? arg) (eq? (car arg) 'url))]   ; .nah.
>             [path
>              (cond
>                [(and (pair? arg)
>                      (eq? (car arg) 'planet))
>                 (raise-syntax-error 'bitmap "planet paths not yet supported" stx)]
>                ; .nah. ...
>                [url?
>                 (let ([temp-path (make-temporary-file)])
>                   (call-with-output-file temp-path
>                     (lambda (outp)
>                       (call/input-url
>                        (string->url (cadr arg)) get-pure-port
>                        (lambda (inp)
>                          (copy-port inp outp)
>                             )))
>                     #:exists 'replace
>                     )
>                   (display temp-path)
>                   temp-path
>                   )]
>                ; ... .nah.
>                [(symbol? arg)
>                 (let ([pieces (regexp-split #rx"/" (symbol->string arg))])
>                   (cond
>                     [(null? pieces)
>                      (raise-syntax-error 'bitmap "expected a path with a / in it" stx)]
>                     [else
>                      (let loop ([cps (current-library-collection-paths)])
>                        (cond
>                          [(null? cps)
>                           (raise-syntax-error 'bitmap
>                                               (format "could not find the ~a collection" (car pieces))
>                                               stx)]
>                          [else
>                           (if (and (directory-exists? (car cps))
>                                    (member (build-path (car pieces))
>                                            (directory-list (car cps))))
>                               (let ([candidate (apply build-path (car cps) pieces)])
>                                 (if (file-exists? candidate)
>                                     candidate
>                                     (raise-syntax-error 'bitmap
>                                                         (format "could not find ~a in the ~a collection"
>                                                                 (apply string-append (add-between (cdr pieces) "/"))
>                                                                 (car pieces))
>                                                         stx)))
>                               (loop (cdr cps)))]))]))]
>                [(string? arg)
>                 (path->complete-path
>                  arg
>                  (or (current-load-relative-directory)
>                      (current-directory)))])]
>             )
>        ; .nah. ...
>        #`(let ([result (make-object image-snip% (make-object bitmap% #,path 'unknown/mask))])
>            (when #,url? (delete-file #,path))
>            result)
>        ; ... .nah.
>        )]))
> _________________________________________________
>   For list-related administrative tasks:
>   http://lists.racket-lang.org/listinfo/dev
>

Posted on the dev mailing list.