Fixing xexpr pretty printing
svn: r13875
This commit is contained in:
parent
5fda17741b
commit
12dcbfdc88
|
@ -1,8 +1,8 @@
|
||||||
#lang scheme
|
#lang scheme
|
||||||
(require scheme/runtime-path
|
(require scheme/runtime-path
|
||||||
net/url
|
net/url
|
||||||
web-server/http/response-structs
|
|
||||||
web-server/private/xexpr
|
web-server/private/xexpr
|
||||||
|
web-server/http/response-structs
|
||||||
web-server/http/request-structs)
|
web-server/http/request-structs)
|
||||||
|
|
||||||
(define (format-stack-trace trace)
|
(define (format-stack-trace trace)
|
||||||
|
@ -33,7 +33,9 @@
|
||||||
(div ([class "title"]) "Exception")
|
(div ([class "title"]) "Exception")
|
||||||
(p
|
(p
|
||||||
"The application raised an exception with the message:"
|
"The application raised an exception with the message:"
|
||||||
(pre ,(reformat-xexpr-exn (exn-message exn))))
|
(pre ,(if (exn:pretty? exn)
|
||||||
|
(exn:pretty-xexpr exn)
|
||||||
|
(exn-message exn))))
|
||||||
(p
|
(p
|
||||||
"Stack trace:"
|
"Stack trace:"
|
||||||
,(format-stack-trace
|
,(format-stack-trace
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
#lang web-server/insta
|
||||||
|
(define (start initial-request)
|
||||||
|
`(html (head (title "Foo"))
|
||||||
|
(body (a ([href #f])
|
||||||
|
"Zog"))))
|
|
@ -1,6 +1,6 @@
|
||||||
#lang scheme
|
#lang scheme
|
||||||
(require web-server/http
|
(require web-server/http
|
||||||
xml
|
web-server/private/xexpr
|
||||||
(only-in "lib.ss"
|
(only-in "lib.ss"
|
||||||
formlet/c
|
formlet/c
|
||||||
pure
|
pure
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
default))))
|
default))))
|
||||||
|
|
||||||
(provide/contract
|
(provide/contract
|
||||||
[make-input ((string? . -> . xexpr/c) . -> . (formlet/c (or/c false/c binding?)))]
|
[make-input ((string? . -> . pretty-xexpr/c) . -> . (formlet/c (or/c false/c binding?)))]
|
||||||
#;[binding:form-required (formlet/c (binding? . -> . bytes?))]
|
#;[binding:form-required (formlet/c (binding? . -> . bytes?))]
|
||||||
#;[binding:form/default (bytes? . -> . (formlet/c (binding? . -> . bytes?)))])
|
#;[binding:form/default (bytes? . -> . (formlet/c (binding? . -> . bytes?)))])
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#lang scheme
|
#lang scheme
|
||||||
(require web-server/http
|
(require web-server/http
|
||||||
xml)
|
web-server/private/xexpr)
|
||||||
|
|
||||||
; Combinators
|
; Combinators
|
||||||
(define (const x) (lambda _ x))
|
(define (const x) (lambda _ x))
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
|
|
||||||
; Contracts
|
; Contracts
|
||||||
(define xexpr-forest/c
|
(define xexpr-forest/c
|
||||||
(listof xexpr/c))
|
(listof pretty-xexpr/c))
|
||||||
|
|
||||||
(define (formlet/c c)
|
(define (formlet/c c)
|
||||||
(integer? . -> .
|
(integer? . -> .
|
||||||
|
@ -91,7 +91,7 @@
|
||||||
() #:rest (listof (formlet/c alpha))
|
() #:rest (listof (formlet/c alpha))
|
||||||
. ->* . (formlet/c beta))]
|
. ->* . (formlet/c beta))]
|
||||||
[xml-forest (xexpr-forest/c . -> . (formlet/c procedure?))]
|
[xml-forest (xexpr-forest/c . -> . (formlet/c procedure?))]
|
||||||
[xml (xexpr/c . -> . (formlet/c procedure?))]
|
[xml (pretty-xexpr/c . -> . (formlet/c procedure?))]
|
||||||
[text (string? . -> . (formlet/c procedure?))]
|
[text (string? . -> . (formlet/c procedure?))]
|
||||||
[tag-xexpr (symbol? (listof (list/c symbol? string?)) (formlet/c alpha) . -> . (formlet/c alpha))]
|
[tag-xexpr (symbol? (listof (list/c symbol? string?)) (formlet/c alpha) . -> . (formlet/c alpha))]
|
||||||
[formlet-display ((formlet/c alpha) . -> . xexpr-forest/c)]
|
[formlet-display ((formlet/c alpha) . -> . xexpr-forest/c)]
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#lang scheme
|
#lang scheme
|
||||||
(require web-server/servlet
|
(require web-server/servlet
|
||||||
xml
|
web-server/private/xexpr
|
||||||
"lib.ss")
|
"lib.ss")
|
||||||
|
|
||||||
(provide/contract
|
(provide/contract
|
||||||
[send/formlet (((formlet/c any/c))
|
[send/formlet (((formlet/c any/c))
|
||||||
(#:wrap (xexpr/c . -> . response/c))
|
(#:wrap (pretty-xexpr/c . -> . response/c))
|
||||||
. ->* . any/c)])
|
. ->* . any/c)])
|
||||||
|
|
||||||
(define (send/formlet f
|
(define (send/formlet f
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
,@(formlet-display f)))))))
|
,@(formlet-display f)))))))
|
||||||
|
|
||||||
(provide/contract
|
(provide/contract
|
||||||
[embed-formlet (embed/url/c (formlet/c any/c) . -> . xexpr/c)])
|
[embed-formlet (embed/url/c (formlet/c any/c) . -> . pretty-xexpr/c)])
|
||||||
|
|
||||||
(define (embed-formlet embed/url f)
|
(define (embed-formlet embed/url f)
|
||||||
`(form ([action ,(embed/url
|
`(form ([action ,(embed/url
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
web-server/http/request-structs
|
web-server/http/request-structs
|
||||||
web-server/http/response-structs
|
web-server/http/response-structs
|
||||||
xml
|
xml
|
||||||
|
web-server/private/xexpr
|
||||||
scheme/contract)
|
scheme/contract)
|
||||||
|
|
||||||
(provide/contract
|
(provide/contract
|
||||||
|
@ -13,7 +14,7 @@
|
||||||
#:secure? (or/c false/c boolean?))
|
#:secure? (or/c false/c boolean?))
|
||||||
. ->* . cookie?)]
|
. ->* . cookie?)]
|
||||||
[cookie->header (cookie? . -> . header?)]
|
[cookie->header (cookie? . -> . header?)]
|
||||||
[xexpr-response/cookies ((listof cookie?) xexpr/c . -> . response/full?)])
|
[xexpr-response/cookies ((listof cookie?) pretty-xexpr/c . -> . response/full?)])
|
||||||
|
|
||||||
(define (set-when-true fn val)
|
(define (set-when-true fn val)
|
||||||
(if val
|
(if val
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
(require mzlib/contract
|
(require mzlib/contract
|
||||||
scheme/list
|
scheme/list
|
||||||
xml/xml
|
xml
|
||||||
|
web-server/private/xexpr
|
||||||
web-server/http/request-structs)
|
web-server/http/request-structs)
|
||||||
|
|
||||||
(define TEXT/HTML-MIME-TYPE #"text/html; charset=utf-8")
|
(define TEXT/HTML-MIME-TYPE #"text/html; charset=utf-8")
|
||||||
|
@ -13,7 +14,7 @@
|
||||||
(define response/c
|
(define response/c
|
||||||
(or/c response/basic?
|
(or/c response/basic?
|
||||||
(cons/c bytes? (listof (or/c string? bytes?)))
|
(cons/c bytes? (listof (or/c string? bytes?)))
|
||||||
xexpr/c))
|
pretty-xexpr/c))
|
||||||
|
|
||||||
;; response/full->size: response/full -> number
|
;; response/full->size: response/full -> number
|
||||||
(define (response/full->size resp)
|
(define (response/full->size resp)
|
||||||
|
|
|
@ -2,13 +2,38 @@
|
||||||
(require scheme/pretty
|
(require scheme/pretty
|
||||||
xml)
|
xml)
|
||||||
|
|
||||||
|
(define-struct (exn:pretty exn) (xexpr))
|
||||||
|
|
||||||
(provide/contract
|
(provide/contract
|
||||||
|
[struct (exn:pretty exn) ([message string?]
|
||||||
|
[continuation-marks continuation-mark-set?]
|
||||||
|
[xexpr xexpr/c])]
|
||||||
[format-xexpr/errors (any/c . -> . string?)]
|
[format-xexpr/errors (any/c . -> . string?)]
|
||||||
[reformat-xexpr-exn (string? . -> . xexpr/c)])
|
[pretty-xexpr/c contract?])
|
||||||
|
|
||||||
|
(define pretty-xexpr/c
|
||||||
|
(make-proj-contract
|
||||||
|
'pretty-xexpr/c
|
||||||
|
(lambda (pos neg src-info name)
|
||||||
|
(lambda (val)
|
||||||
|
(define marks (current-continuation-marks))
|
||||||
|
(with-handlers ([exn:fail:contract?
|
||||||
|
(lambda (exn)
|
||||||
|
(raise
|
||||||
|
(make-exn:pretty
|
||||||
|
(exn-message exn)
|
||||||
|
marks
|
||||||
|
`(span ,(drop-after "Context:\n" (exn-message exn))
|
||||||
|
,(make-cdata #f #f (format-xexpr/errors val))))))])
|
||||||
|
(contract xexpr/c val pos neg src-info))))
|
||||||
|
(lambda (v) #t)))
|
||||||
|
|
||||||
|
(define (drop-after delim str)
|
||||||
|
(substring str 0 (cdr (first (regexp-match-positions (regexp-quote delim) str)))))
|
||||||
|
|
||||||
; Formating Xexprs
|
; Formating Xexprs
|
||||||
(define (format-xexpr/errors v)
|
(define (format-xexpr/errors v)
|
||||||
(pretty-format (format-xexpr v)))
|
(pretty-format (format-xexpr v) 80))
|
||||||
|
|
||||||
(define-struct xexpr-error (message content)
|
(define-struct xexpr-error (message content)
|
||||||
#:property prop:custom-write
|
#:property prop:custom-write
|
||||||
|
@ -27,6 +52,7 @@
|
||||||
(exact-nonnegative-integer? v)
|
(exact-nonnegative-integer? v)
|
||||||
(comment? v)
|
(comment? v)
|
||||||
(p-i? v)
|
(p-i? v)
|
||||||
|
(pcdata? v)
|
||||||
(cdata? v)))
|
(cdata? v)))
|
||||||
|
|
||||||
(define (format-xexpr v)
|
(define (format-xexpr v)
|
||||||
|
@ -43,7 +69,7 @@
|
||||||
(format-elements+attributes (cdr v)))])]
|
(format-elements+attributes (cdr v)))])]
|
||||||
[(xexpr-datum? v) v]
|
[(xexpr-datum? v) v]
|
||||||
[else
|
[else
|
||||||
(mark-error "Not a valid Xexpr datum (Must be a string, symbol, exact nonnegative integer, comment, PI, or cdata.)" v)]))
|
(mark-error "Not a valid Xexpr datum (Must be a string, symbol, exact nonnegative integer, comment, PI, pcdata, or cdata.)" v)]))
|
||||||
|
|
||||||
(define (format-elements+attributes l)
|
(define (format-elements+attributes l)
|
||||||
(match l
|
(match l
|
||||||
|
@ -87,39 +113,4 @@
|
||||||
[(list attr (? string? val))
|
[(list attr (? string? val))
|
||||||
(list (mark-error "Not a valid attribute name (Must be symbol.)" attr) val)]
|
(list (mark-error "Not a valid attribute name (Must be symbol.)" attr) val)]
|
||||||
[else
|
[else
|
||||||
(mark-error "Not a valid attribute (Must be a list of a symbol and a string.)" l)]))
|
(mark-error "Not a valid attribute (Must be a list of a symbol and a string.)" l)]))
|
||||||
|
|
||||||
; Reformating Xexpr errors
|
|
||||||
(define (parse-xexpr-error s)
|
|
||||||
(with-input-from-string
|
|
||||||
s (lambda ()
|
|
||||||
(define violator (read))
|
|
||||||
(define c:broke (read))
|
|
||||||
(define c:the (read))
|
|
||||||
(define c:contract (read))
|
|
||||||
(define contract-expr (read))
|
|
||||||
(define c:on (read))
|
|
||||||
(define contracted (read))
|
|
||||||
(define c:semi (read-char))
|
|
||||||
(define xml:msg (read-line))
|
|
||||||
(define blank (read-line))
|
|
||||||
(define c:context (read-line))
|
|
||||||
(define not-xexpr (read))
|
|
||||||
(when
|
|
||||||
(or (ormap eof-object?
|
|
||||||
(list violator c:broke c:the c:contract contract-expr
|
|
||||||
c:on contracted c:semi xml:msg blank c:context not-xexpr))
|
|
||||||
(not (andmap symbol=?
|
|
||||||
(list 'broke 'the 'contract 'on '|;| 'Context:)
|
|
||||||
(list c:broke c:the c:contract c:on c:semi c:context))))
|
|
||||||
(error 'parse-xexpr-error "Not Xexpr error"))
|
|
||||||
(values violator contract-expr contracted xml:msg not-xexpr))))
|
|
||||||
|
|
||||||
(define (reformat-xexpr-exn m)
|
|
||||||
(with-handlers ([exn? (lambda _ m)])
|
|
||||||
(define-values (violator contract-expr contracted xml:msg not-xexpr)
|
|
||||||
(parse-xexpr-error m))
|
|
||||||
`(span ,(format "~a broke the contract~n~a~non ~a;~a~n~nContext:~n"
|
|
||||||
violator (pretty-format contract-expr) contracted
|
|
||||||
xml:msg)
|
|
||||||
,(make-cdata #f #f (format-xexpr/errors not-xexpr)))))
|
|
|
@ -21,6 +21,17 @@
|
||||||
|
|
||||||
(define xexpr-drop-empty-attributes (make-parameter #f))
|
(define xexpr-drop-empty-attributes (make-parameter #f))
|
||||||
|
|
||||||
|
(define xexpr-datum/c
|
||||||
|
(or/c string? symbol? exact-nonnegative-integer?
|
||||||
|
comment? p-i? cdata? pcdata?))
|
||||||
|
|
||||||
|
#;(define xexpr/c
|
||||||
|
(flat-rec-contract xexpr
|
||||||
|
xexpr-datum/c
|
||||||
|
(cons/c symbol?
|
||||||
|
(or/c (cons/c (listof (list/c symbol? string?)) (listof xexpr))
|
||||||
|
(listof xexpr)))))
|
||||||
|
|
||||||
(define xexpr/c
|
(define xexpr/c
|
||||||
(make-proj-contract
|
(make-proj-contract
|
||||||
'xexpr?
|
'xexpr?
|
||||||
|
|
Loading…
Reference in New Issue
Block a user