--- deliantra/server/lib/cf/pod.pm 2007/04/18 14:24:10 1.3 +++ deliantra/server/lib/cf/pod.pm 2008/08/31 09:03:31 1.13 @@ -15,17 +15,27 @@ sub asxml($) { local $_ = $_[0]; - s/&/&/g; - s/>/>/g; - s//g; + s/>/E/g; + + $_ +} + +sub flatten($) { + local $_ = $_[0]; + + s/<[^>]+>//g; + s/^\s+//; + s/\s+$//; + s/\s+/ /g; $_ } *view_seq_file = *view_seq_code = -*view_seq_bold = sub { "$_[1]" }; -*view_seq_italic = sub { "$_[1]" }; +*view_seq_bold = sub { "B<$_[1]>" }; +*view_seq_italic = sub { "I<$_[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]; "" }; @@ -33,7 +43,7 @@ sub view_seq_text { my $text = $_[1]; $text =~ s/\s+/ /g; - ::asxml $text + asxml $text } sub view_seq_link { @@ -42,7 +52,7 @@ my $text = $link =~ s/^(.*)\|// ? $1 : $link; if ($link =~ /http:/) { - "" . (::asxml $link) . "" + "U<" . (asxml $link) . ">" } else { () } @@ -50,12 +60,13 @@ sub view_item { push @result, { + type => "item", 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; + $result[-1]{markup} = $title if length $title; + $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () @@ -63,9 +74,10 @@ sub view_verbatim { push @result, { + type => "verbatim", indent => $indent * 16, level => $level, - markup => "" . (::asxml $_[1]) . "\n", + markup => $_[1], }; () } @@ -74,19 +86,20 @@ push @result, { indent => $indent * 16, level => $level, - markup => "$_[1]\n", + markup => flatten $_[1], }; () } sub view_head1 { push @result, { + type => "head1", 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; + $result[-1]{markup} = $title if length $title; + $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () @@ -94,12 +107,13 @@ sub view_head2 { push @result, { + type => "head2", 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; + $result[-1]{markup} = $title if length $title; + $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () @@ -107,12 +121,13 @@ sub view_head3 { push @result, { + type => "head3", 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; + $result[-1]{markup} = $title if length $title; + $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; local $level = $level + 1; $_[1]->content->present ($_[0]); () @@ -168,11 +183,38 @@ sub load_pod($) { my ($path) = @_; - cf::cache "cf::pod::as_paragraphs/$path" => $path, - 1 => sub { - }; -} + Coro::Storable::thaw cf::cache "cf::pod::as_paragraphs/$path" => [$path], + 3 => sub { + my ($src) = @_; + + cf::fork_call { + my $pod = $src->[0]; + utf8::decode $pod; + Coro::Storable::blocking_nfreeze pom_as_paragraphs +(Pod::POM->new->parse_text ($pod)) + } + }; +} + +# format as cfpod-style text +sub as_cfpod($) { + my ($pars) = @_; + + my $res; + + for my $par (@$pars) { + if ($par->{type} =~ /^head\d+$/) { + $res .= "B<$par->{markup}>\n\n"; + } elsif ($par->{type} eq "verbatim") { + $res .= "\n$par->{markup}\n\n"; + } elsif ($par->{type} eq "item") { + $res .= "\n* I<$par->{markup}>\n\n"; + } else { + $res .= "$par->{markup}\n\n"; + } + } + $res +} 1;