#============================================================= -*-Perl-*-
#
# Pod::POM::View::Text
#
# DESCRIPTION
#   Text view of a Pod Object Model.
#
# AUTHOR
#   Andy Wardley   <abw@kfs.org>
#
# COPYRIGHT
#   Copyright (C) 2000 Andy Wardley.  All Rights Reserved.
#
#   This module is free software; you can redistribute it and/or
#   modify it under the same terms as Perl itself.
#
# REVISION
#   $Id: Text.pm 77 2009-08-20 20:44:14Z ford $
#
#========================================================================

package Pod::POM::View::Text;
$Pod::POM::View::Text::VERSION = '2.01';
require 5.006;
use strict;
use warnings;

use Pod::POM::View;
use parent qw( Pod::POM::View );
use vars qw( $DEBUG $ERROR $AUTOLOAD $INDENT );
use Text::Wrap;

$DEBUG   = 0 unless defined $DEBUG;
$INDENT  = 0;


sub new {
    my $class = shift;
    my $args  = ref $_[0] eq 'HASH' ? shift : { @_ };
    bless { 
	INDENT => 0,
	%$args,
    }, $class;
}


sub view {
    my ($self, $type, $item) = @_;

    if ($type =~ s/^seq_//) {
	return $item;
    }
    elsif (UNIVERSAL::isa($item, 'HASH')) {
	if (defined $item->{ content }) {
	    return $item->{ content }->present($self);
	}
	elsif (defined $item->{ text }) {
	    my $text = $item->{ text };
	    return ref $text ? $text->present($self) : $text;
	}
	else {
	    return '';
	}
    }
    elsif (! ref $item) {
	return $item;
    }
    else {
	return '';
    }
}


sub view_head1 {
    my ($self, $head1) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    my $pad = ' ' x $$indent;
    local $Text::Wrap::unexpand = 0;
    my $title = wrap($pad, $pad, 
		     $head1->title->present($self));
    
    $$indent += 4;
    my $output = "$title\n" . $head1->content->present($self);
    $$indent -= 4;

    return $output;
}


sub view_head2 {
    my ($self, $head2) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    my $pad = ' ' x $$indent;
    local $Text::Wrap::unexpand = 0;
    my $title = wrap($pad, $pad, 
		     $head2->title->present($self));

    $$indent += 4;
    my $output = "$title\n" . $head2->content->present($self);
    $$indent -= 4;

    return $output;
}


sub view_head3 {
    my ($self, $head3) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    my $pad = ' ' x $$indent;
    local $Text::Wrap::unexpand = 0;
    my $title = wrap($pad, $pad, 
		     $head3->title->present($self));

    $$indent += 4;
    my $output = "$title\n" . $head3->content->present($self);
    $$indent -= 4;

    return $output;
}


sub view_head4 {
    my ($self, $head4) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    my $pad = ' ' x $$indent;
    local $Text::Wrap::unexpand = 0;
    my $title = wrap($pad, $pad, 
		     $head4->title->present($self));

    $$indent += 4;
    my $output = "$title\n" . $head4->content->present($self);
    $$indent -= 4;

    return $output;
}


#------------------------------------------------------------------------
# view_over($self, $over)
#
# Present an =over block - this is a blockquote if there are no =items
# within the block.
#------------------------------------------------------------------------

sub view_over {
    my ($self, $over) = @_;

    if (@{$over->item}) {
	return $over->content->present($self);
    }
    else {
	my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
	my $pad = ' ' x $$indent;
	$$indent += 4;
	my $content = $over->content->present($self);
	$$indent -= 4;
    
	return $content;
    }
}

sub view_item {
    my ($self, $item) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    my $pad = ' ' x $$indent;
    local $Text::Wrap::unexpand = 0;
    my $title = wrap($pad . '* ', $pad . '  ', 
		     $item->title->present($self));

    $$indent += 2;
    my $content = $item->content->present($self);
    $$indent -= 2;
    
    return "$title\n\n$content";
}


sub view_for {
    my ($self, $for) = @_;
    return '' unless $for->format() =~ /\btext\b/;
    return $for->text()
	. "\n\n";
}

    
sub view_begin {
    my ($self, $begin) = @_;
    return '' unless $begin->format() =~ /\btext\b/;
    return $begin->content->present($self);
}

    
sub view_textblock {
    my ($self, $text) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    $text =~ s/\s+/ /mg;

    $$indent ||= 0;
    my $pad = ' ' x $$indent;
    local $Text::Wrap::unexpand = 0;
    return wrap($pad, $pad, $text) . "\n\n";
}


sub view_verbatim {
    my ($self, $text) = @_;
    my $indent = ref $self ? \$self->{ INDENT } : \$INDENT;
    my $pad = ' ' x $$indent;
    $text =~ s/^/$pad/mg;
    return "$text\n\n";
}


sub view_seq_bold {
    my ($self, $text) = @_;
    return "*$text*";
}


sub view_seq_italic {
    my ($self, $text) = @_;
    return "_${text}_";
}


sub view_seq_code {
    my ($self, $text) = @_;
    return "'$text'";
}


sub view_seq_file {
    my ($self, $text) = @_;
    return "_${text}_";
}

my $entities = {
    gt   => '>',
    lt   => '<',
    amp  => '&',
    quot => '"',
};


sub view_seq_entity {
    my ($self, $entity) = @_;
    return $entities->{ $entity } || $entity;
}

sub view_seq_index {
    return '';
}

sub view_seq_link {
    my ($self, $link) = @_;
    if ($link =~ s/^.*?\|//) {
	return $link;
    }
    else {
	return "the $link manpage";
    }
}
	
    

1;

=head1 NAME

Pod::POM::View::Text - create text views of POM objects

=head1 DESCRIPTION

Text view of a Pod Object Model.

=head1 METHODS

=over 4

=item C<view($self, $type, $item)>

=item C<view_pod($self, $pod)>

=item C<view_head1($self, $head1)>

=item C<view_head2($self, $head2)>

=item C<view_head3($self, $head3)>

=item C<view_head4($self, $head4)>

=item C<view_over($self, $over)>

=item C<view_item($self, $item)>

=item C<view_for($self, $for)>

=item C<view_begin($self, $begin)>

=item C<view_textblock($self, $textblock)>

=item C<view_verbatim($self, $verbatim)>

=item C<view_meta($self, $meta)>

=item C<view_seq_bold($self, $text)>

Returns the text of a C<BE<lt>E<gt>> sequence in 'bold' (i.e. surrounded by asterisks, like *this*).

=item C<view_seq_italic($self, $text)>

Returns the text of a C<IE<lt>E<gt>> sequence in 'italics' (i.e. surrounded by underscores, like _this_).

=item C<view_seq_code($self, $text)>

=item C<view_seq_file($self, $text)>

=item C<view_seq_entity($self, $text)>

=item C<view_seq_index($self, $text)>

Returns an empty string.  Index sequences are suppressed in text view.

=item C<view_seq_link($self, $text)>

=back

=head1 AUTHOR

Andy Wardley E<lt>abw@kfs.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2000 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut
