301 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2005, 2006 Daniel Ehrenberg
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: namespaces kernel assocs sequences ;
 | 
						|
IN: xml.entities
 | 
						|
 | 
						|
: entities-out
 | 
						|
    H{
 | 
						|
        { CHAR: < "<"   }
 | 
						|
        { CHAR: > ">"   }
 | 
						|
        { CHAR: & "&"  }
 | 
						|
    } ;
 | 
						|
 | 
						|
: quoted-entities-out
 | 
						|
    H{
 | 
						|
        { CHAR: & "&"  }
 | 
						|
        { CHAR: ' "'" }
 | 
						|
        { CHAR: " """ }
 | 
						|
    } ;
 | 
						|
 | 
						|
: escape-string-by ( str table -- escaped )
 | 
						|
    #! Convert <, >, &, ' and " to HTML entities.
 | 
						|
    [ [ dupd at [ % ] [ , ] ?if ] curry each ] "" make ;
 | 
						|
 | 
						|
: escape-string ( str -- newstr )
 | 
						|
    entities-out escape-string-by ;
 | 
						|
 | 
						|
: escape-quoted-string ( str -- newstr )
 | 
						|
    quoted-entities-out escape-string-by ;
 | 
						|
 | 
						|
: entities
 | 
						|
    H{
 | 
						|
        { "lt"    CHAR: <  }
 | 
						|
        { "gt"    CHAR: >  }
 | 
						|
        { "amp"   CHAR: &  }
 | 
						|
        { "apos"  CHAR: '  }
 | 
						|
        { "quot"  CHAR: "  }
 | 
						|
    } ;
 | 
						|
 | 
						|
: html-entities
 | 
						|
    #! generated from:
 | 
						|
    #! http://www.w3.org/TR/REC-html40/sgml/entities.html
 | 
						|
    H{
 | 
						|
        { "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 }
 | 
						|
        { "fnof"     402 }
 | 
						|
        { "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 }
 | 
						|
        { "bull"     8226 }
 | 
						|
        { "hellip"   8230 }
 | 
						|
        { "prime"    8242 }
 | 
						|
        { "Prime"    8243 }
 | 
						|
        { "oline"    8254 }
 | 
						|
        { "frasl"    8260 }
 | 
						|
        { "weierp"   8472 }
 | 
						|
        { "image"    8465 }
 | 
						|
        { "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 }
 | 
						|
        { "lceil"    8968 }
 | 
						|
        { "rceil"    8969 }
 | 
						|
        { "lfloor"   8970 }
 | 
						|
        { "rfloor"   8971 }
 | 
						|
        { "lang"     9001 }
 | 
						|
        { "rang"     9002 }
 | 
						|
        { "loz"      9674 }
 | 
						|
        { "spades"   9824 }
 | 
						|
        { "clubs"    9827 }
 | 
						|
        { "hearts"   9829 }
 | 
						|
        { "diams"    9830 }
 | 
						|
        { "OElig"   338 }
 | 
						|
        { "oelig"   339 }
 | 
						|
        { "Scaron"  352 }
 | 
						|
        { "scaron"  353 }
 | 
						|
        { "Yuml"    376 }
 | 
						|
        { "circ"    710 }
 | 
						|
        { "tilde"   732 }
 | 
						|
        { "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 }
 | 
						|
        { "permil"  8240 }
 | 
						|
        { "lsaquo"  8249 }
 | 
						|
        { "rsaquo"  8250 }
 | 
						|
        { "euro"   8364 }
 | 
						|
    } ;
 | 
						|
 | 
						|
SYMBOL: extra-entities
 | 
						|
f extra-entities set-global
 | 
						|
 | 
						|
: with-entities ( entities quot -- )
 | 
						|
    [ swap extra-entities set call ] with-scope ; inline
 | 
						|
 | 
						|
: with-html-entities ( quot -- )
 | 
						|
    html-entities swap with-entities ; inline
 |