--- trunk/vhost/webpac2.cgi 2009/04/21 23:17:21 1135 +++ trunk/vhost/webpac2.cgi 2009/04/22 10:14:56 1138 @@ -8,6 +8,11 @@ use File::Slurp; use YAML; use Search::Estraier; +use Data::Page; +use Data::Dump qw/dump/; + +my $range_around = 5; +my $entries_per_page = 30; print header; @@ -16,7 +21,39 @@ print qq|
# $name\n|, YAML::Dump( @_ ), qq|
|; } -my $path = $ENV{PATH_INFO}; +sub show_pages { + my ($pager,$coderef) = @_; + + my @show_pages; + my $after_current = 0; + + if ( $pager->current_page <= $range_around + 2 ) { + @show_pages = ( $pager->first_page .. $pager->current_page ); + $after_current = $range_around - $pager->current_page; + } else { + @show_pages = ( $pager->first_page, '', $pager->current_page - $range_around .. $pager->current_page ); + } + + if ( $pager->current_page + $range_around + 1 >= $pager->last_page ) { + push @show_pages, ( $pager->current_page + 1 .. $pager->last_page ); + } else { + push @show_pages, ( $pager->current_page + 1 .. $pager->current_page + $after_current + $range_around, '', $pager->last_page ); + } + + warn "## show_pages = ",dump( @show_pages ); + + return join( ' ', map { + if ( $_ == $pager->current_page ) { + qq|$_|; + } elsif ( $_ eq '' ) { + qq|...|; + } else { + $coderef->( $_ ); + } + } @show_pages ); +} + +my $path = $ENV{PATH_INFO} || 'ecas'; my $dir = $0; $dir =~ s{/[^/]+.cgi}{}; @@ -25,6 +62,15 @@ my $database = (keys %{ $config->{databases} })[0]; die "$database not in $path" unless $path =~ m{\Q$database\E}; +my $html_markup = "$dir/$path/html.pm"; +my $html_markup_skip; +if ( -e $html_markup ) { + require $html_markup; + $html_markup = $database . '::html'; +} else { + undef $html_markup; +} + my $estraier = YAML::LoadFile( "$dir/../var/estraier/$database.yaml" ); my $db = $config->{databases}->{$database}; @@ -45,7 +91,9 @@ # -linebreak => 0, ), textfield( -name => 'search' ), - submit + submit, + textfield( -name => 'entries_per_page', -default => $entries_per_page ), + textfield( -name => 'current_page', -default => 1 ), ; print end_form; @@ -59,32 +107,67 @@ croak_on_error => 1, ); + param( 'entries_per_page', $entries_per_page ) unless param('entries_per_page'); # FIXME not needed? + my $cond = Search::Estraier::Condition->new; $cond->set_phrase( $search ); + $cond->set_skip( param('current_page') ); + $cond->set_max( param('entries_per_page') ); my $nres = $node->search( $cond, 0 ); + my $pager = Data::Page->new( $nres->hits, param('entries_per_page'), param('current_page') ); + if ( ! $nres ) { my $no_results = "No results for search '%s'"; printf qq|
$no_results
|, $search; } else { + my $results = "Got %d results for search '%s'"; printf qq|
$results
|, $nres->hits, $search; - print qq|
    |; + print + qq|
    |, + show_pages( $pager, + sub { + my ($page) = @_; + param( 'current_page', $page ); + my $url = self_url( -query => 1 ); + qq|$_|; + } + ), + qq|
    | + ; + + my $start = $pager->first; + print qq|
      |; foreach my $i ( 1 .. $nres->doc_num ) { my $rdoc = $nres->get_doc( $i - 1 ); print qq|
    1. |; - print qq|
      |, $rdoc->attr( $_ ), qq|
      | - foreach @attr; + foreach my $attr ( @attr ) { + my $v = $rdoc->attr( $attr ); + if ( defined $v && $html_markup && ! $html_markup_skip->{$attr} ) { + eval "\$v = $html_markup->$attr( \$v );"; + if ( $@ ) { + warn "disable html markup for $attr: $@"; + $html_markup_skip->{$attr} = $@; + } + } + next unless defined $v; + print qq|
      $v
      \n|; + } print qq|
    2. \n|; } print qq|
    |; } print qq||; + + dump_yaml( 'pager', $pager ); + } dump_yaml( 'estraier', $estraier ); dump_yaml( 'db', $db ); +dump_yaml( 'html_markup_skip', $html_markup_skip ); print end_html;