#!/usr/bin/perl

## PARSE XHTML (PERHAPS OTHERS?) DTD INTO HTML DISPLAYING ELEMENT SCOPES

$DTD = "xhtml1-strict.dtd";

open (FP, $DTD);
	$TXT = join ("", <FP>);
close (FP);

## REMOVE COMMENTS ANYTHING BETWEEN PAIR OF '--'
$TXT =~ s/--((-[^-])|[^-])*--//gs;

## REMOVE NEWLINES
$TXT =~ s/(\n|\r)/ /gs;

## COLLAPSE MULTIPLE WHITESPACES TO ONE
$TXT =~ s/[ \t]+/ /gs;

## PARSE ENTITIES
while ($TXT =~ /<!ENTITY % ([^ ]*) ([^>]*)>/gs) {
	$t1 = $1;
	$t2 = $2;
	$t2 =~ s/\"//gs;
	$entities{"$t1"} = $t2;
}

## PARSE ELEMENTS
while ($TXT =~ /<!ELEMENT ([^ ]*) ([^>]*)>/gs) {
	$elements{"$1"} = $2;
}

## RESOLVE ALL ENTITIY REFERENCES WITHIN ELEMENTS
foreach (keys(%elements)) {
	while ($elements{"$_"} =~ /%([^;]+);/sg) {
		$t1 = $1;
		$elements{"$_"} =~ s/%$t1;/$entities{"$t1"}/sg;
	}
}

## DUMP DESCRIPTIVE HEADER OF WHAT THIS SCRIPT OUTPUTS
print qq{<h1>XHTML ELEMENT IN QUESTION</h1>
<html><head><title>XHTML ELEMENTS</title></head></body>
<ul>
 <li><b>allowed within these elements</b></li>
 <li><i>elements allowed within this element</i></li>
</ul>
<hr>
<div align="right">
<a href="xhtml1-strict.dtd">XHTML-DTD</a> &nbsp;
<a href="dtd-translate.pl">this-translator</a>
<a href="http://shroom.dv8.org/">home
</div>
};

foreach (sort(keys(%elements))) {
	$el = $_;
	print "\n<h1>$el</h1>\n<ul>\n<li><b>" ;
	## LIST ELEMENTS IT'S ALLOWED WITHIN
	foreach (keys(%elements)) {
		$elements{$_} =~ /[^a-zA-Z]$el[^a-zA-Z]/ and print "$_ ";
	}
	## LIST ELEMENTS ALLOWED WITHIN IT
	print "\n</li>\n<li><i>$elements{$_}</i>\n</li></ul>\n";
}

print qq{</body></html>};

## DUMP ENTITY DEFINITION
#foreach (keys(%entities)) { print qq(\n$_ $entities{"$_"}); }
## DUMP ELEMENT DEFINITION
#foreach (keys(%elements)) { print qq(\n$_ $elements{"$_"}); }
