Skip to content

Commit

Permalink
Moved ToC creation/writing into Corpus.
Browse files Browse the repository at this point in the history
  • Loading branch information
chromatic committed Mar 10, 2012
1 parent 656f25b commit bc3e7f1
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 58 deletions.
19 changes: 2 additions & 17 deletions lib/Pod/PseudoPod/DOM/App/ToHTML.pm
Original file line number Diff line number Diff line change
Expand Up @@ -35,27 +35,12 @@ sub process_files_with_output
die "Unable to open file ($source)\n" unless -e $source;
$parser->parse_file($source);

$corpus->add_document( $parser->get_document );
$corpus->add_document( $parser->get_document, $parser );
}

# turn anchor text contents into link destinations
# create link descriptions from anchor headers
# generate unique IDs for index anchors
# must process index display info?

my @toc;
write_toc( @toc );
# do not merge anchor links; throw error on duplicates!

$corpus->write_documents;
$corpus->write_index;
}

# move into Corpus
sub write_toc
{
my $fh = open_fh( 'index.html', '>' );
print {$fh} "<ul>\n", @_, "</ul>\n";
$corpus->write_toc;
}

1;
24 changes: 21 additions & 3 deletions lib/Pod/PseudoPod/DOM/Corpus.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@ use warnings;

use Moose;
use Pod::PseudoPod::DOM::Index;
use Pod::PseudoPod::DOM::TableOfContents;
use Pod::PseudoPod::DOM::App 'open_fh';

has 'index', is => 'ro', default => sub {Pod::PseudoPod::DOM::Index->new};
has 'references', is => 'ro', default => sub { {} };
has 'contents', is => 'ro', default => sub { [] };

has 'documents', is => 'ro', default => sub { [] };
has 'references', is => 'ro', default => sub { {} };
has 'index', is => 'ro',
default => sub {Pod::PseudoPod::DOM::Index->new};
has 'contents', is => 'ro',
default => sub {Pod::PseudoPod::DOM::TableOfContents->new};

sub add_document
{
Expand All @@ -36,6 +40,7 @@ sub add_references_from_document
sub add_contents_from_document
{
my ($self, $document) = @_;
$self->contents->add_document( $document );
}

sub get_index
Expand All @@ -44,6 +49,12 @@ sub get_index
return $self->index->emit_index;
}

sub get_toc
{
my $self = shift;
return $self->contents->emit_toc;
}

sub write_documents
{
my $self = shift;
Expand All @@ -66,4 +77,11 @@ sub write_index
print {$outfh} $self->get_index;
}

sub write_toc
{
my $self = shift;
my $outfh = open_fh( 'index.html', '>' );
print {$outfh} $self->get_toc;
}

__PACKAGE__->meta->make_immutable;
23 changes: 16 additions & 7 deletions lib/Pod/PseudoPod/DOM/Elements.pm
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,20 @@ use Moose;
package Pod::PseudoPod::DOM::Element::Heading;

use Moose;
use Scalar::Util ();

extends 'Pod::PseudoPod::DOM::ParentElement';

has 'level', is => 'ro', required => 1;
sub exclude_from_toc { scalar shift->emit_kids =~ /^\*/ }
has 'level', is => 'ro', required => 1;
has 'anchor', is => 'rw';

sub exclude_from_toc
{
my ($self, $max_depth) = @_;

return scalar $self->emit_kids =~ /^\*/ unless defined $max_depth;
return $self->level > $max_depth;
}
}

{
Expand Down Expand Up @@ -350,11 +359,11 @@ use Moose;

use Moose;

has 'externals', is => 'ro', default => sub { {} };
has 'filename', is => 'ro', default => '';
has 'index', is => 'ro', default => sub { [] };
has 'anchor', is => 'ro', default => sub { [] };
has 'link', is => 'ro', default => sub { [] };
has 'externals', is => 'ro', default => sub { {} };
has 'filename', is => 'ro', default => '';
has 'index', is => 'ro', default => sub { [] };
has 'anchor', is => 'ro', default => sub { [] };
has 'link', is => 'ro', default => sub { [] };

extends 'Pod::PseudoPod::DOM::ParentElement';
}
Expand Down
40 changes: 9 additions & 31 deletions lib/Pod/PseudoPod/DOM/Role/XHTML.pm
Original file line number Diff line number Diff line change
Expand Up @@ -98,36 +98,14 @@ sub emit_document

sub extract_headings
{
my $self = shift;
my $full_toc = '';
my $current_level = 1;
my ($self, %args) = @_;
my @headings;
my $heading_level = \@headings;

for my $kid (@{ $self->children })
{
next unless $kid->type eq 'header';
next if $kid->exclude_from_toc;

my $level = $kid->level;

if ($level == $current_level)
{
# do nothing!
}
elsif ($level > $current_level)
{
push @{ $heading_level }, [];
$heading_level = $heading_level->[-1];
}
else
{
$heading_level = pop @{ $heading_level }
for $current_level .. $level;
}

$current_level = $level;
push @{ $heading_level }, $kid;
next if $kid->exclude_from_toc( $args{max_depth} );
push @headings, $kid;
}

return \@headings;
Expand All @@ -150,11 +128,11 @@ sub walk_headings

for my $heading (@$headings)
{
$toc .= $args{indent} . '<li>';
$toc .= $args{indent};

if (blessed($heading))
{
$toc .= $heading->get_heading_link( %args );
$toc .= '<li>' . $heading->get_heading_link( %args );
}
else
{
Expand All @@ -175,12 +153,12 @@ sub walk_headings
sub get_heading_link
{
my ($self, %args) = @_;
my $content = $self->emit_kids;
my $filename = $args{filename};

return '' if $content =~ /^\*/;
my $content = $self->emit_kids;
my $filename = $self->anchor->link || $args{filename};
my $href = $self->emit_kids( encode => 'index_anchor' );

my $href = $self->emit_kids( encode => 'index_anchor' );
$content =~ s/^\*//;
return qq|<a href="$filename#$href">$content</a>|;
}

Expand Down
128 changes: 128 additions & 0 deletions lib/Pod/PseudoPod/DOM/TableOfContents.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package Pod::PseudoPod::DOM::TableOfContents;
# ABSTRACT: table of contents for a PPDOM Corpus

use strict;
use warnings;

use Moose;

has 'contents',
is => 'ro',
default => sub { Pod::PseudoPod::DOM::TableOfContents::TopContents->new };

sub add_document
{
my ($self, $document) = @_;
my $headings = $document->extract_headings( max_depth => 5 );
my @stack = ($self->contents);
my $current_level = 0;
my $class = 'Pod::PseudoPod::DOM::TableOfContents::Entry';
my $last_entry;

for my $heading (@$headings)
{
my $level = $heading->level;
my $entry = $class->new( heading => $heading );

if ($level == $current_level)
{
$stack[-1]->add( $entry );
}
elsif ($level > $current_level)
{
$last_entry->add( $entry );
push @stack, $last_entry;
}
else
{
my $diff = $current_level - $level;
$last_entry = pop @stack for 1 .. $diff;
$stack[-1]->add( $entry );
}

$last_entry = $entry;
$current_level = $level;
}
}

sub emit_toc
{
my $self = shift;
return "<ul>\n" . $self->contents->emit . "</ul>\n";
}

__PACKAGE__->meta->make_immutable;

package Pod::PseudoPod::DOM::TableOfContents::TopContents;

use strict;
use warnings;

use Moose;

has 'kids', is => 'ro', default => sub { [] };

sub add
{
my ($self, $entry) = @_;
push @{ $self->kids }, $entry;
}

sub emit
{
my $self = shift;
my $kids = $self->kids;
return '' unless @$kids;

my $contents = '';
for my $kid (@$kids)
{
$contents .= '<h2>' . $kid->heading->get_heading_link . "</h2>\n"
. $kid->emit_kids;
}

return $contents;
}

__PACKAGE__->meta->make_immutable;

package Pod::PseudoPod::DOM::TableOfContents::Entry;

use strict;
use warnings;

use Moose;

has 'kids', is => 'ro', default => sub { [] };
has 'heading', is => 'ro', required => 1;

sub add
{
my ($self, $entry) = @_;
push @{ $self->kids }, $entry;
}

sub emit_kids
{
my $self = shift;
my $kids = $self->kids;
return '' unless @$kids;
my $contents = "<ul>\n";

for my $kid (@$kids)
{
$contents .= $kid->emit;
}

return $contents . "\n</ul>\n";
}

sub emit
{
my $self = shift;
my $kids = $self->kids;
return "<li>" . $self->heading->get_heading_link
. $self->emit_kids . "</li>\n";
}

__PACKAGE__->meta->make_immutable;

0 comments on commit bc3e7f1

Please sign in to comment.