diff --git a/txexpr/base.rkt b/txexpr/base.rkt index cf25b78..999e777 100644 --- a/txexpr/base.rkt +++ b/txexpr/base.rkt @@ -214,7 +214,7 @@ (define+provide+safe (->txexpr-attr-value x) (can-be-txexpr-attr-value? . -> . txexpr-attr-value?) (unless (can-be-txexpr-attr-value? x) - (raise-argument-error '->txexpr-attr-value "can-be-txexpr-attr-value?" x)) + (raise-argument-error '->txexpr-attr-value "can-be-txexpr-attr-value?" x)) (->string x)) @@ -352,16 +352,21 @@ (cdata #f #f x) x)) +;; but treat CDATA strings correctly anyhow, because that's friendly +(define (cdata-string? x) + (and (string? x) (regexp-match #rx"^$" x) #t)) (define+provide+safe (xexpr->html x) (xexpr? . -> . string?) (xexpr->string (let loop ([x x]) - (if (txexpr? x) - (let*-values ([(tag attrs elements) (txexpr->values x)] - [(proc) (if (memq tag '(script style)) - ->cdata - loop)]) - ;; a little faster than `txexpr` since we know the pieces are valid - (txexpr-unsafe tag attrs (map proc elements))) - x)))) + (cond + [(txexpr? x) + (let*-values ([(tag attrs elements) (txexpr->values x)] + [(proc) (if (memq tag '(script style)) + ->cdata + loop)]) + ;; a little faster than `txexpr` since we know the pieces are valid + (txexpr-unsafe tag attrs (map proc elements)))] + [(cdata-string? x) (->cdata x)] + [else x])))) diff --git a/txexpr/tests.rkt b/txexpr/tests.rkt index bd3dfc8..d47af43 100644 --- a/txexpr/tests.rkt +++ b/txexpr/tests.rkt @@ -220,4 +220,7 @@ (check-false (findf-txexpr split-this-tx false-pred)) (check-equal? (xexpr->html '(root (script "3 > 2") "Why is 3 > 2?")) - "Why is 3 > 2?")) \ No newline at end of file + "Why is 3 > 2?") + + (check-equal? (xexpr->html '(root (div " 2]]>") "Why is 3 > 2?")) + "
2]]>
Why is 3 > 2?
")) \ No newline at end of file