最近マイブームのcodegenで今度はPHPからCannaを使う拡張を作って見た。
WEBサービスも作った。
http://www.netflowers.co.jp/canna/
すげー。
本当は変換の候補とか出さないと行け無かったりするので、
まぁ、実用性は無いんだけど、、個人的にはちょっと感動。
せっかくなので、ソースは公開。
C言語良くわからないので、これで良いのかさっぱり不明。
わかる方添削してくれると超嬉しいです。
canna-0.0.1.tar.gz
使い方は、
当然ですが、cannaが必要。
yum install Canna
yum install Canna-libs
yum install Canna-devel
あとは、いつもどおり、
tar xvfz canna-0.0.1.tar.gz
cd canna-0.0.1
phpize
./configure
make
make install
php.iniに
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=canna.so
ってすると、
$ret = kanji_string("honzitu ha seiten nari.");
で、$retに配列で帰ってくる。
array(1) { [0]=> string(16) "本日は青天なり。" }
なんで配列かって言うと、\nで区切って有った場合に分けるため。
で、文字コードはeucで帰ってくるので必要な場合は、mb_convert_encodingなりして下さい。
うまく動いたかた、教えてくれると嬉しいです。
codegenの
canna.xmlは下記の通り
WEBサービスも作った。
http://www.netflowers.co.jp/canna/
すげー。
本当は変換の候補とか出さないと行け無かったりするので、
まぁ、実用性は無いんだけど、、個人的にはちょっと感動。
せっかくなので、ソースは公開。
C言語良くわからないので、これで良いのかさっぱり不明。
わかる方添削してくれると超嬉しいです。
canna-0.0.1.tar.gz
使い方は、
当然ですが、cannaが必要。
yum install Canna
yum install Canna-libs
yum install Canna-devel
あとは、いつもどおり、
tar xvfz canna-0.0.1.tar.gz
cd canna-0.0.1
phpize
./configure
make
make install
php.iniに
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=canna.so
ってすると、
$ret = kanji_string("honzitu ha seiten nari.");
で、$retに配列で帰ってくる。
array(1) { [0]=> string(16) "本日は青天なり。" }
なんで配列かって言うと、\nで区切って有った場合に分けるため。
で、文字コードはeucで帰ってくるので必要な場合は、mb_convert_encodingなりして下さい。
うまく動いたかた、教えてくれると嬉しいです。
codegenの
canna.xmlは下記の通り
<?xml version="1.0" ?>
<extension name="canna" version="1.0.0">
<deps language="c" platform="all">
<with defaults="/usr:/usr/local" testfile="include/canna/jrkanji.h">
<header name="canna/jrkanji.h" />
<lib name="canna" platform="all" />
</with>
</deps>
<function name="kanji_string">
<proto>array kanji_string(string src)</proto>
<code>
<![CDATA[
int c, nbytes ,i,len;
unsigned char workbuf[1024];
jrKanjiStatus ks;
jrKanjiControl(0, KC_INITIALIZE, 0);
{
jrKanjiStatusWithValue ksv;
ksv.ks = &ks;
ksv.buffer = workbuf;
ksv.bytes_buffer = 1024;
ksv.val = CANNA_MODE_HenkanMode;
jrKanjiControl(0, KC_CHANGEMODE, &ksv);
}
len = (int) strlen(src);
array_init(return_value);
for (i=0;i<len;i++) {
nbytes = jrKanjiString(0, (int)src[i], workbuf, 1024, &ks);
if (nbytes > 0) {
workbuf[nbytes] = '\0';
add_next_index_stringl(return_value, workbuf,nbytes,1);
}
}
if(src[len-1] != '\n'){
nbytes = jrKanjiString(0, '\n', workbuf, 1024, &ks);
if (nbytes > 0) {
workbuf[nbytes] = '\0';
add_next_index_stringl(return_value, workbuf,nbytes,1);
}
}
jrKanjiControl(0, KC_FINALIZE, 0);
]]>
</code>
</function>
</extension>

