--- deliantra/Deliantra-Client/DC/Pod.pm 2006/07/23 16:11:12 1.1 +++ deliantra/Deliantra-Client/DC/Pod.pm 2006/08/13 03:20:56 1.5 @@ -1,217 +1,89 @@ -package CFClient::Pod; +package CFPlus::Pod; use strict; -use Pod::POM; +use Storable; -use CFClient; -use CFClient::UI; +our $VERSION = 1; -our $VERSION = 1; # bump if resultant formatting changes +our %wiki; -our @result; -our $indent; +*wiki = Storable::retrieve CFPlus::find_rcfile "docwiki.pst"; -package CFClient::Pod::AsXML; +sub is_prefix_of($@) { + my ($node, @path) = @_; -use strict; + return 1 unless @path; -use base "Pod::POM::View::Text"; + my $kw = pop @path; -*view_seq_code = -*view_seq_bold = sub { "$_[1]" }; -*view_seq_italic = sub { "$_[1]" }; -*view_seq_space = -*view_seq_link = -*view_seq_index = sub { CFClient::asxml $_[1] }; + $node = $node->{parent} + or return 0; -sub view_seq_text { - my $text = $_[1]; - $text =~ s/\s+/ /g; - CFClient::asxml $text + return ! ! grep $_ eq $kw, @{ $node->{kw} }; } -sub view_item { - ("\t" x ($indent / 4)) - . $_[1]->title->present ($_[0]) - . "\n\n" - . $_[1]->content->present ($_[0]) -} +sub find(@) { + my (@path) = @_; -sub view_verbatim { - (join "", - map +("\t" x ($indent / 2)) . "$_\n", - split /\n/, CFClient::asxml $_[1]) - . "\n" -} - -sub view_textblock { - ("\t" x ($indent / 2)) . "$_[1]\n\n" -} + return unless @path; -sub view_head1 { - "\n\n" . $_[1]->title->present ($_[0]) . "\n\n" - . $_[1]->content->present ($_[0]) -}; + my $kw = pop @path; -sub view_head2 { - "\n" . $_[1]->title->present ($_[0]) . "\n\n" - . $_[1]->content->present ($_[0]) -}; + # TODO: make sure results are unique -sub view_head3 { - "\n" . $_[1]->title->present ($_[0]) . "\n\n" - . $_[1]->content->present ($_[0]) -}; - -sub view_over { - local $indent = $indent + $_[1]->indent; - $_[1]->content->present ($_[0]) + grep { is_prefix_of $_, @path } + map @$_, + $kw eq "*" ? @wiki{sort keys %wiki} + : grep $_, $wiki{$kw} } -package CFClient::Pod::AsParagraphs; - -use strict; - -use base "Pod::POM::View"; +sub full_path_of($) { + my ($node) = @_; -*view_seq_code = -*view_seq_bold = sub { "$_[1]" }; -*view_seq_italic = sub { "$_[1]" }; -*view_seq_space = -*view_seq_link = -*view_seq_index = sub { CFClient::asxml $_[1] }; - -sub view_seq_text { - my $text = $_[1]; - $text =~ s/\s+/ /g; - CFClient::asxml $text + my $path = $node->{kw}[0]; + $path = "$node->{kw}[0]/$path" while $node = $node->{parent}; + $path } -sub view_item { - push @result, { - indent => $indent * 8, - text => $_[1]->title->present ($_[0]) . "\n\n", - }; - $_[1]->content->present ($_[0]); - () -} +sub section_of($) { + my ($node) = @_; -sub view_verbatim { - push @result, { - indent => $indent * 16, - text => "" . (CFClient::asxml $_[1]) . "", - }; - () -} + my $doc = $node->{doc}; + my $par = $node->{par}; + my $lvl = $node->{level}; -sub view_textblock { - push @result, { - indent => $indent * 16, - text => "$_[1]\n", - }; - () -} + my @res; -sub view_head1 { - push @result, { - indent => $indent * 16, - text => "\n\n" . $_[1]->title->present ($_[0]) . "\n", - }; - $_[1]->content->present ($_[0]); - () -}; + do { + my $p = $doc->[$par]; -sub view_head2 { - push @result, { - indent => $indent * 16, - text => "\n\n" . $_[1]->title->present ($_[0]) . "\n", - }; - $_[1]->content->present ($_[0]); - () -}; + if (exists $p->{markup}) { + my %para = ( + markup => $p->{markup}, + indent => $p->{indent}, + ); -sub view_head3 { - push @result, { - indent => $indent * 16, - text => "\n\n" . $_[1]->title->present ($_[0]) . "\n", - }; - $_[1]->content->present ($_[0]); - () -}; + for (@{ $p->{widget} || [] }) { + my ($class, @args) = @$_; + push @{ $para{widget} }, $class->new (@args); + } -sub view_over { - local $indent = $indent + $_[1]->indent; - push @result, { indent => $indent }; - $_[1]->content->present ($_[0]); - () -} + push @res, \%para; + } + } while $doc->[++$par]{level} > $lvl; -sub view_for { - if ($_[1]->format eq "image") { - push @result, { - indent => $indent * 16, - text => "\x{fffc}", - obj => [new CFClient::UI::Image path => "pod/" . $_[1]->text], - }; - } - () + @res } -sub view { - my ($self, $type, $item) = @_; - - $item->content->present ($self); +sub section(@) { + map section_of $_, &find } -package CFClient::Pod; - -my $pod_cache = CFClient::db_table "pod_cache"; - -sub load($$$$) { - my ($path, $filtertype, $filterversion, $filtercb) = @_; - - stat $path - or die "$path: $!"; - - my $phash = join ",", $filterversion, $VERSION, (stat _)[7,9]; - - my ($chash, $pom) = eval { @{ Storable::thaw $pod_cache->get ("$path/$filtertype") } }; - - return $pom if $chash eq $phash; - - my $pod = do { - local $/; - open my $pod, "<:utf8", $_[0] - or die "$_[0]: $!"; - <$pod> - }; - - #utf8::downgrade $pod; - - $pom = $filtercb->(Pod::POM->new->parse_text ($pod)); - - $pod_cache->put ("$path/$filtertype" => Storable::nfreeze [$phash, $pom]); - - $pom -} - -sub as_xml($) { - my ($pom) = @_; - - local $indent = 0; - - $pom->present ("CFClient::Pod::AsXML") -} - -sub as_paragraphs($) { - my ($pom) = @_; - - local @result = ( { } ); - local $indent = 0; - - $pom->present ("CFClient::Pod::AsParagraphs"); - - [grep exists $_->{text}, @result] +sub as_label(@) { + join "\n", + map +("\xa0" x ($_->{indent} / 4)) . $_->{markup}, + @_ } +1