post Category: ブログ,プログラミング  post タグ: , ,  post Comments (1) post2008年6月18日

さてZooTube用に入れてみたWordPress向け 用語集プラグインIMM-Glossary ですが、このままではいくつか問題があります:

  1. ある用語が別の用語を包含していると、化ける場合がある
    例:「ネズミ目」と「目」という用語がある場合、うまく用語にマッチせず、かつ%%%という変な文字列が挿入されることがある↓
    %%%が挿入される ←変な%%%が
  2. 文中の用語がリンクされない場合がある(空白や記号で挟まれていないと発症)
    「固有種」は用語にあるが ←「固有種」も用語にあるが
  3. これは仕方ないんだけど、用語リストが正しくあいうえお順ではなく、文字コード順になる
    文字コード順に並んでる ←「ねずみもく」の次が「あしゅ」

これらを解消するために、 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 ;

直りました。

直ったみたい ←直ったみたい
%%%は直ったけど、用語リンクが変 ←「固有種」もOKだけど

さて、これをすると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' , '' ) ;

これで正しく表示されるようになりました。

これでOK ←これでOK

用語リストをあいうえお順に(運用でカバー)

これは気にしなくてもいい(ほっといてもいい)のかもしれませんが。

半分運用でカバーすることにします。つまり、用語説明の先頭に必ずふりがなを入れることにします。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 ) ;

これで、あいうえお順に並ぶようになりました。

あいうえお順に並んだ ←あしゅ<いくじのう<うしもく、OK

おわり。

…と、
以上、たいした修正でもないのに、意味なく気合い入れて書いてみました。
現時点で日本語情報があまりなかったので。おすすめプラグインですよ。

1 件のコメント :-)

#1

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

taka on 2008年11月24日 - 08:42
トラックバック»

この記事へコメントをどうぞ

ガイドライン: いくつかのタグが使えます (a href, strong, em, code).

あなたのお名前を。必須です 
メールアドレスをこちらに。公開されません 
ウェブサイトやブログをお持ちの方はこちらに. 
ここにコメントを書きます. 
Cookieに保存(次回から入力を省略できます)