#!/perl/bin/perl # # dtd2tex.pl -- simple approach to convert .dtd to LaTeX. use strict; use warnings; use diagnostics; use XML::DTDParser qw(ParseDTD); use Data::Dumper; open DTD, $ARGV[0] or die "Cannot open $ARGV[0] : $!\n"; my $DTDtext; { local $/; $DTDtext = } close DTD; my $DTD = ParseDTD $DTDtext; if ($ARGV[1]) { print Dumper($DTD); exit; } print <{\\columncolor[gray]{.7}[.95\\tabcolsep]}{l}}% \\newcommand{\\textbsc}[1]{% \\textsc{\\textbf{\#1}}% } BP for (sort keys %$DTD) { my $ref = $$DTD{$_}; print "\\section{$_}\n"; print "\\begin{tabular}{|l|l|l|l|l|l|}\\hline\n"; print "\\multicolumn{1}{|H|}{\\textbf{Name}}%\n"; print "&\\multicolumn{5}{H|}{\\textbf{Content Category/Model}}\\\\\n"; print "\\hline\n"; if ($$ref{'childrenSTR'}) { print "\\multicolumn{1}{|l|}{$_} "; if (exists($$ref{'children'})) { print "& \\multicolumn{5}{l|}{A list of:}\\\\ \\hline\n"; print "& \\multicolumn{5}{H|}{Name}\\\\ \\hline\n"; my $children = $$ref{'children'}; for (sort keys %$children) { my $cardinality = $$children{$_}; if ($cardinality ne '!') { print "& \\multicolumn{5}{l|}{$_$cardinality}\\\\ \\hline\n"; } else { print "& \\multicolumn{5}{l|}{$_}\\\\ \\hline\n"; } } } else { print "& \\multicolumn{5}{l|}{",latexsafe($$ref{'childrenSTR'}),"}\\\\ \\hline\n"; } } else { print "\\multicolumn{1}{|l|}{$_} & \\multicolumn{5}{l|}{EMPTY}\\\\ \\hline\n"; } if ($$ref{'attributes'}) { my $list = $$ref{'attributes'}; print "&\\multicolumn{1}{H|}{\\textbf{Name}}%\n"; print "&\\multicolumn{1}{H|}{\\textbf{Type}}%\n"; print "&\\multicolumn{1}{H|}{\\textbf{Values}}%\n"; print "&\\multicolumn{1}{H|}{\\textbf{Presence}}%\n"; print "&\\multicolumn{1}{H|}{\\textbf{Default}}%\n"; print "\\\\ \\hline\n"; for (keys %$list) { print "&\\textit{$_}"; my $arrayref = $$list{$_}; if ($$arrayref[0] =~ /\|/) { print "& &",latexsafe($$arrayref[0]); } else { print "&\\textbsc{",latexsafe(lc($$arrayref[0])),"}& "; } if ($$arrayref[1]) { print "&\\textbsc{",latexsafe(lc($$arrayref[1])),"}"; } else { print "& "; } if ($$arrayref[2]) { print "&",latexsafe($$arrayref[2]); } else { print "& "; } print " \\\\ \\hline\n" } } if ($$ref{'parent'}) { my $list = $$ref{'parent'}; print "\\multicolumn{6}{|H|}{\\textbf{Parents (Used by)}} \\\\ \\hline\n"; for (@$list) { print "\\multicolumn{6}{|l|}{$_} \\\\ \\hline\n"; } } print "\\end{tabular}\n"; } print <