From 7740733c05c71aaf3f9e35960d071fdedd8e2b0b Mon Sep 17 00:00:00 2001 From: Jay McCarthy Date: Wed, 7 May 2014 15:42:23 -0600 Subject: [PATCH] Fixing PR14478 --- pkgs/racket-pkgs/racket-test/tests/xml/test.rkt | 3 +++ racket/collects/xml/private/writer.rkt | 13 ++++++++++--- racket/collects/xml/private/xexpr.rkt | 6 +++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt b/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt index 4525d3b499..3b5aac2931 100644 --- a/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt +++ b/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt @@ -563,6 +563,9 @@ END " ") (test-xexpr->string '(root () 40) "(") + (check-exn + exn:fail? + (λ () (xexpr->string "\f"))) ; XXX more xexpr->string tests ) diff --git a/racket/collects/xml/private/writer.rkt b/racket/collects/xml/private/writer.rkt index 3bfc5adf80..bd56c006e8 100644 --- a/racket/collects/xml/private/writer.rkt +++ b/racket/collects/xml/private/writer.rkt @@ -154,15 +154,22 @@ (let ([n (entity-text entity)]) (fprintf out (if (number? n) "&#~a;" "&~a;") n))) -(define escape-table #rx"[<>&]") +(define escape-table #px"[<>&[:cntrl:]]") (define escape-attribute-table #rx"[<>&\"]") (define (replace-escaped s) - (case (string-ref s 0) + (define c (string-ref s 0)) + (case c [(#\<) "<"] [(#\>) ">"] [(#\&) "&"] - [(#\") """])) + [(#\") """] + [(#\newline) "\n"] + [else + (define i (char->integer c)) + (if (valid-char? i) + (format "&#~a;" i) + (error 'escape "illegal character, ~v" c))])) ;; escape : String -> String (define (escape x table) diff --git a/racket/collects/xml/private/xexpr.rkt b/racket/collects/xml/private/xexpr.rkt index 5fb458c09d..add87dd5f1 100644 --- a/racket/collects/xml/private/xexpr.rkt +++ b/racket/collects/xml/private/xexpr.rkt @@ -60,7 +60,7 @@ (error 'xexpr->xml "expected a list of xexprs for the body in ~e" x)) - (make-element 'scheme 'scheme (car x) + (make-element 'racket 'racket (car x) atts (map xexpr->xml body)))]) (if (and (pair? (cdr x)) @@ -68,9 +68,9 @@ (and (pair? (cadr x)) (pair? (caadr x))))) (f (map srep->attribute (cadr x)) (cddr x)) (f null (cdr x))))] - [(string? x) (make-pcdata 'scheme 'scheme x)] + [(string? x) (make-pcdata 'racket 'racket x)] [(or (symbol? x) (exact-nonnegative-integer? x)) - (make-entity 'scheme 'scheme x)] + (make-entity 'racket 'racket x)] [(or (comment? x) (p-i? x) (cdata? x) (pcdata? x)) x] [else ;(error 'xexpr->xml "malformed xexpr ~e" x) x]))