[첫화면으로]UseModWiki소스수정/검색결과본문내용출력

마지막으로 [b]

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. 검색 결과 출력시, 본문 내용 출력

제목 그대로, 검색 결과를 출력할 때 본문 텍스트에서 해당 검색어가 있는 부분을 출력.

UseMod:WikiPatches/BetterSearchOutput를 수정,개선하여 적용

1.1. 사용법

상단 검색폼 옆에 "내용출력" 체크박스를 켜고 검색하면 본문 내용도 출력. 켜지 않으면 기존 출력.

본문 내용을 출력할 경우, 본문의 첫 100바이트 정도와, 이하의 내용에서 검색어가 있는 곳을 중심으로 100바이트 정도를 출력한다. 이 때 최대 5곳까지만 출력한다.

URL에 직접 "search=검색어" 파라메터를 넣을 경우, "context=숫자" 파라메터를 같이 넣으면 역시 내용을 출력하고, 최대 그 숫자만큼 단락을 출력한다.
검색엔진이 긁어대면 곤란한터라 링크를 직접 넣지 않았습니다
wiki.pl/search=UseModWiki - 기존 검색
wiki.pl/search=UseModWiki&context=1 - 본문 중 검색어가 있는 곳 처음 한 번만 출력
wiki.pl/search=UseModWiki&context=5 - 최대 5번까지 검색어를 찾아 출력. 상단 메뉴바에서 UseModWiki를 검색한 것과 동일.

1.2. 부작용

기존 소스 수정을 최소화하면서 하려다보니, 한 번 검색하여 페이지 목록을 뽑아낸 후, 다시 그 페이지들에 대해 검색어가 있는 곳을 찾기 위한 검색을 한다. 비효율적이고, 느리다.

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);
#   &PrintPageList(@x); 이 줄 아래처럼 수정
    if (&GetParam("context", "")) {
        &PrintSearchResults($string, @x);
    } else {
        &PrintPageList(@x);
    }
    ...
}

다음 함수 통채로 추가
# Print search results with context
# based on UseMod:WikiPatches/BetterSearchOutput
sub PrintSearchResults {
    my ($searchstring, @results) = @_;
    my ($output);

    my ($name, $pageText, $t, $j, $jsnippet, $start, $end) ;
    my ($snippetlen, $maxsnippets) = ( 100, 5 ) ; #  these seem nice.
    if (&GetParam("context") =~ /^(\d+)$/) {
        $maxsnippets = $1;
    }

# TOC 출력
    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}}) {
#  get the page, filter it, remove all tags (since we're presenting in
#  plaintext, not HTML, a la google(tm)).
            &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;  # Remove separators (paranoia)
            $pageText =~ s/[\s]+/ /g;  #  Shrink whitespace
            $pageText =~ s/([-_=\\*\\.]){10,}/$1$1$1$1$1/g ; # e.g. shrink "----------"

#  entry header
            $output = "";
            $output .= "... "  if ($name =~ m|/|);
            $output .= "<SPAN class='searchresultpagename'>". &GetPageLink($name) ."</SPAN><BR>\n";
#  entry trailer
#           $output .= "<br><i><font size=-1>"
            $output .= "<SPAN class='searchresultpageinfo'>"
            . int((length($pageText)/1024)+1) . "KB - "
            . T("Last edited") . &TimeToText($Section{ts})
            . "</SPAN><br>\n" ;

            $output .= "<BLOCKQUOTE class='searchresultcontext'>";

#  show a snippet from the top of the document
            $j = index( $pageText, " ", $snippetlen ) ;  #  end on word boundary
            $t = substr($pageText, 0, $j);
            $t =~ s/($searchstring)/<SPAN class='highlight'>\1<\/SPAN>/gi ;
            $output .= $t . " <b>...</b> " ;
            $pageText = substr( $pageText, $j ) ;  #  to avoid rematching

#  search for occurrences of searchstring
            $jsnippet = 0 ;
            while ( $jsnippet < $maxsnippets
            &&  $pageText =~ m/($searchstring)/i ) {  #  captures match as $1
                $jsnippet++ ;  #  paranoid about looping
                if ( ($j = index( $pageText, $1 )) > -1 ) {  #  get index of match
#  get substr containing (start of) match, ending on word boundaries
                    $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 ) ;
#  highlight occurrences and tack on to output stream.
                    $t =~ s/($searchstring)/<SPAN class='highlight'>\1<\/SPAN>/gi ;
                    $output .= $t . " <b>...</b> " ;
#  truncate text to avoid rematching the same string.
                    $pageText = substr( $pageText, $end ) ;
                }
            }

            $output .= "</BLOCKQUOTE><br>\n";

            print $output ;
        }
    }
}

1.4. wiki.css 수정

/* search results */
/* 검색 결과 화면의 페이지 제목 */
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. 추가 업데이트 내역

1.7. 사용자 의견

  1. TOC 출력
    my %hash;
    map { push( @{$hash{GetPageDirectoryExt($_)}}, $_); } @results;

    부분에서 에러가 나는군요.
    -- Nyxity 2007-3-13 4:13 pm

ext2rc10 나올 때 추가된 함수입니다. 여기 올리기에 애매한 것들은 수정 내역을 따로 안 적어두기 때문에... 압축파일 받아서 wiki.pl을 새 걸로 덮어 쓰시는 게 나을 것 같네요 ^^
-- Raymundo 2007-3-13 4:51 pm

아앗..역시
-- Nyxity 2007-3-13 5:08 pm
이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2007-3-13 5:08 pm (변경사항 [d])
787 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기