2024/01/23

DXL Step-by-Step:#24)サンプルコード(段落と文字の装飾②)

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 24 回です。前回に引き続き、段落と文字の装飾のサンプルプログラムのご紹介です。


作成するリッチテキスト

まずは、作成するリッチテキストのイメージです。サンプル然とした画像ではありますが...

段落と文字の装飾に関して紹介したすべての機能は網羅していませんが、インデント、文字色やサイズ、パーマネントペンの指定を行います。


エージェント

これまでと同様にエージェントで作成します。Initialize の構成はこれまでとほぼ同じですが、DXL 用のライブラリを Use していて、事前に準備した共通関数を使用しています。

また、保存(インポート)エラーが発生したときは DXL を出力するようデバッグ機能を付けています。

Option Declare
Use "lsDXL"

Private xns As NotesSession

Sub Initialize
   Dim dprs As NotesDOMParser
   Dim ndb As NotesDatabase

   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase

   Set dprs = xns.CreateDOMParser()
   'DXL の構築
   Call xSetDXL(dprs)

   '保存(インポート)
   If Not DXL_Import(dprs, DXLIMPORTOPTION_CREATE, False) Then
      'エラーの場合 DXL を出力
      Call Debug_SaveDXL(dprs)
   End If
End Sub


DXL 出力のメインルーチン

xSetDXL 関数が DXL を構築するメインルーチンになります。この関数ではリッチテキストフィールドを作成する部分までを行い、それより詳細なノードの構築は、目的ごとのサブ関数で実施しています。

Function xSetDXL(vdprs As NotesDOMParser)
   Dim ddn As NotesDOMDocumentNode
   Dim den As NotesDOMElementNode
   Dim denDoc As NotesDOMElementNode
   Dim denItem As NotesDOMElementNode
   Dim denRT As NotesDOMElementNode

   Set ddn = vdprs.Document

   '文書作成
   Set den = ddn.CreateElementNode("document")
   Call den.SetAttribute("form", "Doc")
   Set denDoc = ddn.AppendChild(den)

   'フィールド作成
   Set den = ddn.CreateElementNode("item")
   Call den.SetAttribute("name", "Body")
   Set denItem = denDoc.AppendChild(den)

   'リッチテキスト作成
   Set den = ddn.CreateElementNode("richtext")
   Set denRT = denItem.AppendChild(den)

   '段落定義
   Call xSetDXL_pardef(ddn, denRT)

   'テキストノード追加
   Call xSetDXL_par1_Text(ddn, denRT)

   '文字色の指定
   Call xSetDXL_par1_TextRed(ddn, denRT)

   '文字サイズと色を変更
   Call xSetDXL_par2_Size(ddn, denRT)

   'パーマネントペンの設定
   Call xSetDXL_par2_ParPen(ddn, denRT)
End Function

各サブ関数は、仕様がわかりやすくなるよう引数をそろえています。ノードの新規作成に必要となる NotesDOMDocumentNode と 親となる richtext のノードです。


段落の定義

第 20 回『pardef と par ノードの関係② インポート時』でまとめたように段落の定義である padef ノードはリッチテキストの先頭にまとめて記述しても問題ありません。そこで、今回のサンプルで使用する段落定義を一気に作成する関数 xSetDXL_pardef を作成しました。

Function xSetDXL_pardef(vddn As NotesDOMDocumentNode, vdenRT As NotesDOMElementNode)
   Dim den As NotesDOMElementNode
   Dim denPar As NotesDOMElementNode
   Dim denRun As NotesDOMElementNode

   '段落定義 id='1'
   '-------------------------
   Set den = vddn.CreateElementNode("pardef")
   Call den.SetAttribute("id", "1")

   '1 行目は 4 cm
   Call den.SetAttribute("firstlineleftmargin", DXL_CMToInch(4))

   '2 行目以降は 3 cm
   Call den.SetAttribute("leftmargin", DXL_CMToInch(3))

   '段落定義を追加
    Call vdenRT.AppendChild(den)


   '段落定義 id='2'
   '-------------------------
   Set den = vddn.CreateElementNode("pardef")
   Call den.SetAttribute("id", "2")
 
   '行間は 1.5

    Call den.SetAttribute("linespacing","1.5")

   '段落定義を追加
   Call vdenRT.AppendChild(den)
End Function

マージンの指定では、以前に作成した長さ(センチメートル)をインチの文字列に変換する関数 DXL_CMToInch を使用しています。

この関数で作成される DXL は次の部分となります。


テキストノード追加

段落にプレーンテキストを追加する場合のパターンです。

段落を表す par ノードを作成、段落定義は id 1 を設定しています。その配下のノードにテキストノードを追加しています。途中に段落内で改行する break ノードを挿入しています。

Function xSetDXL_par1_Text(vddn As NotesDOMDocumentNode, vdenRT As NotesDOMElementNode)
   Dim denPar As NotesDOMElementNode
   Dim den As NotesDOMElementNode
   Dim dtn As NotesDOMTextNode

   '段落の作成
   Set den = vddn.CreateElementNode("par")
   Call den.SetAttribute("def", "1")
   Set denPar = vdenRT.AppendChild(den)

   'プレーンテキスト(テキストノード)追加
   Set dtn = vddn.CreateTextNode("この段落はインデントをしています。")
   Call denPar.AppendChild(dtn)

   '段落内改行の追加
   Set den = vddn.CreateElementNode("break")
   Call denPar.AppendChild(den)

   'プレーンテキスト(テキストノード)追加
   Set dtn = vddn.CreateTextNode("この行は段落内で改行した2行目です。")
   Call denPar.AppendChild(dtn)
End Function

この関数で作成される DXL は次の部分となります。


文字色の指定

文字色を指定するには font ノードが必要でした。そして、適用する範囲を設定するために run ノードで括る必要がありましたね。以下のコードでは par、run の順で階層化したノードを作成し、その配下に font とテキストノードを作成しています。 

Function xSetDXL_par1_TextRed(vddn As NotesDOMDocumentNode, vdenRT As NotesDOMElementNode)
   Dim denPar As NotesDOMElementNode
   Dim denRun As NotesDOMElementNode
   Dim den As NotesDOMElementNode
   Dim dtn As NotesDOMTextNode

   '段落の作成
   Set den = vddn.CreateElementNode("par")
   Call den.SetAttribute("def", "1")
   Set denPar = vdenRT.AppendChild(den)

   '範囲の作成
    Set den = vddn.CreateElementNode("run")
   Set denRundenPar.AppendChild(den)

   '文字装飾の追加
   Set den = vddn.CreateElementNode("font")
   Call den.SetAttribute("color", "red")
   Call denRun.AppendChild(den)

   'プレーンテキスト(テキストノード)追加
   Set dtn = vddn.CreateTextNode("同じ段落スタイルですが赤字で表示します。")
   Call denRun.AppendChild(dtn)
End Function

font ノードには色を設定する color 属性を追加し、定義済みの色である red を指定しています。

この関数で作成される DXL は次の部分となります。


続きは次回

まだ、すべてのサブ関数を紹介していないのですが、長くなったので続きの文字サイズの設定とパーマネントペンは次回とします。

前回 DXL Step-by-Step 次回


0 件のコメント:

コメントを投稿