racket/collects/xml/private/structures.rkt

114 lines
4.0 KiB
Racket

#lang racket/base
(require "core.rkt"
racket/contract)
; Location = (make-location Nat Nat Nat) | Symbol
(define-struct location (line char offset) #:transparent)
; Document = (make-document Prolog Element (listof Misc))
(define-struct document (prolog element misc) #:transparent)
; Prolog = (make-prolog (listof Misc) Document-type (listof Misc))
(define-struct prolog (misc dtd misc2) #:transparent)
; Document-type = (make-document-type sym External-dtd #f)
; | #f
(define-struct document-type (name external inlined) #:transparent)
; External-dtd = (make-external-dtd/public str str)
; | (make-external-dtd/system str)
; | #f
(define-struct external-dtd (system) #:transparent)
(define-struct (external-dtd/public external-dtd) (public) #:transparent)
(define-struct (external-dtd/system external-dtd) () #:transparent)
; Element = (make-element Location Location Symbol (listof Attribute) (listof Content))
(define-struct (element source) (name attributes content) #:transparent)
; Attribute = (make-attribute Location Location Symbol String)
(define-struct (attribute source) (name value) #:transparent)
; Content = Pcdata
; | Element
; | Entity
; | Misc
; | Cdata
; Misc = Comment
; | Processing-instruction
; Entity = (make-entity Location Location (U Nat Symbol))
(define-struct (entity source) (text) #:transparent)
(define permissive/c
(make-contract
#:name 'permissive/c
#:projection
(lambda (blame)
(lambda (v)
(if (permissive-xexprs)
v
(raise-blame-error
blame v "not in permissive mode"))))
#:first-order
(lambda (v)
(permissive-xexprs))))
; content? : TST -> Bool
(define content/c
(or/c pcdata? element? entity? comment? cdata? p-i? permissive/c))
(define misc/c
(or/c comment? p-i?))
(define location/c
(or/c location? symbol? false/c))
(provide/contract
(struct location ([line (or/c false/c exact-nonnegative-integer?)]
[char (or/c false/c exact-nonnegative-integer?)]
[offset exact-nonnegative-integer?]))
[location/c contract?]
(struct source ([start location/c]
[stop location/c]))
(struct external-dtd ([system string?]))
(struct (external-dtd/public external-dtd) ([system string?]
[public string?]))
(struct (external-dtd/system external-dtd) ([system string?]))
(struct document-type ([name symbol?]
[external external-dtd?]
[inlined false/c]))
(struct comment ([text string?]))
(struct (p-i source) ([start location/c]
[stop location/c]
[target-name symbol?]
[instruction string?]))
[misc/c contract?]
(struct prolog ([misc (listof misc/c)]
[dtd (or/c document-type? false/c)]
[misc2 (listof misc/c)]))
(struct document ([prolog prolog?]
[element element?]
[misc (listof misc/c)]))
(struct (element source) ([start location/c]
[stop location/c]
[name symbol?]
[attributes (listof attribute?)]
[content (listof content/c)]))
(struct (attribute source) ([start location/c]
[stop location/c]
[name symbol?]
[value (or/c string? permissive/c)]))
[permissive-xexprs (parameter/c boolean?)]
[permissive/c contract?]
[content/c contract?]
(struct (pcdata source) ([start location/c]
[stop location/c]
[string string?]))
(struct (cdata source) ([start location/c]
[stop location/c]
[string string?]))
[valid-char? (any/c . -> . boolean?)]
(struct (entity source) ([start location/c]
[stop location/c]
[text (or/c symbol? valid-char?)])))