検索に使用したキーワードをハイライト表示します。
- 2004-04-22 (Thu) 00:17:33 検索ページでの検索結果もハイライト表示するように処理を追加。
- 2004-05-20 (Thu) 21:58:08 日本語を正しくマッチさせるようにして、2バイト以内の文字列もハイライトさせるように修正。
- 2004-05-22 (Sat) 15:32:59 "箸"等を検索した後でInternalServerErrorがでる場合があったので手法を変更。
[highlight search keywords]
CSSに下記のような定義を追加しておいて下さい。
em.keyword { font-weight: bold; background-color: yellow; }
関連するカスタマイズ
グローバル変数定義
検索キーワードをクッキーで保持しています。
キーワードを覚えておく時間を設定します。
my $highlightexpires = '+10m'; # yakty add [highlight search keywords]
日本語を正しくマッチさせるためのEUC文字の定義です。(参考:Perlメモ)
my $EUC_PRE = qr{(?<!\x8F)}; my $EUC_POST = qr{ (?= (?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて (?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端 ) }x;
init_form()内の変更
$form{mymsg} = &code_convert(\$form{mymsg}, $kanjicode); $form{myname} = &code_convert(\$form{myname}, $kanjicode); # yakty add [highlight search keywords] start if($form{mycmd} eq 'search'){ &set_cookie('mysearchwords', $form{mymsg}, expires => $highlightexpires); } # yakty add [highlight search keywords] end
print_content()内の変更
- 2003-09-28 (Sun) 00:04:58 空白文字がキーワードになってしまう問題があったので修正。ついでに"海"とか"箸"とかが日本語の変な部分にマッチしてしまうので、2バイト以内の文字はハイライトしないように変更。
- 2004-01-07 (Wed) 00:01:36 メタ文字のクォートが思ったように機能していなかったので修正。
- 2004-05-20 (Thu) 21:54:35 日本語を正しくマッチさせるようにして2バイト以内の文字列もハイライトするように修正。
- 2004-05-22 (Sat) 15:32:47 "箸"等を検索した後でInternalServerErrorがでる場合があったので手法を変更。
sub print_content { my ($rawcontent) = @_; # print &text_to_html($rawcontent, toc=>1); # Walrus add [part edit] #print &text_to_html($rawcontent, toc=>1, partinfo=>1); # Walrus add [part edit] # yakty del [highlight search keywords] # yakty add [highlight search keywords] start my $content = &text_to_html($rawcontent, toc=>1, partinfo=>1); # Walrus add [part edit] $_ = cookie(-name => 'mysearchwords'); if($_){ s/(?:\x0D\x0A|[\x0D\x0A])?$/ /; my @search_words = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} (/("[^"]*(?:""[^"]*)*"|[^ ]*) /g); #@search_words = grep { length($_) > 2 } @search_words; if(@search_words){ @search_words = map { "(\Q@{[&escape($_)]}\E)" } @search_words; my $highlightkeywords = join("|", @search_words); #$content =~ s|($highlightkeywords)(?![^<]*>)|<em class="keyword">$1</em>|gs; #$content =~ s|\G((?:$EUC_CHAR)*?)($highlightkeywords)(?![^<]*>)|$1<em class="keyword">$2</em>|gs; $content =~ s|$EUC_PRE($highlightkeywords)$EUC_POST(?![^<]*>)|<em class="keyword">$1</em>|gs; } } print $content; # yakty add [highlight search keywords] end }
do_search()内の変更
- 2004-04-22 (Thu) 00:16:53 検索結果もハイライトする。
- 2004-05-20 (Thu) 21:55:57 日本語を正しくマッチさせるようにしたので、2バイト以内の文字列もハイライトするように修正。
$_ = $form{mymsg}; s/(?:\x0D\x0A|[\x0D\x0A])?$/ /; my @search_words = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} (/("[^"]*(?:""[^"]*)*"|[^ ]*) /g); # yakty add [highlight search keywords] start #my @highlight_words = grep { length($_) > 2 } @search_words; my @highlight_words = @search_words; if(@highlight_words){ @highlight_words = map { "(\Q@{[&escape($_)]}\E)" } @highlight_words; } my $highlightkeywords = join("|", @highlight_words); # yakty add [highlight search keywords] end if (@search_words) {
next unless ($list); print "<ul>\n" unless ($counter); #$list =~ s|($highlightkeywords)(?![^<]*>)|<em class="keyword">$1</em>|go if(@highlight_words); # yakty add [highlight search keywords] $list =~ s|\G((?:$EUC_CHAR)*?)($highlightkeywords)(?![^<]*>)|$1<em class="keyword">$2</em>|go if(@highlight_words); # yakty add [highlight search keywords] $list = "<li><b>".&make_link($page)."</b>$list</li>\n"; &code_convert(\$list, $kanjicode); print $list; $counter++;