--- Webpacus/lib/Webpacus/Model/WebPAC.pm 2005/11/23 00:15:01 115 +++ Webpacus/lib/Webpacus/Model/WebPAC.pm 2005/11/25 19:19:55 150 @@ -5,11 +5,12 @@ use lib '/data/webpac2/lib'; use base qw/ Catalyst::Model - WebPAC::Search::Estraier /; use Data::Dumper; use WebPAC::DB; use WebPAC::Output::TT; +use WebPAC::Search::Estraier 0.02; +use File::Slurp; =head1 NAME @@ -35,6 +36,7 @@ url: 'http://localhost:1978/node/webpac2' user: 'admin' passwd: 'admin' + hits_on_page: 100 webpac: db_path: '/data/webpac2/db' @@ -59,12 +61,15 @@ my $est_cfg = $c->config->{hyperestraier}; $est_cfg->{'log'} = $log; + $est_cfg->{encoding} = $est_cfg->{catalyst_encoding}; + $log->debug("using config:" . Dumper($est_cfg) ); $self->{est} = new WebPAC::Search::Estraier( %{ $est_cfg } ); my $db_path = $c->config->{webpac}->{db_path}; my $template_path = $c->config->{webpac}->{template_path}; + $self->{template_path} = $template_path; $log->debug("using db path '$db_path', template path '$template_path'"); @@ -97,22 +102,61 @@ } +=head2 iconv_on_save + + my $out = $m->iconv_on_save( $content ); + +Convert data saved to disk in Webpac encoding. + +=cut + +sub iconv_on_save { + my $self = shift; + + $self->{iconv_save} ||= new Text::Iconv( + $self->config->{webpac}->{out_encoding}, + $self->config->{webpac}->{webpac_encoding}, + ); + + $self->{iconv_save}->convert( @_ ); +} + + +=head2 search + + my $m->search( + phrase => 'query phrase', + template => 'result_template.tt', + add_attr => \@add_attr + ); + +=cut + sub search { - my ( $self, $query, $template ) = @_; + my $self = shift; + + my $args = {@_}; my $log = $self->{log}; - $log->debug("search model query: -->$query<--"); + $log->debug("args: " . Dumper( $args )); + + my $query = $args->{phrase} || $log->warn("no query phrase") && return; - my $template_filename = $template || $self->{template}; + $log->debug("search model query: '$query', add_attr: '" . join("','", @{$args->{add_attr}}) . "'"); + + my $template_filename = $args->{template} || $self->{template}; my @results = $self->{est}->search( - query => $query, - attr => [ '@uri' ], - max => 100, + phrase => $query, + get_attr => [ '@uri' ], + max => ( $self->{est}->{hits_on_page} || 30 ), + add_attr => $args->{add_attr}, ); - $log->debug("loading " . ($#results + 1) . " results"); + my $hits = $#results + 1; + + $log->debug("processing $hits results"); my @html_results; @@ -142,8 +186,56 @@ return \@html_results; } +=head2 save_html - + $m->save_html( '/full/path/to/file', $content ); + +It will use C to convert content encoding back to +Webpac codepage, recode JavaScript Unicode entities (%u1234), +strip extra newlines at beginning and end, and save to +C and if that succeeds, just rename +it over original file which should be atomic on filesystem level. + +=cut + +sub save_html { + my ($self, $path, $content) = @_; + + $content = $self->iconv_on_save( $content ) || die "no content?"; + + sub _conv_js { + my $t = shift || return; + return $self->{iconv}->convert(chr(hex($t))); + } + $content =~ s/%u([a-fA-F0-9]{4})/_conv_js($1)/gex; + $content =~ s/^[\n\r]+//s; + $content =~ s/[\n\r]+$/\n/s; + + write_file($path . '.new', $content) || die "can't save ${path}.new $!"; + rename $path . '.new', $path || die "can't rename to $path: $!"; +} + +=head2 load_html + + my $html = $m->load_html('/full/path/to/file'); + +This will convert file from Webpac encoding to Catalyst and +convert that data to escaped HTML (for sending into +C<<