Blame lib/Pod/Perldoc/ToMan.pm

Packit a38e86
require 5.006;
Packit a38e86
package Pod::Perldoc::ToMan;
Packit a38e86
use strict;
Packit a38e86
use warnings;
Packit a38e86
use parent qw(Pod::Perldoc::BaseTo);
Packit a38e86
Packit a38e86
use vars qw($VERSION);
Packit a38e86
$VERSION = '3.28';
Packit a38e86
Packit a38e86
use File::Spec::Functions qw(catfile);
Packit a38e86
use Pod::Man 2.18;
Packit a38e86
# This class is unlike ToText.pm et al, because we're NOT paging thru
Packit a38e86
# the output in our particular format -- we make the output and
Packit a38e86
# then we run nroff (or whatever) on it, and then page thru the
Packit a38e86
# (plaintext) output of THAT!
Packit a38e86
Packit a38e86
sub SUCCESS () { 1 }
Packit a38e86
sub FAILED  () { 0 }
Packit a38e86
Packit a38e86
sub is_pageable        { 1 }
Packit a38e86
sub write_with_binmode { 0 }
Packit a38e86
sub output_extension   { 'txt' }
Packit a38e86
Packit a38e86
sub __filter_nroff  { shift->_perldoc_elem('__filter_nroff'  , @_) }
Packit a38e86
sub __nroffer       { shift->_perldoc_elem('__nroffer'       , @_) }
Packit a38e86
sub __bindir        { shift->_perldoc_elem('__bindir'        , @_) }
Packit a38e86
sub __pod2man       { shift->_perldoc_elem('__pod2man'       , @_) }
Packit a38e86
sub __output_file   { shift->_perldoc_elem('__output_file'   , @_) }
Packit a38e86
Packit a38e86
sub center          { shift->_perldoc_elem('center'         , @_) }
Packit a38e86
sub date            { shift->_perldoc_elem('date'           , @_) }
Packit a38e86
sub fixed           { shift->_perldoc_elem('fixed'          , @_) }
Packit a38e86
sub fixedbold       { shift->_perldoc_elem('fixedbold'      , @_) }
Packit a38e86
sub fixeditalic     { shift->_perldoc_elem('fixeditalic'    , @_) }
Packit a38e86
sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
Packit a38e86
sub name            { shift->_perldoc_elem('name'           , @_) }
Packit a38e86
sub quotes          { shift->_perldoc_elem('quotes'         , @_) }
Packit a38e86
sub release         { shift->_perldoc_elem('release'        , @_) }
Packit a38e86
sub section         { shift->_perldoc_elem('section'        , @_) }
Packit a38e86
Packit a38e86
sub new {
Packit a38e86
	my( $either ) = shift;
Packit a38e86
	my $self = bless {}, ref($either) || $either;
Packit a38e86
	$self->init( @_ );
Packit a38e86
	return $self;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub init {
Packit a38e86
	my( $self, @args ) = @_;
Packit a38e86
Packit a38e86
	unless( $self->__nroffer ) {
Packit a38e86
		my $roffer = $self->_find_roffer( $self->_roffer_candidates );
Packit a38e86
		$self->debug( "Using $roffer\n" );
Packit a38e86
		$self->__nroffer( $roffer );
Packit a38e86
		}
Packit a38e86
    else {
Packit a38e86
	    $self->debug( "__nroffer is " . $self->__nroffer() . "\n" );
Packit a38e86
        }
Packit a38e86
Packit a38e86
	$self->_check_nroffer;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _roffer_candidates {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	if( $self->is_openbsd || $self->is_freebsd || $self->is_bitrig ) { qw( mandoc groff nroff ) }
Packit a38e86
	else                    { qw( groff nroff mandoc ) }
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _find_roffer {
Packit a38e86
	my( $self, @candidates ) = @_;
Packit a38e86
Packit a38e86
	my @found = ();
Packit a38e86
	foreach my $candidate ( @candidates ) {
Packit a38e86
		push @found, $self->_find_executable_in_path( $candidate );
Packit a38e86
		}
Packit a38e86
Packit a38e86
	return wantarray ? @found : $found[0];
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _check_nroffer {
Packit a38e86
	return 1;
Packit a38e86
	# where is it in the PATH?
Packit a38e86
Packit a38e86
	# is it executable?
Packit a38e86
Packit a38e86
	# what is its real name?
Packit a38e86
Packit a38e86
	# what is its version?
Packit a38e86
Packit a38e86
	# does it support the flags we need?
Packit a38e86
Packit a38e86
	# is it good enough for us?
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _get_stty { `stty -a` }
Packit a38e86
Packit a38e86
sub _get_columns_from_stty {
Packit a38e86
	my $output = $_[0]->_get_stty;
Packit a38e86
Packit a38e86
	if(    $output =~ /\bcolumns\s+(\d+)/ )    { return $1 }
Packit a38e86
	elsif( $output =~ /;\s*(\d+)\s+columns;/ ) { return $1 }
Packit a38e86
	else                                       { return  0 }
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _get_columns_from_manwidth {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	return 0 unless defined $ENV{MANWIDTH};
Packit a38e86
Packit a38e86
	unless( $ENV{MANWIDTH} =~ m/\A\d+\z/ ) {
Packit a38e86
		$self->warn( "Ignoring non-numeric MANWIDTH ($ENV{MANWIDTH})\n" );
Packit a38e86
		return 0;
Packit a38e86
		}
Packit a38e86
Packit a38e86
	if( $ENV{MANWIDTH} == 0 ) {
Packit a38e86
		$self->warn( "Ignoring MANWIDTH of 0. Really? Why even run the program? :)\n" );
Packit a38e86
		return 0;
Packit a38e86
		}
Packit a38e86
Packit a38e86
	if( $ENV{MANWIDTH} =~ m/\A(\d+)\z/ ) { return $1 }
Packit a38e86
Packit a38e86
	return 0;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _get_default_width {
Packit a38e86
	73
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _get_columns {
Packit a38e86
	$_[0]->_get_columns_from_manwidth ||
Packit a38e86
	$_[0]->_get_columns_from_stty     ||
Packit a38e86
	$_[0]->_get_default_width;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _get_podman_switches {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	my @switches = map { $_, $self->{$_} } grep !m/^_/s, keys %$self;
Packit a38e86
Packit a38e86
    # There needs to be a cleaner way to handle setting
Packit a38e86
    # the UTF-8 flag, but for now, comment out this
Packit a38e86
    # line because it often does the wrong thing.
Packit a38e86
    #
Packit a38e86
    # See RT #77465
Packit a38e86
    #
Packit a38e86
    #push @switches, 'utf8' => 1;
Packit a38e86
Packit a38e86
	$self->debug( "Pod::Man switches are [@switches]\n" );
Packit a38e86
Packit a38e86
	return @switches;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _parse_with_pod_man {
Packit a38e86
	my( $self, $file ) = @_;
Packit a38e86
Packit a38e86
	#->output_fh and ->output_string from Pod::Simple aren't
Packit a38e86
	# working, apparently, so there's this ugly hack:
Packit a38e86
	local *STDOUT;
Packit a38e86
	open STDOUT, '>', $self->{_text_ref};
Packit a38e86
	my $parser = Pod::Man->new( $self->_get_podman_switches );
Packit a38e86
	$self->debug( "Parsing $file\n" );
Packit a38e86
	$parser->parse_from_file( $file );
Packit a38e86
	$self->debug( "Done parsing $file\n" );
Packit a38e86
	close STDOUT;
Packit a38e86
Packit a38e86
	$self->die( "No output from Pod::Man!\n" )
Packit a38e86
		unless length $self->{_text_ref};
Packit a38e86
Packit a38e86
	$self->_save_pod_man_output if $self->debugging;
Packit a38e86
Packit a38e86
	return SUCCESS;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _save_pod_man_output {
Packit a38e86
	my( $self, $fh ) = @_;
Packit a38e86
Packit a38e86
	$fh = do {
Packit a38e86
		my $file = "podman.out.$$.txt";
Packit a38e86
		$self->debug( "Writing $file with Pod::Man output\n" );
Packit a38e86
		open my $fh2, '>', $file;
Packit a38e86
		$fh2;
Packit a38e86
		} unless $fh;
Packit a38e86
Packit a38e86
	print { $fh } ${ $self->{_text_ref} };
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _have_groff_with_utf8 {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	return 0 unless $self->_is_groff;
Packit a38e86
	my $roffer = $self->__nroffer;
Packit a38e86
Packit a38e86
	my $minimum_groff_version = '1.20.1';
Packit a38e86
Packit a38e86
	my $version_string = `$roffer -v`;
Packit a38e86
	my( $version ) = $version_string =~ /\(?groff\)? version (\d+\.\d+(?:\.\d+)?)/;
Packit a38e86
	$self->debug( "Found groff $version\n" );
Packit a38e86
Packit a38e86
	# is a string comparison good enough?
Packit a38e86
	if( $version lt $minimum_groff_version ) {
Packit a38e86
		$self->warn(
Packit a38e86
			"You have an old groff." .
Packit a38e86
			" Update to version $minimum_groff_version for good Unicode support.\n" .
Packit a38e86
			"If you don't upgrade, wide characters may come out oddly.\n"
Packit a38e86
			 );
Packit a38e86
		}
Packit a38e86
Packit a38e86
	$version ge $minimum_groff_version;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _have_mandoc_with_utf8 {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
       $self->_is_mandoc and not system 'mandoc -Tlocale -V > /dev/null 2>&1;;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _collect_nroff_switches {
Packit a38e86
	my( $self ) = shift;
Packit a38e86
Packit a38e86
    my @render_switches = ('-man', $self->_get_device_switches);
Packit a38e86
Packit a38e86
	# Thanks to Brendan O'Dea for contributing the following block
Packit a38e86
	if( $self->_is_roff and -t STDOUT and my ($cols) = $self->_get_columns ) {
Packit a38e86
		my $c = $cols * 39 / 40;
Packit a38e86
		$cols = $c > $cols - 2 ? $c : $cols -2;
Packit a38e86
		push @render_switches, '-rLL=' . (int $c) . 'n' if $cols > 80;
Packit a38e86
		}
Packit a38e86
Packit a38e86
	# I hear persistent reports that adding a -c switch to $render
Packit a38e86
	# solves many people's problems.  But I also hear that some mans
Packit a38e86
	# don't have a -c switch, so that unconditionally adding it here
Packit a38e86
	# would presumably be a Bad Thing   -- sburke@cpan.org
Packit a38e86
    push @render_switches, '-c' if( $self->_is_roff and $self->is_cygwin );
Packit a38e86
Packit a38e86
	return @render_switches;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _get_device_switches {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	   if( $self->_is_nroff  )             { qw()              }
Packit a38e86
	elsif( $self->_have_groff_with_utf8 )  { qw(-Kutf8 -Tutf8) }
Packit a38e86
	elsif( $self->_is_ebcdic )             { qw(-Tcp1047)      }
Packit a38e86
	elsif( $self->_have_mandoc_with_utf8 ) { qw(-Tlocale)      }
Packit a38e86
	elsif( $self->_is_mandoc )             { qw()              }
Packit a38e86
	else                                   { qw(-Tlatin1)      }
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _is_roff {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	$self->_is_nroff or $self->_is_groff;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _is_nroff {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	$self->__nroffer =~ /\bnroff\b/;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _is_groff {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	$self->__nroffer =~ /\bgroff\b/;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _is_mandoc {
Packit a38e86
	my ( $self ) = @_;
Packit a38e86
Packit a38e86
	$self->__nroffer =~ /\bmandoc\b/;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _is_ebcdic {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	return 0;
Packit a38e86
	}
Packit a38e86
	
Packit a38e86
sub _filter_through_nroff {
Packit a38e86
	my( $self ) = shift;
Packit a38e86
	$self->debug( "Filtering through " . $self->__nroffer() . "\n" );
Packit a38e86
Packit a38e86
    # Maybe someone set rendering switches as part of the opt_n value
Packit a38e86
    # Deal with that here.
Packit a38e86
Packit a38e86
    my ($render, $switches) = $self->__nroffer() =~ /\A([\/a-zA-Z0-9_\.-]+)\b(.+)?\z/;
Packit a38e86
Packit a38e86
    $self->die("no nroffer!?") unless $render;
Packit a38e86
    my @render_switches = $self->_collect_nroff_switches;
Packit a38e86
Packit a38e86
    if ( $switches ) {
Packit a38e86
        # Eliminate whitespace 
Packit a38e86
        $switches =~ s/\s//g;
Packit a38e86
Packit a38e86
        # Then separate the switches with a zero-width positive 
Packit a38e86
        # lookahead on the dash.
Packit a38e86
        #
Packit a38e86
        # See:
Packit a38e86
        # http://www.effectiveperlprogramming.com/blog/1411
Packit a38e86
        # for a good discussion of this technique
Packit a38e86
Packit a38e86
        push @render_switches, split(/(?=-)/, $switches);
Packit a38e86
        }
Packit a38e86
Packit a38e86
	$self->debug( "render is $render\n" );
Packit a38e86
	$self->debug( "render options are @render_switches\n" );
Packit a38e86
Packit a38e86
	require Symbol;
Packit a38e86
	require IPC::Open3;
Packit a38e86
	require IO::Handle;
Packit a38e86
Packit a38e86
	my $pid = IPC::Open3::open3(
Packit a38e86
		my $writer,
Packit a38e86
		my $reader,
Packit a38e86
		my $err = Symbol::gensym(),
Packit a38e86
		$render,
Packit a38e86
		@render_switches
Packit a38e86
		);
Packit a38e86
Packit a38e86
	$reader->autoflush(1);
Packit a38e86
Packit a38e86
	use IO::Select;
Packit a38e86
	my $selector = IO::Select->new( $reader );
Packit a38e86
Packit a38e86
	$self->debug( "Writing to pipe to $render\n" );
Packit a38e86
Packit a38e86
	my $offset = 0;
Packit a38e86
	my $chunk_size = 4096;
Packit a38e86
	my $length = length( ${ $self->{_text_ref} } );
Packit a38e86
	my $chunks = $length / $chunk_size;
Packit a38e86
	my $done;
Packit a38e86
	my $buffer;
Packit a38e86
	while( $offset <= $length ) {
Packit a38e86
		$self->debug( "Writing chunk $chunks\n" ); $chunks++;
Packit a38e86
		syswrite $writer, ${ $self->{_text_ref} }, $chunk_size, $offset
Packit a38e86
			or $self->die( $! );
Packit a38e86
		$offset += $chunk_size;
Packit a38e86
		$self->debug( "Checking read\n" );
Packit a38e86
		READ: {
Packit a38e86
			last READ unless $selector->can_read( 0.01 );
Packit a38e86
			$self->debug( "Reading\n" );
Packit a38e86
			my $bytes = sysread $reader, $buffer, 4096;
Packit a38e86
			$self->debug( "Read $bytes bytes\n" );
Packit a38e86
			$done .= $buffer;
Packit a38e86
			$self->debug( sprintf "Output is %d bytes\n",
Packit a38e86
				length $done
Packit a38e86
				);
Packit a38e86
			next READ;
Packit a38e86
			}
Packit a38e86
		}
Packit a38e86
	close $writer;
Packit a38e86
	$self->debug( "Done writing\n" );
Packit a38e86
Packit a38e86
	# read any leftovers
Packit a38e86
	$done .= do { local $/; <$reader> };
Packit a38e86
	$self->debug( sprintf "Done reading. Output is %d bytes\n",
Packit a38e86
		length $done
Packit a38e86
		);
Packit a38e86
Packit a38e86
	if( $? ) {
Packit a38e86
		$self->warn( "Error from pipe to $render!\n" );
Packit a38e86
		$self->debug( 'Error: ' . do { local $/; <$err> } );
Packit a38e86
		}
Packit a38e86
Packit a38e86
Packit a38e86
	close $reader;
Packit a38e86
	if( my $err = $? ) {
Packit a38e86
		$self->debug(
Packit a38e86
			"Nonzero exit ($?) while running `$render @render_switches`.\n" .
Packit a38e86
			"Falling back to Pod::Perldoc::ToPod\n"
Packit a38e86
			);
Packit a38e86
		return $self->_fallback_to_pod( @_ );
Packit a38e86
		}
Packit a38e86
Packit a38e86
	$self->debug( "Output:\n----\n$done\n----\n" );
Packit a38e86
Packit a38e86
	${ $self->{_text_ref} } = $done;
Packit a38e86
Packit a38e86
	return length ${ $self->{_text_ref} } ? SUCCESS : FAILED;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub parse_from_file {
Packit a38e86
	my( $self, $file, $outfh) = @_;
Packit a38e86
Packit a38e86
	# We have a pipeline of filters each affecting the reference
Packit a38e86
	# in $self->{_text_ref}
Packit a38e86
	$self->{_text_ref} = \my $output;
Packit a38e86
Packit a38e86
	$self->_parse_with_pod_man( $file );
Packit a38e86
	# so far, nroff is an external command so we ensure it worked
Packit a38e86
	my $result = $self->_filter_through_nroff;
Packit a38e86
	return $self->_fallback_to_pod( @_ ) unless $result == SUCCESS;
Packit a38e86
Packit a38e86
	$self->_post_nroff_processing;
Packit a38e86
Packit a38e86
	print { $outfh } $output or
Packit a38e86
		$self->die( "Can't print to $$self{__output_file}: $!" );
Packit a38e86
Packit a38e86
	return;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _fallback_to_pod {
Packit a38e86
	my( $self, @args ) = @_;
Packit a38e86
	$self->warn( "Falling back to Pod because there was a problem!\n" );
Packit a38e86
	require Pod::Perldoc::ToPod;
Packit a38e86
	return  Pod::Perldoc::ToPod->new->parse_from_file(@_);
Packit a38e86
	}
Packit a38e86
Packit a38e86
# maybe there's a user setting we should check?
Packit a38e86
sub _get_tab_width { 4 }
Packit a38e86
Packit a38e86
sub _expand_tabs {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	my $tab_width = ' ' x $self->_get_tab_width;
Packit a38e86
Packit a38e86
	${ $self->{_text_ref} } =~ s/\t/$tab_width/g;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _post_nroff_processing {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	if( $self->is_hpux ) {
Packit a38e86
	    $self->debug( "On HP-UX, I'm going to expand tabs for you\n" );
Packit a38e86
		# this used to be a pipe to `col -x` for HP-UX
Packit a38e86
		$self->_expand_tabs;
Packit a38e86
		}
Packit a38e86
Packit a38e86
	if( $self->{'__filter_nroff'} ) {
Packit a38e86
		$self->debug( "filter_nroff is set, so filtering\n" );
Packit a38e86
		$self->_remove_nroff_header;
Packit a38e86
		$self->_remove_nroff_footer;
Packit a38e86
		}
Packit a38e86
	else {
Packit a38e86
		$self->debug( "filter_nroff is not set, so not filtering\n" );
Packit a38e86
		}
Packit a38e86
Packit a38e86
	$self->_handle_unicode;
Packit a38e86
Packit a38e86
	return 1;
Packit a38e86
	}
Packit a38e86
Packit a38e86
# I don't think this does anything since there aren't two consecutive
Packit a38e86
# newlines in the Pod::Man output
Packit a38e86
sub _remove_nroff_header {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
	$self->debug( "_remove_nroff_header is still a stub!\n" );
Packit a38e86
	return 1;
Packit a38e86
Packit a38e86
#  my @data = split /\n{2,}/, shift;
Packit a38e86
#  shift @data while @data and $data[0] !~ /\S/; # Go to header
Packit a38e86
#  shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
Packit a38e86
	}
Packit a38e86
Packit a38e86
# I don't think this does anything since there aren't two consecutive
Packit a38e86
# newlines in the Pod::Man output
Packit a38e86
sub _remove_nroff_footer {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
	$self->debug( "_remove_nroff_footer is still a stub!\n" );
Packit a38e86
	return 1;
Packit a38e86
	${ $self->{_text_ref} } =~ s/\n\n+.*\w.*\Z//m;
Packit a38e86
Packit a38e86
#  my @data = split /\n{2,}/, shift;
Packit a38e86
#  pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
Packit a38e86
        # 28/Jan/99 perl 5.005, patch 53 1
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _unicode_already_handled {
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	$self->_have_groff_with_utf8 ||
Packit a38e86
	1  # so, we don't have a case that needs _handle_unicode
Packit a38e86
	;
Packit a38e86
	}
Packit a38e86
Packit a38e86
sub _handle_unicode {
Packit a38e86
# this is the job of preconv
Packit a38e86
# we don't need this with groff 1.20 and later.
Packit a38e86
	my( $self ) = @_;
Packit a38e86
Packit a38e86
	return 1 if $self->_unicode_already_handled;
Packit a38e86
Packit a38e86
	require Encode;
Packit a38e86
Packit a38e86
	# it's UTF-8 here, but we need character data
Packit a38e86
	my $text = Encode::decode( 'UTF-8', ${ $self->{_text_ref} } ) ;
Packit a38e86
Packit a38e86
# http://www.mail-archive.com/groff@gnu.org/msg01378.html
Packit a38e86
# http://linux.die.net/man/7/groff_char
Packit a38e86
# http://www.gnu.org/software/groff/manual/html_node/Using-Symbols.html
Packit a38e86
# http://lists.gnu.org/archive/html/groff/2011-05/msg00007.html
Packit a38e86
# http://www.simplicidade.org/notes/archives/2009/05/fixing_the_pod.html
Packit a38e86
# http://lists.freebsd.org/pipermail/freebsd-questions/2011-July/232239.html
Packit a38e86
	$text =~ s/(\P{ASCII})/
Packit a38e86
		sprintf '\\[u%04X]', ord $1
Packit a38e86
	     /eg;
Packit a38e86
Packit a38e86
	# should we encode?
Packit a38e86
	${ $self->{_text_ref} } = $text;
Packit a38e86
	}
Packit a38e86
Packit a38e86
1;
Packit a38e86
Packit a38e86
__END__
Packit a38e86
Packit a38e86
=head1 NAME
Packit a38e86
Packit a38e86
Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
Packit a38e86
Packit a38e86
=head1 SYNOPSIS
Packit a38e86
Packit a38e86
  perldoc -o man Some::Modulename
Packit a38e86
Packit a38e86
=head1 DESCRIPTION
Packit a38e86
Packit a38e86
This is a "plug-in" class that allows Perldoc to use
Packit a38e86
Pod::Man and C<groff> for reading Pod pages.
Packit a38e86
Packit a38e86
The following options are supported:  center, date, fixed, fixedbold,
Packit a38e86
fixeditalic, fixedbolditalic, quotes, release, section
Packit a38e86
Packit a38e86
(Those options are explained in L<Pod::Man>.)
Packit a38e86
Packit a38e86
For example:
Packit a38e86
Packit a38e86
  perldoc -o man -w center:Pod Some::Modulename
Packit a38e86
Packit a38e86
=head1 CAVEAT
Packit a38e86
Packit a38e86
This module may change to use a different pod-to-nroff formatter class
Packit a38e86
in the future, and this may change what options are supported.
Packit a38e86
Packit a38e86
=head1 SEE ALSO
Packit a38e86
Packit a38e86
L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToNroff>
Packit a38e86
Packit a38e86
=head1 COPYRIGHT AND DISCLAIMERS
Packit a38e86
Packit a38e86
Copyright (c) 2011 brian d foy. All rights reserved.
Packit a38e86
Packit a38e86
Copyright (c) 2002,3,4 Sean M. Burke.  All rights reserved.
Packit a38e86
Packit a38e86
This library is free software; you can redistribute it and/or modify it
Packit a38e86
under the same terms as Perl itself.
Packit a38e86
Packit a38e86
This program is distributed in the hope that it will be useful, but
Packit a38e86
without any warranty; without even the implied warranty of
Packit a38e86
merchantability or fitness for a particular purpose.
Packit a38e86
Packit a38e86
=head1 AUTHOR
Packit a38e86
Packit a38e86
Current maintainer: Mark Allen C<< <mallen@cpan.org> >>
Packit a38e86
Packit a38e86
Past contributions from:
Packit a38e86
brian d foy C<< <bdfoy@cpan.org> >>
Packit a38e86
Adriano R. Ferreira C<< <ferreira@cpan.org> >>,
Packit a38e86
Sean M. Burke C<< <sburke@cpan.org> >>
Packit a38e86
Packit a38e86
=cut
Packit a38e86