# Kosmina O. Yaroslav
# http://darviarush.narod.ru


%U = (1026=>'€', 1027=>'', 8218=>'‚', 1107=>'ƒ', 8222=>'„', 8230=>'…', 8224=>'†', 8225=>'‡', 8364=>'ˆ', 8240=>'‰', 1033=>'Š', 8249=>'‹', 1034=>'Œ', 1036=>'', 1035=>'Ž', 1039=>'', 1106=>'', 8216=>'‘', 8217=>'’', 8220=>'“', 8221=>'”', 8226=>'•', 8226=>'•', 8482=>'™', 1113=>'š', 8250=>'›', 1114=>'œ', 1116=>'', 1115=>'ž', 1119=>'Ÿ', 160=>' ', 1038=>'¡', 1118=>'¢', 1032=>'£', 164=>'¤', 1168=>'¥', 166=>'¦', 167=>'§', 1025=>'¨', 169=>'©', 1028=>'ª', 172=>'¬', 173=>'­', 174=>'®', 1031=>'¯', 176=>'°', 177=>'±', 1030=>'²', 1110=>'³', 1169=>'´', 181=>'µ', 182=>'¶', 183=>'·', 1105=>'¸', 8470=>'¹', 1108=>'º', 1112=>'¼', 1029=>'½', 1109=>'¾', 1111=>'¿', 1040=>'À', 1041=>'Á', 1042=>'Â', 1043=>'Ã', 1044=>'Ä', 1045=>'Å', 1046=>'Æ', 1047=>'Ç', 1048=>'È', 1049=>'É', 1050=>'Ê', 1051=>'Ë', 1052=>'Ì', 1053=>'Í', 1054=>'Î', 1055=>'Ï', 1056=>'Ð', 1057=>'Ñ', 1058=>'Ò', 1059=>'Ó', 1060=>'Ô', 1061=>'Õ', 1062=>'Ö', 1063=>'×', 1064=>'Ø', 1065=>'Ù', 1066=>'Ú', 1067=>'Û', 1068=>'Ü', 1069=>'Ý', 1070=>'Þ', 1071=>'ß', 1072=>'à', 1073=>'á', 1074=>'â', 1075=>'ã', 1076=>'ä', 1077=>'å', 1078=>'æ', 1079=>'ç', 1080=>'è', 1081=>'é', 1082=>'ê', 1083=>'ë', 1084=>'ì', 1085=>'í', 1086=>'î', 1087=>'ï', 1088=>'ð', 1089=>'ñ', 1090=>'ò', 1091=>'ó', 1092=>'ô', 1093=>'õ', 1094=>'ö', 1095=>'÷', 1096=>'ø', 1097=>'ù', 1098=>'ú', 1099=>'û', 1100=>'ü', 1101=>'ý', 1102=>'þ', 1103=>'ÿ');

%S = ('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,'quot'=>34,'amp'=>38,'lt'=>60,'gt'=>62,'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);

%A = ('br'=>"\n", 'p'=>"\n");
%Q = ('p'=>"\n");


sub html2txt($$){
open in, "<", $_[0] or do { print "not open $_[0]\n"; return}; binmode in;
open f, ">", $_[1] or do { print "not create $_[1]\n"; return}; binmode f;

$/ = "<";

my @X, $a, $c;

$PRINT = sub {print f $_[0]};
$UNDEF = sub {};

%N = ('html'=>$UNDEF, 'body'=>$PRINT, 'script'=>$UNDEF, 'style'=>$UNDEF);

@X = ([$PRINT,""]);

$a = <in>;
$a =~ s/<$//;
&$PRINT($a);

while(<in>){

s/<$//;

if(s/^(\w+)[^>]*>//){ $c = lc $1; $a = $A{$c}; push @X, [$N{$c}, $c] if exists $N{$c}; }
elsif(s/^\/(\w+)[^>]*>//){ $c = lc $1; $a = $Q{$c}; pop @X if $c eq $X[$#X]->[1]; }
#elsif(/^!--/){ if(!s/^[.\n\r]*?-->//){ while(<in>){ last if s/^[.\n\r]*?-->//;} }  $a = undef;}
else { $a = "<" }

&{$X[$#X]->[0]}($a) if defined $a;

s/&#?(\d+);?/exists $U{$1}?$U{$1}:($1<128 ? chr $1:"$1")/ge;
s/&(\w+)(;?)/my $s = $S{$1}; defined $s? (exists $U{$s}? $U{$s}: ($1<128 ? chr $1:"$1")):"\&$1$2"/ge;
&{$X[$#X]->[0]}($_);
}

}


$f = $ARGV[0];
$o = $ARGV[1];

if(-d $f){
opendir A, $f or die "xm, not open dir $f\n";
readdir A; readdir A;
@Ax = readdir A;
closedir A;
$dir = $f;
$o = undef;
} else { @Ax = ($f); $dir = undef;}

for $f (@Ax){
print "$f\n";
$f = "$dir/$f" if $dir;
if($o eq ""){ $f =~ /\.[^\.]*$/; $o = "$`.txt"; }

html2txt($f, $o);
$o = undef;
}
