######################################################################## # skel.pl: an SGMLSPL script for producing scripts (!!). # # Copyright (c) 1995 by David Megginson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # # Changes: # # $Log: skel.pl,v $ # Revision 1.4 1995/11/15 20:21:07 david # Changed "use Output" to "use SGMLS::Output". # # Revision 1.3 1995/08/24 15:04:38 david # Fixed commented-out 're' handler. # # Revision 1.2 1995/08/12 16:16:42 david # Revised version for 1.01 distribution. # # Revision 1.1 1995/04/23 14:49:35 david # Initial revision # ######################################################################## use SGMLS; use SGMLS::Output; $version = '$Id: skel.pl,v 1.4 1995/11/15 20:21:07 david Exp $'; %subdocs = (); # Subdocument entities seen so far. %entities = (); # External data entities seen so far. %sdata = (); # SDATA strings seen so far. %elements = (); # Elements seen so far. $pi = 0; # Any processing instructions? $intro = 0; # Have we printed the banner yet? $| = 1; sgml('end_element', ''); # Ignore the ends of elements. sgml('end_subdoc', ''); # Ignore the ends of subdocument entities. sgml('cdata', ''); # Ignore CDATA. sgml('re', ''); # Ignore Record Ends. # Note any processing instructions. sgml('pi', sub { $pi = 1; }); # Keep track of all subdocument entities. sgml('start_subdoc', sub { my $entity = shift; $entities{$entity->name} = 1; }); # Keep track of all external data entities. sgml('entity', sub { my $entity = shift; $entities{$entity->name} = 1; }); # Keep track of all SDATA strings sgml('sdata', sub { my $sdata = shift; $sdata{$sdata} = 1; }); # Display element handlers as they appear. sgml('start_element', sub { my $element = shift; unless ($intro) { $intro = 1; do_intro($element->name); } if (!$elements{$element->name}) { output "# Element: " . $element->name . "\n"; output "sgml('<" . $element->name . ">', \"\");\n"; output "sgml('name . ">', \"\");\n\n"; $elements{$element->name} = 1; } }); sgml('end', sub { # generate subdoc handlers my @keys = keys(%subdocs); if ($#keys > 0) { output "#\n# Subdocument Entity Handlers\n#\n\n"; foreach (@keys) { output "# Subdocument Entity: $_\n"; output "sgml('{" . $_ . "}', \"\");\n"; output "sgml('{/" . $_ . "}', \"\");\n\n"; } } # generate entity handlers my @keys = keys(%entities); if ($#keys > 0) { output "#\n# External Data Entity Handlers\n#\n\n"; foreach (@keys) { output "sgml('&" . $_ . ";', \"\");\n"; } } # generate sdata handlers my @keys = keys(%sdata); if ($#keys > 0) { output "#\n# SDATA Handlers\n#\n\n"; foreach (@keys) { output "sgml('|" . $_ . "|', \"\");\n"; } } if ($pi) { output "#\n# Processing-Instruction Handler\n#\n"; output "sgml('pi', sub {});\n\n"; } output <name; }); # sgml('end_element',''); # sgml('cdata',sub { output \$_[0]; }); # sgml('sdata',sub { die "Unknown SDATA: " . \$_[0]; }); # sgml('re',"\\n"); # sgml('pi',sub { die "Unknown processing instruction: " . \$_[0]; }); # sgml('entity',sub { die "Unknown external entity: " . \$_[0]->name; }); # sgml('start_subdoc',sub { die "Unknown subdoc entity: " . \$_[0]->name; }); # sgml('end_subdoc',''); # sgml('conforming',''); 1; END }); # Function to print the banner. sub do_intro { my $doctype = shift; output <