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]

メールによる返信