文書ドキュメントの編集
文書ドキュメントの編集に関しては、すでに前節で、段落および段落部位へのアクセスを行う com.sun.star.text.TextPortion と com.sun.star.text.Paragraph サービスを中心に説明しました。これらのサービスの利用が適しているのは、各ループごとに 1 度ずつテキストの編集を行うタイプの作業です。しかし、このような方式では対処し得ない処理も多く存在します。Apache OpenOffice に用意されている com.sun.star.text.TextCursor サービスは、ドキュメントを逆方向に遡って処理したり、センテンスや単語単位で操作するといった、より複雑な処理を行うためのもので、TextPortions を使うよりもこのような操作に適しています。
TextCursor
Apache OpenOffice API の TextCursor は、Apache OpenOffice ドキュメント上の操作で表示されるカーソルに該当するものです。これを使用すると、文書ドキュメント上の特定位置を操作対象に指定して、コマンド指定による各種の選択処理を行うことができます。ただし、このような Apache OpenOffice Basic の TextCursor オブジェクトを、通常のカーソルと混同してはいけません。両者は、本質的に異なるものです。
![]() |
VBA の Range オブジェクトの機能に該当するものは、Apache OpenOffice の TextCursor オブジェクトであって、同じ名前を持つ Apache OpenOffice の Range オブジェクトに相当するものではありません。 |
たとえば、Apache OpenOffice の TextCursor オブジェクトはドキュメント内の移動やテキストの変更という機能を担っていますが、このような処理を VBA では Range オブジェクトで処理します (MoveStart、MoveEnd、InsertBefore、InsertAfter など)。Apache OpenOffice の TextCursor オブジェクトに該当する機能は、次の節で説明しています。
テキスト内の移動
Apache OpenOffice Basic の TextCursor オブジェクトは、文書ドキュメント上に表示される通常のカーソルとは異なるものです。このため、TextCursor オブジェクトの表示位置をプログラム制御で変更しても、通常のカーソルは何の影響も受けません。また TextCursor オブジェクトは、同一オブジェクト上の異なる位置に複数オープンすることが可能で、相互に独立した形で個別制御できます。
TextCursor オブジェクトを作成するには、createTextCursor 呼び出しを使用します。
Dim Doc As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Cursor = TextDocument.Text.createTextCursor()
ここで作成した Cursor というオブジェクトは、com.sun.star.text.TextCursor サービスをサポートしており、文書ドキュメント内のテキストを移動するための各種メソッドを利用できます。たとえば次のサンプルコードは、最初に TextCursor を 10 文字分左に移動してから、3 文字分右に移動します。
Cursor.goLeft(10, False) Cursor.goRight(3, False)
TextCursor は、選択範囲の強調表示にも使用できます。このような処理は、マウスでテキストの一部を選択して強調させる操作に相当します。上記のサンプルコードでパラメータとして渡した False は、オブジェクトの移動に伴う通過部分を強調表示させるかどうかの指定です。このような TextCursor の挙動は、次のサンプルコードと対比させると分かりやすいでしょう。
Cursor.goLeft(10, False) Cursor.goRight(3, True)
この場合も最初に 10 文字分左に移動させてますが、このときは強調表示しないで、次に 3 文字分右に移動させる際には、強調表示するようにしています。つまりこのサンプルコードで TextCursor が強調表示するのは、最初の位置から 8 番目から 10 番目の文字までとなります。
以下に、com.sun.star.text.TextCursor サービスの移動操作に用いる主要なメソッドを示します。
- goLeft (Count, Expand)
- Count 分の文字だけ左へ移動します。
- goRight (Count, Expand)
- Count 分の文字だけ右へ移動します。
- gotoStart (Expand)
- 文書ドキュメントの先頭に移動します。
- gotoEnd (Expand))
- 文書ドキュメントの末尾に移動します。
- gotoRange (TextRange, Expand)
- TextRange の指定オブジェクトに移動します。
- gotoStartOfWord (Expand)
- 現在位置にあるワード (単語) の先頭に移動します。
- gotoEndOfWord (Expand)
- 現在位置にあるワードの末尾に移動します。
- gotoNextWord (Expand)
- 後ろにあるワードの先頭に移動します。
- gotoPreviousWord (Expand)
- 前にあるワードの先頭に移動します。
- isStartOfWord ()
- TextCursor の位置がワードの先頭であれば True を返します。
- isEndOfWord ()
- TextCursor の位置がワードの末尾であれば True を返します。
- gotoStartOfSentence (Expand)
- 現在位置にあるセンテンス (文章) の先頭に移動します。
- gotoEndOfSentence (Expand)
- 現在位置にあるセンテンスの末尾に移動します。
- gotoNextSentence (Expand)
- 後ろにあるセンテンスの先頭に移動します。
- gotoPreviousSentence (Expand)
- 前にあるセンテンスの先頭に移動します。
- isStartOfSentence ()
- TextCursor の位置がセンテンスの先頭であれば True を返します。
- isEndOfSentence ()
- TextCursor の位置がセンテンスの末尾であれば True を返します。
- gotoStartOfParagraph (Expand)
- 現在位置にあるパラグラフ (段落) の先頭に移動します。
- gotoEndOfParagraph (Expand)
- 現在位置にあるパラグラフの末尾に移動します。
- gotoNextParagraph (Expand)
- 後ろにあるパラグラフの先頭に移動します。
- gotoPreviousParagraph (Expand))
- 前にあるパラグラフの先頭に移動します。
- isStartOfParagraph ()
- TextCursor の位置がパラグラフの先頭であれば True を返します。
- isEndOfParagraph ()
- TextCursor の位置がパラグラフの末尾であれば True を返します。
個々のセンテンス (文章) 間の区切りは、センテンス末を示す記号を基準に処理されます。たとえばピリオドは、このようなセンテンス末の記号として認識されます。
Expand パラメータは、オブジェクトの移動に伴う通過部分を強調表示させるかを、ブール値を用いて指定します。またこれらの移動操作用メソッドは、移動処理に成功したか、あるいは移動先となるテキスト位置の不在により処理が中断されたかを、戻り値として返します。
以下に、com.sun.star.text.TextCursor サービスをサポートし、TextCursor を使用して強調表示した範囲を編集する代表的なメソッドを示します。
- collapseToStart ()
- TextCursor の位置を強調表示部分の先頭に移動し、強調表示を解除します。
- collapseToEnd ()
- TextCursor の位置を強調表示部分の末尾に移動し、強調表示を解除します。
- isCollapsed ()
- TextCursor による強調表示部分がなければ、True を返します。
TextCursor によるテキストの書式設定
com.sun.star.text.TextCursor サービスは、本章の冒頭で説明した文字および段落関係の属性をすべてサポートしています。
次のサンプルコードは、TextCursor を用いたこれらの使用例です。ここでは、ドキュメントの内容に順次アクセスして、各センテンスの先頭ワードに対して太字の書式を設定します。
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) Cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed
このサンプルコードではまず、テキストの取得に使うドキュメントオブジェクトを作成しています。そして、ループを使ってセンテンス単位でテキストを読み取り、先頭ワードを強調表示して、太字の書式を設定します。
テキストの取得と変更
TextCursor による強調表示部分に対しては、TextCursor オブジェクトの String 属性によるテキスト操作が可能です。次のサンプルコードでは、String 属性を用いて、センテンスの先頭ワードをメッセージボックスに表示します。
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) MsgBox Cursor.String Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed
このような String 属性を使った手法は、センテンスの先頭ワードを変更する場合にも利用できます。
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) Cursor.String = "Ups" Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed
TextCursor によりテキストを強調表示した状態で、String 属性に文字列を代入すると、該当部のテキストが新規の文字列に置き換えられます。強調表示されていない場合、文字列は TextCursor 位置に挿入されます。
制御コードの挿入
状況によっては、ドキュメント上に表示される実際のテキストではなく、表示形態の方を変更したい場合もあります。Apache OpenOffice は、このような表示形態の一部を制御コードを用いて処理します。これらの制御コードは、テキスト内に挿入することで、その表示形態を整えます。個々の制御コードは com.sun.star.text.ControlCharacter で定数として定義されています。以下に、Apache OpenOffice で使用可能な制御コードを示します。
- PARAGRAPH_BREAK
- 段落区切り。
- LINE_BREAK
- 段落内の行ブレーク。
- SOFT_HYPHEN
- ハイフネーションが可能な位置。
- HARD_HYPHEN
- ハイフネーションを強制する位置。
- HARD_SPACE
- ハードスペーステキストの行末調整に影響されないスペース (ハードスペース)。
制御コードを挿入するには、挿入位置だけではなく、該当するドキュメントオブジェクトも指定する必要があります。次のサンプルコードでは、20 番目の文字の次に段落区切りを挿入します。
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Cursor.goRight(20, False) Doc.Text.insertControlCharacter(Cursor, _ com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
insertControlCharacter メソッドの呼び出しで、パラメータに False を指定しているのは、挿入処理後も TextCursor による強調表示部分を保持させるためです。ここでパラメータに True を指定すると、insertControlCharacter は、該当部のテキストを置き換えます。
テキスト部位の検索
使用頻度の高い操作として、文書ドキュメント内にある特定の文字列を検索して、その位置にあるテキストを編集するという処理があります。このような処理を行うため、すべての Apache OpenOffice ドキュメントには特殊なインターフェースが用意されていますが、このインターフェースによる検索を行う際は、SearchDescriptor と呼ばれるオブジェクトを事前に作成しておく必要があります。これにより、ドキュメントの検索する対象が Apache OpenOffice に指定されます。SearchDescriptor は com.sun.star.util. SearchDescriptor サービスをサポートしたオブジェクトで、次のサンプルコードのように createSearchDescriptor メソッドを用いて作成します。
Dim SearchDesc As Object SearchDesc = Doc.createSearchDescriptor
作成した SearchDescriptor に対しては、次のようにして検索するテキストを指定します。
SearchDesc.searchString="any text"
このように SearchDescriptor は、通常の Apache OpenOffice 操作で使う検索ダイアログに相当する機能を担っています。また、検索ダイアログに各種の検索設定があるように、同様の設定を SearchDescriptor オブジェクトに対しても指定できます。
このような属性は、com.sun.star.util.SearchDescriptor サービスに用意されています。
- SearchBackwards (Boolean)
- テキストを前方ではなく後方に向かって検索する指定。
- SearchCaseSensitive (Boolean)
- 検索をする際に大文字と小文字を区別する指定。
- SearchRegularExpression (Boolean)
- 検索式を正規表現として扱う指定。
- SearchStyles (Boolean)
- 指定した段落テンプレートを検索する指定。
- SearchWords (Boolean)
- 完全なワードのみを検索する指定。
Apache OpenOffice Basic では、Apache OpenOffice SearchSimilarity (いわゆる「ファジーマッチ」) 機能を利用できます。この機能を使うと、指定文字列と類似した文字列を Apache OpenOffice に検索させることができます。このような検索を行う際には、オリジナルの検索文字列に対して追加、削除、変更可能な文字数をそれぞれ指定できます。このような指定には、以下に示す com.sun.star.util.SearchDescriptor サービスの関連属性を使用します。
- SearchSimilarity (Boolean)
- 類似検索を実行する指定。
- SearchSimilarityAdd (Short)
- 類似検索での追加可能な文字数の指定。
- SearchSimilarityExchange (Short)
- 類似検索での置換可能な文字数の指定。
- SearchSimilarityRemove (Short)
- 類似検索での削除可能な文字数の指定。
- SearchSimilarityRelax (Boolean)
- 類似検索の変動規則を適用する指定。
SearchDescriptor に関する必要な指定の終了後、文書ドキュメントに対する検索を実行します。このような処理には、Apache OpenOffice に用意されている findFirst および findNext メソッドを使用します。
Found = Doc.findFirst (SearchDesc) Do ' Suchergebnis bearbeiten Found = Doc.findNext( Found.End, SearchDesc) Loop until IsNull(Found)
このサンプルコードでは、ループを使って検索該当箇所をすべて探し、検索にヒットしたテキストを参照する TextRange オブジェクトを取得しています。
例: 類似検索
次のサンプルコードは、「turnover」という単語を検索して、該当箇所に太字の書式を設定します。ここでは類似検索を用いて、「turnover」に完全に一致するものだけでなく、複数形の「turnovers」を始め「turnover's」なども検索にヒットするようにしています。なお類似性の度合いとしては、オリジナルの検索文字列に対して 2 文字までの違いを許容させることにします。
Dim SearchDesc As Object Dim Doc As Object Doc = StarDesktop.CurrentComponent SearchDesc = Doc.createSearchDescriptor SearchDesc.SearchString="turnover" SearchDesc.SearchSimilarity = True SearchDesc.SearchSimilarityAdd = 2 SearchDesc.SearchSimilarityExchange = 2 SearchDesc.SearchSimilarityRemove = 2 SearchDesc.SearchSimilarityRelax = False Found = Doc.findFirst (SearchDesc) Do Found.CharWeight = com.sun.star.awt.FontWeight.BOLD Found = Doc.findNext( Found.End, SearchDesc) Loop until IsNull(Found)
従来の Apache OpenOffice API 同様に現行の API でも、テキストの検索や置換は、ドキュメントオブジェクトを通じて実行します。ただし従来は、検索オプションの指定などを SearchSettings というオブジェクトで行なっていましたが、現在はテキストの置換処理用に用意された SearchDescriptor または ReplaceDescriptor オブジェクトを使用します。これらのオブジェクトには、検索オプションだけでなく、検索文字列を指定することが可能で、必要であれば置換文字列も格納できます。これらのオプション指定用オブジェクトは、ドキュメントオブジェクトを用いて作成してから、必要なオプション値を代入し、検索メソッド用のパラメータの形でドキュメントオブジェクトに引き渡します。
テキスト部位の置換
検索の場合と同様、Apache OpenOffice で行う通常の置換操作も、Apache OpenOffice Basic 上で実行できます。置換処理に必要な手順は、検索処理の場合と基本的に同じです。置換の場合も、最初にオプション指定用の特殊オブジェクトを作成します。このオブジェクトは ReplaceDescriptor と呼ばれ、com.sun.star.util.ReplaceDescriptor サービスをサポートしています。これまでの節で説明した SearchDescriptor のすべての属性は、ReplaceDescriptor によってサポートされています。たとえば、置換処理中、大文字と小文字の区別は有効にも無効にもすることができ、類似検索を実行できます。
次のサンプルコードは、ReplaceDescriptors を使用した Apache OpenOffice ドキュメント上での検索処理を示します。
Dim I As Long Dim Doc As Object Dim Replace As Object Dim BritishWords(5) As String Dim USWords(5) As String BritishWords() = Array("colour", "neighbour", "centre", "behaviour", _ "metre", "through") USWords() = Array("color", "neighbor", "center", "behavior", _ "meter", "thru") Doc = StarDesktop.CurrentComponent Replace = Doc.createReplaceDescriptor For O = 0 To 5 Replace.SearchString = BritishWords(I) Replace.ReplaceString = USWords(I) Doc.replaceAll(Replace) Next n
検索文字列および置換文字列は、ReplaceDescriptors の SearchString および ReplaceString 属性を使って指定します。実際の置換処理では、ドキュメントオブジェクトの replaceAll メソッドを使用することで、該当文字列を一括置換できます。
例: 正規表現による検索と置換
Apache OpenOffice の置換機能は、正規表現と併用することで、より複雑な処理を行えるようになります。正規表現とは、通常の固定された検索文字列の代わりに、プレースホルダや特殊記号から成る検索式を用いた、いわゆるパターンマッチングのことです。
Apache OpenOffice で使用可能な正規表現の詳細情報については、Apache OpenOffice のオンラインヘルプを参照してください。ここでは、いくつかの例を紹介します。
- 検索式内のピリオド記号は、任意の文字に一致します。たとえば sh.rt という検索式は、shirt にも short にも一致します。
- 検索式内の ^ 記号は、段落の先頭に一致します。たとえば ^Peter という検索式は、Peter が先頭にあるすべての段落に一致します。
- 検索式内の $ 記号は、段落の末尾に一致します。たとえば Peter$ という検索式は、Peter が末尾にあるすべての段落に一致します。
- 検索式内の * 記号は、直前の文字の任意回数の繰り返しを意味します。これをピリオド記号の次に置くと、任意の文字列に一致するプレースホルダとなります。たとえば temper.*e という検索式は、temperance にも temperature にも一致します。
次のサンプルコードでは、^$ という正規表現を用いて、文書ドキュメント内の空白行を削除します。
Dim Doc As Object Dim Replace As Object Dim I As Long Doc = StarDesktop.CurrentComponent Replace = Doc.createReplaceDescriptor Replace.SearchRegularExpression = True Replace.SearchString = "^$" Replace.ReplaceString = "" Doc.replaceAll(Replace)
Content on this page is licensed under the Public Documentation License (PDL). |