/pliant/util/encoding/html.pli
 
 1  module "/pliant/language/unsafe.pli" 
 2  module "/pliant/language/type/text/str32.pli" 
 3   
 4  constant undefined_character "?" 
 5   
 6   
 7  gvar (Array uInt8 256) encode1 
 8  gvar (Array uInt8 256) encode2 
 9   
 10  function init 
 11    for (var Int u) 0 255 
 12      encode1 := shunt (u>="a":0:number and u<="z":0:number or u>="A":0:number and u<="Z":0:number or u>="0":0:number and u<="9":0:number or u=" ":0:number or u="_":0:number or u=".":0:number) 0 1 
 13      encode2 := shunt u="[lf]":number encode1:u 
 14  init 
 15   
 16  function html_encode buffer length csize cr -> html 
 17    arg Address buffer ; arg Int length csize ; arg CBool cr ; arg Str html 
 18    constant extra ("&#"+(string 2^31-1)+";" len)-1 
 19    var Address encode := shunt cr addressof:encode2 addressof:encode1 
 20    var Int reserved := 2*length+extra 
 21    var Address buf := memory_allocate reserved addressof:html 
 22    var Address dest := buf 
 23    var Address src := buffer 
 24    var Int := 0 
 25    while i<length 
 26      var Int c 
 27      if csize=1 
 28        if default_charset_is_utf8 
 29          module "/pliant/util/encoding/utf8.pli" 
 30          := src map uInt8 
 31          var Int l 
 32          if c<0C0h 
 33            := 1 
 34          eif c<0E0h 
 35            := 2 
 36          eif c<0F0h 
 37            := 3 
 38          eif c<0F8h 
 39            := 4 
 40          else 
 41            := 1 
 42          if i+l>length 
 43            := 1 
 44          if l<>1 
 45            := .and. 07Fh\2^l 
 46            for (var Int j) l-1 
 47              := c*2^6+((src map uInt8 j) .and. 3Fh) 
 48          src := src translate uInt8 l ; += l 
 49        else 
 50          c := src map uInt8 ; src := src translate uInt8 1 ; i+= 1 
 51      else 
 52        := src map Int32 ; src := src translate Int32 1 ; i+= 1 
 53      var Int mode 
 54      if c<256 
 55        mode := (encode translate uInt8 c) map uInt8 
 56      else 
 57        mode := 1 
 58      if mode=0 
 59        dest map uInt8 := c ; dest := dest translate Char 1 
 60      else 
 61        var Int required := ((cast dest Int).-.(cast buf Int))+extra+(length-i) 
 62        if required>reserved 
 63          var Int offset := (cast dest Int).-.(cast buf Int) 
 64          reserved := 2*reserved+extra 
 65          buf := memory_resize buf reserved addressof:html 
 66          dest := buf translate Byte offset 
 67        if mode=1 
 68          dest map uInt8 := "&":number ; dest := dest translate Char 1 
 69          dest map uInt8 := "#":number ; dest := dest translate Char 1 
 70          if c<1000 
 71            if c>=100 
 72              dest map uInt8 := c\100+"0":number ; dest := dest translate Char 1 
 73            if c>=10 
 74              dest map uInt8 := c\10%10+"0":number ; dest := dest translate Char 1 
 75            dest map uInt8 := c%10+"0":number ; dest := dest translate Char 1 
 76          else 
 77            var Str := string c 
 78            memory_copy s:characters dest s:len ; dest := dest translate Byte s:len 
 79          dest map uInt8 := ";":number ; dest := dest translate Char 1 
 80        else 
 81          memory_copy "<br>":characters dest "<br>":len 
 82          dest := dest translate Char "<br>":len 
 83      check (cast dest Int).-.(cast buf Int)<=reserved 
 84    reserved := (cast dest Int).-.(cast buf Int) 
 85    buf := memory_resize buf reserved addressof:html 
 86    html set buf reserved true 
 87   
 88  function html_encode ascii cr -> html 
 89    arg Str ascii ; arg CBool cr ; arg Str html 
 90    html := html_encode ascii:characters ascii:len cr 
 91   
 92  function html_encode ascii -> html 
 93    arg Str ascii html 
 94    html := html_encode ascii:characters ascii:len false 
 95   
 96  function html_encode s -> html 
 97    arg Str32 s ; arg Str html 
 98    html := html_encode s:characters s:len false 
 99   
 100   
 101  gvar (Dictionary Str Int) html_characters 
 102   
 103  function character name uv 
 104    arg Str name ; arg Int uv 
 105    html_characters insert name uv 
 106   
 107  character "Aacgr" 902 
 108  character "aacgr" 940 
 109  character "Aacute" 193 
 110  character "aacute" 225 
 111  character "Abreve" 258 
 112  character "abreve" 259 
 113  character "Acirc" 194 
 114  character "acirc" 226 
 115  character "acute" 180 
 116  character "Acy" 1040 
 117  character "acy" 1072 
 118  character "AElig" 198 
 119  character "aelig" 230 
 120  character "Agr" 913 
 121  character "agr" 945 
 122  character "Agrave" 192 
 123  character "agrave" 224 
 124  character "alefsym" 8501 
 125  character "aleph" 8501 
 126  character "Alpha" 913 
 127  character "alpha" 945 
 128  character "Amacr" 256 
 129  character "amacr" 257 
 130  character "amalg" 8720 
 131  character "amp" 38 
 132  character "and" 8743 
 133  character "ang" 8736 
 134  character "ang90" 8735 
 135  character "angmsd" 8737 
 136  character "angsph" 8738 
 137  character "angst" 8491 
 138  character "Aogon" 260 
 139  character "aogon" 261 
 140  character "ap" 8776 
 141  character "ape" 8778 
 142  character "apos" 700 
 143  character "Aring" 197 
 144  character "aring" 229 
 145  character "ast" 42 
 146  character "asymp" 8776 
 147  character "Atilde" 195 
 148  character "atilde" 227 
 149  character "Auml" 196 
 150  character "auml" 228 
 151  character "b.alpha" 945 
 152  character "barwed" 8892 
 153  character "Barwed" 8966 
 154  character "b.beta" 946 
 155  character "b.chi" 967 
 156  character "bcong" 8780 
 157  character "Bcy" 1041 
 158  character "bcy" 1073 
 159  character "b.Delta" 916 
 160  character "b.delta" 948 
 161  character "bdquo" 8222 
 162  character "becaus" 8757 
 163  character "bepsi" 8717 
 164  character "b.epsi" 949 
 165  character "b.epsis" 949 
 166  character "b.epsiv" 949 
 167  character "bernou" 8492 
 168  character "Beta" 914 
 169  character "beta" 946 
 170  character "b.eta" 951 
 171  character "beth" 8502 
 172  character "b.Gamma" 915 
 173  character "b.gamma" 947 
 174  character "b.gammad" 988 
 175  character "Bgr" 914 
 176  character "bgr" 946 
 177  character "b.iota" 953 
 178  character "b.kappa" 954 
 179  character "b.kappav" 1008 
 180  character "b.Lambda" 923 
 181  character "b.lambda" 955 
 182  character "blank" 9251 
 183  character "blk12" 9618 
 184  character "blk14" 9617 
 185  character "blk34" 9619 
 186  character "block" 9608 
 187  character "b.mu" 956 
 188  character "b.nu" 957 
 189  character "b.Omega" 937 
 190  character "b.omega" 974 
 191  character "bottom" 8869 
 192  character "bowtie" 8904 
 193  character "boxdl" 9488 
 194  character "boxdL" 9557 
 195  character "boxDl" 9558 
 196  character "boxDL" 9559 
 197  character "boxdr" 9484 
 198  character "boxdR" 9554 
 199  character "boxDr" 9555 
 200  character "boxDR" 9556 
 201  character "boxh" 9472 
 202  character "boxH" 9552 
 203  character "boxhd" 9516 
 204  character "boxHd" 9572 
 205  character "boxhD" 9573 
 206  character "boxHD" 9574 
 207  character "boxhu" 9524 
 208  character "boxHu" 9575 
 209  character "boxhU" 9576 
 210  character "boxHU" 9577 
 211  character "boxul" 9496 
 212  character "boxuL" 9563 
 213  character "boxUl" 9564 
 214  character "boxUL" 9565 
 215  character "boxur" 9492 
 216  character "boxuR" 9560 
 217  character "boxUr" 9561 
 218  character "boxUR" 9562 
 219  character "boxv" 9474 
 220  character "boxV" 9553 
 221  character "boxvh" 9532 
 222  character "boxvH" 9578 
 223  character "boxVh" 9579 
 224  character "boxVH" 9580 
 225  character "boxvl" 9508 
 226  character "boxvL" 9569 
 227  character "boxVl" 9570 
 228  character "boxVL" 9571 
 229  character "boxvr" 9500 
 230  character "boxvR" 9566 
 231  character "boxVr" 9567 
 232  character "boxVR" 9568 
 233  character "b.Phi" 934 
 234  character "b.phis" 966 
 235  character "b.phiv" 981 
 236  character "b.Pi" 928 
 237  character "b.pi" 960 
 238  character "b.piv" 982 
 239  character "bprime" 8245 
 240  character "b.Psi" 936 
 241  character "b.psi" 968 
 242  character "breve" 728 
 243  character "b.rho" 961 
 244  character "b.rhov" 1009 
 245  character "brvbar" 166 
 246  character "b.Sigma" 931 
 247  character "b.sigma" 963 
 248  character "b.sigmav" 962 
 249  character "bsim" 8765 
 250  character "bsime" 8909 
 251  character "bsol" 92 
 252  character "b.tau" 964 
 253  character "b.Theta" 920 
 254  character "b.thetas" 952 
 255  character "b.thetav" 977 
 256  character "bull" 8226 
 257  character "bump" 8782 
 258  character "bumpe" 8783 
 259  character "b.Upsi" 933 
 260  character "b.upsi" 965 
 261  character "b.Xi" 926 
 262  character "b.xi" 958 
 263  character "b.zeta" 950 
 264  character "Cacute" 262 
 265  character "cacute" 263 
 266  character "Cap" 8914 
 267  character "cap" 8745 
 268  character "caret" 8257 
 269  character "caron" 711 
 270  character "Ccaron" 268 
 271  character "ccaron" 269 
 272  character "Ccedil" 199 
 273  character "ccedil" 231 
 274  character "Ccirc" 264 
 275  character "ccirc" 265 
 276  character "Cdot" 266 
 277  character "cdot" 267 
 278  character "cedil" 184 
 279  character "cent" 162 
 280  character "CHcy" 1063 
 281  character "chcy" 1095 
 282  character "check" 10003 
 283  character "Chi" 935 
 284  character "chi" 967 
 285  character "cir" 9675 
 286  character "circ" 710 
 287  character "cire" 8791 
 288  character "clubs" 9827 
 289  character "colon" 58 
 290  character "colone" 8788 
 291  character "comma" 44 
 292  character "commat" 64 
 293  character "comp" 8705 
 294  character "compfn" 8728 
 295  character "cong" 8773 
 296  character "conint" 8750 
 297  character "coprod" 8720 
 298  character "copy" 169 
 299  character "copysr" 8471 
 300  character "crarr" 8629 
 301  character "cross" 10007 
 302  character "cuepr" 8926 
 303  character "cuesc" 8927 
 304  character "cularr" 8630 
 305  character "Cup" 8915 
 306  character "cup" 8746 
 307  character "cupre" 8828 
 308  character "curarr" 8631 
 309  character "curren" 164 
 310  character "cuvee" 8910 
 311  character "cuwed" 8911 
 312  character "dagger" 8224 
 313  character "Dagger" 8225 
 314  character "daleth" 8504 
 315  character "dArr" 8659 
 316  character "darr" 8595 
 317  character "darr2" 8650 
 318  character "dash" 8208 
 319  character "dashv" 8867 
 320  character "dblac" 733 
 321  character "Dcaron" 270 
 322  character "dcaron" 271 
 323  character "Dcy" 1044 
 324  character "dcy" 1076 
 325  character "deg" 176 
 326  character "Delta" 916 
 327  character "delta" 948 
 328  character "Dgr" 916 
 329  character "dgr" 948 
 330  character "dharl" 8643 
 331  character "dharr" 8642 
 332  character "diam" 8900 
 333  character "diams" 9830 
 334  character "die" 168 
 335  character "divide" 247 
 336  character "divonx" 8903 
 337  character "DJcy" 1026 
 338  character "djcy" 1106 
 339  character "dlarr" 8601 
 340  character "dlcorn" 8990 
 341  character "dlcrop" 8973 
 342  character "dollar" 36 
 343  character "dot" 729 
 344  character "Dot" 168 
 345  character "DotDot" 8412 
 346  character "drarr" 8600 
 347  character "drcorn" 8991 
 348  character "drcrop" 8972 
 349  character "DScy" 1029 
 350  character "dscy" 1109 
 351  character "Dstrok" 272 
 352  character "dstrok" 273 
 353  character "dtri" 9663 
 354  character "dtrif" 9662 
 355  character "DZcy" 1039 
 356  character "dzcy" 1119 
 357  character "Eacgr" 904 
 358  character "eacgr" 941 
 359  character "Eacute" 201 
 360  character "eacute" 233 
 361  character "Ecaron" 282 
 362  character "ecaron" 283 
 363  character "ecir" 8790 
 364  character "Ecirc" 202 
 365  character "ecirc" 234 
 366  character "ecolon" 8789 
 367  character "Ecy" 1069 
 368  character "ecy" 1101 
 369  character "eDot" 8785 
 370  character "Edot" 278 
 371  character "edot" 279 
 372  character "EEacgr" 905 
 373  character "eeacgr" 942 
 374  character "EEgr" 919 
 375  character "eegr" 951 
 376  character "efDot" 8786 
 377  character "Egr" 917 
 378  character "egr" 949 
 379  character "Egrave" 200 
 380  character "egrave" 232 
 381  character "egs" 8925 
 382  character "ell" 8467 
 383  character "els" 8924 
 384  character "Emacr" 274 
 385  character "emacr" 275 
 386  character "empty" 8709 
 387  character "emsp" 8195 
 388  character "emsp13" 8196 
 389  character "emsp14" 8197 
 390  character "ENG" 330 
 391  character "eng" 331 
 392  character "ensp" 8194 
 393  character "Eogon" 280 
 394  character "eogon" 281 
 395  character "epsi" 949 
 396  character "Epsilon" 917 
 397  character "epsilon" 949 
 398  character "epsis" 8714 
 399  character "equals" 61 
 400  character "equiv" 8801 
 401  character "erDot" 8787 
 402  character "esdot" 8784 
 403  character "Eta" 919 
 404  character "eta" 951 
 405  character "ETH" 208 
 406  character "eth" 240 
 407  character "Euml" 203 
 408  character "euml" 235 
 409  character "excl" 33 
 410  character "exist" 8707 
 411  character "Fcy" 1060 
 412  character "fcy" 1092 
 413  character "female" 9792 
 414  character "ffilig" 64259 
 415  character "fflig" 64256 
 416  character "ffllig" 64260 
 417  character "filig" 64257 
 418  character "flat" 9837 
 419  character "fllig" 64258 
 420  character "fnof" 402 
 421  character "forall" 8704 
 422  character "fork" 8916 
 423  character "frac12" 189 
 424  character "frac13" 8531 
 425  character "frac14" 188 
 426  character "frac15" 8533 
 427  character "frac16" 8537 
 428  character "frac18" 8539 
 429  character "frac23" 8532 
 430  character "frac25" 8534 
 431  character "frac34" 190 
 432  character "frac35" 8535 
 433  character "frac38" 8540 
 434  character "frac45" 8536 
 435  character "frac56" 8538 
 436  character "frac58" 8541 
 437  character "frac78" 8542 
 438  character "frasl" 8260 
 439  character "frown" 8994 
 440  character "gacute" 501 
 441  character "Gamma" 915 
 442  character "gamma" 947 
 443  character "gammad" 988 
 444  character "Gbreve" 286 
 445  character "gbreve" 287 
 446  character "Gcedil" 290 
 447  character "gcedil" 291 
 448  character "Gcirc" 284 
 449  character "gcirc" 285 
 450  character "Gcy" 1043 
 451  character "gcy" 1075 
 452  character "Gdot" 288 
 453  character "gdot" 289 
 454  character "gE" 8807 
 455  character "ge" 8805 
 456  character "gel" 8923 
 457  character "ges" 8805 
 458  character "Gg" 8921 
 459  character "Ggr" 915 
 460  character "ggr" 947 
 461  character "gimel" 8503 
 462  character "GJcy" 1027 
 463  character "gjcy" 1107 
 464  character "gl" 8823 
 465  character "gne" 8809 
 466  character "gnE" 8809 
 467  character "gnsim" 8935 
 468  character "grave" 96 
 469  character "gsdot" 8919 
 470  character "gsim" 8819 
 471  character "Gt" 8811 
 472  character "gt" 62 
 473  character "gvnE" 8809 
 474  character "hairsp" 8202 
 475  character "half" 189 
 476  character "hamilt" 8459 
 477  character "HARDcy" 1066 
 478  character "hardcy" 1098 
 479  character "harr" 8596 
 480  character "hArr" 8660 
 481  character "harrw" 8621 
 482  character "Hcirc" 292 
 483  character "hcirc" 293 
 484  character "hearts" 9829 
 485  character "hellip" 8230 
 486  character "horbar" 8213 
 487  character "Hstrok" 294 
 488  character "hstrok" 295 
 489  character "hybull" 8259 
 490  character "hyphen" 45 
 491  character "Iacgr" 906 
 492  character "iacgr" 943 
 493  character "Iacute" 205 
 494  character "iacute" 237 
 495  character "Icirc" 206 
 496  character "icirc" 238 
 497  character "Icy" 1048 
 498  character "icy" 1080 
 499  character "idiagr" 912 
 500  character "Idigr" 938 
 501  character "idigr" 970 
 502  character "Idot" 304 
 503  character "IEcy" 1045 
 504  character "iecy" 1077 
 505  character "iexcl" 161 
 506  character "iff" 8660 
 507  character "Igr" 921 
 508  character "igr" 953 
 509  character "Igrave" 204 
 510  character "igrave" 236 
 511  character "IJlig" 306 
 512  character "ijlig" 307 
 513  character "Imacr" 298 
 514  character "imacr" 299 
 515  character "image" 8465 
 516  character "incare" 8453 
 517  character "infin" 8734 
 518  character "inodot" 305 
 519  character "inodot" 305 
 520  character "int" 8747 
 521  character "intcal" 8890 
 522  character "IOcy" 1025 
 523  character "iocy" 1105 
 524  character "Iogon" 302 
 525  character "iogon" 303 
 526  character "Iota" 921 
 527  character "iota" 953 
 528  character "iquest" 191 
 529  character "isin" 8712 
 530  character "Itilde" 296 
 531  character "itilde" 297 
 532  character "Iukcy" 1030 
 533  character "iukcy" 1110 
 534  character "Iuml" 207 
 535  character "iuml" 239 
 536  character "Jcirc" 308 
 537  character "jcirc" 309 
 538  character "Jcy" 1049 
 539  character "jcy" 1081 
 540  character "Jsercy" 1032 
 541  character "jsercy" 1112 
 542  character "Jukcy" 1028 
 543  character "jukcy" 1108 
 544  character "Kappa" 922 
 545  character "kappa" 954 
 546  character "kappav" 1008 
 547  character "Kcedil" 310 
 548  character "kcedil" 311 
 549  character "Kcy" 1050 
 550  character "kcy" 1082 
 551  character "Kgr" 922 
 552  character "kgr" 954 
 553  character "kgreen" 312 
 554  character "KHcy" 1061 
 555  character "khcy" 1093 
 556  character "KHgr" 935 
 557  character "khgr" 967 
 558  character "KJcy" 1036 
 559  character "kjcy" 1116 
 560  character "lAarr" 8666 
 561  character "Lacute" 313 
 562  character "lacute" 314 
 563  character "lagran" 8466 
 564  character "Lambda" 923 
 565  character "lambda" 955 
 566  character "lang" 9001 
 567  character "laquo" 171 
 568  character "Larr" 8606 
 569  character "larr" 8592 
 570  character "lArr" 8656 
 571  character "larr2" 8647 
 572  character "larrhk" 8617 
 573  character "larrlp" 8619 
 574  character "larrtl" 8610 
 575  character "Lcaron" 317 
 576  character "lcaron" 318 
 577  character "Lcedil" 315 
 578  character "lcedil" 316 
 579  character "lceil" 8968 
 580  character "lcub" 123 
 581  character "Lcy" 1051 
 582  character "lcy" 1083 
 583  character "ldot" 8918 
 584  character "ldquo" 8220 
 585  character "ldquor" 8222 
 586  character "lE" 8806 
 587  character "le" 8804 
 588  character "leg" 8922 
 589  character "les" 8804 
 590  character "lfloor" 8970 
 591  character "lg" 8822 
 592  character "Lgr" 923 
 593  character "lgr" 955 
 594  character "lhard" 8637 
 595  character "lharu" 8636 
 596  character "lhblk" 9604 
 597  character "LJcy" 1033 
 598  character "ljcy" 1113 
 599  character "Ll" 8920 
 600  character "Lmidot" 319 
 601  character "lmidot" 320 
 602  character "lnE" 8808 
 603  character "lne" 8808 
 604  character "lnsim" 8934 
 605  character "lowast" 8727 
 606  character "lowbar" 95 
 607  character "loz" 9674 
 608  character "loz" 10023 
 609  character "lozf" 10022 
 610  character "lpar" 40 
 611  character "lrarr2" 8646 
 612  character "lrhar2" 8651 
 613  character "lrm" 8206 
 614  character "lsaquo" 8249 
 615  character "lsh" 8624 
 616  character "lsim" 8818 
 617  character "lsqb" 91 
 618  character "lsquo" 8216 
 619  character "lsquor" 8218 
 620  character "Lstrok" 321 
 621  character "lstrok" 322 
 622  character "Lt" 8810 
 623  character "lt" 60 
 624  character "lthree" 8907 
 625  character "ltimes" 8905 
 626  character "ltri" 9667 
 627  character "ltrie" 8884 
 628  character "ltrif" 9666 
 629  character "lvnE" 8808 
 630  character "macr" 175 
 631  character "male" 9794 
 632  character "malt" 10016 
 633  character "map" 8614 
 634  character "marker" 9646 
 635  character "Mcy" 1052 
 636  character "mcy" 1084 
 637  character "mdash" 8212 
 638  character "Mgr" 924 
 639  character "mgr" 956 
 640  character "micro" 181 
 641  character "mid" 8739 
 642  character "middot" 183 
 643  character "minus" 8722 
 644  character "minusb" 8863 
 645  character "mldr" 8230 
 646  character "mnplus" 8723 
 647  character "models" 8871 
 648  character "Mu" 924 
 649  character "mu" 956 
 650  character "mumap" 8888 
 651  character "nabla" 8711 
 652  character "Nacute" 323 
 653  character "nacute" 324 
 654  character "nap" 8777 
 655  character "napos" 329 
 656  character "natur" 9838 
 657  character "nbsp" 160 
 658  character "Ncaron" 327 
 659  character "ncaron" 328 
 660  character "Ncedil" 325 
 661  character "ncedil" 326 
 662  character "ncong" 8775 
 663  character "Ncy" 1053 
 664  character "ncy" 1085 
 665  character "ndash" 8211 
 666  character "ne" 8800 
 667  character "nearr" 8599 
 668  character "nequiv" 8802 
 669  character "nexist" 8708 
 670  character "nge" 8817 
 671  character "nges" 8817 
 672  character "Ngr" 925 
 673  character "ngr" 957 
 674  character "ngt" 8815 
 675  character "nharr" 8622 
 676  character "nhArr" 8654 
 677  character "ni" 8715 
 678  character "NJcy" 1034 
 679  character "njcy" 1114 
 680  character "nlarr" 8602 
 681  character "nlArr" 8653 
 682  character "nldr" 8229 
 683  character "nle" 8816 
 684  character "nles" 8816 
 685  character "nlt" 8814 
 686  character "nltri" 8938 
 687  character "nltrie" 8940 
 688  character "nmid" 8740 
 689  character "not" 172 
 690  character "notin" 8713 
 691  character "npar" 8742 
 692  character "npr" 8832 
 693  character "npre" 8928 
 694  character "nrarr" 8603 
 695  character "nrArr" 8655 
 696  character "nrtri" 8939 
 697  character "nrtrie" 8941 
 698  character "nsc" 8833 
 699  character "nsce" 8929 
 700  character "nsim" 8769 
 701  character "nsime" 8772 
 702  character "nspar" 8742 
 703  character "nsub" 8836 
 704  character "nsubE" 8840 
 705  character "nsube" 8840 
 706  character "nsup" 8837 
 707  character "nsupE" 8841 
 708  character "nsupe" 8841 
 709  character "Ntilde" 209 
 710  character "ntilde" 241 
 711  character "Nu" 925 
 712  character "nu" 957 
 713  character "num" 35 
 714  character "numero" 8470 
 715  character "numsp" 8199 
 716  character "nvdash" 8876 
 717  character "nvDash" 8877 
 718  character "nVdash" 8878 
 719  character "nVDash" 8879 
 720  character "nwarr" 8598 
 721  character "Oacgr" 908 
 722  character "oacgr" 972 
 723  character "Oacute" 211 
 724  character "oacute" 243 
 725  character "oast" 8859 
 726  character "ocir" 8858 
 727  character "Ocirc" 212 
 728  character "ocirc" 244 
 729  character "Ocy" 1054 
 730  character "ocy" 1086 
 731  character "odash" 8861 
 732  character "Odblac" 336 
 733  character "odblac" 337 
 734  character "odot" 8857 
 735  character "OElig" 338 
 736  character "oelig" 339 
 737  character "ogon" 731 
 738  character "Ogr" 927 
 739  character "ogr" 959 
 740  character "Ograve" 210 
 741  character "ograve" 242 
 742  character "OHacgr" 911 
 743  character "ohacgr" 974 
 744  character "OHgr" 937 
 745  character "ohgr" 969 
 746  character "ohm" 8486 
 747  character "olarr" 8634 
 748  character "oline" 8254 
 749  character "Omacr" 332 
 750  character "omacr" 333 
 751  character "Omega" 937 
 752  character "omega" 969 
 753  character "Omicron" 927 
 754  character "omicron" 959 
 755  character "ominus" 8854 
 756  character "oplus" 8853 
 757  character "or" 8744 
 758  character "orarr" 8635 
 759  character "order" 8500 
 760  character "ordf" 170 
 761  character "ordm" 186 
 762  character "oS" 9416 
 763  character "Oslash" 216 
 764  character "oslash" 248 
 765  character "osol" 8856 
 766  character "Otilde" 213 
 767  character "otilde" 245 
 768  character "otimes" 8855 
 769  character "Ouml" 214 
 770  character "ouml" 246 
 771  character "par" 8741 
 772  character "para" 182 
 773  character "part" 8706 
 774  character "Pcy" 1055 
 775  character "pcy" 1087 
 776  character "percnt" 37 
 777  character "period" 46 
 778  character "permil" 8240 
 779  character "perp" 8869 
 780  character "Pgr" 928 
 781  character "pgr" 960 
 782  character "PHgr" 934 
 783  character "phgr" 966 
 784  character "phi" 966 
 785  character "Phi" 934 
 786  character "phis" 966 
 787  character "phiv" 981 
 788  character "phmmat" 8499 
 789  character "phone" 9742 
 790  character "Pi" 928 
 791  character "pi" 960 
 792  character "piv" 982 
 793  character "planck" 8463 
 794  character "plus" 43 
 795  character "plusb" 8862 
 796  character "plusdo" 8724 
 797  character "plusmn" 177 
 798  character "pound" 163 
 799  character "pr" 8826 
 800  character "pre" 8828 
 801  character "prime" 8242 
 802  character "Prime" 8243 
 803  character "prnsim" 8936 
 804  character "prod" 8719 
 805  character "prop" 8733 
 806  character "prsim" 8830 
 807  character "PSgr" 936 
 808  character "psgr" 968 
 809  character "Psi" 936 
 810  character "psi" 968 
 811  character "puncsp" 8200 
 812  character "quest" 63 
 813  character "quot" 34 
 814  character "rAarr" 8667 
 815  character "Racute" 340 
 816  character "racute" 341 
 817  character "radic" 8730 
 818  character "rang" 9002 
 819  character "raquo" 187 
 820  character "Rarr" 8608 
 821  character "rarr" 8594 
 822  character "rArr" 8658 
 823  character "rarr2" 8649 
 824  character "rarrhk" 8618 
 825  character "rarrlp" 8620 
 826  character "rarrtl" 8611 
 827  character "rarrw" 8605 
 828  character "Rcaron" 344 
 829  character "rcaron" 345 
 830  character "Rcedil" 342 
 831  character "rcedil" 343 
 832  character "rceil" 8969 
 833  character "rcub" 125 
 834  character "Rcy" 1056 
 835  character "rcy" 1088 
 836  character "rdquo" 8221 
 837  character "rdquor" 8220 
 838  character "real" 8476 
 839  character "rect" 9645 
 840  character "reg" 174 
 841  character "rfloor" 8971 
 842  character "Rgr" 929 
 843  character "rgr" 961 
 844  character "rhard" 8641 
 845  character "rharu" 8640 
 846  character "Rho" 929 
 847  character "rho" 961 
 848  character "rhov" 1009 
 849  character "ring" 730 
 850  character "rlarr2" 8644 
 851  character "rlhar2" 8652 
 852  character "rlm" 8207 
 853  character "rpar" 41 
 854  character "rsaquo" 8250 
 855  character "rsh" 8625 
 856  character "rsqb" 93 
 857  character "rsquo" 8217 
 858  character "rsquor" 8216 
 859  character "rthree" 8908 
 860  character "rtimes" 8906 
 861  character "rtri" 9657 
 862  character "rtrie" 8885 
 863  character "rtrif" 9656 
 864  character "rx" 8478 
 865  character "Sacute" 346 
 866  character "sacute" 347 
 867  character "samalg" 8720 
 868  character "sbquo" 8218 
 869  character "sbsol" 92 
 870  character "sc" 8827 
 871  character "Scaron" 352 
 872  character "scaron" 353 
 873  character "sccue" 8829 
 874  character "sce" 8829 
 875  character "Scedil" 350 
 876  character "scedil" 351 
 877  character "Scirc" 348 
 878  character "scirc" 349 
 879  character "scnsim" 8937 
 880  character "scsim" 8831 
 881  character "Scy" 1057 
 882  character "scy" 1089 
 883  character "sdot" 8901 
 884  character "sdotb" 8865 
 885  character "sect" 167 
 886  character "semi" 59 
 887  character "setmn" 8726 
 888  character "sext" 10038 
 889  character "sfgr" 962 
 890  character "sfrown" 8994 
 891  character "Sgr" 931 
 892  character "sgr" 963 
 893  character "sharp" 9839 
 894  character "SHCHcy" 1065 
 895  character "shchcy" 1097 
 896  character "SHcy" 1064 
 897  character "shcy" 1096 
 898  character "shy" 173 
 899  character "Sigma" 931 
 900  character "sigma" 963 
 901  character "sigmaf" 962 
 902  character "sigmav" 962 
 903  character "sim" 8764 
 904  character "sime" 8771 
 905  character "smile" 8995 
 906  character "SOFTcy" 1068 
 907  character "softcy" 1100 
 908  character "sol" 47 
 909  character "spades" 9824 
 910  character "spar" 8741 
 911  character "sqcap" 8851 
 912  character "sqcup" 8852 
 913  character "sqsub" 8847 
 914  character "sqsube" 8849 
 915  character "sqsup" 8848 
 916  character "sqsupe" 8850 
 917  character "squ" 9633 
 918  character "square" 9633 
 919  character "squf" 9642 
 920  character "ssetmn" 8726 
 921  character "ssmile" 8995 
 922  character "sstarf" 8902 
 923  character "star" 9734 
 924  character "starf" 9733 
 925  character "Sub" 8912 
 926  character "sub" 8834 
 927  character "subE" 8838 
 928  character "sube" 8838 
 929  character "subnE" 8842 
 930  character "subne" 8842 
 931  character "sum" 8721 
 932  character "sung" 9834 
 933  character "Sup" 8913 
 934  character "sup" 8835 
 935  character "sup1" 185 
 936  character "sup2" 178 
 937  character "sup3" 179 
 938  character "supE" 8839 
 939  character "supe" 8839 
 940  character "supnE" 8843 
 941  character "supne" 8843 
 942  character "szlig" 223 
 943  character "target" 8982 
 944  character "Tau" 932 
 945  character "tau" 964 
 946  character "Tcaron" 356 
 947  character "tcaron" 357 
 948  character "Tcedil" 354 
 949  character "tcedil" 355 
 950  character "Tcy" 1058 
 951  character "tcy" 1090 
 952  character "tdot" 8411 
 953  character "telrec" 8981 
 954  character "Tgr" 932 
 955  character "tgr" 964 
 956  character "there4" 8756 
 957  character "theta" 952 
 958  character "Theta" 920 
 959  character "thetas" 952 
 960  character "thetasym" 977 
 961  character "thetav" 977 
 962  character "THgr" 920 
 963  character "thgr" 952 
 964  character "thinsp" 8201 
 965  character "thkap" 8776 
 966  character "thksim" 8764 
 967  character "THORN" 222 
 968  character "thorn" 254 
 969  character "tilde" 732 
 970  character "times" 215 
 971  character "timesb" 8864 
 972  character "top" 8868 
 973  character "tprime" 8244 
 974  character "trade" 8482 
 975  character "trie" 8796 
 976  character "TScy" 1062 
 977  character "tscy" 1094 
 978  character "TSHcy" 1035 
 979  character "tshcy" 1115 
 980  character "Tstrok" 358 
 981  character "tstrok" 359 
 982  character "twixt" 8812 
 983  character "Uacgr" 910 
 984  character "uacgr" 973 
 985  character "Uacute" 218 
 986  character "uacute" 250 
 987  character "uArr" 8657 
 988  character "uarr" 8593 
 989  character "uarr2" 8648 
 990  character "Ubrcy" 1038 
 991  character "ubrcy" 1118 
 992  character "Ubreve" 364 
 993  character "ubreve" 365 
 994  character "Ucirc" 219 
 995  character "ucirc" 251 
 996  character "Ucy" 1059 
 997  character "ucy" 1091 
 998  character "Udblac" 368 
 999  character "udblac" 369 
 1000  character "udiagr" 944 
 1001  character "Udigr" 939 
 1002  character "udigr" 971 
 1003  character "Ugr" 933 
 1004  character "ugr" 965 
 1005  character "Ugrave" 217 
 1006  character "ugrave" 249 
 1007  character "uharl" 8639 
 1008  character "uharr" 8638 
 1009  character "uhblk" 9600 
 1010  character "ulcorn" 8988 
 1011  character "ulcrop" 8975 
 1012  character "Umacr" 362 
 1013  character "umacr" 363 
 1014  character "uml" 168 
 1015  character "Uogon" 370 
 1016  character "uogon" 371 
 1017  character "uplus" 8846 
 1018  character "Upsi" 933 
 1019  character "upsi" 965 
 1020  character "upsih" 978 
 1021  character "Upsilon" 933 
 1022  character "upsilon" 965 
 1023  character "urcorn" 8989 
 1024  character "urcrop" 8974 
 1025  character "Uring" 366 
 1026  character "uring" 367 
 1027  character "Utilde" 360 
 1028  character "utilde" 361 
 1029  character "utri" 9653 
 1030  character "utrif" 9652 
 1031  character "Uuml" 220 
 1032  character "uuml" 252 
 1033  character "varr" 8597 
 1034  character "vArr" 8661 
 1035  character "Vcy" 1042 
 1036  character "vcy" 1074 
 1037  character "vdash" 8866 
 1038  character "vDash" 8872 
 1039  character "Vdash" 8873 
 1040  character "veebar" 8891 
 1041  character "vellip" 8942 
 1042  character "verbar" 124 
 1043  character "Verbar" 8214 
 1044  character "vltri" 8882 
 1045  character "vprime" 8242 
 1046  character "vprop" 8733 
 1047  character "vrtri" 8883 
 1048  character "vsubnE" 8842 
 1049  character "vsubne" 8842 
 1050  character "vsupne" 8843 
 1051  character "vsupnE" 8843 
 1052  character "Vvdash" 8874 
 1053  character "Wcirc" 372 
 1054  character "wcirc" 373 
 1055  character "wedgeq" 8793 
 1056  character "weierp" 8472 
 1057  character "wreath" 8768 
 1058  character "xcirc" 9675 
 1059  character "xdtri" 9661 
 1060  character "Xgr" 926 
 1061  character "xgr" 958 
 1062  character "xhArr" 8596 
 1063  character "xharr" 8596 
 1064  character "Xi" 926 
 1065  character "xi" 958 
 1066  character "xlArr" 8656 
 1067  character "xrArr" 8658 
 1068  character "xutri" 9651 
 1069  character "Yacute" 221 
 1070  character "yacute" 253 
 1071  character "YAcy" 1071 
 1072  character "yacy" 1103 
 1073  character "Ycirc" 374 
 1074  character "ycirc" 375 
 1075  character "Ycy" 1067 
 1076  character "ycy" 1099 
 1077  character "yen" 165 
 1078  character "YIcy" 1031 
 1079  character "yicy" 1111 
 1080  character "YUcy" 1070 
 1081  character "yucy" 1102 
 1082  character "yuml" 255 
 1083  character "Yuml" 376 
 1084  character "Zacute" 377 
 1085  character "zacute" 378 
 1086  character "Zcaron" 381 
 1087  character "zcaron" 382 
 1088  character "Zcy" 1047 
 1089  character "zcy" 1079 
 1090  character "Zdot" 379 
 1091  character "zdot" 380 
 1092  character "Zeta" 918 
 1093  character "zeta" 950 
 1094  character "Zgr" 918 
 1095  character "zgr" 950 
 1096  character "ZHcy" 1046 
 1097  character "zhcy" 1078 
 1098  character "zwj" 8205 
 1099  character "zwnj" 8204 
 1100   
 1101  character "euro" 8364 
 1102   
 1103  if false 
 1104   
 1105    module "/pliant/language/stream.pli" 
 1106   
 1107    function unhexa s -> i 
 1108      arg Str s ; arg Int i 
 1109      i := 0 
 1110      for (var Int j) 0 s:len-1 
 1111        var Int c := s:j number 
 1112        if c>="0":0:number and c<="9":0:number 
 1113          i := i*16+(c-"0":0:number) 
 1114        eif c>="A":0:number and c<="F":0:number 
 1115          i := i*16+(c-"A":0:number+10) 
 1116        eif c>="a":0:number and c<="f":0:number 
 1117          i := i*16+(c-"a":0:number+10) 
 1118        else 
 1119          return undefined 
 1120     
 1121    function parse_characters_list 
 1122      (var Stream s) open "file:/backup/doc/unicode/SGML.TXT" in 
 1123      while not s:atend 
 1124        if (s:readline parse any:(var Str name) _ any _ any:(var Str h) _ any) 
 1125          if (h 0 2)="0x" and unhexa:(h 2 h:len)=defined 
 1126            console "character " string:name " " unhexa:(h 2 h:len) eol 
 1127   
 1128    parse_characters_list 
 1129   
 1130   
 1131  function html_decode_character adr size -> n 
 1132    arg Address adr ; arg Int size ; arg Int n 
 1133    (var Str code) set adr size false 
 1134    var Pointer:Int num :> html_characters first code 
 1135    if exists:num 
 1136      := num 
 1137    else 
 1138      := undefined_character number 
 1139   
 1140  function html_decode html -> ascii 
 1141    arg Str html ascii 
 1142    var Address buf := memory_allocate html:len addressof:ascii 
 1143    var Address dest := buf 
 1144    var Address src := html:characters 
 1145    var Address stop := html:characters translate Char html:len 
 1146    while true 
 1147      var Address tag1 := memory_search src (cast stop Int).-.(cast src Int) "&":characters 1 
 1148      if tag1=null 
 1149        tag1 := stop 
 1150      var Int step := (cast tag1 Int).-.(cast src Int) 
 1151      memory_copy src dest step ; dest := dest translate Byte step 
 1152      if tag1=stop 
 1153        ascii set buf (cast dest Int).-.(cast buf Int) true 
 1154        return 
 1155      var Address tag2 := memory_search tag1 (cast stop Int).-.(cast tag1 Int) ";":characters 1 
 1156      if tag2=null 
 1157        ascii := "" 
 1158        memory_free buf 
 1159        return 
 1160      if ((tag1 translate uInt8 1) map uInt8)="#":number 
 1161        part decode_number 
 1162          var Int := 0 
 1163          for (var Int i) 2 (cast tag2 Int).-.(cast tag1 Int)-1 
 1164            var Int := (tag1 translate uInt8 i) map uInt8 
 1165            if d>="0":number and d<="9":number 
 1166              := c*10+d-"0":number 
 1167              if c>=(shunt default_charset_is_utf8 2^21 256) 
 1168                := undefined_character number 
 1169                leave decode_number 
 1170            else 
 1171              := undefined_character number 
 1172              leave decode_number 
 1173      else 
 1174        := html_decode_character (tag1 translate uInt8 1) (cast tag2 Int).-.(cast tag1 Int)-1 
 1175      if default_charset_is_utf8 
 1176        var Int l 
 1177        if c<2^7 
 1178          dest map uInt8 := c ; dest := dest translate Byte 1 
 1179        eif c<2^11 
 1180          dest map uInt8 := 0C0h+c\2^6 ; dest := dest translate Byte 1 
 1181          dest map uInt8 := 080h+(.and. 3Fh) ; dest := dest translate Byte 1 
 1182        eif c<2^16 
 1183          dest map uInt8 := 0E0h+c\2^12 ; dest := dest translate Byte 1 
 1184          dest map uInt8 := 080h+(c\2^.and. 3Fh) ; dest := dest translate Byte 1 
 1185          dest map uInt8 := 080h+(.and. 3Fh) ; dest := dest translate Byte 1 
 1186        eif c<2^21 
 1187          dest map uInt8 := 0F0h+c\2^18 ; dest := dest translate Byte 1 
 1188          dest map uInt8 := 080h+(c\2^12 .and. 3Fh) ; dest := dest translate Byte 1 
 1189          dest map uInt8 := 080h+(c\2^.and. 3Fh) ; dest := dest translate Byte 1 
 1190          dest map uInt8 := 080h+(.and. 3Fh) ; dest := dest translate Byte 1 
 1191      else 
 1192        dest map uInt8 := c ; dest := dest translate uInt8 1 
 1193      src := tag2 translate Char 1 
 1194   
 1195  export html_encode html_decode html_characters 
 1196   
 1197   
 1198  if not default_charset_is_utf8 
 1199   
 1200    function html_decode32 html -> unicode 
 1201      arg Str html ; arg Str32 unicode 
 1202      var Address buf := memory_allocate html:len*Int32:size addressof:unicode 
 1203      var Address dest := buf 
 1204      var Address src := html:characters 
 1205      var Address stop := html:characters translate Char html:len 
 1206      while true 
 1207        var Address tag1 := memory_search src (cast stop Int).-.(cast src Int) "&":characters 1 
 1208        if tag1=null 
 1209          tag1 := stop 
 1210        var Int step := (cast tag1 Int).-.(cast src Int) 
 1211        while step>0 
 1212          dest map Int32 := src map uInt8 
 1213          src := src translate uInt8 1 ; dest := dest translate Int32 1 ; step -= 1 
 1214        if tag1=stop 
 1215          unicode set buf ((cast dest Int).-.(cast buf Int))\Int32:size true 
 1216          return 
 1217        var Address tag2 := memory_search tag1 (cast stop Int).-.(cast tag1 Int) ";":characters 1 
 1218        if tag2=null 
 1219          unicode := "" 
 1220          memory_free buf 
 1221          return 
 1222        if ((tag1 translate uInt8 1) map uInt8)="#":number 
 1223          part decode_number 
 1224            var Int c := 0 
 1225            for (var Int i) 2 (cast tag2 Int).-.(cast tag1 Int)-1 
 1226              var Int d := (tag1 translate uInt8 i) map uInt8 
 1227              if d>="0":number and d<="9":number 
 1228                var Int c := c*10+d-"0":number 
 1229                if c>=2^21 
 1230                  c := undefined_character number 
 1231                  leave decode_number 
 1232              else 
 1233                c := undefined_character number 
 1234                leave decode_number 
 1235        else 
 1236          c := html_decode_character (tag1 translate uInt8 1) (cast tag2 Int).-.(cast tag1 Int)-1 
 1237        dest map Int32 := c ; dest := dest translate Int32 1 
 1238        src := tag2 translate Char 1 
 1239   
 1240    export html_decode32