/[jquery]/no_pager/index.cgi
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /no_pager/index.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (hide annotations)
Sun Aug 27 21:07:16 2006 UTC (17 years, 8 months ago) by dpavlin
File size: 4458 byte(s)
added $self which can be fixed in config
1 dpavlin 2 #!/usr/bin/perl -w
2    
3     use strict;
4    
5     use CGI::Simple;
6 dpavlin 5 use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
7 dpavlin 2 use Search::Estraier;
8 dpavlin 5 use YAML::Syck;
9 dpavlin 15 use JSON::Syck;
10 dpavlin 5 use Data::Dump qw/dump/;
11 dpavlin 2
12     my $q = new CGI::Simple;
13     print qq{Content-type: text/html\n\r\n\r};
14    
15 dpavlin 5 my $config = LoadFile('config.yml');
16    
17 dpavlin 15 my $v = {
18     search => '',
19     hits => 0,
20     page => 0,
21     max_page => 0,
22     time => '',
23     id => time() . rand(99),
24     };
25    
26     my $json;
27    
28 dpavlin 62 my $self = $config->{self} || $q->url();
29    
30 dpavlin 20 sub debug {
31     my ($text,$var) = @_;
32     print "<pre>$text = ", dump($var), "</pre>";
33     }
34 dpavlin 5
35 dpavlin 20 #debug('config', $config);
36    
37 dpavlin 17 sub json {
38     return
39     '<textarea id="json" style="display:none">' .
40     $q->escapeHTML( JSON::Syck::Dump( $v ) ) .
41     '</textarea>';
42     }
43    
44 dpavlin 20 sub sort_order {
45     my $out;
46    
47     my $sort = $q->param('sort');
48    
49     $out .= '<select name="sort" id="sort">';
50    
51     foreach my $s (@{ $config->{estraier}->{order} }) {
52     my ($text,$value) = %{$s};
53     $out .= qq{<option value="$value"} .
54     ( $sort eq $value ? ' selected' : '' ) .
55     qq{>$text</option>};
56     }
57    
58     $out .= '</select>';
59     }
60    
61 dpavlin 15 sub get_results {
62 dpavlin 18 my $p = {@_};
63 dpavlin 2
64 dpavlin 20 my ($search,$page) = ( $p->{search} , $p->{page});
65 dpavlin 18
66     sub next_page {
67     return '<div id="next_page">' .
68     join("\n", @_) . json() . '</div>';
69     }
70    
71 dpavlin 17 if (! $search || $search =~ m/^\s*$/) {
72 dpavlin 15 $v->{status} = 'Enter search query';
73 dpavlin 18 return next_page();
74 dpavlin 15 }
75 dpavlin 2
76 dpavlin 15 if (! $page) {
77     $v->{status} = 'Error: no page number?';
78 dpavlin 18 return next_page();
79 dpavlin 15 }
80 dpavlin 2
81 dpavlin 15 $search = join(" AND ", split(/\s+/, $search)) unless ($search =~ m/(?:AND|OR|\[|\])/);
82 dpavlin 18 $v->{search} = $search;
83 dpavlin 2
84 dpavlin 15 $v->{page} = $page;
85 dpavlin 2
86 dpavlin 15 my $node = new Search::Estraier::Node(%{ $config->{estraier} });
87 dpavlin 2
88 dpavlin 15 my $on_page = 30;
89     my $skip = ( $page - 1 ) * $on_page;
90 dpavlin 2
91 dpavlin 15 my $cond = new Search::Estraier::Condition;
92     $cond->set_phrase( $search );
93 dpavlin 28 $cond->set_max( $on_page * $page ); ## FIXME * $page is needed by hest 1.3.8
94 dpavlin 15 $cond->set_skip( $skip );
95 dpavlin 20 $cond->set_order( $p->{sort} ) if ($p->{sort});
96 dpavlin 2
97 dpavlin 15 my $nres = $node->search($cond, ( $config->{estraier}->{depth} || 0 ) );
98 dpavlin 2
99 dpavlin 15 my $out;
100 dpavlin 2
101 dpavlin 15 if (defined($nres)) {
102 dpavlin 24
103 dpavlin 26 $v->{hits} = $nres->hits;
104     $v->{time} = $nres->hint('TIME');
105    
106     if ($v->{hits} == 0) {
107     $v->{status} = qq{<strong>No results for your search.</strong>};
108     return next_page();
109     } elsif ($nres->doc_num == 0) {
110 dpavlin 24 $v->{status} = qq{<strong>Error getting results for page $page.</strong>};
111     return next_page('<strong>No results found.</strong>');
112     }
113    
114 dpavlin 15 $v->{max_page} = int( ($nres->hits + $on_page - 1) / $on_page );
115    
116     $v->{status} = qq{
117     Got <b>$v->{hits}</b> results for <tt>$v->{search}</tt>
118     in <em>$v->{time} s</em>
119     };
120    
121     sub html_snippet {
122     my $text = shift || return;
123     my $out = '';
124     foreach my $s (split(/[\n\r]{2}/, $text)) {
125     $out .= ' ... ' if ($out);
126     my ($pre,$hit,$post) = split(/\n/,$s,3);
127     $hit =~ s/\t.*$//;
128     $out .=
129     $q->escapeHTML( $pre || '' ) . '<b>' .
130     $q->escapeHTML( $hit || '' ) . '</b>' .
131     $q->escapeHTML( $post || '');
132     }
133     return $out;
134 dpavlin 2 }
135    
136 dpavlin 15 sub attr_regex {
137     my ($rdoc,$attr) = @_;
138     my $text = $rdoc->attr( $attr );
139     return unless defined($text);
140 dpavlin 2
141 dpavlin 15 if (my $r = $config->{estraier}->{attr_regex}->{$attr} ) {
142     my $do = '$text =~ ' . $r . ';';
143     eval $do;
144     if ($@) {
145     warn "eval $do failed: $@\n";
146     }
147 dpavlin 14 }
148 dpavlin 15 return $text;
149 dpavlin 14 }
150    
151 dpavlin 23 my @template;
152     open(my $t, 'result.html') || die "result.html: $!";
153     while(<$t>) {
154     push @template, $_;
155     }
156     close($t);
157    
158 dpavlin 15 # for each document in results
159     for my $i ( 0 ... $nres->doc_num - 1 ) {
160 dpavlin 2
161 dpavlin 15 my $rdoc = $nres->get_doc($i);
162 dpavlin 23 my $uri = attr_regex( $rdoc, '@uri' );
163     my $nr = $skip + $i + 1;
164 dpavlin 2
165 dpavlin 23 map {
166     my $l = $_;
167     $l =~ s/<%(.+?)%>/eval "$1"/ge;
168     $out .= $l;
169     } @template;
170    
171 dpavlin 15 }
172 dpavlin 2
173 dpavlin 15 } else {
174     $out .= 'error: ' . $node->status;
175 dpavlin 2 }
176 dpavlin 15
177 dpavlin 18 if ($v->{page} == $v->{max_page}) {
178 dpavlin 23 $out .= next_page('<br/><strong>All results shown</strong>');
179 dpavlin 18 } else {
180     $out .= next_page(
181 dpavlin 23 '<br/><strong>Loading results...</strong><br/>',
182 dpavlin 18 'If you are using the scroll bar, release the mouse to see more results.'
183     );
184     }
185 dpavlin 15
186 dpavlin 18 return $out;
187    
188 dpavlin 2 }
189    
190 dpavlin 15 if ($q->path_info() eq '/snippet') {
191 dpavlin 2
192 dpavlin 18 print get_results(
193 dpavlin 19 search => $q->param('search') || '',
194     page => $q->param('page') || 0,
195 dpavlin 20 sort => $q->param('sort') || undef,
196 dpavlin 15 );
197 dpavlin 2
198    
199     } else {
200    
201 dpavlin 18 my $get_results = get_results(
202 dpavlin 19 search => $q->param('search') || '',
203 dpavlin 18 page => 1,
204 dpavlin 20 sort => $q->param('sort') || undef,
205 dpavlin 18 );
206 dpavlin 2
207     my $f = $q->path_info;
208     $f =~ s/\W+//g;
209     $f ||= 'search';
210     $f .= '.html';
211     open(my $s, $f) || die "$f: $!";
212     while(<$s>) {
213 dpavlin 4 s/<%(.+?)%>/eval "$1"/ge;
214 dpavlin 2 print;
215     }
216 dpavlin 23 close($s);
217 dpavlin 2
218     }

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26