html.rkt (3102B)
1 #lang racket/base 2 3 ;; Check that the HTML tags provided by scribble/html/html 4 ;; and scribble/html/extra 5 ;; match a master list of HTML tags (defined in this file) 6 ;; Also check that `scribble/html/html` is disjoint from `racket/base` 7 8 (require rackunit racket/set) 9 10 (define (phase0-provides m) ; Symbol -> [Setof Symbol] 11 (parameterize ([current-namespace (make-base-namespace)]) 12 (dynamic-require m #f) 13 (let-values ([(e1* e2*) (module->exports m)]) 14 (for*/seteq ([export* (in-list (list e1* e2*))] 15 [tag+exp (in-list export*)] 16 #:when (or (not (car tag+exp)) (zero? (car tag+exp))) 17 [exp (in-list (cdr tag+exp))]) 18 (car exp))))) 19 20 (define (expected-disjoint m1 m2) 21 (format "'~a' and '~a' should provide disjoint sets of identifiers" m1 m2)) 22 23 (define (expected-overlap m1 m2) 24 (format "expected '~a' and '~a' to provide overlapping sets of identifiers" m1 m2)) 25 26 (define html-provides (phase0-provides 'scribble/html/html)) 27 (define extra-provides (phase0-provides 'scribble/html/extra)) 28 (define base-provides (phase0-provides 'racket/base)) 29 30 (check-pred set-empty? 31 (set-intersect html-provides extra-provides) 32 (expected-disjoint 'scribble/html/html 'scribble/html/extra)) 33 34 ;; note: 'racket' and 'scribble/html/html' both provide "link" 35 (check-pred set-empty? 36 (set-intersect html-provides base-provides) 37 (expected-disjoint 'scribble/html/html 'racket/base)) 38 39 (check-pred positive? 40 (set-count (set-intersect extra-provides base-provides)) 41 (expected-overlap 'scribble/html/extra 'racket/base)) 42 43 ;; From: https://html.spec.whatwg.org/multipage/#toc-semantics 44 (define whatwg-master (list->seteq '( 45 html 46 head 47 title 48 base 49 link 50 meta 51 style 52 body 53 article 54 section 55 nav 56 aside 57 h1 h2 h3 h4 h5 h6 58 hgroup 59 header 60 footer 61 address 62 p 63 hr 64 pre 65 blockquote 66 ol 67 ul 68 li 69 dl 70 dt 71 dd 72 figure 73 figcaption 74 main 75 div 76 a 77 em 78 strong 79 small 80 s 81 cite 82 q 83 dfn 84 abbr 85 ruby 86 rt 87 rp 88 data 89 time 90 code 91 var 92 samp 93 kbd 94 sub sup 95 i 96 b 97 u 98 mark 99 bdi 100 bdo 101 span 102 br 103 wbr 104 ins 105 del 106 picture 107 source 108 img 109 iframe 110 embed 111 object 112 param 113 video 114 audio 115 track 116 map 117 area 118 table 119 caption 120 colgroup 121 col 122 tbody 123 thead 124 tfoot 125 tr 126 td 127 th 128 form 129 label 130 input 131 button 132 select 133 datalist 134 optgroup 135 option 136 textarea 137 keygen 138 output 139 progress 140 meter 141 fieldset 142 legend 143 details 144 summary 145 menu 146 menuitem 147 dialog 148 script 149 noscript 150 template 151 slot 152 canvas))) 153 154 (let ([scribble-master (set-union html-provides extra-provides)]) 155 (check-true (subset? whatwg-master scribble-master)) 156 ;; Uncomment to debug scribble provides vs. whatwg master 157 #;(void 158 (displayln "checking MASTER vs SCRIBBLE") 159 (for ([m (in-set whatwg-master)] 160 #:when (not (set-member? scribble-master m))) 161 (displayln m)) 162 (newline) 163 (displayln "checking SCRIBBLE vs MASTER") 164 (for ([s (in-set scribble-master)] 165 #:when (not (set-member? whatwg-master s))) 166 (displayln s))))