Changeset 94 for tagwire/trunk/tagwire.pl
- Timestamp:
- 06/23/05 19:28:42 (4 years ago)
- Files:
-
- 1 modified
-
tagwire/trunk/tagwire.pl (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tagwire/trunk/tagwire.pl
r93 r94 13 13 use MT::Template::Context; 14 14 15 # DEBUG 16 my $FORCE_PD_REFRESH = 0; 17 my $ENABLE_PD_INDEXES = 1; 18 my $ENABLE_REQ_CACHE = 1; 19 15 20 my $plugin; 16 21 eval { … … 24 29 25 30 if (MT->can('add_callback')) { 26 my $mt = MT->instance;27 MT->add_callback((ref $mt eq 'MT::App::CMS' ? 'AppPostEntrySave' : 'MT::Entry::post_save'),28 10, $plugin, \&update_indexes);29 } 30 31 my $FORCE_REFRESH = 0; 32 sub update_indexes { 31 my $mt = MT->instance; 32 MT->add_callback((ref $mt eq 'MT::App::CMS' ? 'AppPostEntrySave' : 'MT::Entry::post_save'), 33 10, $plugin, \&update_pd_indexes); 34 } 35 36 sub update_pd_indexes { 37 return unless $ENABLE_PD_INDEXES && $plugin; 33 38 my ($eh, $app, $entry) = @_; 34 return unless $plugin;35 39 require MT::Entry; 36 40 my $blog_id = $entry->blog_id; … … 40 44 my (%eindex, %tindex); 41 45 my $data; 42 if (!$pd || $FORCE_ REFRESH) {46 if (!$pd || $FORCE_PD_REFRESH) { 43 47 $pd = new MT::PluginData(); 44 48 $pd->plugin($plugin->name); … … 78 82 MT::Template::Context->add_tag('TagsTotal' => \&tags_total); 79 83 MT::Template::Context->add_tag('TagsTotalSum' => \&tags_total_sum); 80 MT::Template::Context->add_container_tag('EntriesWith Keywords' => \&entries_with_keywords);84 MT::Template::Context->add_container_tag('EntriesWithTags' => \&entries); 81 85 MT::Template::Context->add_container_tag('MostRelatedEntries' => \&most_related_entries); 82 86 83 # For compatibility (this plugin formely named AllKeywords Plugin)87 # For compatibility (this plugin was formerly named 'AllKeywords') 84 88 MT::Template::Context->add_container_tag('AllKeywords' => \&tags); 85 89 MT::Template::Context->add_container_tag('EntryAllKeywords' => \&entry_tags); … … 88 92 MT::Template::Context->add_tag('AllKeywordsTotal' => \&tags_total); 89 93 MT::Template::Context->add_tag('AllKeywordsTotalSum' => \&tags_total_sum); 94 MT::Template::Context->add_container_tag('EntriesWithKeywords' => \&entries); 90 95 91 96 sub split_args { … … 131 136 132 137 use MT::Request; 133 sub get_pdata { 134 return undef unless $plugin; 135 my ($blog_id) = @_; 136 my $r = MT::Request->instance; 137 my $cache = $r->cache('Tagwire::Cache'); 138 return $cache->{data} if $cache && ($cache->{blog_id} == $blog_id); 139 $r->cache('Tagwire::Cache', undef); 140 138 sub get_pd_indexes { 139 return unless $ENABLE_PD_INDEXES && $plugin; 140 my $blog_id = $_[0] or return; 141 my ($r, $cname); 142 if ($ENABLE_REQ_CACHE) { 143 $r = MT::Request->instance; 144 $cname = 'Tagwire::Cache::' . $blog_id; 145 return $r->cache($cname) if defined $r->cache($cname); 146 $r->cache($cname, undef); 147 } 141 148 my $data; 142 149 eval { … … 146 153 $data = $pd->data() if $pd; 147 154 }; 148 if ($data) { 149 $cache->{blog_id} = $blog_id; 150 $cache->{data} = $data; 151 $r->cache('Tagwire::Cache', $cache); 152 } 155 $r->cache($cname, $data) if $ENABLE_REQ_CACHE && $data; 156 $data; 157 } 158 159 sub get_db_indexes { 160 my $blog_id = $_[0] or return; 161 my ($r, $cname); 162 if ($ENABLE_REQ_CACHE) { 163 $r = MT::Request->instance; 164 $cname = 'Tagwire::Cache::' . $blog_id; 165 return $r->cache($cname) if defined $r->cache($cname); 166 $r->cache($cname, undef); 167 } 168 my $data; 169 my (%eindex, %tindex); 170 my $iter = MT::Entry->load_iter({ blog_id => $blog_id, 171 status => MT::Entry::RELEASE() }); 172 while (my $e = $iter->()) { 173 my @tags = split_tags($e->keywords, 1) or next; 174 $eindex{$e->id} = { tags => \@tags, 175 created_on => $e->created_on }; 176 } 177 foreach my $eid (keys %eindex) { 178 map { push @{$tindex{$_}}, $eid } @{$eindex{$eid}->{tags}}; 179 } 180 $data->{eindex} = \%eindex; 181 $data->{tindex} = \%tindex; 182 $r->cache($cname, $data) if $ENABLE_REQ_CACHE; 153 183 $data; 154 184 } … … 158 188 159 189 # sort_by option (tag/tag-case/count, default = tag) 160 my $sort_by = $args->{sort_by} || ' keyword';190 my $sort_by = $args->{sort_by} || 'tag'; 161 191 # sort_order option (ascend/descend, default = ascend) 162 192 my $sort_order = $args->{sort_order} || 'ascend'; … … 170 200 my %tags = (); 171 201 172 my $data = get_pd ata($blog_id);202 my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 173 203 if ($data) { 174 204 my %tindex = %{$data->{tindex}}; … … 234 264 my ($ctx, $args, $cond) = @_; 235 265 my $e = $ctx->stash('entry') 236 or return $ctx->_no_entry_error('MT EntryTas');266 or return $ctx->_no_entry_error('MT' . $ctx->stash('tag')); 237 267 return '' unless $e->keywords; 238 268 … … 276 306 } 277 307 278 sub entries _with_keywords{308 sub entries { 279 309 my ($ctx, $args, $cond) = @_; 280 310 281 # keywords option (must be specified)282 my $ keywords =$args->{keywords} or return '';311 # tags(keywords) option (REQUIRED) 312 my $search = $args->{tags} || $args->{keywords} or return ''; 283 313 # delimiter option (default = space characters) 284 314 my $delimiter = $args->{delimiter} || ''; … … 288 318 # sort_by option (title/status/created_on/modified_on/author_id/excerpt, default = created_on) 289 319 my $sort_by = $args->{sort_by} || 'created_on'; 290 # sort_order option (ascend/descend, default = ascend)320 # sort_order option (ascend/descend, default = descend) 291 321 my $sort_order = $args->{sort_order} || 'descend'; 292 322 # lastn option (default = 0, no cutoff) … … 295 325 my $blog_id = $ctx->stash('blog_id'); 296 326 my @entries; 297 my @patterns = split_args($ keywords, $delimiter, $case_sensitive);298 299 my $data = get_pd ata($blog_id);327 my @patterns = split_args($search, $delimiter, $case_sensitive); 328 329 my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 300 330 if ($data) { 301 331 my %tindex = %{$data->{tindex}}; … … 305 335 foreach my $tag (@patterns) { 306 336 foreach my $eid (@{$tindex{$tag}}) { 307 $match{$eid} = exists $match{$eid} ? 308 $match{$eid} + 1 : 1; 337 $match{$eid} = exists $match{$eid} ? $match{$eid} + 1 : 1; 309 338 } 310 339 } 311 340 } else { 312 341 foreach my $tag (@patterns) { 313 foreach my $mtag (grep { lc $_ ==$tag } keys %tindex) {342 foreach my $mtag (grep { lc $_ eq $tag } keys %tindex) { 314 343 foreach my $eid (@{$tindex{$mtag}}) { 315 $match{$eid} = exists $match{$eid} ? 316 $match{$eid} + 1 : 1; 344 $match{$eid} = exists $match{$eid} ? $match{$eid} + 1 : 1; 317 345 } 318 346 } … … 322 350 my @eids = grep { $match{$_} == $count } keys %match or return; 323 351 @eids = sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids; 352 @eids = $sort_order eq 'descend' ? 353 sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids : 354 sort { $eindex{$a}->{created_on} <=> $eindex{$b}->{created_on} } @eids; 324 355 require MT::Entry; 325 356 map { push @entries, MT::Entry->load($_) } @eids; 326 # The above code is sticked to "created_on" , "descend".357 # The above code is sticked to "created_on". 327 358 } else { 328 359 require MT::Entry; … … 378 409 my ($ctx, $args, $cond) = @_; 379 410 my $entry = $ctx->stash('entry') 380 or return $ctx->_no_entry_error('MT MostRelatedEntries');411 or return $ctx->_no_entry_error('MT' . $ctx->stash('tag')); 381 412 return '' unless $entry->keywords; 382 413 … … 394 425 my %match = (); 395 426 396 my $data = get_pd ata($blog_id);427 my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 397 428 if ($data) { 398 429 my %tindex = %{$data->{tindex}}; … … 409 440 } else { 410 441 foreach my $tag (@patterns) { 411 foreach my $mtag (grep { lc $_ ==$tag } keys %tindex) {442 foreach my $mtag (grep { lc $_ eq $tag } keys %tindex) { 412 443 foreach my $eid (@{$tindex{$mtag}}) { 413 444 next if $eid == $entry->id; … … 492 523 my $args = shift; 493 524 require MT::Entry; 494 my $blog_id = $args->{blog_id} or 495 MT->error('A Blog ID is required.'); 525 my $blog_id = $args->{blog_id} or MT->error('Blog ID is required.'); 496 526 my $sort_by = $args->{sort_by} || 'created_on'; 497 527 my $sort_order = $args->{sort_order} || 'descend'; … … 503 533 my @patterns = split_args($args->{search}, $delimiter, $case_sensitive); 504 534 505 my $data = get_pd ata($blog_id);535 my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 506 536 if ($data) { 507 537 my %tindex = %{$data->{tindex}}; … … 517 547 } else { 518 548 foreach my $tag (@patterns) { 519 foreach my $mtag (grep { lc $_ ==$tag } keys %tindex) {549 foreach my $mtag (grep { lc $_ eq $tag } keys %tindex) { 520 550 foreach my $eid (@{$tindex{$mtag}}) { 521 551 $match{$eid} = exists $match{$eid} ? … … 528 558 my @eids = grep { $match{$_} == $count } keys %match 529 559 or return; 530 @eids = sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids; 560 @eids = $sort_order eq 'descend' ? 561 sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids : 562 sort { $eindex{$a}->{created_on} <=> $eindex{$b}->{created_on} } @eids; 531 563 require MT::Entry; 532 564 map { push @results, MT::Entry->load($_) } @eids; 533 # The above code is sticked to "created_on" , "descend".565 # The above code is sticked to "created_on". 534 566 } else { 535 567 my $iter = MT::Entry->load_iter({ blog_id => $blog_id,
![(please configure the [header_logo] section in trac.ini)](/public/chrome/common/trac_banner.png)