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を以下に記載。
コメント