-
- 1. 검색 결과 출력시, 본문 내용 출력
-
-
- 1.1. 사용법
-
- 1.2. 부작용
-
- 1.3. wiki.pl 수정
-
- 1.4. wiki.css 수정
-
- 1.5. translation/ko_KR.UTF-8.pl, ko_KR.EUC-KR.pl 수정
-
- 1.6. 추가 업데이트 내역
-
- 1.7. 사용자 의견
-
1. 검색 결과 출력시, 본문 내용 출력
제목 그대로, 검색 결과를 출력할 때 본문 텍스트에서 해당 검색어가 있는 부분을 출력.
WikiPatches/BetterSearchOutput를 수정,개선하여 적용
상단 검색폼 옆에 "내용출력" 체크박스를 켜고 검색하면 본문 내용도 출력. 켜지 않으면 기존 출력.
본문 내용을 출력할 경우, 본문의 첫 100바이트 정도와, 이하의 내용에서 검색어가 있는 곳을 중심으로 100바이트 정도를 출력한다. 이 때 최대 5곳까지만 출력한다.
URL에 직접 "search=검색어" 파라메터를 넣을 경우, "context=숫자" 파라메터를 같이 넣으면 역시 내용을 출력하고, 최대 그 숫자만큼 단락을 출력한다.
검색엔진이 긁어대면 곤란한터라 링크를 직접 넣지 않았습니다
wiki.pl/search=UseModWiki - 기존 검색
wiki.pl/search=UseModWiki&context=1 - 본문 중 검색어가 있는 곳 처음 한 번만 출력
wiki.pl/search=UseModWiki&context=5 - 최대 5번까지 검색어를 찾아 출력. 상단 메뉴바에서 UseModWiki를 검색한 것과 동일.
기존 소스 수정을 최소화하면서 하려다보니, 한 번 검색하여 페이지 목록을 뽑아낸 후, 다시 그 페이지들에 대해 검색어가 있는 곳을 찾기 위한 검색을 한다. 비효율적이고, 느리다.
GyparkWiki에서 "UseModWiki"를 검색해보니, 기존 방식은 3초 안팎이던게 본문 출력하면 5초가 좀 넘는다. 딱 배로 늘어난다고 보면 될 듯.
1.3. wiki.pl 수정
메뉴바 검색폼에 체크박스 추가
sub GetSearchForm {
my ($result);
my $checked = &GetParam("context","");
$result = T('Search:')
." <input accesskey=\"s\" class=text type=text name='search' size=10>"
.$q->checkbox(
-name=>'context',
-checked=>($checked)?1:'',
-value=>'on',
-label=>T('Context'))
. &GetHiddenValue("dosearch", 1);
return $result;
}
search 액션을 할 때 파라메터를 보고 분기
sub DoSearch {
...
print &GetHeader('', &QuoteHtml(Ts('Search for: %s', $string)), '');
print '<br>';
@x = &SearchTitleAndBody($string);
if (&GetParam("context", "")) {
&PrintSearchResults($string, @x);
} else {
&PrintPageList(@x);
}
...
}
다음 함수 통채로 추가
sub PrintSearchResults {
my ($searchstring, @results) = @_;
my ($output);
my ($name, $pageText, $t, $j, $jsnippet, $start, $end) ;
my ($snippetlen, $maxsnippets) = ( 100, 5 ) ;
if (&GetParam("context") =~ /^(\d+)$/) {
$maxsnippets = $1;
}
my %hash;
map { push( @{$hash{GetPageDirectoryExt($_)}}, $_); } @results;
print $q->a({-name=>"TOC"}), "<h2>", Ts('%s pages found:', ($#results + 1)), "</h2>\n";
print $q->p( map { "| ". $q->a({-href=>"#$_"}, $_); } sort keys %hash);
print "\n";
foreach my $title (sort keys %hash) {
print $q->h2($q->a({-name=>$title, -href=>"#TOC"}, $title)), "\n";
foreach $name (@{$hash{$title}}) {
&OpenPage($name);
&OpenDefaultText();
$pageText = $Text{'text'};
foreach $t (@HtmlPairs, "pre", "nowiki", "code" ) {
$pageText =~ s/\<$t(\s[^<>]+?)?\>(.*?)\<\/$t\>/$2/gis;
}
foreach $t (@HtmlSingle) {
$pageText =~ s/\<$t(\s[^<>]+?)?\>//gi;
}
$pageText = &QuoteHtml($pageText);
$pageText =~ s/$FS//g;
$pageText =~ s/[\s]+/ /g;
$pageText =~ s/([-_=\\*\\.]){10,}/$1$1$1$1$1/g ;
$output = "";
$output .= "... " if ($name =~ m|/|);
$output .= "<SPAN class='searchresultpagename'>". &GetPageLink($name) ."</SPAN><BR>\n";
$output .= "<SPAN class='searchresultpageinfo'>"
. int((length($pageText)/1024)+1) . "KB - "
. T("Last edited") . &TimeToText($Section{ts})
. "</SPAN><br>\n" ;
$output .= "<BLOCKQUOTE class='searchresultcontext'>";
$j = index( $pageText, " ", $snippetlen ) ;
$t = substr($pageText, 0, $j);
$t =~ s/($searchstring)/<SPAN class='highlight'>\1<\/SPAN>/gi ;
$output .= $t . " <b>...</b> " ;
$pageText = substr( $pageText, $j ) ;
$jsnippet = 0 ;
while ( $jsnippet < $maxsnippets
&& $pageText =~ m/($searchstring)/i ) {
$jsnippet++ ;
if ( ($j = index( $pageText, $1 )) > -1 ) {
$start = index( $pageText, " ", $j-($snippetlen/2) ) ;
$start = 0 if ( $start == -1 ) ;
$end = index( $pageText, " ", $j+($snippetlen/2) ) ;
$end = length( $pageText ) if ( $end == -1 ) ;
$t = substr( $pageText, $start, $end-$start ) ;
$t =~ s/($searchstring)/<SPAN class='highlight'>\1<\/SPAN>/gi ;
$output .= $t . " <b>...</b> " ;
$pageText = substr( $pageText, $end ) ;
}
}
$output .= "</BLOCKQUOTE><br>\n";
print $output ;
}
}
}
1.4. wiki.css 수정
SPAN.searchresultpagename {
font-size: 120%;
font-weight: bold;
}
SPAN.searchresultpageinfo {
font-style: italic;
}
BLOCKQUOTE.searchresultcontext {
}
SPAN.highlight {
font-weight: bold;
}
1.5. translation/ko_KR.UTF-8.pl, ko_KR.EUC-KR.pl 수정
Context
내용출력
1.6. 추가 업데이트 내역
- TOC 출력
my %hash;
map { push( @{$hash{GetPageDirectoryExt($_)}}, $_); } @results;
부분에서 에러가 나는군요.
ext2rc10 나올 때 추가된 함수입니다. 여기 올리기에 애매한 것들은 수정 내역을 따로 안 적어두기 때문에... 압축파일 받아서 wiki.pl을 새 걸로 덮어 쓰시는 게 나을 것 같네요 ^^
- 아앗..역시
위키위키분류