CocoaでTxを使うためのObjcラッパー tx-objc-wrapper

CocoaでTxを使うためのObjective-Cラッパーを作りました。

tx-objc-wrapper

iPhone/iPod touch/iPadで大量の文字列を検出したり置換したりするのに使えます。

使い方

  1. ソースをダウンロード
    git clone http://github.com/yatsu/tx-objc-wrapper.git
  2. Txディレクトリ以下のファイルをXcodeプロジェクトに追加
  3. "Txo.h"をimport
  4. Txoのメソッドを呼び出す
API

構築/読み込み

// NSStringが入ったNSSetからTxを構築し、ファイルに保存する
+ (Txo *)build:(NSSet *)wordSet withFileName:(NSString *)fileName;

// Txをファイルから読み込む
+ (Txo *)read:(NSString *)fileName;

Txの単純なラッパー

- (NSUInteger)prefixSearch:(const char *)aString
                    length:(NSInteger)length
              resultLength:(NSInteger *)resultLength;

- (NSUInteger)commonPrefixSearch:(const char *)aString
                          length:(NSInteger)length
                         strings:(NSArray **)strings
                           txIds:(NSArray **)txIds
                           limit:(NSUInteger)limit;

- (NSUInteger)predictiveSearch:(const char *)aString
                        length:(NSInteger)length
                       strings:(NSArray **)strings
                         txIds:(NSArray **)txIds
                         limit:(NSUInteger)limit;

- (NSString *)resultLog;

- (NSString *)errorLog;

- (NSUInteger)keyNum;

Txo独自メソッド

以下のものはtx-rubyをマネして作りました。こちらのメソッドを呼びだすと便利でしょう。

- (NSInteger)longestPrefix:(NSString *)aString fromPosition:(NSInteger)position;

- (NSInteger)longestPrefix:(NSString *)aString;

- (NSArray *)searchPrefixes:(NSString *)aString forPosition:(NSInteger)position;

- (NSArray *)searchPrefixes:(NSString *)aString;

- (NSArray *)searchExpansions:(NSString *)aString forPosition:(NSInteger)position;

- (NSArray *)searchExpansions:(NSString *)aString;

- (void)scan:(NSString *)aString;

- (NSString *)replace:(NSString *)aString;

サンプルコード

tx-rubyのサンプルコードと同じことをしてみます。

Tx構築

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *txPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"keywords.tx"];

NSMutableSet *wordSet = [[NSMutableSet alloc] init];
[wordSet addObject:@"foo"];
[wordSet addObject:@"ho"];
[wordSet addObject:@"hog"];
[wordSet addObject:@"hoga"];
[wordSet addObject:@"hoge"];
[wordSet addObject:@"hogeshi"];

Txo *txo = [Txo build:wordSet withFileName:txPath];

文字列検索

[txo longestPrefix:@"hogeeee"] // => 4 (which means "hoge" is in the index)

[txo searchPrefixes:@"hoge"] // => (ho, hog, hoge)

[txo searchExpansions:@"hog"] // => (hog, hoga, hoge, hogeshi)

部分文字列検索(scan)

TxoDelegateプロトコルのtxo:scannedString:atPosition:を実装します。

- (void)txo:(Txo *)aTxo scannedString:(NSString *)aString atPosition:(NSInteger)position {
  // 文字列と位置を含む配列をarrayに追加
  // (arrayはNSMutableArrayとしてクラスに定義しておく)
  [array addObject:[NSArray arrayWithObjects:aString,
                    [NSNumber numberWithInt:position], nil]];
}

scanを実行。

array = [[NSMutableArray alloc] init];
[txo scan:@"hogefugafoo"]; // => ((hoge, 0), (foo, 8))

部分文字列置換(replace)

TxoDelegateプロトコルのtxo:replace:を実装します。

- (NSString *)txo:(Txo *)aTxo replace:(NSString *)aString {
  return [aString uppercaseString]; // 大文字にして返す
}

replaceを実行。

[txo replace:@"hogefugafoo"] // => HOGEfugaFOO

以上のサンプルコードはIPhoneSimpleDemoというサンプルアプリに実装しているので、Xcodeでビルドしてお試しください。
実行すると以下のようになります。


C++ライブラリをObjective-Cでラップする方法は、Objective-C Wrappers for C++ Classes を参考にしました。

今後の予定

  • NSDictionary互換インターフェース
  • テストコードを書く
  • UTF8以外の文字コードに対応
  • ラッパーコードの効率的でないところを書き直し
もうひとつのサンプルプログラムHatenaKeywordsについてこちらに書きました:
blog.yatsu.info: iPhoneのUIWebViewではてなキーワードを高速置換

0 Response to "CocoaでTxを使うためのObjcラッパー tx-objc-wrapper"

コメントを投稿