2022/02/09

リッチテキストの特定のフォントだけ置換する

メール等の本文で使用されている「リッチテキスト」フィールドでは、文字ごとに好みのフォントに変えることができます。

多くのユーザーが1つの文書を編集するような場合、リッチテキストフィールドの設計でフォントを指定しているにも関わらず、気付いたら途中の段落からフォントが変わっていた、なんてこともあるようで...


今回は、リッチテキストにある特定のフォントを、別のフォントに置換する方法をご紹介します。


まずはリッチテキスト内にあるテキストのフォントの調べ方です。

リッチテキスト内で使われているフォントが何かを調べるには、NotesRichTextStyle クラスの NotesFont プロパティを使います。

NotesFont プロパティは 0 から 255 までの整数値(フォントID)を返しますが、このフォントID は事前に定義されているもの(0, 1, 4, 255)とそうでないもの(5 から 254)があります。"Meiryo UI" といったフォントは「そうでないもの」に該当するため、フォントIDを調べなければなりません。

フォントの名前からその文書に割り当てられたフォントIDを調べるには、NotesRichTextItem クラスの GetNotesFont メソッドを使います。

リッチテキストでまだ使用されていないフォントにIDを割り当てるには、GetNotesFont の第2引数に True を指定します。第2引数を省略するか False を指定した場合、使用されていないフォントなら 0 が返ります。

今回は "Meiryo UI" を "HG創英角ポップ体" へ変更したいので、この2つのフォントの番号を調べます。

	Dim ss As New NotesSession
	Dim doc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim fontIdFrom As Integer
	Dim styleTo As NotesRichTextStyle
    
	Set doc = ss.CurrentDatabase.UnprocessedDocuments.GetFirstDocument
	Set rtitem = doc.GetFirstItem( "Body" )
	fontIdFrom = rtitem.GetNotesFont( "Meiryo UI", True )
	Set styleTo = ss.CreateRichTextStyle
	styleTo.NotesFont = rtitem.GetNotesFont( "HG創英角ポップ体", True )

リッチテキスト内で、テキストの最初から開始されて新しい段落やスタイルの変更で終わるテキストの範囲を「テキストラン」と言います。テキストランの範囲内はスタイルが同じになります。リッチテキスト内にあるテキストランを最初から最後まで検索しながら、テキストランのスタイルのフォントを調べていきます。

テキストランの範囲を NotesRichTextRange クラスのオブジェクトにして、範囲の最初から最後までを SetBegin と SetEnd で設定します。その上で範囲のスタイルにあるフォントIDが "Meiryo UI" のフォントIDと一致したら、範囲のスタイルを置換します。スタイルのプロパティにはフォントの他にもフォントサイズなどもありますが、フォント以外のプロパティを変えたくない場合は STYLE_NO_CHANGE (255) をセットとします。新規にスタイルを作成すると、各プロパティには 255 がデフォルト値としてセットされています。 

	Dim nav As NotesRichTextNavigator
	Dim range As NotesRichTextRange
	Dim rangeStyle As NotesRichTextStyle

	Set nav = rtitem.CreateNavigator()
	If nav.FindFirstElement( RTELEM_TYPE_TEXTRUN ) Then
		Set range = rtitem.CreateRange
		Do
			Call range.SetBegin( nav )
			Call range.SetEnd( nav )
			Set rangeStyle = range.Style
			If rangeStyle.NotesFont = fontIdFrom Then
				Call range.SetStyle( styleTo )
			End If
		Loop While nav.FindNextElement( RTELEM_TYPE_TEXTRUN, 1 )
	End If
	Call doc.Save( True, False )

ここまでのコードをビューのアクションボタンに設定します。

下の画像はアクションボタンの実行前(左)と実行後(右)でフォームを開いた状態の画面ショットです。2行目の Meiryo UI だけフォントが変わりました。

「指定したフォントなら置換する」というコードでしたが、最後から5行上のIf文にある等号「=」を不等号「<>」に置き換えると「指定したフォントじゃなければ置換する」になり、下図のようにすることもできます。


0 件のコメント:

コメントを投稿