SGML-DTDParse
view release on metacpan or search on metacpan
bin/dtdformat view on Meta::CPAN
my $basename = shift;
my $fileext = shift;
my $html = shift;
open (F, ">$path/" . $basename . $fileext);
print F $html;
close (F);
}
sub writeNotation {
my $count = shift;
my $path = shift;
my $basename = shift;
my $fileext = shift;
my $html = shift;
open (F, ">$path/" . $basename . $fileext);
print F $html;
close (F);
}
sub basenames {
my @names = @_;
my %basename = ();
my %usedname = ();
foreach my $name (@names) {
my $count = 2;
my $bname = lc($name);
if ($usedname{$bname}) {
$bname = lc($name) . $count;
while ($usedname{$bname}) {
$bname++;
}
}
$basename{$name} = $bname;
$usedname{$name} = 1;
}
return %basename;
}
sub entityType {
my $ent = shift;
my $textnl = $ent->getElementsByTagName("text");
my $text = $textnl->item(0);
my $type = $ent->getAttribute('type');
if ($type eq 'param') {
if ($ent->getAttribute('system') || $ent->getAttribute('public')) {
$type = 'paramext';
} elsif ($text && $text->getFirstChild()) {
my $data = $text->getFirstChild()->getData();
if ($data eq 'INCLUDE' || $data eq 'IGNORE') {
$type = 'msparam';
}
}
} elsif (($type eq 'gen') || ($type eq 'cdata')) {
if ($text && $text->getFirstChild()) {
my $data = $text->getFirstChild()->getData();
if ($data =~ /^\&\#[xX][0-9A-F]+\;/i
|| $data =~ /^\&\#[0-9]+\;/i) {
$type = 'charent';
}
}
}
return $type;
}
# ======================================================================
sub propagateInclExcl {
# For each element, look for inclusions on all its parents
my $totelem = $#elements+1;
my $count = 0;
foreach my $name (@elements) {
my %children = ();
my %checked = ();
my @tocheck = ();
my %excl = ();
my %incl = ();
%children = %{$CHILDREN{$name}} if exists $CHILDREN{$name};
&status(sprintf("Propagating inclusions and exclusions: %5.1f%%",
$count / $totelem * 100.0));
$count++;
@tocheck = keys %{$PARENTS{$name}} if exists $PARENTS{$name};
while (@tocheck) {
my $parent = shift @tocheck;
if (exists $ELEMINCL{$parent}) {
foreach my $element (keys %{$ELEMINCL{$parent}}) {
$incl{$element} = 1;
}
}
if (exists $ELEMEXCL{$parent}) {
foreach my $element (keys %{$ELEMEXCL{$parent}}) {
$excl{$element} = 1;
}
}
if (exists $PARENTS{$parent}) {
foreach my $element (keys %{$PARENTS{$parent}}) {
push (@tocheck, $element) unless $checked{$element};
$checked{$element} = 1;
}
}
}
# Exclusions are only interesting if they're allowed as children.
foreach my $element (keys %excl) {
delete $excl{$element} if !exists $children{$element};
}
if (%excl) {
bin/dtdformat view on Meta::CPAN
# Any element that contains %x is influenced by %x
foreach my $elemname (keys %{$EAPPEARSIN{"%$name"}}) {
$XAPPEARSIN{"%$name"} = {} if !exists $XAPPEARSIN{"%$name"};
$XAPPEARSIN{"%$name"}->{$elemname} = 1;
# print DEBUGFILE "X': %$name appears in $elemname\n";
}
next if !$APPEARSIN{"%$name"};
# print DEBUGFILE "?: %$name appears in: ";
my %toinspect = %{$APPEARSIN{"%$name"}};
# print DEBUGFILE join(", ", keys %toinspect), "\n";
my %inspected = ();
while (%toinspect) {
my $pe = (keys %toinspect)[0];
$inspected{$pe} = 1;
delete($toinspect{$pe});
if (exists($EAPPEARSIN{"%$pe"})) {
foreach my $elemname (keys %{$EAPPEARSIN{"%$pe"}}) {
#
# nwalsh: 11/04/1999 Why was this here? It short-circuits the whole process.
# What was I trying to accomplish?
#
# my %eapp = %{$EAPPEARSIN{"%$pe"}};
# next if exists $eapp{$elemname};
$XAPPEARSIN{"%$name"} = {}
if !exists $XAPPEARSIN{"%$name"};
$XAPPEARSIN{"%$name"}->{$elemname} = 1;
# print DEBUGFILE "X: %$name appears in $elemname\n";
}
}
if ($APPEARSIN{"%$pe"}) {
foreach my $entname (keys %{$APPEARSIN{"%$pe"}}) {
$toinspect{$entname} = 1 if !$inspected{$entname};
}
}
}
}
}
# ======================================================================
sub cmFragment {
my $text = shift;
my $cmfragment = 1;
# if it contains a keyword, it's not a content model fragment.
$cmfragment = 0 if $text =~ /\#implied|\#required|\#fixed/is;
# if it contains characters that can't appear in a content
# model fragment, then it isn't one.
# The string #PCDATA is allowed, but would confuse us...
$text =~ s/\#pcdata//isg;
$cmfragment = 0 if $text =~ /[^\sa-z0-9_\|\,\&\(\)\*\?\+\-]/is;
return $cmfragment;
}
# ======================================================================
my $lastmsglen = 0;
my $persist = 0;
sub status {
my $msg = shift;
my $shouldpersist = shift || $opt{'debug'};
return if !$option{'verbose'};
if ($persist) {
print "\n";
$persist = 0;
} else {
print "\r";
print " " x $lastmsglen;
print "\r";
}
print $msg;
$lastmsglen = length($msg);
$persist = 1 if $shouldpersist || (length($msg) > 78);
}
# ======================================================================
__END__
=head1 NAME
dtdformat - Read a DTDParse XML file and produce formatted documentation
=head1 SYNOPSIS
dtdformat [options] xmlfile
=head1 DESCRIPTION
B<dtdformat> generated formatted documentation based upon a
DTDParse XML file created by L<dtdparse|dtdparse>. The
following documentation formats are supported:
=over 4
=item HTML
Designated by the C<--html> option.
=item DocBook Refentry
Designated by the C<--refenty> option.
=back
( run in 1.078 second using v1.01-cache-2.11-cpan-39bf76dae61 )