/[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 15 - (hide annotations)
Wed Aug 16 21:34:37 2006 UTC (17 years, 8 months ago) by dpavlin
File size: 3152 byte(s)
another major refactor:

- generate json object from perl $v which is updated on every request
- pages now start with 1
- we now generate just 4 cookies, not milions
- first page is now serverd from server, and not via ajax request
- various other tweaks
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 5 #warn "config = ", dump($config);
29    
30 dpavlin 15 sub get_results {
31     my ($search, $page) = @_;
32 dpavlin 2
33 dpavlin 15 if (! $search) {
34     $v->{status} = 'Enter search query';
35     return;
36     }
37 dpavlin 2
38 dpavlin 15 if (! $page) {
39     $v->{status} = 'Error: no page number?';
40     return;
41     }
42 dpavlin 2
43 dpavlin 15 $search = join(" AND ", split(/\s+/, $search)) unless ($search =~ m/(?:AND|OR|\[|\])/);
44     $v->{search} = $search || '';
45 dpavlin 2
46 dpavlin 15 $v->{page} = $page;
47 dpavlin 2
48 dpavlin 15 my $node = new Search::Estraier::Node(%{ $config->{estraier} });
49 dpavlin 2
50 dpavlin 15 my $on_page = 30;
51     my $skip = ( $page - 1 ) * $on_page;
52 dpavlin 2
53 dpavlin 15 my $cond = new Search::Estraier::Condition;
54     $cond->set_phrase( $search );
55     $cond->set_max( $on_page );
56     $cond->set_skip( $skip );
57 dpavlin 2
58 dpavlin 15 my $nres = $node->search($cond, ( $config->{estraier}->{depth} || 0 ) );
59 dpavlin 2
60 dpavlin 15 my $out;
61 dpavlin 2
62 dpavlin 15 if (defined($nres)) {
63     $v->{hits} = $nres->hits;
64     $v->{time} = $nres->hint('TIME');
65     $v->{max_page} = int( ($nres->hits + $on_page - 1) / $on_page );
66    
67     $v->{status} = qq{
68     Got <b>$v->{hits}</b> results for <tt>$v->{search}</tt>
69     in <em>$v->{time} s</em>
70     };
71    
72     sub html_snippet {
73     my $text = shift || return;
74     my $out = '';
75     foreach my $s (split(/[\n\r]{2}/, $text)) {
76     $out .= ' ... ' if ($out);
77     my ($pre,$hit,$post) = split(/\n/,$s,3);
78     $hit =~ s/\t.*$//;
79     $out .=
80     $q->escapeHTML( $pre || '' ) . '<b>' .
81     $q->escapeHTML( $hit || '' ) . '</b>' .
82     $q->escapeHTML( $post || '');
83     }
84     return $out;
85 dpavlin 2 }
86    
87 dpavlin 15 sub attr_regex {
88     my ($rdoc,$attr) = @_;
89     my $text = $rdoc->attr( $attr );
90     return unless defined($text);
91 dpavlin 2
92 dpavlin 15 if (my $r = $config->{estraier}->{attr_regex}->{$attr} ) {
93     my $do = '$text =~ ' . $r . ';';
94     eval $do;
95     if ($@) {
96     warn "eval $do failed: $@\n";
97     }
98 dpavlin 14 }
99 dpavlin 15 return $text;
100 dpavlin 14 }
101    
102 dpavlin 15 # for each document in results
103     for my $i ( 0 ... $nres->doc_num - 1 ) {
104 dpavlin 2
105 dpavlin 15 my $rdoc = $nres->get_doc($i);
106 dpavlin 2
107 dpavlin 15 $out .= '<div class="item">' .
108     '<h1>' . $rdoc->attr('@title') . '</h1>' .
109     '<p>' . html_snippet( $rdoc->snippet ) . '</p>' .
110     '<h2>' . attr_regex( $rdoc, 'source' ) . '</h2>';
111     my $uri = attr_regex( $rdoc, '@uri' );
112     $out .=
113     qq{<a href="$uri"><tt>$uri</tt></a> } .
114     attr_regex( $rdoc, '@mdate' ) .
115     ' [' . ( $skip + $i + 1 ) . ']';
116     }
117 dpavlin 2
118 dpavlin 15 } else {
119     $out .= 'error: ' . $node->status;
120 dpavlin 2 }
121 dpavlin 15
122     $json = '<textarea id="json" style="display:none">' .
123     $q->escapeHTML( JSON::Syck::Dump( $v ) ) .
124     '</textarea>';
125    
126     return ($out,$json);
127    
128 dpavlin 2 }
129    
130 dpavlin 15 if ($q->path_info() eq '/snippet') {
131 dpavlin 2
132 dpavlin 15 print join("\n<!-- json data -->",
133     get_results(
134     $q->param('search'),
135     $q->param('page'),
136     )
137     );
138 dpavlin 2
139    
140     } else {
141    
142 dpavlin 15 my ($get_results, $json) = get_results( $q->param('search'), 1 );
143 dpavlin 2
144     my $f = $q->path_info;
145     $f =~ s/\W+//g;
146     $f ||= 'search';
147     $f .= '.html';
148     open(my $s, $f) || die "$f: $!";
149     while(<$s>) {
150 dpavlin 4 s/<%(.+?)%>/eval "$1"/ge;
151 dpavlin 2 print;
152     }
153     close($f);
154    
155     }

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26