ab.com コミュニティ https://www.activebasic.com/forum/ |
|
テキスト処理プラグインを作りませんか? https://www.activebasic.com/forum/viewtopic.php?t=2052 |
ページ 1 / 1 |
作成者: | 淡幻星 [ 2007年9月30日(日) 21:24 ] |
記事の件名: | テキスト処理プラグインを作りませんか? |
お世話になっております。 ABにて作成したタブ型テキストエディタに、プラグイン機能を追加しました。 テキストエディタ本体はこちらになります。 というわけで、このテキストエディタにて動作する、テキスト処理プラグインを募集いたします。( ^_^) サンプルDLL、開発支援テンプレート等はこちらです。 プラグインの仕様は、こちらです。 仕様書を開く [ここをクリックすると内容が表示されます]
コード: ■プラグインとして認識されるファイル名 システムモジュール(TabTextList.exe)のあるフォルダ直下の "Plugins"フォルダに置かれた拡張子[.tpi]のDLLを、プラグインとして認識します。 "Plugins\*.tpi" ■プラグインが呼び出されるタイミング 「手近なテキストメニュー」が選択されたとき。 ■プラグインの実装 プラグインDLLは以下の4つの関数をエキスポートする必要があります。 ※以下において、「テキスト処理」とは「手近なテキストメニュー」 によって選択されたプラグインのテキスト処理の実行を意味します。 ------------------------------------------------ 【関数名】 【機能】 TtlPlgIn_GetTMenuTitle システムモジュールが、プラグインで実装されたメニュー名を取得するために利用します。 TtlPlgIn_HandleOpen テキスト処理の開始時に呼び出されます。 TtlPlgIn_Work テキスト処理を実行するために呼び出されます。 TtlPlgIn_HandleClose テキスト処理の終了時に呼び出されます。 以上の4つの関数は以下の流れで呼び出されます。 TtlPlgIn_GetTMenuTitle ↓ TtlPlgIn_HandleOpen ↓ TtlPlgIn_Work ↓ TtlPlgIn_HandleClose ■エキスポート関数の仕様 呼び出し規約は "__stdcall" 出なければなりません。 以下では「Long型(long型)=符号付き32ビット整数型」として扱います。 ○Function Export TtlPlgIn_GetTMenuTitle( nIndex As Long, pszMenu As BytePtr ) As Long 【引数】 nIndex As Long プラグインが持つ、テキスト処理メニューの項目番号(0,1,2,,,)がLong型で指定されます。 もしくは、テキスト処理メニューの個数取得のフラグとして[-1]が指定されます。 pszMenu As BytePtr 指定されたテキスト処理メニューのタイトルを格納すべきバッファのポインタが BytePtr(*char)型で指定されます。 【返り値】 Long型を返します。 nIndex=-1 のときは、プラグインが保有するテキスト処理メニューの個数を返します。 nIndex=0,1,2,,, のときは、pszMenu に格納したタイトルの長さを返します。 ○Function Export TtlPlgIn_HandleOpen( nIndex As Long ) As DWord 【引数】 nIndex As Long システムモジュールによって選択された(「手近なテキストメニュー」で選択された)、 テキスト処理メニューの項目番号がLong型で格納されます。 【返り値】 DWord(unsigned long)型です。 テキスト処理メニューを識別するハンドルを返します。 ここで返したハンドルが TtlPlgIn_Work() と TtlPlgIn_HandleClose() に与えれます。 ○Function Export TtlPlgIn_Work( dwHandle As DWord, hWnd As HWND , pszFile As BytePtr, pszText As BytePtr, pszSel As BytePtr, ByRef pzNText As BytePtr, ByRef pzNSel As BytePtr, dwReserved As DWord ) As DWord 【引数】 dwHandle As DWord テキスト処理メニューを識別するハンドルがDWord(unsigned long)型で指定されます。 hWnd As HWND システムモジュールの窓ハンドルが指定されます。 pszFile As BytePtr 編集中のテキストが保存されているファイルパスが格納されたバッファのポインタがBytePtr(*char)型で指定されます。 格納内容を編集は禁止です(コピーのみ可)。 pszText As BytePtr 編集中のテキスト全体が格納されたバッファのポインタがBytePtr(*char)型で指定されます。 格納内容を編集は禁止です(コピーのみ可)。 pszSel As BytePtr 被選択テキスト(反転部)が格納されたバッファのポインタがBytePtr(*char)型で指定されます。 格納内容を編集は禁止です(コピーのみ可)。 ByRef pzNText As BytePtr テキスト処理を実行後の、テキスト全体を格納したバッファへのポインタをBytePtr(*char)型で指定します。 このパラメータに指定したバッファは、TtlPlgIn_HandleClose() が呼ばれるまで有効でなければいけません。 不要であればNULLを指定できますが、その際は dwReserved に TTL_PLUGIN_ALLTEXT 以外を指定しなければなりません。 ByRef pzNSel As BytePtr テキスト処理を実行後の、被選択テキストを格納したバッファへのポインタをBytePtr(*char)型で指定します。 このパラメータに指定したバッファは、TtlPlgIn_HandleClose() が呼ばれるまで有効でなければいけません。 不要であればNULLを指定できますが、その際は dwReserved に TTL_PLUGIN_SELECTED 以外を指定しなければなりません。 dwReserved As DWord 将来のために予約されています。 現在は、NULLが指定されます。 【返り値】 テキスト処理の種類を指定します。 テキスト全体を処理した場合は、TTL_PLUGIN_ALLTEXT(=1) ※テキスト全体が、pzNText に指定された内容で置き換えられます。 被選択テキストのみが処理された場合は、TTL_PLUGIN_SELECTED(=2) ※被選択テキストのみが、pzNSel に指定された内容で置き換えられます。 テキスト処理を伴わない、もしくは処理に失敗した場合は、TTL_PLUGIN_FALSE(=0) ※テキストの置き換えは行いません。 ○Function Export TtlPlgIn_HandleClose( dwHandle As DWord ) As Char 【引数】 dwHandle As DWord テキスト処理メニューを識別するハンドルがDWord(unsigned long)型で指定されます。 【返り値】 処理の結果をTRUE(=1) or FALSE(=0) で返します。 ■備考 プラグインDLL内部にて、動的メモリ(ヒープ領域)確保が必要な場合には、 TtlPlgIn_HandleOpen() もしくは、TtlPlgIn_Work() にて確保を行い、 TtlPlgIn_HandleClose() にて開放することを推奨します。 例えば、 ・テキストスピーチ ・特定の情報を抽出してテキストを整形 ・選択されたテキストをグーグル検索 ・自分がよく使う構文の自動挿入 ・顔文字リスト挿入 etc というように、汎用性のあるものから、自分専用なニッチなものまで、なんでもありです。 自分専用のつもりであっても、誰かに需要があるかもしれません。 興味ありましたら是非、作成してみませんか? 作成したプラグインのアップロード先に困った際は、こちらの「プラグイン置き場」をご利用ください。 # 2008.12.10 URLを修正しました。スパム対策のため。 作成されたプラグインの公開をお待ちしております。 |
作成者: | konisi [ 2007年10月01日(月) 01:39 ] |
記事の件名: | |
渡されるpszTextの値が少しおかしいようです。確認してください。 文字列のサイズが1バイト足りてません。 それと、文字列を挿入する位置を決定したりしたいのでカーソルのある位置をパラメータに追加して欲しかったりします。 とりあえず こんなの [ここをクリックすると内容が表示されます] 作ってみました。
コード: Function Menu1_Title(ByRef fEnable As Char)As String fEnable=TRUE Menu1_Title="GetNowTime" End Function Function Menu1_Work(hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef dwAction As DWord)As String Menu1_Work=pszText+Date$()+" "+Time$() dwAction=TTL_PLUGIN_ALLTEXT End Function Function Menu2_Title(ByRef fEnable As Char)As String fEnable=TRUE Menu2_Title="選択範囲が「竹薮焼けた」" End Function Function Menu2_Work(hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef dwAction As DWord)As String Dim pszs As*Byte,length As Long length=lstrlen(pszSel)-1 pszs=calloc(length+2) Dim i=0 As Long,j As Long 'SJIS文字として編集 Do If pszSel>=&H80 then For j=i+1 To 2 Step -1'memmove無いかなぁ・・・。 pszs[j]=pszs[j-2] Next pszs[1]=pszSel[i+1] pszs[0]=pszSel i+=2 Else For j=i To 1 Step -1 pszs[j]=pszs[j-1] Next pszs[0]=pszSel i++ End If If i>length then Exit Do Loop Menu2_Work=pszs free(pszs) dwAction=TTL_PLUGIN_SELECTED End Function |
作成者: | 淡幻星 [ 2007年10月01日(月) 21:12 ] |
記事の件名: | バグ報告&作成をありがとうございます |
≫konisiさん 早速の作成をありがとうございます。 # こんなに早くレスポンスがあるとは思っていませんでした(喜)。 バグ報告をありがとうございます。 終端の1バイトが欠けていました。修正したβ版をアップしましたのでご確認ください。 なお、上記β版ではカーソル位置をパラメータに追加してあります。 まだ暫定ですが、仕様は以下です。 拡張パラメータ仕様 [ここをクリックすると内容が表示されます]
この部分に関しては、これで決定のつもりですが気が変わって正式アップまでに変更になったらすみません。コード: dwReserved As DWord パラメータに、 以下で定義されるTtlExpand構造体のポインタが格納されます。 Type TtlExpand wVersion As Word dwSelIin As DWord dwSelFin As DWord End Type wVersion ・・・バージョン番号が格納されます。(Ver.160=160, Ver.161=161,,,) dwSelIni ・・・カーソルの開始位置が格納されます。 dwSelFin ・・・カーソルの終了位置が格納されます。 この拡張仕様に関するテンプレート変更は、正式アップまで勘弁ください。 # しばらくまとまった時間が取れないので。。。 # コーディングから察するに、konisiさんなら必要なさそうですね(^^) |
作成者: | konisi [ 2007年10月02日(火) 23:03 ] |
記事の件名: | |
どうもありがとうございます。 とりあえずこんなコードを打ってみました。 [ここをクリックすると内容が表示されます] それと今気が付いたのですが、エディタのフォント名とかフォントサイズとか使用中の文字コードとかが分かると、それはそれで使い道がありそうです。
コード: Type TtlExpand wVersion As Word dwSelIin As DWord dwSelFin As DWord End Type Dim ptrDataEx As*TtlExpand Function Export TtlPlgIn_Work(dwHandle As DWord,hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef pzNText As*Byte,ByRef pzNSel As*Byte,dwReserved As DWord)As DWord Dim pst As*DllItemDist Dim nRet As DWord Dim strBuf As String Dim dwReserved_TtlExpand As TtlExpand pst=dwHandle As*DllItemDist If dwReserved Then'0でなければ ptrDataEx=dwReserved As VoidPtr End If 'テキスト処理の実行 Select Case pst->nIndex Case 0 strBuf=Menu1_Work(hWnd,pszFile,pszText,pszSel,nRet) Case 1 strBuf=Menu2_Work(hWnd,pszFile,pszText,pszSel,nRet) Case 2 strBuf=Menu3_Work(hWnd,pszFile,pszText,pszSel,nRet) End Select '返却テキストの設定 Select Case nRet Case TTL_PLUGIN_ALLTEXT pzNText=HeapAlloc(pst->hHeap,HEAP_ZERO_MEMORY,Len(strBuf)+1) lstrcpy(pzNText,StrPtr(strBuf)) Case TTL_PLUGIN_SELECTED pzNSel = HeapAlloc(pst->hHeap,HEAP_ZERO_MEMORY,Len(strBuf)+1) lstrcpy(pzNSel,StrPtr(strBuf)) Case TTL_PLUGIN_FALSE '返却文字列は準備しない。 End Select '返り値の設定 TtlPlgIn_Work=nRet End Function コード: 'プラグインメニューの3つ目 Function Menu3_Title(ByRef fEnable As Char)As String fEnable=TRUE Menu3_Title="削除のテスト。" End Function Function Menu3_Work(hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef dwAction As DWord)As String Dim buffer[80] As Byte If ptrDataEx then'バージョン照合は可能か If ptrDataEx->wVersion<160 then'バージョンが1.60より下なら MessageBox(hWnd,"このエディタのバージョンでは動作できません。Ver1.61(V161)以上で使用してください。","Warning",MB_OK) wsprintf(buffer,"今のバージョン識別番号:V%d",ptrDataEx->wVersion) MessageBox(hWnd,buffer,"Warning",MB_OK) Menu3_Work="" dwAction=TTL_PLUGIN_FALSE Exit Function End If Else'バージョン照合不可能なら(Ver 1.60) MessageBox(hWnd,"このエディタのバージョンでは動作できません。Ver1.61(V161)以上で使用してください。","Warning",MB_OK) MessageBox(hWnd,"今のバージョン識別番号:多分V160","Warning",MB_OK) Menu3_Work="" dwAction=TTL_PLUGIN_FALSE Exit Function End If '以下本処理 Dim buf As*Byte Dim si As Long,sf As Long si=ptrDataEx->dwSelIin sf=ptrDataEx->dwSelFin If si<>sf then buf=calloc(lstrlen(pszText)+1) If si then memcpy(buf,pszText,si) memcpy(buf+si,pszText+sf,lstrlen(pszText)-sf+si) Else memcpy(buf,pszText+sf,lstrlen(pszText)-sf) End If Menu3_Work=buf free(buf) dwAction=TTL_PLUGIN_ALLTEXT Else Menu3_Work="" dwAction=TTL_PLUGIN_FALSE End If End Function |
作成者: | 淡幻星 [ 2007年10月03日(水) 23:48 ] |
記事の件名: | |
またの早速の作成と、提案をありがとうございます。 >それと今気が付いたのですが、エディタのフォント名とかフォントサイズとか使用中の文字コードとかが分かると、それはそれで使い道がありそうです。 そうですね。 次回のバージョンアップ(Ver.161)で検討してみます。 2週間後くらいまでにはアップできるかと、考えています。 # ちなみに。 [ここをクリックすると内容が表示されます]
個人的には、カーソル位置にある四則算が出来るプラグインを作りたいところですね。# 文字コードは5種類を読み書きできることを謳ってますが、当然ながらEdit窓上ではShift-JISのみで取り扱ってます。 # ロード/セーブ時にコード変換しているだけです。(UTF16への変換がちょっと怪しいとかいう話も。。。汗) # よって、プラグインDLLに渡される文字列も必ずShift-JISになります。 # 保存時にどの文字コードを用いるか、のユーザ設定は保持しているので、それを渡すことは可能ですが。。。 # そもそもそういう意味で言ってますか?(^^;) んー、仕様をどうしようかな。 # エディタのフォントについては、何も考えてません(爆 # GetStockObject( OEM_FIXED_FONT ) を放り込んでます。 # フォント選択ダイアログは、、、そのうち余力があったら実装しようかなというところ。 # プラグイン側で作成した独自/特殊フォントを取得して設定する、なんて実装の方が楽といえば楽なんですが。。。 # ↑私がフォントについて理解しなくて良い分、という意。 # これも仕様をどうしようかな。 konisiさんがこちらに投稿されてるコードを追うことから、、、と思っている今日この頃。 次のバージョンアップに間に合うかは、、、時間が取れたらかな。。。 あ、どちら様か、作成されますか?(ワクワク)←マテ。 |
作成者: | つっちー [ 2007年10月12日(金) 20:45 ] |
記事の件名: | 四則算について |
こんばんわ。 ABはまだまだ初心者で、皆さんのをパクリながら(笑) たまに 何かに取り組んでるレベルのつっちーです。 久しぶりにここを見ていたら、僕が質問させて頂いた四則計算の話題と 僕の投稿が関わっていたので・・・(笑)、ご参考までに書き込みをさせて頂きます。 四則算についての記事です。 http://www.activebasic.com/forum/viewto ... 7%D7%BB%BB ※質問で使用していたコードは、僕では先に進めなかったので・・・ 僕はこの中のyoshiさんのプログラムを使用して、プログラム電卓 (式が液晶に表示される電卓)みたいなのに流用させて頂きました。 (他にも、いろいろと四則計算に絡む回答が沢山あります) 何度がここで質問させて頂いて、いろんな方にお世話になりました。 (まだ現在進行形です・・・) コードを書いたり助言はできませんが、 こう言う事ででも恩返しできれば・・・と思い書き込みさせて頂きました。 淡幻星さんの意図としているものかどうかわかりませんが、 ご覧になってみて下さい。 |
作成者: | 淡幻星 [ 2007年10月14日(日) 02:23 ] |
記事の件名: | Re: 四則算について |
≫つっちーさん コメントをありがとうございます。 ほんと、数式を文字列として認識しての計算を難しいですね。 残念ながら、紹介いただいた記事は知ってました。 # 数学関数式の計算がメインのようでしたので、 # ちょっと目的が違うと思い、スルーしてました(^^;)。 なんとか、逆ポーランド記法を利用した四則算が完成しました。 参考までに、こんな感じになってます。 お互い、ABプログラミングをがんばっていきましょう。 # あ、興味ありましたら是非プラグイン作成にご参加くださいませ(笑)。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |