curvirgoです。
以前、中本さんがいわれていたAnthyによる振り仮名の取得に関して作成してみました。
それから、WIndows用IMM版に関してもう少し制限を少なくしたいと考え、分割する文字の対象を追加してみました。
Index: Makefile.linux
===================================================================
RCS file: /cvsroot/waooo/furigana/Makefile.linux,v
retrieving revision 1.6
diff -u -r1.6 Makefile.linux
--- Makefile.linux 7 Oct 2006 11:10:35 -0000 1.6
+++ Makefile.linux 15 Oct 2006 13:48:12 -0000
@@ -14,7 +14,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-VERSION=0.3
+VERSION=0.4pre1
# base directories
#OO_SDK_HOME=
@@ -33,7 +33,7 @@
CPP_OPT=-O2 -fomit-frame-pointer -c -o $@ -DUNX \
-DGCC -DLINUX -DCPPU_ENV=gcc3 -I. -I$(OO_SDK_HOME)/include
-LINK_LIB=-lcppuhelpergcc3 -lmecab
+LINK_LIB=-lcppuhelpergcc3
CPPUMAKER_OPT=-BUCR -Tjp.sourceforge.waooo.addin.XFurigana \
-Tcom.sun.star.sheet.XAddIn \
@@ -55,6 +55,8 @@
all: furigana-$(VERSION)-Linux.uno.pkg
+anthy: furigana-$(VERSION)-Linux-anthy.uno.pkg
+
furigana.urd: furigana.idl
$(IDLC) -C -I$(OO_SDK_HOME)/idl furigana.idl
@@ -63,16 +65,28 @@
furigana_impl.o: furigana.rdb furigana_impl.cxx
cppumaker $(CPPUMAKER_OPT) $(OFFICE_PROGRAM_PATH)/types.rdb furigana.rdb
- $(CPP) $(CPP_OPT) furigana_impl.cxx
+ $(CPP) $(CPP_OPT) -D__USE_MECAB__ furigana_impl.cxx
+
+furigana_impl-anthy.o: furigana.rdb furigana_impl.cxx
+ cppumaker $(CPPUMAKER_OPT) $(OFFICE_PROGRAM_PATH)/types.rdb furigana.rdb
+ $(CPP) $(CPP_OPT) -D__USE_ANTHY__ furigana_impl.cxx
libfurigana.uno.so: furigana_impl.o symbols.txt
$(LINK) -o $@ -shared -L$(OFFICE_PROGRAM_PATH) --retain-symbols-file \
- symbols.txt furigana_impl.o $(LINK_LIB)
+ symbols.txt furigana_impl.o $(LINK_LIB) -lmecab
+
+libfurigana-anthy.uno.so: furigana_impl-anthy.o symbols.txt
+ $(LINK) -o libfurigana.uno.so -shared -L$(OFFICE_PROGRAM_PATH) --retain-symbols-file \
+ symbols.txt furigana_impl-anthy.o $(LINK_LIB) -lanthy -lanthydic
furigana-$(VERSION)-Linux.uno.pkg: furigana.rdb libfurigana.uno.so META-INF/manifest.xml
$(REGCOMP) -register -r furigana.rdb -c libfurigana.uno.so
$(ZIP) $@ META-INF/manifest.xml furigana.rdb libfurigana.uno.so DESCRIPTION DESCRIPTION.ja Messages.xcu Messages.xcs
+furigana-$(VERSION)-Linux-anthy.uno.pkg: furigana.rdb libfurigana-anthy.uno.so META-INF/manifest.xml
+ $(REGCOMP) -register -r furigana.rdb -c libfurigana.uno.so
+ $(ZIP) $@ META-INF/manifest.xml furigana.rdb libfurigana.uno.so DESCRIPTION DESCRIPTION.ja Messages.xcu Messages.xcs
+
install: furigana-$(VERSION)-Linux.uno.pkg
$(OFFICE_PROGRAM_PATH)/unopkg add furigana-$(VERSION)-Linux.uno.pkg
Index: furigana_impl.cxx
===================================================================
RCS file: /cvsroot/waooo/furigana/furigana_impl.cxx,v
retrieving revision 1.24
diff -u -r1.24 furigana_impl.cxx
--- furigana_impl.cxx 8 Oct 2006 04:58:25 -0000 1.24
+++ furigana_impl.cxx 15 Oct 2006 13:48:18 -0000
@@ -44,7 +44,11 @@
#if defined(__USE_IMM__)
#include <imm.h>
#define TO_UNICODE(c1,c2) (sal_Unicode)((c2>=0?c2:c2+0x100)*0x100+(c1>=0?c1:c1+0x100))
-#else
+#endif
+#if defined(__USE_ANTHY__)
+#include <anthy/anthy.h>
+#endif
+#if defined(__USE_MECAB__)
#include <mecab.h>
#endif
@@ -71,7 +75,7 @@
lang::Locale maFuncLoc;
Reference< XComponentContext > mxContext;
Reference< XHierarchicalNameAccess > xViewRoot;
-#ifndef __USE_IMM__
+#if defined(__USE_MECAB__)
static MeCab::Tagger *tagger;
#endif
@@ -137,7 +141,7 @@
virtual lang::Locale SAL_CALL getLocale() throw ( uno::RuntimeException );
};
-#ifndef __USE_IMM__
+#if defined(__USE_MECAB__)
MeCab::Tagger* FuriganaImpl::tagger = NULL;
#endif
@@ -160,7 +164,7 @@
FuriganaImpl::~FuriganaImpl()
{
-#ifndef __USE_IMM__
+#if defined(__USE_MECAB__)
if( tagger )
{
delete tagger;
@@ -213,6 +217,19 @@
if( aZenkaku.getLength() > 0 )
res += getImmFurigana( aZenkaku.makeStringAndClear() );
}
+ else if( ( src[k] >= 0x3001 && src[k] <= 0x3020 ) ||
+ ( src[k] >= 0x302a && src[k] <= 0x3031 ) ||
+ ( src[k] >= 0x3036 && src[k] <= 0x303f ) ||
+ ( src[k] >= 0xff01 && src[k] <= 0xff20 ) ||
+ ( src[k] >= 0xff3b && src[k] <= 0xff65 ) ||
+ src[k] == 0x30A0 )
+ {
+ if( aZenkaku.getLength() > 0 )
+ res += getImmFurigana( aZenkaku.makeStringAndClear() );
+ if( aHankaku.getLength() > 0 )
+ res += aHankaku.makeStringAndClear();
+ aZenkaku.append((sal_Unicode)src[k]);
+ }
else
{
aZenkaku.append((sal_Unicode)src[k]);
@@ -227,7 +244,46 @@
}
}
}
-#else
+#endif
+#if defined(__USE_ANTHY__)
+ if( ! anthy_init() )
+ {
+ anthy_context_t aAnthyContext = anthy_create_context();
+ anthy_conv_stat aAnthyConversionStat;
+ int aConversionListSize;
+ char *result;
+ for(int i=0;i<aStrList.getLength();i++)
+ {
+ for(int j=0;j<aStrList[i].getLength();j++)
+ {
+ if( aStrList[i][j].getLength() != 0 )
+ {
+
+ OStringBuffer aStr = OStringBuffer(OUStringToOString(aStrList[i][j], CONVERT_FLAGS));
+ aStr.append(static_cast< char >(0));
+ if( ! anthy_set_string( aAnthyContext, aStr.getStr()) )
+ {
+ anthy_get_stat( aAnthyContext, &aAnthyConversionStat );
+ for(int k=0; k < aAnthyConversionStat.nr_segment; k++)
+ {
+ aConversionListSize = anthy_get_segment( aAnthyContext, k, NTH_UNCONVERTED_CANDIDATE, 0, 0 );
+ if( aConversionListSize > 0 )
+ {
+ result = (char *)malloc( aConversionListSize + 1 );
+ anthy_get_segment( aAnthyContext, k, NTH_UNCONVERTED_CANDIDATE, result, aConversionListSize + 1 );
+ res += OUString(result, strlen(result), CONVERT_FLAGS);
+ free( result );
+ }
+ }
+ }
+ }
+ }
+ }
+ anthy_release_context( aAnthyContext );
+ res = convertIntoKatakana( res );
+ }
+#endif
+#if defined(__USE_MECAB__)
// mecab
if( !tagger )
tagger = MeCab::createTagger("-Oyomi");
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]