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