#lang racket/base (require racket/contract xml) (provide (all-defined-out)) ;; for now, body is deemed a block, not inline ;; todo: is this legit? Why is body inline? (define block-tags '(address article aside audio blockquote body canvas dd div dl fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hgroup noscript ol output p pre section table tfoot ul video)) ;; for now, map is omitted because it's a Racket keyword ;; for now, style, script, and link are omitted because they shouldn't be wrapped ;; todo: figure out how to resolve this. should be able to use html version of map. ;; possibly prefixed? Probably a good idea so it doesn't collide with user namespace (define inline-tags '(a abbr acronym applet area b base basefont bdo big br button caption center cite code col colgroup del dir dfn dt em embed font frame framesethead hr html i iframe img input ins isindex kbd label legend li menu meta noframes object optgroup option param q s samp select small span strike strong sub sup tbody td textarea th thead title tr tt u var xmp)) (define tags (append block-tags inline-tags)) (define/contract (entity->string e) (symbol? . -> . string?) (format "~a" (integer->char (entity->integer e)))) (define/contract (string->entity str) (string? . -> . symbol?) (integer->entity (char->integer (car (string->list str))))) (define/contract (entity->integer e) (symbol? . -> . integer?) (hash-ref entities e)) (define/contract (integer->entity int) (integer? . -> . symbol?) (hash-ref chars int)) (define entities '#hash((quot . 34) (amp . 38) (apos . 39) (lt . 60) (gt . 62) (nbsp . 160) (iexcl . 161) (cent . 162) (pound . 163) (curren . 164) (yen . 165) (brvbar . 166) (sect . 167) (uml . 168) (copy . 169) (ordf . 170) (laquo . 171) (not . 172) (shy . 173) (reg . 174) (macr . 175) (deg . 176) (plusmn . 177) (sup2 . 178) (sup3 . 179) (acute . 180) (micro . 181) (para . 182) (middot . 183) (cedil . 184) (sup1 . 185) (ordm . 186) (raquo . 187) (frac14 . 188) (frac12 . 189) (frac34 . 190) (iquest . 191) (Agrave . 192) (Aacute . 193) (Acirc . 194) (Atilde . 195) (Auml . 196) (Aring . 197) (AElig . 198) (Ccedil . 199) (Egrave . 200) (Eacute . 201) (Ecirc . 202) (Euml . 203) (Igrave . 204) (Iacute . 205) (Icirc . 206) (Iuml . 207) (ETH . 208) (Ntilde . 209) (Ograve . 210) (Oacute . 211) (Ocirc . 212) (Otilde . 213) (Ouml . 214) (times . 215) (Oslash . 216) (Ugrave . 217) (Uacute . 218) (Ucirc . 219) (Uuml . 220) (Yacute . 221) (THORN . 222) (szlig . 223) (agrave . 224) (aacute . 225) (acirc . 226) (atilde . 227) (auml . 228) (aring . 229) (aelig . 230) (ccedil . 231) (egrave . 232) (eacute . 233) (ecirc . 234) (euml . 235) (igrave . 236) (iacute . 237) (icirc . 238) (iuml . 239) (eth . 240) (ntilde . 241) (ograve . 242) (oacute . 243) (ocirc . 244) (otilde . 245) (ouml . 246) (divide . 247) (oslash . 248) (ugrave . 249) (uacute . 250) (ucirc . 251) (uuml . 252) (yacute . 253) (thorn . 254) (yuml . 255) (OElig . 338) (oelig . 339) (Scaron . 352) (scaron . 353) (Yuml . 376) (fnof . 402) (circ . 710) (tilde . 732) (Alpha . 913) (Beta . 914) (Gamma . 915) (Delta . 916) (Epsilon . 917) (Zeta . 918) (Eta . 919) (Theta . 920) (Iota . 921) (Kappa . 922) (Lambda . 923) (Mu . 924) (Nu . 925) (Xi . 926) (Omicron . 927) (Pi . 928) (Rho . 929) (Sigma . 931) (Tau . 932) (Upsilon . 933) (Phi . 934) (Chi . 935) (Psi . 936) (Omega . 937) (alpha . 945) (beta . 946) (gamma . 947) (delta . 948) (epsilon . 949) (zeta . 950) (eta . 951) (theta . 952) (iota . 953) (kappa . 954) (lambda . 955) (mu . 956) (nu . 957) (xi . 958) (omicron . 959) (pi . 960) (rho . 961) (sigmaf . 962) (sigma . 963) (tau . 964) (upsilon . 965) (phi . 966) (chi . 967) (psi . 968) (omega . 969) (thetasym . 977) (upsih . 978) (piv . 982) (ensp . 8194) (emsp . 8195) (thinsp . 8201) (zwnj . 8204) (zwj . 8205) (lrm . 8206) (rlm . 8207) (ndash . 8211) (mdash . 8212) (lsquo . 8216) (rsquo . 8217) (sbquo . 8218) (ldquo . 8220) (rdquo . 8221) (bdquo . 8222) (dagger . 8224) (Dagger . 8225) (bull . 8226) (hellip . 8230) (permil . 8240) (prime . 8242) (Prime . 8243) (lsaquo . 8249) (rsaquo . 8250) (oline . 8254) (frasl . 8260) (euro . 8364) (image . 8465) (weierp . 8472) (real . 8476) (trade . 8482) (alefsym . 8501) (larr . 8592) (uarr . 8593) (rarr . 8594) (darr . 8595) (harr . 8596) (crarr . 8629) (lArr . 8656) (uArr . 8657) (rArr . 8658) (dArr . 8659) (hArr . 8660) (forall . 8704) (part . 8706) (exist . 8707) (empty . 8709) (nabla . 8711) (isin . 8712) (notin . 8713) (ni . 8715) (prod . 8719) (sum . 8721) (minus . 8722) (lowast . 8727) (radic . 8730) (prop . 8733) (infin . 8734) (ang . 8736) (and . 8743) (or . 8744) (cap . 8745) (cup . 8746) (int . 8747) (there4 . 8756) (sim . 8764) (cong . 8773) (asymp . 8776) (ne . 8800) (equiv . 8801) (le . 8804) (ge . 8805) (sub . 8834) (sup . 8835) (nsub . 8836) (sube . 8838) (supe . 8839) (oplus . 8853) (otimes . 8855) (perp . 8869) (sdot . 8901) (vellip . 8942) (lceil . 8968) (rceil . 8969) (lfloor . 8970) (rfloor . 8971) (lang . 9001) (rang . 9002) (loz . 9674) (spades . 9824) (clubs . 9827) (hearts . 9829) (diams . 9830))) (define chars (make-hash (hash-map entities (λ(k v) (cons v k))))) ; flip the hash