/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1133 - (hide 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 dpavlin 763 package Frey::View::NoPager;
2     use Moose;
3    
4     extends 'Frey';
5 dpavlin 1133 with 'Frey::Web', 'Frey::Config', 'Frey::jQuery';
6 dpavlin 763
7     use Search::Estraier;
8     use JSON::Syck;
9     use Data::Dump qw/dump/;
10    
11     has search => (
12 dpavlin 963 documentation => 'Search for',
13 dpavlin 763 is => 'rw',
14     isa => 'Str',
15 dpavlin 957 # required => 1,
16 dpavlin 765 default => '',
17 dpavlin 763 );
18    
19 dpavlin 963 has 'page' => (
20     documentation => 'display page',
21 dpavlin 765 is => 'rw',
22 dpavlin 843 isa => 'Int',
23     default => 1,
24 dpavlin 765 );
25    
26 dpavlin 963 has 'on_page' => (
27 dpavlin 966 documentation => 'number of items on page',
28 dpavlin 963 is => 'rw',
29     isa => 'Int',
30 dpavlin 966 default => 20,
31 dpavlin 963 );
32    
33 dpavlin 843 has 'sort' => (
34 dpavlin 765 is => 'rw',
35 dpavlin 843 isa => 'Str',
36 dpavlin 963 default => '',
37 dpavlin 765 );
38    
39     sub results_as_markup {
40 dpavlin 957 my ($self) = @_;
41 dpavlin 763
42 dpavlin 963 my ( $search,$page ) = ( $self->search , $self->page );
43 dpavlin 763
44 dpavlin 963 my $v = {
45     search => $search,
46     page => $page,
47 dpavlin 966 max_page => 0,
48 dpavlin 963 id => time() . rand(99),
49     };
50    
51 dpavlin 763 sub next_page {
52 dpavlin 957 my $self = shift;
53 dpavlin 966 my $v = shift;
54 dpavlin 963 my $json = $self->html_escape( JSON::Syck::Dump( $v ) );
55    
56     my $message = join("\n", @_);
57    
58 dpavlin 966 my $next_page = $v->{page} + 1;
59    
60 dpavlin 963 return qq|
61 dpavlin 966 <div id="next_page_$next_page">
62 dpavlin 963 $message
63 dpavlin 966 <textarea id="json" style="display:none">$json</textarea>
64 dpavlin 963 </div>
65     |
66     ;
67 dpavlin 763 }
68    
69     if (! $search || $search =~ m/^\s*$/) {
70     $v->{status} = 'Enter search query';
71 dpavlin 966 return $self->next_page( $v );
72 dpavlin 763 }
73    
74     $search = join(" AND ", split(/\s+/, $search)) unless ($search =~ m/(?:AND|OR|\[|\])/);
75 dpavlin 966 $v->{search} = $search;
76 dpavlin 763
77 dpavlin 765 my $node = new Search::Estraier::Node(%{ $self->config->{estraier} });
78 dpavlin 763
79 dpavlin 963 my $on_page = $self->on_page;
80 dpavlin 763 my $skip = ( $page - 1 ) * $on_page;
81    
82     my $cond = new Search::Estraier::Condition;
83     $cond->set_phrase( $search );
84 dpavlin 966 $cond->set_max( $on_page );
85 dpavlin 763 $cond->set_skip( $skip );
86 dpavlin 843 $cond->set_order( $self->sort ) if $self->sort;
87 dpavlin 763
88 dpavlin 963 warn "INFO: estraier for '$search' page $page with $on_page items, first $skip";
89    
90 dpavlin 765 my $nres = $node->search($cond, ( $self->config->{estraier}->{depth} || 0 ) );
91 dpavlin 763
92 dpavlin 966 my $out = qq|<!-- page $page -->|;
93 dpavlin 763
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 dpavlin 966 return $self->next_page( $v, qq|<strong>No results found.</strong>| );
102 dpavlin 763 } elsif ($nres->doc_num == 0) {
103     $v->{status} = qq{<strong>Error getting results for page $page.</strong>};
104 dpavlin 966 return $self->next_page( $v );
105 dpavlin 763 }
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 dpavlin 765 $out
122     .= $self->html_escape( $pre )
123     . '<b>'
124     . $self->html_escape( $hit )
125     . '</b>'
126     . $self->html_escape( $post )
127     ;
128 dpavlin 763 }
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 dpavlin 765 if (my $r = $self->config->{estraier}->{attr_regex}->{$attr} ) {
138 dpavlin 763 my $do = '$text =~ ' . $r . ';';
139     eval $do;
140     if ($@) {
141     warn "eval $do failed: $@\n";
142     }
143     }
144     return $text;
145     }
146    
147 dpavlin 957 my $result = q|
148     <div class="result">
149 dpavlin 966 <span class="nr"><% $nr %></span>
150     <h1 title="<% $nr %>"><% attr_regex( $rdoc, '@title' ) %></h1>
151 dpavlin 957 <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 dpavlin 763
163 dpavlin 957 my @result = split(/\n/, $result);
164     warn "# result template has ", $#result + 1, " lines";
165    
166 dpavlin 763 # 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 dpavlin 957 } @result;
178 dpavlin 763
179     }
180    
181     } else {
182     $out .= 'error: ' . $node->status;
183     }
184    
185     if ($v->{page} == $v->{max_page}) {
186 dpavlin 966 $out .= $self->next_page( $v, qq|<br/><strong>All results shown</strong>|);
187 dpavlin 763 } else {
188 dpavlin 966 $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 dpavlin 763 }
193    
194 dpavlin 963 warn "# v = ", dump( $v );
195 dpavlin 957
196 dpavlin 963 return ( $out, $v->{status} ) if wantarray;
197    
198     $self->wrap_in_page( 0 ); # disable <body> and status bar for ajax call
199 dpavlin 763 return $out;
200    
201     }
202    
203     sub as_markup {
204     my ($self) = @_;
205    
206 dpavlin 957 $self->add_css('static/Frey/View/NoPager.css');
207     $self->add_js ('static/Frey/View/NoPager.js');
208 dpavlin 763
209 dpavlin 858 $self->add_js(q|
210     $(document).ready( function() {
211     $.log.info('hook onchange to #search_form' );
212     $('#search_form').change( function() {
213 dpavlin 763 //logDebug('submit #search_form');
214     this.submit();
215     });
216     });
217     |);
218    
219 dpavlin 963 my ( $results, $status ) = $self->results_as_markup;
220    
221 dpavlin 966 $self->add_css(q|
222     #results {
223     margin-top: 3em;
224     margin-bottom: 3em;
225     }
226     |);
227    
228 dpavlin 957 my $html = join("\n",
229     qq|
230 dpavlin 763 <div id="search_form_div">
231     <form id="search_form" method="get">
232    
233 dpavlin 957 <input autocomplete="off" name="search" type="input" value="|, $self->search, qq|">
234     |, $self->sort, qq|
235     <input type="submit" class="submit" value="search">
236 dpavlin 763
237 dpavlin 957 <span id="status" class="note">
238 dpavlin 963 $status
239 dpavlin 957 </span>
240 dpavlin 763
241 dpavlin 957 </form>
242     </div>
243    
244 dpavlin 966 <div id="results">
245 dpavlin 763 <!-- Dynamic Content -->
246 dpavlin 963 $results
247 dpavlin 763 </div>
248    
249 dpavlin 957 |
250     );
251    
252     return $html;
253 dpavlin 763 }
254    
255 dpavlin 1133 __PACKAGE__->meta->make_immutable;
256     no Moose;
257    
258 dpavlin 763 1;

  ViewVC Help
Powered by ViewVC 1.1.26