=$command $expansion}; } else { $html = EMPTY; } } }; if ( $html ne EMPTY ) { push @{ $parser->{POD_HTMLEASY}->{HTML} }, $html; } return; } ############ # VERBATIM # ############ # Overrides verbatim() provided by base class in Pod::Parser sub verbatim { my ( $parser, $paragraph, $line_num ) = @_; if ( exists $parser->{POD_HTMLEASY}->{IN_BEGIN} ) { return; } $parser->{POD_HTMLEASY}->{VERBATIM_BUFFER} .= $paragraph; return; } sub _verbatim { my ($parser) = @_; if ( exists $parser->{POD_HTMLEASY}->{IN_BEGIN} ) { return; } my $expansion = $parser->{POD_HTMLEASY}->{VERBATIM_BUFFER}; $parser->{POD_HTMLEASY}->{VERBATIM_BUFFER} = EMPTY; _encode_entities( \$expansion ); # If we had "=item *", we should now be looking at the text that will # appear as the item. The "*" was passed over initially, so we need # the text to index. Save the flag as ON_VERBATIM deletes IN_ITEM my $add_index = $parser->{INDEX_ITEM} && $parser->{POD_HTMLEASY}{IN_ITEM}; my $html = $parser->{POD_HTMLEASY} ->{ON_VERBATIM}( $parser->{POD_HTMLEASY}, $expansion ); # Now look for any embedded URIs _add_uri_href( \$html ); # And remove any NUL escapes _remove_nul_escapes( \$html ); if ( $html ne EMPTY ) { if ($add_index) { _add_index( $parser, $expansion, $LEVELL ); } push @{ $parser->{POD_HTMLEASY}->{HTML} }, $html; } # [6062] return; } ############# # TEXTBLOCK # ############# # Overrides textblock() provided by base class in Pod::Parser sub textblock { my ( $parser, $paragraph, $line_num ) = @_; if ( exists $parser->{POD_HTMLEASY}->{IN_BEGIN} ) { return; } if ( defined $parser->{POD_HTMLEASY}->{VERBATIM_BUFFER} ) { _verbatim($parser); } # [6062] my $expansion = $parser->interpolate( $paragraph, $line_num ); $expansion =~ s{$RE{ws}{crop}}{}gsmx; # delete surrounding whitespace $expansion =~ s{\s+$}{}gsmx; # Encode HTML-specific characters before adding any HTML (eg
) _encode_entities( \$expansion ); # If we had "=item *", we should now be looking at the text that will # appear as the item. The "*" was passed over initially, so we need # the text to index. Save the flag as ON_TEXTBLOCK deletes IN_ITEM my $add_index = $parser->{INDEX_ITEM} && $parser->{POD_HTMLEASY}{IN_ITEM}; my $html = $parser->{POD_HTMLEASY} ->{ON_TEXTBLOCK}( $parser->{POD_HTMLEASY}, $expansion ); # Now look for any embedded URIs _add_uri_href( \$html ); # And remove any NUL escapes _remove_nul_escapes( \$html ); if ( $html ne EMPTY ) { if ($add_index) { _add_index( $parser, $expansion, $LEVELL ); } push @{ $parser->{POD_HTMLEASY}->{HTML} }, $html; } return; } ##################### # INTERIOR_SEQUENCE # ##################### # Overrides interior_sequence() provided by base class in Pod::Parser sub interior_sequence { my ( $parser, $seq_command, $seq_argument, $pod_seq ) = @_; my $ret; # Encode HTML-specific characters before adding any HTML (eg
) if ( $seq_command ne q{L} ) { _encode_entities( \$seq_argument ); } given ($seq_command) { when q{B} { $ret = $parser->{POD_HTMLEASY} ->{ON_B}( $parser->{POD_HTMLEASY}, $seq_argument ); } when q{C} { $ret = $parser->{POD_HTMLEASY} ->{ON_C}( $parser->{POD_HTMLEASY}, $seq_argument ); } when q{E} { $ret = $parser->{POD_HTMLEASY} ->{ON_E}( $parser->{POD_HTMLEASY}, $seq_argument ); } when q{F} { $ret = $parser->{POD_HTMLEASY} ->{ON_F}( $parser->{POD_HTMLEASY}, $seq_argument ); } when q{I} { $ret = $parser->{POD_HTMLEASY} ->{ON_I}( $parser->{POD_HTMLEASY}, $seq_argument ); } when q{L} { # L<> causes problems, but not with parselink. if ( $seq_argument eq EMPTY ) { _errors( $parser, q{Empty L<>} ); return EMPTY; } my @parsed = Pod::ParseLink::parselink($seq_argument); foreach (@parsed) { if ( defined $_ ) { _encode_entities( \$_ ); } } # Encoding handled in ON_L() $ret = $parser->{POD_HTMLEASY} ->{ON_L}( $parser->{POD_HTMLEASY}, @parsed ); } when q{S} { $ret = $parser->{POD_HTMLEASY} ->{ON_S}( $parser->{POD_HTMLEASY}, $seq_argument ); } when q{Z} { $ret = $parser->{POD_HTMLEASY} ->{ON_Z}( $parser->{POD_HTMLEASY}, $seq_argument ); } default { if ( defined $parser->{POD_HTMLEASY}->{qq{ON_\U$seq_command\E}} ) { $ret = $parser->{POD_HTMLEASY} ->{qq{ON_\U$seq_command\E}}( $parser->{POD_HTMLEASY}, $seq_argument ); } else { $ret = qq{$seq_command<$seq_argument>}; } } } # Escape HTML-significant characters _nul_escape( \$ret ); return $ret; } ######################## # PREPROCESS_PARAGRAPH # ######################## Readonly::Scalar my $INFO_DONE => 3; # Overrides preprocess_paragraph() provided by base class in Pod::Parser # NB: the text is _not_ altered. sub preprocess_paragraph { my ( $parser, $text, $line_num ) = @_; if ( $parser->{POD_HTMLEASY}{INFO_COUNT} == $INFO_DONE ) { return $text; } if ( not exists $parser->{POD_HTMLEASY}{PACKAGE} ) { if ( $text =~ m{package}smx ) { my ($pack) = $text =~ m{package\s+(\w+(?:::\w+)*)}smx; if ( defined $pack ) { $parser->{POD_HTMLEASY}{PACKAGE} = $pack; $parser->{POD_HTMLEASY}{INFO_COUNT}++; } } } if ( not exists $parser->{POD_HTMLEASY}{VERSION} ) { if ( $text =~ m{VERSION}smx ) { my ($ver) = $text =~ m{($RE{num}{decimal})}smx; if ( defined $ver ) { $parser->{POD_HTMLEASY}{VERSION} = $ver; $parser->{POD_HTMLEASY}{INFO_COUNT}++; } } } # This situation is created by evt_on_head1() # _do_title has found nothing following =head1 NAME, so it # creates ...{TITLE}, and leaves it undef, so that it will be # picked up here when the paragraph following is processed. if ( ( exists $parser->{POD_HTMLEASY}{TITLE} ) and ( not defined $parser->{POD_HTMLEASY}{TITLE} ) ) { my @lines = split m{\n}smx, $text; my $tmp_text = shift @lines; if ( not defined $tmp_text ) { return $text; } $tmp_text =~ s{$RE{ws}{crop}}{}gsmx; # delete surrounding whitespace $parser->{POD_HTMLEASY}{TITLE} = $tmp_text; $parser->{POD_HTMLEASY}{INFO_COUNT}++; } return $text; } ############## # _ADD_INDEX # ############## sub _add_index { my ( $parser, $txt, $level ) = @_; # Don't index star items if ( $txt eq q{*} ) { return; } if ( exists $parser->{INDEX_ITEM} ) { my $max_len = $parser->{INDEX_LENGTH}; if ( length $txt > $max_len ) { while ( substr( $txt, $max_len, 1 ) ne q{ } ) { $max_len++; last if $max_len >= length $txt; } if ( $max_len < length $txt ) { $txt = substr( $txt, 0, $max_len ) . "..."; } } } _remove_nul_escapes( \$txt ); push @{ $parser->{POD_HTMLEASY}->{INDEX} }, [ $level, $txt ]; return; } ############# # BEGIN_POD # ############# # Overrides begin_pod() provided by base class in Pod::Parser sub begin_pod { my ($parser) = @_; delete $parser->{POD_HTMLEASY}->{INDEX}; $parser->{POD_HTMLEASY}->{INDEX} = []; return 1; } ########### # END_POD # ########### # Overrides end_pod() provided by base class in Pod::Parser sub end_pod { my ($parser) = @_; if ( defined $parser->{POD_HTMLEASY}->{VERBATIM_BUFFER} ) { _verbatim($parser); } return 1; } ########### # _ERRORS # ########### sub _errors { my ( $parser, $error ) = @_; carp "$error"; $error =~ s{^\s*\**\s*errors?:?\s*}{}ismx; $error =~ s{\s+$}{}smx; my $html = $parser->{POD_HTMLEASY} ->{ON_ERROR}( $parser->{POD_HTMLEASY}, $error ); if ( $html ne EMPTY ) { push @{ $parser->{POD_HTMLEASY}->{HTML} }, $html; } return 1; } ########### # DESTROY # ########### sub DESTROY { } ####### # END # ####### 1;