diff --git a/main.rkt b/main.rkt index ba82b6a..48ae6aa 100644 --- a/main.rkt +++ b/main.rkt @@ -35,7 +35,7 @@ (let ([bad-attrs (filter (λ(i) (not (txexpr-attr? i))) x)]) (format "because ~a ~a" (string-join (map (λ(ba) (format "~v" ba)) bad-attrs) " and ") (if (> (length bad-attrs) 1) "are not valid attributes" - "is not in the form (list symbol? string?)"))))) + "is not in the form '(symbol \"string\")"))))) (match x [(list (? txexpr-attr?) ...) x] [else [else (error (string-append "validate-txexpr-attrs: " @@ -61,7 +61,7 @@ (valid-char? x) (cdata? x)) x] [else (error (string-append "validate-txexpr-element: " (if txexpr-context (format "in ~v, " txexpr-context) "") - (format "~v is not a valid element (expecting txexpr, string, symbol, XML char, or cdata)" x)))])) + (format "~v is not a valid element (must be txexpr, string, symbol, XML char, or cdata)" x)))])) (define+provide+safe (txexpr-element? x) @@ -82,7 +82,7 @@ (and (validate-txexpr-attrs-with-context attr-list) (andmap validate-txexpr-element-with-context rest))] [(list (? symbol? name) rest ...)(andmap validate-txexpr-element-with-context rest)] - [else (error (format "validate-txexpr: first element is not a symbol in ~v" x))]) + [else (error (format "validate-txexpr: ~v is not a list starting with a symbol" x))]) x)) (define+provide+safe (txexpr? x) diff --git a/scribblings/txexpr.scrbl b/scribblings/txexpr.scrbl index 146d113..4323bef 100644 --- a/scribblings/txexpr.scrbl +++ b/scribblings/txexpr.scrbl @@ -154,9 +154,12 @@ txexpr?] Like @racket[txexpr?], but raises a descriptive error if @racket[_possible-txexpr] is invalid, and otherwise returns @racket[_possible-txexpr] itself. @examples[#:eval my-eval -(validate-txexpr '(root (mama.html son.html daughter.html) uncle.html)) -(validate-txexpr `(root (,+ son.html daughter.html) uncle.html)) -(validate-txexpr '(root (mama.html son.html son.html) mama.html)) +(validate-txexpr 'root) +(validate-txexpr '(root)) +(validate-txexpr '(root ((id "top")(class 42)))) +(validate-txexpr '(root ((id "top")(class "42")))) +(validate-txexpr '(root ((id "top")(class "42")) ("hi"))) +(validate-txexpr '(root ((id "top")(class "42")) "hi")) ] @@ -218,6 +221,19 @@ Like @racket[txexpr->values], but returns the three components in a list. (txexpr->list '(div [[id "top"]] "Hello" (p "World"))) ] +@defproc[ +(txexpr->html +[tx txexpr?]) +string?] +Convert @racket[_tx] to an HTML string. Better than @racket[xexpr->string] because consistent with the HTML spec, it will not escape text that appears within @code{script} or @code{style} blocks. + +@examples[#:eval my-eval +(define tx '(root (script "3 > 2") "Why is 3 > 2?")) +(xexpr->string tx) +(txexpr->html tx) +] + + @deftogether[( @defproc[ (get-tag diff --git a/tests.rkt b/tests.rkt index b4bb2dc..d361327 100644 --- a/tests.rkt +++ b/tests.rkt @@ -118,3 +118,5 @@ (check-equal? (call-with-values (λ() (splitf-txexpr split-this-tx (λ(x) (and (txexpr? x) (equal? 'meta (car x)))))) list) (list '(root "hello" "world" (em "goodnight" "moon")) '((meta "foo" "bar") (meta "foo2" "bar2") (meta "foo3" "bar3")))) +(check-equal? (txexpr->html '(root (script "3 > 2") "Why is 3 > 2?")) + "Why is 3 > 2?") \ No newline at end of file