KENT-WEB サポートコーナー 過去ログ [ 0080 ]


記事No: 15917
投稿日: 2018/06/15(Fri) 13:57:27
タイトルKEY SEARCHにて該当ページでハイライト表示 一部修正
ID情報: teketen
投稿者: てけてん

※2018年6月26日 バージョンアップしました。
検索語が「span」「class」「mark」だった場合に、ハイライト用の<span>タグも検索対象にするバグを修正しました。
この修正に伴い、半角の"と=及び半角数字の1〜5は、検索してもハイライト表示になりません。
これは、仕様です。


KEY SEARCHで検索したページにて、Googleのキャッシュのように、検索語句をハイライト表示する補助スクリプトです。
どなたでも、ご自由にお使い下さい。

スクリプトは、#!/usr/bin/perlから__END__までです。
必ず、最初の行が

#!/usr/bin/perl

になるようにして下さい(ご利用のサーバーのPerlのパスに変更して下さい)。
最後の行は、
__END__
です。最後に改行を入れても構いません。
ファイル名は何でも構いませんが、取り敢えず、highlight.cgiとでも名前をつけて、eucの文字コードで保存して下さい。
設置方法などは、スクリプト内のReadmeをお読み下さい。

これより以下がスクリプトとなります。
--------------------------------------------

#!/usr/bin/perl

# KEY SEARCH用 ハイライト表示スクリプト[ Highlight ] highlight.cgi
# このスクリプトは、KEY SEARCHで検索したページで、Googleのキャッシュのように検索語句をハイライト表示するスクリプトです。
# 必ずksearch.cgiと同じ階層(場所)に設置して下さい。
# また、Encode.pmを使用しているため、Perl5.8以上でないと動作しません。
# 改造・転用・再配布等ご自由にどうぞ。
# このスクリプトは、必ずksearch.cgiと同じeucの文字コードにて保存して下さい。

=Readme
KEY SEARCHで利用するには、ksearch.cgiを少し改造する必要があります。
改造方法:
テキストエディタでksearch.cgiを開き、「$tmp =~ s/!url!/$url$page/g;」を検索して下さい。
$tmp =~ s/!url!/$url$page/g;の次の行に

$tmp =~ s|!hilight!|<a href="highlight.cgi?page=$page&q=$in{q}">ハイライト表示</a>|g;

を挿入して下さい。
<a href="highlight.cgi?page=$page&q=$in{q}">ハイライト表示</a>のhighlight.cgiは、このスクリプトのファイル名です。
他のファイル名で保存された場合は、そのファイル名に変更して下さい。また「ハイライト表示」も別の文字に変更して構いません。
次に、これより少し上の行に、「# テンプレート分割」がありますので、その前の行に

$in{q} = url_encode($in{q});

を挿入して下さい。
次に、KEY SEARCHのテンプレートファイルsearch.htmlをテキストエディタで開いて下さい。
<!-- loop_begin -->〜<!-- loop_end -->内のお好きな場所に

!hilight!

を挿入して下さい。
この部分が、先にあげた「ハイライト表示」のリンク文字に変換されます。

次に、ハイライト表示用の外部スタイルシートを作成して下さい。
Googleのキャッシュページのように、検索文字毎に背景色を変更出来ます。
スタイルシートのクラス名は、mark1〜mark5です。
検索文字が5個以上は、またmark1からとなります。
<span class="mark1">検索文字1</span>
<span class="mark2">検索文字2</span>
<span class="mark3">検索文字3</span>
<span class="mark4">検索文字4</span>
<span class="mark5">検索文字5</span>
<span class="mark1">検索文字6</span>
<span class="mark2">検索文字7</span>
    :
    :

スタイルシートの記述例
.mark1 { background: #ffff66; font-weight:bold; }
.mark2 { background: #87CEFA; font-weight:bold; }
.mark3 { background: #FF00FF; font-weight:bold; }
.mark4 { background: #ADFF2F; font-weight:bold; }
.mark5 { background: #9370DB; font-weight:bold; }

以上です。
=cut

# 設定 --------------------

# KEY SEARCHの設定ファイルへのパス
require './init.cgi';

# ハイライト表示用外部スタイルシートへのパス
# スクリプトで、外部スタイルシートの呼び出しタグを付加します。
# 例:<link rel="stylesheet" href="./highlight.css" type="text/css" media="all">
# 相対パスで指定される場合は、このスクリプトから見たパスを指定して下さい。
my $style = './highlight.css';

# 検索語句をGoogleのキャッシュのように、ページの始めに
# ハイライトされているキーワード:検索文字
# を付加する場合は1を、しない場合は0を指定して下さい。
# 1にした場合は、該当ページに
# 例:<div id="highlight">ハイライトされているキーワード:<span class="mark1">検索文字1</span> <span class="mark2">検索文字2</span> </div>
# のように<body>タグの下に付加されます。$styleで指定したスタイルシートに、#highlightにてスタイルの指定が出来ます。
my $highlight = 1;


# 設定終了 --------------------

my %cf = &init;
use strict;
use CGI::Carp qw(fatalsToBrowser);
use Encode;
use Encode::Guess qw(euc-jp shiftjis 7bit-jis utf8);

my %in = parse_form();
page_view() if($in{q} and $in{page});
error('予期せぬエラーです');

sub page_view {
my ($page,$dir);
open(my $fh,"$cf{datadir}/index.dat") or &error('open err: index.dat');
while(<$fh>) {
my $p = (split(/\t/,$_))[0];
($page = $p) and last if($p =~ /$in{page}/);
}
close($fh);
&error('Not Found') unless($page);

open(my $fh,"$cf{datadir}/set.dat") or &error('open err: set.dat');
<$fh>;
$dir = (split(/<>/,<$fh>))[0];
close($fh);
$dir =~ s|/$||;

open(my $fh,"$dir$page") or &error("open err: $page");
my $body = join('',<$fh>);
close($fh);

my $enc = guess_encoding($body);
$enc = ref $enc ? $enc->name : $enc;
$in{q} = Encode::encode($enc,Encode::decode('euc-jp',$in{q}));
$in{q} =~ s/ / /g;
$body =~ s/\n{2,}/\n/g;
$body =~ s|(.*?</head>)||si;
my $head = $1;
my $body2;
print "Content-type: text/html\n\n";
while($body =~ m|(<\/?[^>]*>)*?(.*?)(<\/?[^>]*>)|gis) {
my ($tag1,$txt,$tag2) = ($1,$2,$3);
if($tag1 =~ /style/i or $tag2 =~ /style/i) {
$body2 .= "$tag1$txt$tag2";
} else {
my $i = 1;
Roop:for my $q (split(/\s+/,$in{q})) {
$i = 1 if($i >= 6);
if($q eq 'class' or $q eq 'span' or $q eq 'mark') {
$txt =~ s#(?<!\=")(\Q$q\E)#<span class="mark$i">$1</span>#igs if($q eq 'mark');
$txt =~ s#(?<!span )(\Q$q\E)#<span class="mark$i">$1</span>#igs if($q eq 'class');
$txt =~ s#(?<!\<|/)(\Q$q\E)#<span class="mark$i">$1</span>#igs if($q eq 'span');
} elsif($q eq '=' or $q eq '&amp;quot;' or $q =~ /[1-5]/) {
next Roop;
} else {
$txt =~ s|(?<!s=")(\Q$q\E)|<span class="mark$i">$1</span>|igs;
}
$i++;
}
$body2 .= "$tag1$txt$tag2";
}
}
if($highlight == 1) {
my $i = 1;
my $hl = '';
for my $q (split(/\s+/,$in{q})) {
$i = 1 if($i >= 6);
next if($q eq '=' or $q eq '&amp;quot;' or $q =~ /[1-5]/);
$hl .= qq|<span class="mark$i">$q</span> |;
$i++;
}
my $txt = Encode::encode($enc,Encode::decode('euc-jp','ハイライトされているキーワード'));
$body2 =~ s|(<body[^>]*>)|$1\n<div id="highlight">$txt:$hl</div>|si;
}
undef $enc;

$head =~ s|(</head>)|<link rel="stylesheet" href="$style" type="text/css" media="all">\n$1|i if($style);
print "$head$body2";
exit;
}

__END__


[検索ページ]