#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
