KBPublisher:オープンソースのナレッジベース「KBPublisher」の用語集を日本語対応させる方法

ナレッジベース

KBPublisher

KBPublisherを日本語で使用する際の問題点の一つとして「用語集」の機能が動作しないというのがあったが、その記事に最近解決する方法に関するコメントがあました。

用語集をきちんと機能させる方法がわかったので覚書しておきます。

コメントをしていただいた方に感謝!

KBPublisherの用語集について

KBPublisherの「用語集」機能は、予め用語集に単語を登録しておくと、ナレッジベースの記事中にその単語が出てくると強調表示される。

強調表示された単語をマウスでクリックすると、用語集に登録したその単語に関する説明文がポップアップされて表示される機能。

今まで英単語については問題なく動作していたけれども、日本語で登録した用語については動作してくれなかった。

用語集を日本語対応する手順

以下に「用語集」を日本語対応する手順について記載する。

KBPublisherのDocumentParser.phpの変更

「用語集」を日本語対応するためには、DocumentParser.phpファイルの変更が必要になる。

変更する前に必ずバックアップをとっておくこと! DocumentParser.phpは、以下のフォルダに保存されている。

kbpublisher¥client¥inc

DocumentParser.phpの変更箇所

DocumentParser.phpをメモ帳やエディタで開き、以下の3箇所を変更する。

変更箇所1:146行目のif文の変更

変更場所がわかりやすいように144行目から載せるけど、実際に変更するのは146行目のみ

変更前:

$ids = array();
foreach($glossary as $id => $item) {
if(strpos(strtolower($string), strtolower($item)) !== false) {
$ids[] = $id;
}
}

変更後:

$ids = array();
foreach($glossary as $id => $item) {
if(mb_strpos(mb_strtolower($string), mb_strtolower($item)) !== false) {
$ids[] = $id;
}
}

変更箇所2:158行目の$pregの代入文の変更

変更場所がわかりやすいように156行目から載せるけど、実際に変更するのは158行目のみ

変更前:

foreach($glossary as $k => $v) {
$preg = "~\b($k)\b(?![^<]*>)~i";
preg_match_all($preg, $string, $matches);
$num = ($v['display_once']) ? 1 : count($matches[0]);

変更後:

foreach($glossary as $k => $v) {
$preg = "/($k)/iu";
preg_match_all($preg, $string, $matches);
$num = ($v['display_once']) ? 1 : count($matches[0]);

変更箇所3:171行目の$searchの代入文の変更

変更場所がわかりやすいように168行目から載せるけど、実際に変更するのは171行目のみ

変更前:

//$str = "<span class=¥"glossaryItem¥" onmouseover=¥"return overlib('%s', CAPTION, 'URL', HAUTO, VAUTO, FGCOLOR, '#FFFF99', BGCOLOR, '#CC9900', WIDTH, 300);¥" onmouseout=¥"return nd();¥">";
//<a class="glossaryItem" href="/knowledgebase/glossary/#URL">URL</a></span>
$search = "~¥b(".$matches[0][$j].")¥b(?!<¥/span>¥s)(?![^<]*>)~i";
$v['definition'] = addslashes(str_replace(array("¥r¥n", "¥n"), ' ', $v['definition']));
$replace = sprintf($str, $id, $v['definition'], $id, $id);

変更後:

//$str = "<span class=¥"glossaryItem¥" onmouseover=¥"return overlib('%s', CAPTION, 'URL', HAUTO, VAUTO, FGCOLOR, '#FFFF99', BGCOLOR, '#CC9900', WIDTH, 300);¥" onmouseout=¥"return nd();¥">";
//<a class="glossaryItem" href="/knowledgebase/glossary/#URL">URL</a></span>
$search = "/(".$matches[0][$j].")(?!<¥/span>¥s)(?![^<]*>)/iu";
$v['definition'] = addslashes(str_replace(array("¥r¥n", "¥n"), ' ', $v['definition']));
$replace = sprintf($str, $id, $v['definition'], $id, $id);

変更後の結果

以下がDocumentParser.phpを変更した後の用語集機能のサンプル画像。

これで1つ問題が解決した。

コメントをくれた方には本当に感謝です!

ちなみにコメント欄に紹介されていた修正内容が掲載されているサイトのURLを以下に記載。

KBPublisher用語集日本語キーワード対応パッチ

(Visited 72 times, 11 visits today)

Posted by るーと