カスタム検索

2008年12月18日木曜日

覚えておくと便利なConfluenceのウラワザ

Confluenceの2.9.2を入れて数日、日本語で検索をした時にエラーが出ます。

エラーメッセージを見ると StringIndexOutOfBounds エラーが出ているもよう。

・英語での検索はエラーが出ない
・前のバージョンと比べて、検索結果でハイライトされるようになった

以上の結果から検索結果の文字をハイライトする時の文字数計算が2バイト考慮されてなくてエラーが出てるのではないかと推測

まずは検索結果の decorators/components/search-results.vmd を見てみる
該当部分は以下

<ul class="search-results">
#foreach($searchResult in $results)
<li>
#searchResult($searchResult $showExcerpts $queryString)
</li>
#end
</ul>


searchResultを消してしまうと検索結果がでないので、この searchResultがどこにあるかを探っていくと、以下にたどりついた
template/includes/macros.vm
該当部分は以下

#set ($summary = $generalUtil.makeSummary($contentBody, $queryString))
#elseif ($searchResult.type == "attachment" && $contentBody)
#set ($summary = $generalUtil.makeSummary($contentBody, $queryString))
#elseif ($searchResult.type == "attachment" && $searchResult.comment)
#set ($summary = $generalUtil.makeSummary($searchResult.comment, $queryString))


GeneralUtilクラスのmakeSummaryがダメダメっぽい

APIを見てみる > http://docs.atlassian.com/com/atlassian/confluence/atlassian-confluence/latest/com/atlassian/confluence/util/GeneralUtil.html

Summary型を返さないといけないので、ここをはぶいてしまうと検索は出来るけど、検索結果がページタイトルしかでなくなってしまう
makeSummaryを見てみると、 content だけをうけとるのと、 contentとqueryを受け取るメソッドがあるのがわかる。
queryのハイライトが問題なんで、contentだけを渡すメソッドに書き換えてみる。


#set ($summary = $generalUtil.makeSummary($contentBody))
#elseif ($searchResult.type == "attachment" && $contentBody)
#set ($summary = $generalUtil.makeSummary($contentBody))
#elseif ($searchResult.type == "attachment" && $searchResult.comment)
#set ($summary = $generalUtil.makeSummary($searchResult.comment))


ここのテンプレートは再起動しないと反映されないので、confluenceを再起動。
検索してみると、無事検索がとおり、検索結果にページタイトルと中身の一部が表示された! :D

0 件のコメント: