Changeset 85

Show
Ignore:
Timestamp:
06/16/05 12:33:16 (3 years ago)
Author:
ogawa
Message:

Support much more patterns of multiple keywords.
Now MTAllKeywords and MTEntryAllKeywords doesn't require "delimiter" options (they would be ignored if specified).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • all-keywords/trunk/all-keywords.pl

    r83 r85  
    11# A plugin for adding keywords-handling tags 
    22# 
    3 # Release 0.13 (Jun 11, 2005) 
     3# $Id$ 
    44# 
    55# This software is provided as-is. You may use it for commercial or  
     
    2222}; 
    2323 
     24#if (MT->can('add_callback')) { 
     25#  my $mt = MT->instance; 
     26#  MT->add_callback((ref $mt eq 'MT::App::CMS' ? 'AppPostEntrySave' : 'MT::Entry::post_save'), 
     27#                  10, $plugin, \&update_entry_tags); 
     28#} 
     29 
    2430MT::Template::Context->add_container_tag('AllKeywords' => \&all_keywords); 
    2531MT::Template::Context->add_container_tag('EntryAllKeywords' => \&entry_all_keywords); 
     
    3137MT::Template::Context->add_container_tag('MostRelatedEntries' => \&most_related_entries); 
    3238 
    33 sub split_keywords { 
     39sub split_args { 
    3440    my ($string, $delimiter, $case_sensitive) = @_; 
    3541    return unless $string; 
    3642    my @keywords; 
    37     $string =~ s/^\s+//; 
    38     $string =~ s/\s+$//; 
     43    $string =~ s/(^\s+|\s+$)//g; 
    3944    $string = lc $string unless $case_sensitive; 
    40     return $delimiter ? 
    41         map { s/^\s+//; s/\s+$//; $_ } split($delimiter, $string) : 
    42         split(/\s+/, $string); 
     45 
     46    return split(/\s+/, $string) unless $delimiter; 
     47 
     48    foreach my $keyword (split($delimiter, $string)) { 
     49        $keyword =~ s/(^\s+|\s+$)//g; 
     50        push @keywords, $keyword if $keyword; 
     51    } 
     52    @keywords; 
     53
     54 
     55sub split_keywords { 
     56    my ($string, $case_sensitive) = @_; 
     57    return unless $string; 
     58    my @keywords; 
     59    $string =~ s/(^\s+|\s+$)//g; 
     60    $string = lc $string unless $case_sensitive; 
     61 
     62    # keywords w/o whitespaces 
     63    return split(/\s+/, $string) unless $string =~ m/[[]"';,|]?/; 
     64 
     65    # keywords w/ whitespaces 
     66    while ($string =~ m/(\[[^]]+\]|"[^"]+"|'[^']+'|[^;,|]+)/g) { 
     67        my $keyword = $1; 
     68        $keyword =~ s/(^[\["'\s;,|]+|[\]"'\s;,|]+$)//g; 
     69        push @keywords, $keyword if $keyword; 
     70    } 
     71    @keywords; 
    4372} 
    4473 
     
    5281    # lastn option (default = 0, no cutoff) 
    5382    my $lastn = $args->{lastn} || 0; 
    54     # delimiter option (default = space characters) 
    55     my $delimiter = $args->{delimiter} || ''; 
    5683    # case_sensitive option (0/1, default = 1) 
    5784    my $case_sensitive = defined $args->{case_sensitive} ? 
     
    6592    while (my $e = $iter->()) { 
    6693        next unless $e->keywords; 
    67         my @keywords = split_keywords($e->keywords, $delimiter, $case_sensitive); 
     94        my @keywords = split_keywords($e->keywords, $case_sensitive); 
    6895        foreach my $keyword (@keywords) { 
    6996            if (exists($all_keywords{$keyword})) { 
     
    121148    return '' unless $e->keywords; 
    122149 
    123     # delimiter option (default = space characters) 
    124     my $delimiter = $args->{delimiter} || ''; 
    125150    # case_sensitive option (0/1, default = 1) 
    126151    my $case_sensitive = defined $args->{case_sensitive} ? 
    127152        $args->{case_sensitive} : 1; 
    128153 
    129     my @keywords = split_keywords($e->keywords, $delimiter, $case_sensitive); 
     154    my @keywords = split_keywords($e->keywords, $case_sensitive); 
    130155    my $total = scalar(@keywords); 
    131156    $ctx->stash('all_keywords_total', $total); 
     
    185210                                      direction => $sort_order }); 
    186211    my @entries; 
    187     my @patterns = split_keywords($keywords, $delimiter, $case_sensitive); 
     212    my @patterns = split_args($keywords, $delimiter, $case_sensitive); 
    188213    my $i = 0; 
    189214    while (my $e = $iter->()) { 
    190215        last if $lastn && $i >= $lastn; 
    191216        next unless $e->keywords; 
    192         my @keywords = split_keywords($e->keywords, $delimiter, $case_sensitive); 
     217        my @keywords = split_keywords($e->keywords, $case_sensitive); 
    193218        my $check = 1; 
    194219        foreach my $pattern (@patterns) { 
     
    235260    return '' unless $entry->keywords; 
    236261 
    237     # delimiter option (default = space characters) 
    238     my $delimiter = $args->{delimiter} || ''; 
    239262    # case_sensitive option (0/1, default = 0) 
    240263    my $case_sensitive = $args->{case_sensitive} || 0; 
     
    242265    my $lastn = $args->{lastn} || 0; 
    243266 
    244     my @patterns = split_keywords($entry->keywords, $delimiter, $case_sensitive); 
     267    my @patterns = split_keywords($entry->keywords, $case_sensitive); 
    245268 
    246269    my $blog_id = $ctx->stash('blog_id'); 
     
    255278        next unless $e->keywords; 
    256279        next if $e->id == $entry->id; 
    257         my @keywords = split_keywords($e->keywords, $delimiter, $case_sensitive); 
     280        my @keywords = split_keywords($e->keywords, $case_sensitive); 
    258281        my $count = 0; 
    259282        foreach my $pattern (@patterns) { 
     
    294317} 
    295318 
    296 eval("use MT::XSearch;"); 
    297 if (!$@) { 
     319eval { 
     320    require MT::XSearch; 
    298321    MT::XSearch->add_search_plugin('AllKeywords', { 
    299322        label => 'Keyword Search', 
     
    301324        on_execute => \&xsearch_on_execute, 
    302325        on_stash => \&xsearch_on_stash }); 
    303 } 
     326}; 
    304327 
    305328sub xsearch_on_stash { 
     
    319342    my $case_sensitive = $args->{case_sensitive} || 0; 
    320343 
    321     my @patterns = split_keywords($args->{search}, $delimiter, $case_sensitive); 
     344    my @patterns = split_args($args->{search}, $delimiter, $case_sensitive); 
    322345    my $iter = MT::Entry->load_iter({ blog_id => $blog_id, 
    323346                                      status => MT::Entry::RELEASE() }, 
     
    327350    while (my $e = $iter->()) { 
    328351        next unless $e->keywords; 
    329         my @keywords = split_keywords($e->keywords, $delimiter, $case_sensitive); 
     352        my @keywords = split_keywords($e->keywords, $case_sensitive); 
    330353        my $check = 1; 
    331354        foreach my $pattern (@patterns) {