/[Frey]/trunk/lib/Frey/View/NoPager.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/lib/Frey/View/NoPager.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1133 - (show annotations)
Tue Jun 30 15:10:55 2009 UTC (14 years, 10 months ago) by dpavlin
File size: 5443 byte(s)
make classes immutable and remove moose droppings to make Perl::Critic::Moose happy
1 package Frey::View::NoPager;
2 use Moose;
3
4 extends 'Frey';
5 with 'Frey::Web', 'Frey::Config', 'Frey::jQuery';
6
7 use Search::Estraier;
8 use JSON::Syck;
9 use Data::Dump qw/dump/;
10
11 has search => (
12 documentation => 'Search for',
13 is => 'rw',
14 isa => 'Str',
15 # required => 1,
16 default => '',
17 );
18
19 has 'page' => (
20 documentation => 'display page',
21 is => 'rw',
22 isa => 'Int',
23 default => 1,
24 );
25
26 has 'on_page' => (
27 documentation => 'number of items on page',
28 is => 'rw',
29 isa => 'Int',
30 default => 20,
31 );
32
33 has 'sort' => (
34 is => 'rw',
35 isa => 'Str',
36 default => '',
37 );
38
39 sub results_as_markup {
40 my ($self) = @_;
41
42 my ( $search,$page ) = ( $self->search , $self->page );
43
44 my $v = {
45 search => $search,
46 page => $page,
47 max_page => 0,
48 id => time() . rand(99),
49 };
50
51 sub next_page {
52 my $self = shift;
53 my $v = shift;
54 my $json = $self->html_escape( JSON::Syck::Dump( $v ) );
55
56 my $message = join("\n", @_);
57
58 my $next_page = $v->{page} + 1;
59
60 return qq|
61 <div id="next_page_$next_page">
62 $message
63 <textarea id="json" style="display:none">$json</textarea>
64 </div>
65 |
66 ;
67 }
68
69 if (! $search || $search =~ m/^\s*$/) {
70 $v->{status} = 'Enter search query';
71 return $self->next_page( $v );
72 }
73
74 $search = join(" AND ", split(/\s+/, $search)) unless ($search =~ m/(?:AND|OR|\[|\])/);
75 $v->{search} = $search;
76
77 my $node = new Search::Estraier::Node(%{ $self->config->{estraier} });
78
79 my $on_page = $self->on_page;
80 my $skip = ( $page - 1 ) * $on_page;
81
82 my $cond = new Search::Estraier::Condition;
83 $cond->set_phrase( $search );
84 $cond->set_max( $on_page );
85 $cond->set_skip( $skip );
86 $cond->set_order( $self->sort ) if $self->sort;
87
88 warn "INFO: estraier for '$search' page $page with $on_page items, first $skip";
89
90 my $nres = $node->search($cond, ( $self->config->{estraier}->{depth} || 0 ) );
91
92 my $out = qq|<!-- page $page -->|;
93
94 if (defined($nres)) {
95
96 $v->{hits} = $nres->hits;
97 $v->{time} = $nres->hint('TIME');
98
99 if ($v->{hits} == 0) {
100 $v->{status} = qq{<strong>No results for your search.</strong>};
101 return $self->next_page( $v, qq|<strong>No results found.</strong>| );
102 } elsif ($nres->doc_num == 0) {
103 $v->{status} = qq{<strong>Error getting results for page $page.</strong>};
104 return $self->next_page( $v );
105 }
106
107 $v->{max_page} = int( ($nres->hits + $on_page - 1) / $on_page );
108
109 $v->{status} = qq{
110 Got <b>$v->{hits}</b> results for <tt>$v->{search}</tt>
111 in <em>$v->{time} s</em>
112 };
113
114 sub html_snippet {
115 my $text = shift || return;
116 my $out = '';
117 foreach my $s (split(/[\n\r]{2}/, $text)) {
118 $out .= ' ... ' if ($out);
119 my ($pre,$hit,$post) = split(/\n/,$s,3);
120 $hit =~ s/\t.*$//;
121 $out
122 .= $self->html_escape( $pre )
123 . '<b>'
124 . $self->html_escape( $hit )
125 . '</b>'
126 . $self->html_escape( $post )
127 ;
128 }
129 return $out;
130 }
131
132 sub attr_regex {
133 my ($rdoc,$attr) = @_;
134 my $text = $rdoc->attr( $attr );
135 return unless defined($text);
136
137 if (my $r = $self->config->{estraier}->{attr_regex}->{$attr} ) {
138 my $do = '$text =~ ' . $r . ';';
139 eval $do;
140 if ($@) {
141 warn "eval $do failed: $@\n";
142 }
143 }
144 return $text;
145 }
146
147 my $result = q|
148 <div class="result">
149 <span class="nr"><% $nr %></span>
150 <h1 title="<% $nr %>"><% attr_regex( $rdoc, '@title' ) %></h1>
151 <p>
152 <% html_snippet( $rdoc->snippet ) %>
153 </p>
154 <strong><% attr_regex( $rdoc, 'source' ) %></strong>
155 <em>
156 <% attr_regex( $rdoc, '@size' ) %> bytes
157 </em>
158 <% attr_regex( $rdoc, '@mdate' ) %>
159 <br/><a href="<% $uri %>"><tt><% $uri %></tt></a>
160 </div>
161 |;
162
163 my @result = split(/\n/, $result);
164 warn "# result template has ", $#result + 1, " lines";
165
166 # for each document in results
167 for my $i ( 0 ... $nres->doc_num - 1 ) {
168
169 my $rdoc = $nres->get_doc($i);
170 my $uri = attr_regex( $rdoc, '@uri' );
171 my $nr = $skip + $i + 1;
172
173 map {
174 my $l = $_;
175 $l =~ s/<%(.+?)%>/eval "$1"/ge;
176 $out .= $l;
177 } @result;
178
179 }
180
181 } else {
182 $out .= 'error: ' . $node->status;
183 }
184
185 if ($v->{page} == $v->{max_page}) {
186 $out .= $self->next_page( $v, qq|<br/><strong>All results shown</strong>|);
187 } else {
188 $out .= $self->next_page( $v, qq|
189 <br/><strong>Loading results...</strong>
190 <br/>If you are using the scroll bar, release the mouse to see more results.
191 |);
192 }
193
194 warn "# v = ", dump( $v );
195
196 return ( $out, $v->{status} ) if wantarray;
197
198 $self->wrap_in_page( 0 ); # disable <body> and status bar for ajax call
199 return $out;
200
201 }
202
203 sub as_markup {
204 my ($self) = @_;
205
206 $self->add_css('static/Frey/View/NoPager.css');
207 $self->add_js ('static/Frey/View/NoPager.js');
208
209 $self->add_js(q|
210 $(document).ready( function() {
211 $.log.info('hook onchange to #search_form' );
212 $('#search_form').change( function() {
213 //logDebug('submit #search_form');
214 this.submit();
215 });
216 });
217 |);
218
219 my ( $results, $status ) = $self->results_as_markup;
220
221 $self->add_css(q|
222 #results {
223 margin-top: 3em;
224 margin-bottom: 3em;
225 }
226 |);
227
228 my $html = join("\n",
229 qq|
230 <div id="search_form_div">
231 <form id="search_form" method="get">
232
233 <input autocomplete="off" name="search" type="input" value="|, $self->search, qq|">
234 |, $self->sort, qq|
235 <input type="submit" class="submit" value="search">
236
237 <span id="status" class="note">
238 $status
239 </span>
240
241 </form>
242 </div>
243
244 <div id="results">
245 <!-- Dynamic Content -->
246 $results
247 </div>
248
249 |
250 );
251
252 return $html;
253 }
254
255 __PACKAGE__->meta->make_immutable;
256 no Moose;
257
258 1;

  ViewVC Help
Powered by ViewVC 1.1.26