さてZooTube用に入れてみた、WordPress向け 用語集プラグインIMM-Glossary ですが、このままではいくつか問題があります:
- ある用語が別の用語を包含していると、化ける場合がある
例:「ネズミ目」と「目」という用語がある場合、うまく用語にマッチせず、かつ%%%という変な文字列が挿入されることがある↓
←変な%%%が - 文中の用語がリンクされない場合がある(空白や記号で挟まれていないと発症)
←「固有種」も用語にあるが - これは仕方ないんだけど、用語リストが正しくあいうえお順ではなく、文字コード順になる
←「ねずみもく」の次が「あしゅ」
これらを解消するために、 IMM-Glossary.php を下記のように修正しました。
適用したのは IMM-Glossary ver.2.1.1 です。
その1:日本語キーワードは非単語文字で区切らない
そもそも英語など1バイト系文字を前提としているため、用語は \W (空白などの非単語文字(0-9a-zA-Z_でない文字))で区切られることになっています。
日本語の場合それでは不都合なので、1246行目付近と1248行目付近、 \W でマッチしているところを [^%] でマッチさせるよう修正します。
// $Content = preg_replace ( '#(\W)(' . preg_quote ( $Term['Title'] , '#' ) . ')(\W)#Ui' , '${1}%%%${2}%%%${3}' , $Content , $Limit ) ;
$Content = preg_replace ( '#([^%])(' . preg_quote ( $Term['Title'] , '#' ) . ')([^%])#Ui' , '${1}%%%${2}%%%${3}' , $Content , $Limit ) ;
// $Private['#(\W)%%%(' . preg_quote ( $Term['Title'] , '#' ) . ')%%%(\W)#Ui'] = $Link ;
$Private['#([^%])%%%(' . preg_quote ( $Term['Title'] , '#' ) . ')%%%([^%])#Ui'] = $Link ;
直りました。
さて、これをすると1つ新たな障害が。たとえば上図例でいうと「サル目」「目」という用語がある場合、より長い用語(「サル目」)にマッチしてほしいところ、用語を登録した順序によっては(先に登録した用語を優先的に変換するようなので)「目」にマッチしてしまう場合があります。
これを修正するため、DBよりデータ取得する際にID順ではなく文字列長降順で取得するよう変更。
用語数が多くなったらパフォーマンスに問題出るかもしれませんが、とりあえず。
1118行目:
// $Temporary = IMM_Glossary_MySQL_Records_Get ( 'DISTINCT `Title`' , $GLOBALS['IMM-Glossary']['Variables']['Table'] , '' , '`ID` ASC' , '' ) ;
$Temporary = IMM_Glossary_MySQL_Records_Get ( 'DISTINCT `Title`' , $GLOBALS['IMM-Glossary']['Variables']['Table'] , '' , 'LENGTH(`title`) DESC' , '' ) ;
これで正しく表示されるようになりました。
用語リストをあいうえお順に(運用でカバー)
これは気にしなくてもいい(ほっといてもいい)のかもしれませんが。
半分運用でカバーすることにします。つまり、用語説明の先頭に必ずふりがなを入れることにします。ZooTubeはちびっこも見るかもしれないので、ふりがな必須にするのはいいことだ。
それで、並び順は用語の昇順ではなく用語説明の昇順とすることにします。
561行目:
// $Terms = IMM_Glossary_MySQL_Records_Get ( '*' , $GLOBALS['IMM-Glossary']['Variables']['Table'] , '' , '`Title` ASC' , $Limit ) ;
$Terms = IMM_Glossary_MySQL_Records_Get ( '*' , $GLOBALS['IMM-Glossary']['Variables']['Table'] , '' , '`Definition` ASC' , $Limit ) ;
752行目:
// $Terms = IMM_Glossary_MySQL_Records_Get ( '*' , $GLOBALS['IMM-Glossary']['Variables']['Table'] , '' , '`Title` ASC' , $Limit ) ;
$Terms = IMM_Glossary_MySQL_Records_Get ( '*' , $GLOBALS['IMM-Glossary']['Variables']['Table'] , '' , '`Definition` ASC' , $Limit ) ;
これで、あいうえお順に並ぶようになりました。
おわり。
…と、
以上、たいした修正でもないのに、意味なく気合い入れて書いてみました。
現時点で日本語情報があまりなかったので。おすすめプラグインですよ。

タグ:
2008年6月18日




1 件のコメント :-)
こんにちわ。現在手探りでPHPを設定、公開に漕ぎつけるために四苦八苦しているのですが、どうもIMM-Glossaryの日本語化が儘なりません。何度手順どおりにしてもエラーがおきてしまうのですが、同コードの編集はどのようなソフトで行ったか教えていただけないでしょうか?