First release
authorJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Wed, 18 Mar 2009 11:37:35 +0000 (11:37 +0000)
committerJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Wed, 18 Mar 2009 11:37:35 +0000 (11:37 +0000)
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/install [new file with mode: 0644]
debian/rules [new file with mode: 0755]
entities.txt [new file with mode: 0644]
htmlentities.py [new file with mode: 0755]

diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..205e466
--- /dev/null
@@ -0,0 +1,5 @@
+python-htmlentities (0.1) UNRELEASED; urgency=low
+
+  * Initial release.
+
+ -- Jean-Michel Vourgère <jmv_deb@nirgal.com>  Wed, 18 Mar 2009 12:34:44 +0100
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..9c7532a
--- /dev/null
@@ -0,0 +1,15 @@
+Source: python-htmlentities
+Section: python
+Priority: optional
+Maintainer: Jean-Michel Vourgère <jmv_deb@nirgal.com>
+Build-Depends: debhelper (>> 3.0.0)
+Build-Depends-Indep: python-support (>= 0.5.3)
+Standards-Version: 3.8.0
+
+Package: python-htmlentities
+Section: python
+Architecture: all
+Depends: python
+Description: Python library for XML character entities
+ Provide functions for resolving characters entities such as &amp; &#160;
+ It emulates Internet Explorer resolution and supports buggy input.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..22691c8
--- /dev/null
@@ -0,0 +1,15 @@
+Intellectual property is a human pleague causing much misery throughout the world.
+You are free to copy / modify / redistribute / resell theses files.
+
+© 2009 Jean-Michel Vourgère <jmv_deb@nirgal.com>
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/install b/debian/install
new file mode 100644 (file)
index 0000000..c689cfd
--- /dev/null
@@ -0,0 +1 @@
+htmlentities.py /usr/share/python-support/python-htmlentities/
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..6962cc6
--- /dev/null
@@ -0,0 +1,80 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+#CFLAGS = -g
+#ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+#      CFLAGS += -O0
+#else
+#      CFLAGS += -O2
+#endif
+
+build: build-stamp
+build-stamp:
+       dh_testdir
+
+       # Add here commands to compile the package.
+       #-$(MAKE)
+       #docbook-to-man debian/gentoo.sgml > gentoo.1
+
+       touch build-stamp
+
+clean:
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp
+
+       # Add here commands to clean up after the build process.
+       #$(MAKE) clean
+
+       dh_clean
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k
+       dh_installdirs
+       
+       # Add here commands to install the package into debian/curcy.
+       #$(MAKE) install DESTDIR=$(CURDIR)/debian/curcy
+
+# Build architecture-independent files here.
+binary-indep: build install
+       dh_testdir
+       dh_testroot
+       dh_install -X.svn
+#      dh_installdebconf
+       dh_installdocs entities.txt
+       dh_installexamples
+       dh_installmenu
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_installinit
+#      dh_installcron
+#      dh_installman man/*
+       dh_installinfo
+       dh_installchangelogs
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+       dh_pysupport
+#      dh_makeshlibs
+       dh_installdeb
+#      dh_perl
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
diff --git a/entities.txt b/entities.txt
new file mode 100644 (file)
index 0000000..5059c43
--- /dev/null
@@ -0,0 +1,526 @@
+Taken from DTD from w3c.org (HTML 4.01)\r
+\r
+\r
+<!-- Portions © International Organization for Standardization 1986\r
+     Permission to copy in any form is granted for use with\r
+     conforming SGML systems and applications as defined in\r
+     ISO 8879, provided this notice is included in all copies.\r
+-->\r
+<!-- Character entity set. Typical invocation:\r
+     <!ENTITY % HTMLlat1 PUBLIC\r
+       "-//W3C//ENTITIES Latin 1//EN//HTML">\r
+     %HTMLlat1;\r
+-->\r
+\r
+<!ENTITY nbsp   CDATA "&#160;" -- no-break space = non-breaking space,\r
+                                  U+00A0 ISOnum -->\r
+<!ENTITY iexcl  CDATA "&#161;" -- inverted exclamation mark, U+00A1 ISOnum -->\r
+<!ENTITY cent   CDATA "&#162;" -- cent sign, U+00A2 ISOnum -->\r
+<!ENTITY pound  CDATA "&#163;" -- pound sign, U+00A3 ISOnum -->\r
+<!ENTITY curren CDATA "&#164;" -- currency sign, U+00A4 ISOnum -->\r
+<!ENTITY yen    CDATA "&#165;" -- yen sign = yuan sign, U+00A5 ISOnum -->\r
+<!ENTITY brvbar CDATA "&#166;" -- broken bar = broken vertical bar,\r
+                                  U+00A6 ISOnum -->\r
+<!ENTITY sect   CDATA "&#167;" -- section sign, U+00A7 ISOnum -->\r
+<!ENTITY uml    CDATA "&#168;" -- diaeresis = spacing diaeresis,\r
+                                  U+00A8 ISOdia -->\r
+<!ENTITY copy   CDATA "&#169;" -- copyright sign, U+00A9 ISOnum -->\r
+<!ENTITY ordf   CDATA "&#170;" -- feminine ordinal indicator, U+00AA ISOnum -->\r
+<!ENTITY laquo  CDATA "&#171;" -- left-pointing double angle quotation mark\r
+                                  = left pointing guillemet, U+00AB ISOnum -->\r
+<!ENTITY not    CDATA "&#172;" -- not sign, U+00AC ISOnum -->\r
+<!ENTITY shy    CDATA "&#173;" -- soft hyphen = discretionary hyphen,\r
+                                  U+00AD ISOnum -->\r
+<!ENTITY reg    CDATA "&#174;" -- registered sign = registered trade mark sign,\r
+                                  U+00AE ISOnum -->\r
+<!ENTITY macr   CDATA "&#175;" -- macron = spacing macron = overline\r
+                                  = APL overbar, U+00AF ISOdia -->\r
+<!ENTITY deg    CDATA "&#176;" -- degree sign, U+00B0 ISOnum -->\r
+<!ENTITY plusmn CDATA "&#177;" -- plus-minus sign = plus-or-minus sign,\r
+                                  U+00B1 ISOnum -->\r
+<!ENTITY sup2   CDATA "&#178;" -- superscript two = superscript digit two\r
+                                  = squared, U+00B2 ISOnum -->\r
+<!ENTITY sup3   CDATA "&#179;" -- superscript three = superscript digit three\r
+                                  = cubed, U+00B3 ISOnum -->\r
+<!ENTITY acute  CDATA "&#180;" -- acute accent = spacing acute,\r
+                                  U+00B4 ISOdia -->\r
+<!ENTITY micro  CDATA "&#181;" -- micro sign, U+00B5 ISOnum -->\r
+<!ENTITY para   CDATA "&#182;" -- pilcrow sign = paragraph sign,\r
+                                  U+00B6 ISOnum -->\r
+<!ENTITY middot CDATA "&#183;" -- middle dot = Georgian comma\r
+                                  = Greek middle dot, U+00B7 ISOnum -->\r
+<!ENTITY cedil  CDATA "&#184;" -- cedilla = spacing cedilla, U+00B8 ISOdia -->\r
+<!ENTITY sup1   CDATA "&#185;" -- superscript one = superscript digit one,\r
+                                  U+00B9 ISOnum -->\r
+<!ENTITY ordm   CDATA "&#186;" -- masculine ordinal indicator,\r
+                                  U+00BA ISOnum -->\r
+<!ENTITY raquo  CDATA "&#187;" -- right-pointing double angle quotation mark\r
+                                  = right pointing guillemet, U+00BB ISOnum -->\r
+<!ENTITY frac14 CDATA "&#188;" -- vulgar fraction one quarter\r
+                                  = fraction one quarter, U+00BC ISOnum -->\r
+<!ENTITY frac12 CDATA "&#189;" -- vulgar fraction one half\r
+                                  = fraction one half, U+00BD ISOnum -->\r
+<!ENTITY frac34 CDATA "&#190;" -- vulgar fraction three quarters\r
+                                  = fraction three quarters, U+00BE ISOnum -->\r
+<!ENTITY iquest CDATA "&#191;" -- inverted question mark\r
+                                  = turned question mark, U+00BF ISOnum -->\r
+<!ENTITY Agrave CDATA "&#192;" -- latin capital letter A with grave\r
+                                  = latin capital letter A grave,\r
+                                  U+00C0 ISOlat1 -->\r
+<!ENTITY Aacute CDATA "&#193;" -- latin capital letter A with acute,\r
+                                  U+00C1 ISOlat1 -->\r
+<!ENTITY Acirc  CDATA "&#194;" -- latin capital letter A with circumflex,\r
+                                  U+00C2 ISOlat1 -->\r
+<!ENTITY Atilde CDATA "&#195;" -- latin capital letter A with tilde,\r
+                                  U+00C3 ISOlat1 -->\r
+<!ENTITY Auml   CDATA "&#196;" -- latin capital letter A with diaeresis,\r
+                                  U+00C4 ISOlat1 -->\r
+<!ENTITY Aring  CDATA "&#197;" -- latin capital letter A with ring above\r
+                                  = latin capital letter A ring,\r
+                                  U+00C5 ISOlat1 -->\r
+<!ENTITY AElig  CDATA "&#198;" -- latin capital letter AE\r
+                                  = latin capital ligature AE,\r
+                                  U+00C6 ISOlat1 -->\r
+<!ENTITY Ccedil CDATA "&#199;" -- latin capital letter C with cedilla,\r
+                                  U+00C7 ISOlat1 -->\r
+<!ENTITY Egrave CDATA "&#200;" -- latin capital letter E with grave,\r
+                                  U+00C8 ISOlat1 -->\r
+<!ENTITY Eacute CDATA "&#201;" -- latin capital letter E with acute,\r
+                                  U+00C9 ISOlat1 -->\r
+<!ENTITY Ecirc  CDATA "&#202;" -- latin capital letter E with circumflex,\r
+                                  U+00CA ISOlat1 -->\r
+<!ENTITY Euml   CDATA "&#203;" -- latin capital letter E with diaeresis,\r
+                                  U+00CB ISOlat1 -->\r
+<!ENTITY Igrave CDATA "&#204;" -- latin capital letter I with grave,\r
+                                  U+00CC ISOlat1 -->\r
+<!ENTITY Iacute CDATA "&#205;" -- latin capital letter I with acute,\r
+                                  U+00CD ISOlat1 -->\r
+<!ENTITY Icirc  CDATA "&#206;" -- latin capital letter I with circumflex,\r
+                                  U+00CE ISOlat1 -->\r
+<!ENTITY Iuml   CDATA "&#207;" -- latin capital letter I with diaeresis,\r
+                                  U+00CF ISOlat1 -->\r
+<!ENTITY ETH    CDATA "&#208;" -- latin capital letter ETH, U+00D0 ISOlat1 -->\r
+<!ENTITY Ntilde CDATA "&#209;" -- latin capital letter N with tilde,\r
+                                  U+00D1 ISOlat1 -->\r
+<!ENTITY Ograve CDATA "&#210;" -- latin capital letter O with grave,\r
+                                  U+00D2 ISOlat1 -->\r
+<!ENTITY Oacute CDATA "&#211;" -- latin capital letter O with acute,\r
+                                  U+00D3 ISOlat1 -->\r
+<!ENTITY Ocirc  CDATA "&#212;" -- latin capital letter O with circumflex,\r
+                                  U+00D4 ISOlat1 -->\r
+<!ENTITY Otilde CDATA "&#213;" -- latin capital letter O with tilde,\r
+                                  U+00D5 ISOlat1 -->\r
+<!ENTITY Ouml   CDATA "&#214;" -- latin capital letter O with diaeresis,\r
+                                  U+00D6 ISOlat1 -->\r
+<!ENTITY times  CDATA "&#215;" -- multiplication sign, U+00D7 ISOnum -->\r
+<!ENTITY Oslash CDATA "&#216;" -- latin capital letter O with stroke\r
+                                  = latin capital letter O slash,\r
+                                  U+00D8 ISOlat1 -->\r
+<!ENTITY Ugrave CDATA "&#217;" -- latin capital letter U with grave,\r
+                                  U+00D9 ISOlat1 -->\r
+<!ENTITY Uacute CDATA "&#218;" -- latin capital letter U with acute,\r
+                                  U+00DA ISOlat1 -->\r
+<!ENTITY Ucirc  CDATA "&#219;" -- latin capital letter U with circumflex,\r
+                                  U+00DB ISOlat1 -->\r
+<!ENTITY Uuml   CDATA "&#220;" -- latin capital letter U with diaeresis,\r
+                                  U+00DC ISOlat1 -->\r
+<!ENTITY Yacute CDATA "&#221;" -- latin capital letter Y with acute,\r
+                                  U+00DD ISOlat1 -->\r
+<!ENTITY THORN  CDATA "&#222;" -- latin capital letter THORN,\r
+                                  U+00DE ISOlat1 -->\r
+<!ENTITY szlig  CDATA "&#223;" -- latin small letter sharp s = ess-zed,\r
+                                  U+00DF ISOlat1 -->\r
+<!ENTITY agrave CDATA "&#224;" -- latin small letter a with grave\r
+                                  = latin small letter a grave,\r
+                                  U+00E0 ISOlat1 -->\r
+<!ENTITY aacute CDATA "&#225;" -- latin small letter a with acute,\r
+                                  U+00E1 ISOlat1 -->\r
+<!ENTITY acirc  CDATA "&#226;" -- latin small letter a with circumflex,\r
+                                  U+00E2 ISOlat1 -->\r
+<!ENTITY atilde CDATA "&#227;" -- latin small letter a with tilde,\r
+                                  U+00E3 ISOlat1 -->\r
+<!ENTITY auml   CDATA "&#228;" -- latin small letter a with diaeresis,\r
+                                  U+00E4 ISOlat1 -->\r
+<!ENTITY aring  CDATA "&#229;" -- latin small letter a with ring above\r
+                                  = latin small letter a ring,\r
+                                  U+00E5 ISOlat1 -->\r
+<!ENTITY aelig  CDATA "&#230;" -- latin small letter ae\r
+                                  = latin small ligature ae, U+00E6 ISOlat1 -->\r
+<!ENTITY ccedil CDATA "&#231;" -- latin small letter c with cedilla,\r
+                                  U+00E7 ISOlat1 -->\r
+<!ENTITY egrave CDATA "&#232;" -- latin small letter e with grave,\r
+                                  U+00E8 ISOlat1 -->\r
+<!ENTITY eacute CDATA "&#233;" -- latin small letter e with acute,\r
+                                  U+00E9 ISOlat1 -->\r
+<!ENTITY ecirc  CDATA "&#234;" -- latin small letter e with circumflex,\r
+                                  U+00EA ISOlat1 -->\r
+<!ENTITY euml   CDATA "&#235;" -- latin small letter e with diaeresis,\r
+                                  U+00EB ISOlat1 -->\r
+<!ENTITY igrave CDATA "&#236;" -- latin small letter i with grave,\r
+                                  U+00EC ISOlat1 -->\r
+<!ENTITY iacute CDATA "&#237;" -- latin small letter i with acute,\r
+                                  U+00ED ISOlat1 -->\r
+<!ENTITY icirc  CDATA "&#238;" -- latin small letter i with circumflex,\r
+                                  U+00EE ISOlat1 -->\r
+<!ENTITY iuml   CDATA "&#239;" -- latin small letter i with diaeresis,\r
+                                  U+00EF ISOlat1 -->\r
+<!ENTITY eth    CDATA "&#240;" -- latin small letter eth, U+00F0 ISOlat1 -->\r
+<!ENTITY ntilde CDATA "&#241;" -- latin small letter n with tilde,\r
+                                  U+00F1 ISOlat1 -->\r
+<!ENTITY ograve CDATA "&#242;" -- latin small letter o with grave,\r
+                                  U+00F2 ISOlat1 -->\r
+<!ENTITY oacute CDATA "&#243;" -- latin small letter o with acute,\r
+                                  U+00F3 ISOlat1 -->\r
+<!ENTITY ocirc  CDATA "&#244;" -- latin small letter o with circumflex,\r
+                                  U+00F4 ISOlat1 -->\r
+<!ENTITY otilde CDATA "&#245;" -- latin small letter o with tilde,\r
+                                  U+00F5 ISOlat1 -->\r
+<!ENTITY ouml   CDATA "&#246;" -- latin small letter o with diaeresis,\r
+                                  U+00F6 ISOlat1 -->\r
+<!ENTITY divide CDATA "&#247;" -- division sign, U+00F7 ISOnum -->\r
+<!ENTITY oslash CDATA "&#248;" -- latin small letter o with stroke,\r
+                                  = latin small letter o slash,\r
+                                  U+00F8 ISOlat1 -->\r
+<!ENTITY ugrave CDATA "&#249;" -- latin small letter u with grave,\r
+                                  U+00F9 ISOlat1 -->\r
+<!ENTITY uacute CDATA "&#250;" -- latin small letter u with acute,\r
+                                  U+00FA ISOlat1 -->\r
+<!ENTITY ucirc  CDATA "&#251;" -- latin small letter u with circumflex,\r
+                                  U+00FB ISOlat1 -->\r
+<!ENTITY uuml   CDATA "&#252;" -- latin small letter u with diaeresis,\r
+                                  U+00FC ISOlat1 -->\r
+<!ENTITY yacute CDATA "&#253;" -- latin small letter y with acute,\r
+                                  U+00FD ISOlat1 -->\r
+<!ENTITY thorn  CDATA "&#254;" -- latin small letter thorn,\r
+                                  U+00FE ISOlat1 -->\r
+<!ENTITY yuml   CDATA "&#255;" -- latin small letter y with diaeresis,\r
+                                  U+00FF ISOlat1 -->\r
+\r
+\r
+\r
+\r
+<!-- Mathematical, Greek and Symbolic characters for HTML -->\r
+\r
+<!-- Character entity set. Typical invocation:\r
+     <!ENTITY % HTMLsymbol PUBLIC\r
+       "-//W3C//ENTITIES Symbols//EN//HTML">\r
+     %HTMLsymbol; -->\r
+\r
+<!-- Portions © International Organization for Standardization 1986:\r
+     Permission to copy in any form is granted for use with\r
+     conforming SGML systems and applications as defined in\r
+     ISO 8879, provided this notice is included in all copies.\r
+-->\r
+\r
+<!-- Relevant ISO entity set is given unless names are newly introduced.\r
+     New names (i.e., not in ISO 8879 list) do not clash with any\r
+     existing ISO 8879 entity names. ISO 10646 character numbers\r
+     are given for each character, in hex. CDATA values are decimal\r
+     conversions of the ISO 10646 values and refer to the document\r
+     character set. Names are ISO 10646 names. \r
+\r
+-->\r
+\r
+<!-- Latin Extended-B -->\r
+<!ENTITY fnof     CDATA "&#402;" -- latin small f with hook = function\r
+                                    = florin, U+0192 ISOtech -->\r
+\r
+<!-- Greek -->\r
+<!ENTITY Alpha    CDATA "&#913;" -- greek capital letter alpha, U+0391 -->\r
+<!ENTITY Beta     CDATA "&#914;" -- greek capital letter beta, U+0392 -->\r
+<!ENTITY Gamma    CDATA "&#915;" -- greek capital letter gamma,\r
+                                    U+0393 ISOgrk3 -->\r
+<!ENTITY Delta    CDATA "&#916;" -- greek capital letter delta,\r
+                                    U+0394 ISOgrk3 -->\r
+<!ENTITY Epsilon  CDATA "&#917;" -- greek capital letter epsilon, U+0395 -->\r
+<!ENTITY Zeta     CDATA "&#918;" -- greek capital letter zeta, U+0396 -->\r
+<!ENTITY Eta      CDATA "&#919;" -- greek capital letter eta, U+0397 -->\r
+<!ENTITY Theta    CDATA "&#920;" -- greek capital letter theta,\r
+                                    U+0398 ISOgrk3 -->\r
+<!ENTITY Iota     CDATA "&#921;" -- greek capital letter iota, U+0399 -->\r
+<!ENTITY Kappa    CDATA "&#922;" -- greek capital letter kappa, U+039A -->\r
+<!ENTITY Lambda   CDATA "&#923;" -- greek capital letter lambda,\r
+                                    U+039B ISOgrk3 -->\r
+<!ENTITY Mu       CDATA "&#924;" -- greek capital letter mu, U+039C -->\r
+<!ENTITY Nu       CDATA "&#925;" -- greek capital letter nu, U+039D -->\r
+<!ENTITY Xi       CDATA "&#926;" -- greek capital letter xi, U+039E ISOgrk3 -->\r
+<!ENTITY Omicron  CDATA "&#927;" -- greek capital letter omicron, U+039F -->\r
+<!ENTITY Pi       CDATA "&#928;" -- greek capital letter pi, U+03A0 ISOgrk3 -->\r
+<!ENTITY Rho      CDATA "&#929;" -- greek capital letter rho, U+03A1 -->\r
+<!-- there is no Sigmaf, and no U+03A2 character either -->\r
+<!ENTITY Sigma    CDATA "&#931;" -- greek capital letter sigma,\r
+                                    U+03A3 ISOgrk3 -->\r
+<!ENTITY Tau      CDATA "&#932;" -- greek capital letter tau, U+03A4 -->\r
+<!ENTITY Upsilon  CDATA "&#933;" -- greek capital letter upsilon,\r
+                                    U+03A5 ISOgrk3 -->\r
+<!ENTITY Phi      CDATA "&#934;" -- greek capital letter phi,\r
+                                    U+03A6 ISOgrk3 -->\r
+<!ENTITY Chi      CDATA "&#935;" -- greek capital letter chi, U+03A7 -->\r
+<!ENTITY Psi      CDATA "&#936;" -- greek capital letter psi,\r
+                                    U+03A8 ISOgrk3 -->\r
+<!ENTITY Omega    CDATA "&#937;" -- greek capital letter omega,\r
+                                    U+03A9 ISOgrk3 -->\r
+\r
+<!ENTITY alpha    CDATA "&#945;" -- greek small letter alpha,\r
+                                    U+03B1 ISOgrk3 -->\r
+<!ENTITY beta     CDATA "&#946;" -- greek small letter beta, U+03B2 ISOgrk3 -->\r
+<!ENTITY gamma    CDATA "&#947;" -- greek small letter gamma,\r
+                                    U+03B3 ISOgrk3 -->\r
+<!ENTITY delta    CDATA "&#948;" -- greek small letter delta,\r
+                                    U+03B4 ISOgrk3 -->\r
+<!ENTITY epsilon  CDATA "&#949;" -- greek small letter epsilon,\r
+                                    U+03B5 ISOgrk3 -->\r
+<!ENTITY zeta     CDATA "&#950;" -- greek small letter zeta, U+03B6 ISOgrk3 -->\r
+<!ENTITY eta      CDATA "&#951;" -- greek small letter eta, U+03B7 ISOgrk3 -->\r
+<!ENTITY theta    CDATA "&#952;" -- greek small letter theta,\r
+                                    U+03B8 ISOgrk3 -->\r
+<!ENTITY iota     CDATA "&#953;" -- greek small letter iota, U+03B9 ISOgrk3 -->\r
+<!ENTITY kappa    CDATA "&#954;" -- greek small letter kappa,\r
+                                    U+03BA ISOgrk3 -->\r
+<!ENTITY lambda   CDATA "&#955;" -- greek small letter lambda,\r
+                                    U+03BB ISOgrk3 -->\r
+<!ENTITY mu       CDATA "&#956;" -- greek small letter mu, U+03BC ISOgrk3 -->\r
+<!ENTITY nu       CDATA "&#957;" -- greek small letter nu, U+03BD ISOgrk3 -->\r
+<!ENTITY xi       CDATA "&#958;" -- greek small letter xi, U+03BE ISOgrk3 -->\r
+<!ENTITY omicron  CDATA "&#959;" -- greek small letter omicron, U+03BF NEW -->\r
+<!ENTITY pi       CDATA "&#960;" -- greek small letter pi, U+03C0 ISOgrk3 -->\r
+<!ENTITY rho      CDATA "&#961;" -- greek small letter rho, U+03C1 ISOgrk3 -->\r
+<!ENTITY sigmaf   CDATA "&#962;" -- greek small letter final sigma,\r
+                                    U+03C2 ISOgrk3 -->\r
+<!ENTITY sigma    CDATA "&#963;" -- greek small letter sigma,\r
+                                    U+03C3 ISOgrk3 -->\r
+<!ENTITY tau      CDATA "&#964;" -- greek small letter tau, U+03C4 ISOgrk3 -->\r
+<!ENTITY upsilon  CDATA "&#965;" -- greek small letter upsilon,\r
+                                    U+03C5 ISOgrk3 -->\r
+<!ENTITY phi      CDATA "&#966;" -- greek small letter phi, U+03C6 ISOgrk3 -->\r
+<!ENTITY chi      CDATA "&#967;" -- greek small letter chi, U+03C7 ISOgrk3 -->\r
+<!ENTITY psi      CDATA "&#968;" -- greek small letter psi, U+03C8 ISOgrk3 -->\r
+<!ENTITY omega    CDATA "&#969;" -- greek small letter omega,\r
+                                    U+03C9 ISOgrk3 -->\r
+<!ENTITY thetasym CDATA "&#977;" -- greek small letter theta symbol,\r
+                                    U+03D1 NEW -->\r
+<!ENTITY upsih    CDATA "&#978;" -- greek upsilon with hook symbol,\r
+                                    U+03D2 NEW -->\r
+<!ENTITY piv      CDATA "&#982;" -- greek pi symbol, U+03D6 ISOgrk3 -->\r
+\r
+<!-- General Punctuation -->\r
+<!ENTITY bull     CDATA "&#8226;" -- bullet = black small circle,\r
+                                     U+2022 ISOpub  -->\r
+<!-- bullet is NOT the same as bullet operator, U+2219 -->\r
+<!ENTITY hellip   CDATA "&#8230;" -- horizontal ellipsis = three dot leader,\r
+                                     U+2026 ISOpub  -->\r
+<!ENTITY prime    CDATA "&#8242;" -- prime = minutes = feet, U+2032 ISOtech -->\r
+<!ENTITY Prime    CDATA "&#8243;" -- double prime = seconds = inches,\r
+                                     U+2033 ISOtech -->\r
+<!ENTITY oline    CDATA "&#8254;" -- overline = spacing overscore,\r
+                                     U+203E NEW -->\r
+<!ENTITY frasl    CDATA "&#8260;" -- fraction slash, U+2044 NEW -->\r
+\r
+<!-- Letterlike Symbols -->\r
+<!ENTITY weierp   CDATA "&#8472;" -- script capital P = power set\r
+                                     = Weierstrass p, U+2118 ISOamso -->\r
+<!ENTITY image    CDATA "&#8465;" -- blackletter capital I = imaginary part,\r
+                                     U+2111 ISOamso -->\r
+<!ENTITY real     CDATA "&#8476;" -- blackletter capital R = real part symbol,\r
+                                     U+211C ISOamso -->\r
+<!ENTITY trade    CDATA "&#8482;" -- trade mark sign, U+2122 ISOnum -->\r
+<!ENTITY alefsym  CDATA "&#8501;" -- alef symbol = first transfinite cardinal,\r
+                                     U+2135 NEW -->\r
+<!-- alef symbol is NOT the same as hebrew letter alef,\r
+     U+05D0 although the same glyph could be used to depict both characters -->\r
+\r
+<!-- Arrows -->\r
+<!ENTITY larr     CDATA "&#8592;" -- leftwards arrow, U+2190 ISOnum -->\r
+<!ENTITY uarr     CDATA "&#8593;" -- upwards arrow, U+2191 ISOnum-->\r
+<!ENTITY rarr     CDATA "&#8594;" -- rightwards arrow, U+2192 ISOnum -->\r
+<!ENTITY darr     CDATA "&#8595;" -- downwards arrow, U+2193 ISOnum -->\r
+<!ENTITY harr     CDATA "&#8596;" -- left right arrow, U+2194 ISOamsa -->\r
+<!ENTITY crarr    CDATA "&#8629;" -- downwards arrow with corner leftwards\r
+                                     = carriage return, U+21B5 NEW -->\r
+<!ENTITY lArr     CDATA "&#8656;" -- leftwards double arrow, U+21D0 ISOtech -->\r
+<!-- ISO 10646 does not say that lArr is the same as the 'is implied by' arrow\r
+    but also does not have any other character for that function. So ? lArr can\r
+    be used for 'is implied by' as ISOtech suggests -->\r
+<!ENTITY uArr     CDATA "&#8657;" -- upwards double arrow, U+21D1 ISOamsa -->\r
+<!ENTITY rArr     CDATA "&#8658;" -- rightwards double arrow,\r
+                                     U+21D2 ISOtech -->\r
+<!-- ISO 10646 does not say this is the 'implies' character but does not have \r
+     another character with this function so ?\r
+     rArr can be used for 'implies' as ISOtech suggests -->\r
+<!ENTITY dArr     CDATA "&#8659;" -- downwards double arrow, U+21D3 ISOamsa -->\r
+<!ENTITY hArr     CDATA "&#8660;" -- left right double arrow,\r
+                                     U+21D4 ISOamsa -->\r
+\r
+<!-- Mathematical Operators -->\r
+<!ENTITY forall   CDATA "&#8704;" -- for all, U+2200 ISOtech -->\r
+<!ENTITY part     CDATA "&#8706;" -- partial differential, U+2202 ISOtech  -->\r
+<!ENTITY exist    CDATA "&#8707;" -- there exists, U+2203 ISOtech -->\r
+<!ENTITY empty    CDATA "&#8709;" -- empty set = null set = diameter,\r
+                                     U+2205 ISOamso -->\r
+<!ENTITY nabla    CDATA "&#8711;" -- nabla = backward difference,\r
+                                     U+2207 ISOtech -->\r
+<!ENTITY isin     CDATA "&#8712;" -- element of, U+2208 ISOtech -->\r
+<!ENTITY notin    CDATA "&#8713;" -- not an element of, U+2209 ISOtech -->\r
+<!ENTITY ni       CDATA "&#8715;" -- contains as member, U+220B ISOtech -->\r
+<!-- should there be a more memorable name than 'ni'? -->\r
+<!ENTITY prod     CDATA "&#8719;" -- n-ary product = product sign,\r
+                                     U+220F ISOamsb -->\r
+<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though\r
+     the same glyph might be used for both -->\r
+<!ENTITY sum      CDATA "&#8721;" -- n-ary sumation, U+2211 ISOamsb -->\r
+<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'\r
+     though the same glyph might be used for both -->\r
+<!ENTITY minus    CDATA "&#8722;" -- minus sign, U+2212 ISOtech -->\r
+<!ENTITY lowast   CDATA "&#8727;" -- asterisk operator, U+2217 ISOtech -->\r
+<!ENTITY radic    CDATA "&#8730;" -- square root = radical sign,\r
+                                     U+221A ISOtech -->\r
+<!ENTITY prop     CDATA "&#8733;" -- proportional to, U+221D ISOtech -->\r
+<!ENTITY infin    CDATA "&#8734;" -- infinity, U+221E ISOtech -->\r
+<!ENTITY ang      CDATA "&#8736;" -- angle, U+2220 ISOamso -->\r
+<!ENTITY and      CDATA "&#8743;" -- logical and = wedge, U+2227 ISOtech -->\r
+<!ENTITY or       CDATA "&#8744;" -- logical or = vee, U+2228 ISOtech -->\r
+<!ENTITY cap      CDATA "&#8745;" -- intersection = cap, U+2229 ISOtech -->\r
+<!ENTITY cup      CDATA "&#8746;" -- union = cup, U+222A ISOtech -->\r
+<!ENTITY int      CDATA "&#8747;" -- integral, U+222B ISOtech -->\r
+<!ENTITY there4   CDATA "&#8756;" -- therefore, U+2234 ISOtech -->\r
+<!ENTITY sim      CDATA "&#8764;" -- tilde operator = varies with = similar to,\r
+                                     U+223C ISOtech -->\r
+<!-- tilde operator is NOT the same character as the tilde, U+007E,\r
+     although the same glyph might be used to represent both  -->\r
+<!ENTITY cong     CDATA "&#8773;" -- approximately equal to, U+2245 ISOtech -->\r
+<!ENTITY asymp    CDATA "&#8776;" -- almost equal to = asymptotic to,\r
+                                     U+2248 ISOamsr -->\r
+<!ENTITY ne       CDATA "&#8800;" -- not equal to, U+2260 ISOtech -->\r
+<!ENTITY equiv    CDATA "&#8801;" -- identical to, U+2261 ISOtech -->\r
+<!ENTITY le       CDATA "&#8804;" -- less-than or equal to, U+2264 ISOtech -->\r
+<!ENTITY ge       CDATA "&#8805;" -- greater-than or equal to,\r
+                                     U+2265 ISOtech -->\r
+<!ENTITY sub      CDATA "&#8834;" -- subset of, U+2282 ISOtech -->\r
+<!ENTITY sup      CDATA "&#8835;" -- superset of, U+2283 ISOtech -->\r
+<!-- note that nsup, 'not a superset of, U+2283' is not covered by the Symbol \r
+     font encoding and is not included. Should it be, for symmetry?\r
+     It is in ISOamsn  --> \r
+<!ENTITY nsub     CDATA "&#8836;" -- not a subset of, U+2284 ISOamsn -->\r
+<!ENTITY sube     CDATA "&#8838;" -- subset of or equal to, U+2286 ISOtech -->\r
+<!ENTITY supe     CDATA "&#8839;" -- superset of or equal to,\r
+                                     U+2287 ISOtech -->\r
+<!ENTITY oplus    CDATA "&#8853;" -- circled plus = direct sum,\r
+                                     U+2295 ISOamsb -->\r
+<!ENTITY otimes   CDATA "&#8855;" -- circled times = vector product,\r
+                                     U+2297 ISOamsb -->\r
+<!ENTITY perp     CDATA "&#8869;" -- up tack = orthogonal to = perpendicular,\r
+                                     U+22A5 ISOtech -->\r
+<!ENTITY sdot     CDATA "&#8901;" -- dot operator, U+22C5 ISOamsb -->\r
+<!-- dot operator is NOT the same character as U+00B7 middle dot -->\r
+\r
+<!-- Miscellaneous Technical -->\r
+<!ENTITY lceil    CDATA "&#8968;" -- left ceiling = apl upstile,\r
+                                     U+2308 ISOamsc  -->\r
+<!ENTITY rceil    CDATA "&#8969;" -- right ceiling, U+2309 ISOamsc  -->\r
+<!ENTITY lfloor   CDATA "&#8970;" -- left floor = apl downstile,\r
+                                     U+230A ISOamsc  -->\r
+<!ENTITY rfloor   CDATA "&#8971;" -- right floor, U+230B ISOamsc  -->\r
+<!ENTITY lang     CDATA "&#9001;" -- left-pointing angle bracket = bra,\r
+                                     U+2329 ISOtech -->\r
+<!-- lang is NOT the same character as U+003C 'less than' \r
+     or U+2039 'single left-pointing angle quotation mark' -->\r
+<!ENTITY rang     CDATA "&#9002;" -- right-pointing angle bracket = ket,\r
+                                     U+232A ISOtech -->\r
+<!-- rang is NOT the same character as U+003E 'greater than' \r
+     or U+203A 'single right-pointing angle quotation mark' -->\r
+\r
+<!-- Geometric Shapes -->\r
+<!ENTITY loz      CDATA "&#9674;" -- lozenge, U+25CA ISOpub -->\r
+\r
+<!-- Miscellaneous Symbols -->\r
+<!ENTITY spades   CDATA "&#9824;" -- black spade suit, U+2660 ISOpub -->\r
+<!-- black here seems to mean filled as opposed to hollow -->\r
+<!ENTITY clubs    CDATA "&#9827;" -- black club suit = shamrock,\r
+                                     U+2663 ISOpub -->\r
+<!ENTITY hearts   CDATA "&#9829;" -- black heart suit = valentine,\r
+                                     U+2665 ISOpub -->\r
+<!ENTITY diams    CDATA "&#9830;" -- black diamond suit, U+2666 ISOpub -->\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+<!-- Special characters for HTML -->\r
+\r
+<!-- Character entity set. Typical invocation:\r
+     <!ENTITY % HTMLspecial PUBLIC\r
+       "-//W3C//ENTITIES Special//EN//HTML">\r
+     %HTMLspecial; -->\r
+\r
+<!-- Portions © International Organization for Standardization 1986:\r
+     Permission to copy in any form is granted for use with\r
+     conforming SGML systems and applications as defined in\r
+     ISO 8879, provided this notice is included in all copies.\r
+-->\r
+\r
+<!-- Relevant ISO entity set is given unless names are newly introduced.\r
+     New names (i.e., not in ISO 8879 list) do not clash with any\r
+     existing ISO 8879 entity names. ISO 10646 character numbers\r
+     are given for each character, in hex. CDATA values are decimal\r
+     conversions of the ISO 10646 values and refer to the document\r
+     character set. Names are ISO 10646 names. \r
+\r
+-->\r
+\r
+<!-- C0 Controls and Basic Latin -->\r
+<!ENTITY quot    CDATA "&#34;"   -- quotation mark = APL quote,\r
+                                    U+0022 ISOnum -->\r
+<!ENTITY amp     CDATA "&#38;"   -- ampersand, U+0026 ISOnum -->\r
+<!ENTITY lt      CDATA "&#60;"   -- less-than sign, U+003C ISOnum -->\r
+<!ENTITY gt      CDATA "&#62;"   -- greater-than sign, U+003E ISOnum -->\r
+\r
+<!-- Latin Extended-A -->\r
+<!ENTITY OElig   CDATA "&#338;"  -- latin capital ligature OE,\r
+                                    U+0152 ISOlat2 -->\r
+<!ENTITY oelig   CDATA "&#339;"  -- latin small ligature oe, U+0153 ISOlat2 -->\r
+<!-- ligature is a misnomer, this is a separate character in some languages -->\r
+<!ENTITY Scaron  CDATA "&#352;"  -- latin capital letter S with caron,\r
+                                    U+0160 ISOlat2 -->\r
+<!ENTITY scaron  CDATA "&#353;"  -- latin small letter s with caron,\r
+                                    U+0161 ISOlat2 -->\r
+<!ENTITY Yuml    CDATA "&#376;"  -- latin capital letter Y with diaeresis,\r
+                                    U+0178 ISOlat2 -->\r
+\r
+<!-- Spacing Modifier Letters -->\r
+<!ENTITY circ    CDATA "&#710;"  -- modifier letter circumflex accent,\r
+                                    U+02C6 ISOpub -->\r
+<!ENTITY tilde   CDATA "&#732;"  -- small tilde, U+02DC ISOdia -->\r
+\r
+<!-- General Punctuation -->\r
+<!ENTITY ensp    CDATA "&#8194;" -- en space, U+2002 ISOpub -->\r
+<!ENTITY emsp    CDATA "&#8195;" -- em space, U+2003 ISOpub -->\r
+<!ENTITY thinsp  CDATA "&#8201;" -- thin space, U+2009 ISOpub -->\r
+<!ENTITY zwnj    CDATA "&#8204;" -- zero width non-joiner,\r
+                                    U+200C NEW RFC 2070 -->\r
+<!ENTITY zwj     CDATA "&#8205;" -- zero width joiner, U+200D NEW RFC 2070 -->\r
+<!ENTITY lrm     CDATA "&#8206;" -- left-to-right mark, U+200E NEW RFC 2070 -->\r
+<!ENTITY rlm     CDATA "&#8207;" -- right-to-left mark, U+200F NEW RFC 2070 -->\r
+<!ENTITY ndash   CDATA "&#8211;" -- en dash, U+2013 ISOpub -->\r
+<!ENTITY mdash   CDATA "&#8212;" -- em dash, U+2014 ISOpub -->\r
+<!ENTITY lsquo   CDATA "&#8216;" -- left single quotation mark,\r
+                                    U+2018 ISOnum -->\r
+<!ENTITY rsquo   CDATA "&#8217;" -- right single quotation mark,\r
+                                    U+2019 ISOnum -->\r
+<!ENTITY sbquo   CDATA "&#8218;" -- single low-9 quotation mark, U+201A NEW -->\r
+<!ENTITY ldquo   CDATA "&#8220;" -- left double quotation mark,\r
+                                    U+201C ISOnum -->\r
+<!ENTITY rdquo   CDATA "&#8221;" -- right double quotation mark,\r
+                                    U+201D ISOnum -->\r
+<!ENTITY bdquo   CDATA "&#8222;" -- double low-9 quotation mark, U+201E NEW -->\r
+<!ENTITY dagger  CDATA "&#8224;" -- dagger, U+2020 ISOpub -->\r
+<!ENTITY Dagger  CDATA "&#8225;" -- double dagger, U+2021 ISOpub -->\r
+<!ENTITY permil  CDATA "&#8240;" -- per mille sign, U+2030 ISOtech -->\r
+<!ENTITY lsaquo  CDATA "&#8249;" -- single left-pointing angle quotation mark,\r
+                                    U+2039 ISO proposed -->\r
+<!-- lsaquo is proposed but not yet ISO standardized -->\r
+<!ENTITY rsaquo  CDATA "&#8250;" -- single right-pointing angle quotation mark,\r
+                                    U+203A ISO proposed -->\r
+<!-- rsaquo is proposed but not yet ISO standardized -->\r
+<!ENTITY euro   CDATA "&#8364;"  -- euro sign, U+20AC NEW -->
\ No newline at end of file
diff --git a/htmlentities.py b/htmlentities.py
new file mode 100755 (executable)
index 0000000..abc1bc8
--- /dev/null
@@ -0,0 +1,453 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+
+__all__ = ['resolve', 'expand', 'cleanCDATA']
+
+entities = {
+       u'nbsp': 160,
+       u'iexcl': 161,
+       u'cent': 162,
+       u'pound': 163,
+       u'curren': 164,
+       u'yen': 165,
+       u'brvbar': 166,
+       u'sect': 167,
+       u'uml': 168,
+       u'copy': 169,
+       u'ordf': 170,
+       u'laquo': 171,
+       u'not': 172,
+       u'shy': 173,
+       u'reg': 174,
+       u'macr': 175,
+       u'deg': 176,
+       u'plusmn': 177,
+       u'sup2': 178,
+       u'sup3': 179,
+       u'acute': 180,
+       u'micro': 181,
+       u'para': 182,
+       u'middot': 183,
+       u'cedil': 184,
+       u'sup1': 185,
+       u'ordm': 186,
+       u'raquo': 187,
+       u'frac14': 188,
+       u'frac12': 189,
+       u'frac34': 190,
+       u'iquest': 191,
+       u'Agrave': 192,
+       u'Aacute': 193,
+       u'Acirc': 194,
+       u'Atilde': 195,
+       u'Auml': 196,
+       u'Aring': 197,
+       u'AElig': 198,
+       u'Ccedil': 199,
+       u'Egrave': 200,
+       u'Eacute': 201,
+       u'Ecirc': 202,
+       u'Euml': 203,
+       u'Igrave': 204,
+       u'Iacute': 205,
+       u'Icirc': 206,
+       u'Iuml': 207,
+       u'ETH': 208,
+       u'Ntilde': 209,
+       u'Ograve': 210,
+       u'Oacute': 211,
+       u'Ocirc': 212,
+       u'Otilde': 213,
+       u'Ouml': 214,
+       u'times': 215,
+       u'Oslash': 216,
+       u'Ugrave': 217,
+       u'Uacute': 218,
+       u'Ucirc': 219,
+       u'Uuml': 220,
+       u'Yacute': 221,
+       u'THORN': 222,
+       u'szlig': 223,
+       u'agrave': 224,
+       u'aacute': 225,
+       u'acirc': 226,
+       u'atilde': 227,
+       u'auml': 228,
+       u'aring': 229,
+       u'aelig': 230,
+       u'ccedil': 231,
+       u'egrave': 232,
+       u'eacute': 233,
+       u'ecirc': 234,
+       u'euml': 235,
+       u'igrave': 236,
+       u'iacute': 237,
+       u'icirc': 238,
+       u'iuml': 239,
+       u'eth': 240,
+       u'ntilde': 241,
+       u'ograve': 242,
+       u'oacute': 243,
+       u'ocirc': 244,
+       u'otilde': 245,
+       u'ouml': 246,
+       u'divide': 247,
+       u'oslash': 248,
+       u'ugrave': 249,
+       u'uacute': 250,
+       u'ucirc': 251,
+       u'uuml': 252,
+       u'yacute': 253,
+       u'thorn': 254,
+       u'yuml': 255,
+       u'fnof': 402,
+       u'Alpha': 913,
+       u'Beta': 914,
+       u'Gamma': 915,
+       u'Delta': 916,
+       u'Epsilon': 917,
+       u'Zeta': 918,
+       u'Eta': 919,
+       u'Theta': 920,
+       u'Iota': 921,
+       u'Kappa': 922,
+       u'Lambda': 923,
+       u'Mu': 924,
+       u'Nu': 925,
+       u'Xi': 926,
+       u'Omicron': 927,
+       u'Pi': 928,
+       u'Rho': 929,
+       u'Sigma': 931,
+       u'Tau': 932,
+       u'Upsilon': 933,
+       u'Phi': 934,
+       u'Chi': 935,
+       u'Psi': 936,
+       u'Omega': 937,
+       u'alpha': 945,
+       u'beta': 946,
+       u'gamma': 947,
+       u'delta': 948,
+       u'epsilon': 949,
+       u'zeta': 950,
+       u'eta': 951,
+       u'theta': 952,
+       u'iota': 953,
+       u'kappa': 954,
+       u'lambda': 955,
+       u'mu': 956,
+       u'nu': 957,
+       u'xi': 958,
+       u'omicron': 959,
+       u'pi': 960,
+       u'rho': 961,
+       u'sigmaf': 962,
+       u'sigma': 963,
+       u'tau': 964,
+       u'upsilon': 965,
+       u'phi': 966,
+       u'chi': 967,
+       u'psi': 968,
+       u'omega': 969,
+       u'thetasym': 977,
+       u'upsih': 978,
+       u'piv': 982,
+       u'bull': 8226,
+       u'hellip': 8230,
+       u'prime': 8242,
+       u'Prime': 8243,
+       u'oline': 8254,
+       u'frasl': 8260,
+       u'weierp': 8472,
+       u'image': 8465,
+       u'real': 8476,
+       u'trade': 8482,
+       u'alefsym': 8501,
+       u'larr': 8592,
+       u'uarr': 8593,
+       u'rarr': 8594,
+       u'darr': 8595,
+       u'harr': 8596,
+       u'crarr': 8629,
+       u'lArr': 8656,
+       u'uArr': 8657,
+       u'rArr': 8658,
+       u'dArr': 8659,
+       u'hArr': 8660,
+       u'forall': 8704,
+       u'part': 8706,
+       u'exist': 8707,
+       u'empty': 8709,
+       u'nabla': 8711,
+       u'isin': 8712,
+       u'notin': 8713,
+       u'ni': 8715,
+       u'prod': 8719,
+       u'sum': 8721,
+       u'minus': 8722,
+       u'lowast': 8727,
+       u'radic': 8730,
+       u'prop': 8733,
+       u'infin': 8734,
+       u'ang': 8736,
+       u'and': 8743,
+       u'or': 8744,
+       u'cap': 8745,
+       u'cup': 8746,
+       u'int': 8747,
+       u'there4': 8756,
+       u'sim': 8764,
+       u'cong': 8773,
+       u'asymp': 8776,
+       u'ne': 8800,
+       u'equiv': 8801,
+       u'le': 8804,
+       u'ge': 8805,
+       u'sub': 8834,
+       u'sup': 8835,
+       u'nsub': 8836,
+       u'sube': 8838,
+       u'supe': 8839,
+       u'oplus': 8853,
+       u'otimes': 8855,
+       u'perp': 8869,
+       u'sdot': 8901,
+       u'lceil': 8968,
+       u'rceil': 8969,
+       u'lfloor': 8970,
+       u'rfloor': 8971,
+       u'lang': 9001,
+       u'rang': 9002,
+       u'loz': 9674,
+       u'spades': 9824,
+       u'clubs': 9827,
+       u'hearts': 9829,
+       u'diams': 9830,
+       u'quot': 34,
+       u'amp': 38,
+       u'lt': 60,
+       u'gt': 62,
+       u'OElig': 338,
+       u'oelig': 339,
+       u'Scaron': 352,
+       u'scaron': 353,
+       u'Yuml': 376,
+       u'circ': 710,
+       u'tilde': 732,
+       u'ensp': 8194,
+       u'emsp': 8195,
+       u'thinsp': 8201,
+       u'zwnj': 8204,
+       u'zwj': 8205,
+       u'lrm': 8206,
+       u'rlm': 8207,
+       u'ndash': 8211,
+       u'mdash': 8212,
+       u'lsquo': 8216,
+       u'rsquo': 8217,
+       u'sbquo': 8218,
+       u'ldquo': 8220,
+       u'rdquo': 8221,
+       u'bdquo': 8222,
+       u'dagger': 8224,
+       u'Dagger': 8225,
+       u'permil': 8240,
+       u'lsaquo': 8249,
+       u'rsaquo': 8250,
+       u'euro': 8364,
+}
+
+entities_autocomplete = {}
+longestEntityLen = 0
+
+for key,value in entities.iteritems():
+    if value<=255:
+        entities_autocomplete[key] = value
+    l = len(key)
+    if l>longestEntityLen:
+        longestEntityLen = l
+
+# Characters in range 127-159 are illegals, but they are sometimes wrongly used in web pages
+# Internet Explorer assumes it is taken from Microsoft extension to Latin 1 page 8859-1 aka CP1512
+# However, to be clean, we must remap them to their real unicode values
+# Unknown codes are translated into a space
+iso88591_remap = [
+       32,             # 127: ???
+       8364,   # 128: Euro symbol
+       32,             # 129: ???
+       8218,   # 130: Single Low-9 Quotation Mark
+       402,    # 131: Latin Small Letter F With Hook
+       8222,   # 132: Double Low-9 Quotation Mark
+       8230,   # 133: Horizontal Ellipsis
+       8224,   # 134: Dagger
+       8225,   # 135: Double Dagger
+       710,    # 136: Modifier Letter Circumflex Accent
+       8240,   # 137: Per Mille Sign
+       352,    # 138: Latin Capital Letter S With Caron
+       8249,   # 139: Single Left-Pointing Angle Quotation Mark
+       338,    # 140: Latin Capital Ligature OE
+       32,             # 141: ???
+       381,    # 142: Latin Capital Letter Z With Caron
+       32,             # 143: ???
+       32,             # 144: ???
+       8216,   # 145: Left Single Quotation Mark
+       8217,   # 146: Right Single Quotation Mark
+       8220,   # 147: Left Double Quotation Mark
+       8221,   # 148: Right Double Quotation Mark
+       8226,   # 149: Bullet
+       8211,   # 150: En Dash
+       8212,   # 151: Em Dash
+       732,    # 152: Small Tilde
+       8482,   # 153: Trade Mark Sign
+       353,    # 154: Latin Small Letter S With Caron
+       8250,   # 155: Single Right-Pointing Angle Quotation Mark
+       339,    # 156: Latin Small Ligature OE
+       32,             # 157: ???
+       382,    # 158: Latin Small Letter Z With Caron
+       376             # 159: Latin Capital Letter Y With Diaeresis
+]
+
+
+def checkForUnicodeReservedChar(value):
+    if value >= 0xfffe:
+        return ord('?')
+    if value < 127 or value > 159:
+        return value
+    return iso88591_remap[value-127]
+
+def expand(text):
+    result = u''
+    for c in text:
+        oc = ord(c)
+        oc = checkForUnicodeReservedChar(oc)
+        if oc<32 or c==u'&' or c==u'<' or c==u'>' or c==u'"' or oc>127:
+            result += u'&#'+unicode(oc)+u';'
+        else:
+            result += c
+    return result
+
+def resolve(text):
+    pos = 0
+    result = u''
+    l = len(text)
+    while True:
+        prevpos = pos
+        pos = text.find(u'&', prevpos)
+        if pos == -1:
+            ## print "No more &"
+            break
+
+        if pos >= l-2:
+            ## print "Too shoort"
+            break
+               # here we are sure the next two chars exist
+        
+        result += text[prevpos:pos]
+        c = text[pos+1]
+        if c == u'#':
+            ## print "numeric entity"
+                       # This looks like an char whose unicode if given raw
+            c = text[pos+2]
+            if c == u'x' or c == u'X' and pos < l-3:
+                tmppos = text.find(u';', pos+3)
+                if tmppos != -1:
+                    s = text[pos+3: tmppos]
+                    try:
+                        value = int(s, 16)
+                        value = checkForUnicodeReservedChar(value) # remap unicode char if in range 127-159
+                        result += unichr(value)
+                        pos = tmppos + 1
+                        continue # ok, we did it
+                    except ValueError:
+                                           # there pos is not updated so that the original escape-like sequence is kept unchanged
+                        pass
+            else:
+                               # the given unicode value is decimal
+                               # IE behavior: parse until non digital char, no conversion if this is not
+                sb = u''
+                tmppos = pos+2
+                while True:
+                    if tmppos >= l:
+                        break # out of range
+                    c = text[tmppos]
+                    if c == u';':
+                        tmppos += 1
+                        break
+                    if c<u'0' or c>u'9':
+                        break
+                    sb += c
+                    tmppos += 1
+                try:
+                    value = int(sb)
+                    value = checkForUnicodeReservedChar(value); # remap unicode char if in range 127-159
+                    result += unichr(value)
+                    pos = tmppos
+                    continue # ok, we did it
+                except ValueError:
+                    # there pos is not updated so that the original escape-like sequence is kept unchanged
+                    pass
+        else:
+            # here the first character is not a '#'
+            # let's try the known html entities
+
+            sb = u''
+            tmppos = pos + 1
+            while True:
+                if tmppos >= l or tmppos-pos > longestEntityLen + 1: # 1 more for ';'
+                    c2 = entities_autocomplete.get(sb, 0)
+                    break
+                c = text[tmppos]
+                if c == u';':
+                    tmppos += 1
+                    c2 = entities.get(sb, 0)
+                    break
+                c2 = entities_autocomplete.get(sb, 0)
+                if c2:
+                    break
+                sb += c
+                tmppos += 1
+            if c2:
+                result += unichr(c2)
+                pos = tmppos
+                continue # ok, we did it
+                        
+        result += u'&' # something went wrong, just skip is '&'
+        pos += 1
+
+    result += text[prevpos:] 
+    return result
+
+def cleanCDATA(text):
+    """
+    resolve entities
+    removes useless whites, \r, \n and \t with whites
+    expand back entities
+    """
+    tmp = resolve(text)
+    result = u''
+    isLastWhite = False # so that first white is not removed
+    for c in tmp:
+        if c in ' \r\n\t':
+            if not isLastWhite:
+                result += u' '
+                isLastWhite = True
+        else:
+            result += c
+            isLastWhite = False
+
+    return expand(result)
+
+
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv)<2:
+        print >> sys.stderr, u"Missing required parameter. Try '&amp;test'"
+        sys.exit(1)
+    input = unicode(' '.join(sys.argv[1:]), 'utf-8')
+    #print 'input:', input
+    #raw = resolve(input)
+    #print 'resolved:', raw
+    #print 'expanded:', expand(raw)
+    print 'cleanCDATA:', cleanCDATA(input)
+