#!/usr/bin/perl -wp0777

s{<!(.*?)(--.*?--\s*)+(.*?)>}{ if ($1 || $3) {"<!$1 $3>";}}ges;
s{<(?:[^>'"]+|".*?"|'.*?')+>}{}gs;
s{(&(\x23\d+|\w+);?)}{$entity{$2}||$1}ge;

BEGIN {
    %entity = (
        lt     => '<',    
        gt     => '>',    
        amp    => '&',    
        quot   => '"',    
        nbsp   => chr 160,
        iexcl  => chr 161,
        cent   => chr 162,
        pound  => chr 163,
        curren => chr 164,
        yen    => chr 165,
        brvbar => chr 166,
        sect   => chr 167,
        uml    => chr 168,
        copy   => chr 169,
        ordf   => chr 170,
        laquo  => chr 171,
        not    => chr 172,
        shy    => chr 173,
        reg    => chr 174,
        macr   => chr 175,
        deg    => chr 176,
        plusmn => chr 177,
        sup2   => chr 178,
        sup3   => chr 179,
        acute  => chr 180,
        micro  => chr 181,
        para   => chr 182,
        middot => chr 183,
        cedil  => chr 184,
        sup1   => chr 185,
        ordm   => chr 186,
        raquo  => chr 187,
        frac14 => chr 188,
        frac12 => chr 189,
        frac34 => chr 190,
        iquest => chr 191,
        Agrave => chr 192,
        Aacute => chr 193,
        Acirc  => chr 194,
        Atilde => chr 195,
        Auml   => chr 196,
        Aring  => chr 197,
        AElig  => chr 198,
        Ccedil => chr 199,
        Egrave => chr 200,
        Eacute => chr 201,
        Ecirc  => chr 202,
        Euml   => chr 203,
        Igrave => chr 204,
        Iacute => chr 205,
        Icirc  => chr 206,
        Iuml   => chr 207,
        ETH    => chr 208,
        Ntilde => chr 209,
        Ograve => chr 210,
        Oacute => chr 211,
        Ocirc  => chr 212,
        Otilde => chr 213,
        Ouml   => chr 214,
        times  => chr 215,
        Oslash => chr 216,
        Ugrave => chr 217,
        Uacute => chr 218,
        Ucirc  => chr 219,
        Uuml   => chr 220,
        Yacute => chr 221,
        THORN  => chr 222,
        szlig  => chr 223,
        agrave => chr 224,
        aacute => chr 225,
        acirc  => chr 226,
        atilde => chr 227,
        auml   => chr 228,
        aring  => chr 229,
        aelig  => chr 230,
        ccedil => chr 231,
        egrave => chr 232,
        eacute => chr 233,
        ecirc  => chr 234,
        euml   => chr 235,
        igrave => chr 236,
        iacute => chr 237,
        icirc  => chr 238,
        iuml   => chr 239,
        eth    => chr 240,
        ntilde => chr 241,
        ograve => chr 242,
        oacute => chr 243,
        ocirc  => chr 244,
        otilde => chr 245,
        ouml   => chr 246,
        divide => chr 247,
        oslash => chr 248,
        ugrave => chr 249,
        uacute => chr 250,
        ucirc  => chr 251,
        uuml   => chr 252,
        yacute => chr 253,
        thorn  => chr 254,
        yuml   => chr 255,
    );

    for $chr ( 0 .. 255 ) { 
        $entity{ '#' . $chr } = chr $chr;
    }
}