You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
#lang racket/base
|
|
|
|
(require scribble/text
|
|
|
|
(for-syntax racket/base
|
|
|
|
racket/list
|
|
|
|
syntax/parse)
|
|
|
|
racket/port)
|
|
|
|
|
|
|
|
;; Adaptation of function in web-server/templates library
|
|
|
|
;; to check for binary result and pass it through.
|
|
|
|
;; Actually patches underlying bug in `output`.
|
|
|
|
(define-syntax (include-template stx)
|
|
|
|
(syntax-parse stx
|
|
|
|
[(_ (~optional (~seq #:command-char command-char:expr)) p:expr)
|
|
|
|
(quasisyntax/loc stx
|
|
|
|
(let ([result (include/text #,@(if (attribute command-char)
|
|
|
|
(list #'#:command-char #'command-char)
|
|
|
|
empty)
|
|
|
|
p)])
|
|
|
|
|
|
|
|
(let ([result (cond
|
|
|
|
[(bytes? result) result]
|
|
|
|
;; list of expressions with byte string in last place.
|
|
|
|
;; infer that user is trying to return a binary as the last value in a template,
|
|
|
|
;; and treat it as a single binary value.
|
|
|
|
[(and (list? result) (bytes? (last result))) (last result)]
|
|
|
|
[else result])])
|
|
|
|
(if (bytes? result)
|
|
|
|
(with-output-to-bytes (λ () (write-bytes result)))
|
|
|
|
(with-output-to-string (λ () (output result)))))))]))
|
|
|
|
|
|
|
|
(provide include-template)
|