package cf::pod; use Pod::POM; our $indent; our $level; our @result; package cf::pod::AsParagraphs; use strict; use base "Pod::POM::View"; sub asxml($) { local $_ = $_[0]; s/&/&/g; s/>/>/g; s/$_[1]" }; *view_seq_italic = sub { "$_[1]" }; *view_seq_zero = sub { }; *view_seq_space = sub { my $text = $_[1]; $text =~ s/ /\xa0/g; $text }; *view_seq_index = sub { push @{ $result[-1]{index} }, $_[1]; "" }; sub view_seq_text { my $text = $_[1]; $text =~ s/\s+/ /g; ::asxml $text } sub view_seq_link { my (undef, $link) = @_; my $text = $link =~ s/^(.*)\|// ? $1 : $link; if ($link =~ /http:/) { "" . (::asxml $link) . "" } else { () } } sub view_item { push @result, { indent => $indent * 8, level => $level, }; my $title = $_[1]->title->present ($_[0]); $result[-1]{markup} = "$title\n" if length $title; $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () } sub view_verbatim { push @result, { indent => $indent * 16, level => $level, markup => "" . (::asxml $_[1]) . "\n", }; () } sub view_textblock { push @result, { indent => $indent * 16, level => $level, markup => "$_[1]\n", }; () } sub view_head1 { push @result, { indent => $indent * 16, level => $level, }; my $title = $_[1]->title->present ($_[0]); $result[-1]{markup} = "\n\n

$title

\n" if length $title; $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () }; sub view_head2 { push @result, { indent => $indent * 16, level => $level, }; my $title = $_[1]->title->present ($_[0]); $result[-1]{markup} = "\n\n

$title

\n" if length $title; $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () }; sub view_head3 { push @result, { indent => $indent * 16, level => $level, }; my $title = $_[1]->title->present ($_[0]); $result[-1]{markup} = "\n\n

$title

\n" if length $title; $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () }; sub view_over { local $indent = $indent + $_[1]->indent; push @result, { indent => $indent }; $_[1]->content->present ($_[0]); () } sub view_for { if ($_[1]->format eq "image") { # push @result, { # indent => $indent * 16, # level => $level, # markup => (::special image => "pod/" . $_->text), # }; } () } sub view_begin { () } sub view { my ($self, $type, $item) = @_; $item->content->present ($self); } ############################################################################# package cf::pod; sub pom_as_paragraphs($) { my ($pom) = @_; # we suckers use global variables, unfortunately. my $guard = cf::lock_acquire "cf::pod::as_paragraphs"; local $indent = 0; local $level = 1; local @result = ( { } ); $pom->present ("cf::pod::AsParagraphs"); [grep $_->{index} || exists $_->{markup}, @result] } sub load_pod($) { my ($path) = @_; cf::cache "cf::pod::as_paragraphs/$path" => $path, 1 => sub { }; } 1;