XML-SAX-Machines
view release on metacpan or search on metacpan
lib/XML/SAX/EventMethodMaker.pm view on Meta::CPAN
{
$XML::SAX::EventMethodMaker::VERSION = '0.46';
}
# ABSTRACT: SAX event names, creation of methods from templates
@ISA = qw( Exporter );
@EXPORT_OK = qw(
sax_event_names
missing_methods
compile_methods
compile_missing_methods
);
%EXPORT_TAGS = ( all => \@EXPORT_OK );
use strict ;
## First, a table in easy to maintain format :)
##
## Key to flags field:
## <int> = SAX versions supported in. We'll need to make this more
## powerful (support ranges) if we get in to subversions.
my %event_flags = (
Han => "Handler",
DTD => "DTDHandler",
Cnt => "ContentHandler",
Doc => "DocumentHandler",
Dec => "DeclHandler",
Err => "ErrorHandler",
Ent => "EntityResolver",
Lex => "LexicalHandler",
);
my %parse_method_flags = (
Parse => "ParseMethods",
);
my %event_table = qw(
start_document Han;1Doc;Cnt
end_document Han;1Doc;Cnt
start_element Han;1Doc;Cnt
end_element Han;1Doc;Cnt
characters Han;1Doc;Cnt
start_prefix_mapping Han;----;Cnt
end_prefix_mapping Han;----;Cnt
processing_instruction Han;1Doc;Cnt
ignorable_whitespace Han;1Doc;Cnt
skipped_entity Han;----;Cnt
set_document_locator Han;1Doc;Cnt
notation_decl Han;----;----;DTD
unparsed_entity_decl Han;----;----;DTD
element_decl Han;----;----;----;----;Dec
attribute_decl Han;----;----;----;----;Dec
internal_entity_decl Han;----;----;----;----;Dec
external_entity_decl Han;----;----;----;----;Dec
comment Han;----;----;----;Lex
start_dtd Han;----;----;----;Lex
end_dtd Han;----;----;----;Lex
start_cdata Han;----;----;----;Lex
end_cdata Han;----;----;----;Lex
start_entity Han;----;----;----;Lex
end_entity Han;----;----;----;Lex
warning Han;----;----;----;----;----;Err
error Han;----;----;----;----;----;Err
fatal_error Han;----;----;----;----;----;Err
resolve_entity Han;----;----;----;----;----;----;Ent
xml_decl 1Han;----;----;1DTD
attlist_decl 1Han;----;----;1DTD
doctype_decl 1Han;----;----;1DTD
entity_decl 1Han;----;----;1DTD
entity_reference 1Han;1Doc
);
my %parse_methods_table = qw(
parse 1:2Parse
parse_file 2Parse
parse_string 2Parse
parse_uri 2Parse
);
use Carp;
## Now, tear that apart so it's queryable
my %events_db;
for my $event ( keys %event_table, keys %parse_methods_table ) {
my $flags = exists $event_table{$event}
? $event_table{$event}
: $parse_methods_table{$event};
for ( split /[;-]+/, $flags ) {
my ( $versions, $type ) = /^([\d:]*)(.*)/
or die "Couldn't parse '$_'";
my @versions = split /\D+/, $versions;
die "Unknown flag '$_'"
unless exists $event_flags{$type}
|| exists $parse_method_flags{$type};
@versions = ( 1, 2 ) unless @versions;
$type = exists $event_flags{$type}
? $event_flags{$type}
: $parse_method_flags{$type};
push @{$events_db{$type}}, $event;
for my $version ( @versions ) {
push @{$events_db{"$version,$type"}}, $event;
$events_db{$version}->{$event} = undef
unless $type eq "ParseMethods";
}
}
}
#use Data::Dumper; local $Data::Dumper::Indent=1; warn Dumper( \%events_db );
( run in 1.686 second using v1.01-cache-2.11-cpan-39bf76dae61 )