テキスト プロシージャの定義

要約:
テキスト プロシージャを定義することにより、より強力なテキスト書式を作成することができます。
Curl® 言語では、テキスト プロシージャを定義してテキスト書式機能を拡張することができます。テキスト プロシージャはテキスト書式よりも強力です。Curl 言語の他の プロシージャと同様に、引数を取り、式を評価して、他のプロシージャを呼び出し、値を返すことができます。プロシージャの記述や呼び出し方法の一般的な理解があれば、テキスト プロシージャの記述に役に立ちます。「プロシージャ」を参照してください。
テキスト プロシージャと Curl 言語の他のプロシージャとの主な違いは、テキスト プロシージャの構文はテキストの入力をより簡単なものにすることです。プロシージャの終わりに追加するコンテンツは 1 つの残余引数として扱われ、テキスト チャンク と呼ばれることがあります。テキスト チャンク内の Curl 言語の式はテキストとして処理され、解析されません。テキストを VBox のようなグラフィカル オブジェクトに続けて渡す場合は、残余引数を繰り返し処理し、空白や段落の区切り文字などを取り除く必要があります。
オプション設定のみで定義されているテキスト書式を作成する場合は、define-text-format を呼び出し、テキスト書式を定義します。「テキスト書式の定義」を参照してください。
オプションにないテキスト書式を作成する場合は、define-text-proc を呼び出し、テキスト プロシージャを定義します。
次の表は define-text-proc の構文を示しています。
構文:
{define-text-proc
    {text-procedure-name [arg = value,]* ...}:return-type
        expressions
        {return return-value}
}
         
説明:
  • text-procedure-name は新たに定義するテキスト プロシージャの名前です。
  • arg* は引数がある場合にこれを指定します。これらの引数はキーワード引数で、カンマで区切って指定する必要があります。プロシージャを呼び出す場合のキーワード引数はオプションで、次の形式を使います。
    arg = value
  • return-type は戻り値の型を指定します。これは通常 any 型です。
  • expressions はテキスト プロシージャのコードで構成されます。最後の式は return 呼び出しになります。
  • return-value はテキスト プロシージャが返す値です。テキスト プロシージャはテキストに使用されるため、通常 paragraph または text 呼び出しを返します。

table テキスト書式の使用

次の例は special と呼ばれるテキスト プロシージャを示し、define-text-proc で定義されています。この例では、specialtable テキスト書式を使い、テキストのコンテンツを 2 つのイメージの間に配置します。

例: table テキスト書式
{define-text-proc {special ...}:any
    {return
        {table
            valign = "center",
            {row
                {cell
                    {image
                        source =
                        {url "../../default/images/holiday.gif"},
                        width = 1cm,
                        height = 0.8cm}
                }
                {cell
                    {text font-family = "serif",
                          font-style = "italic",
                          font-size = 11pt,
                        {value ...}
                    }
                }
                {cell
                    {image
                        source =
                        {url "../../default/images/holiday.gif"},
                        width = 1cm,
                        height = 0.8cm}
                }
            }
        }
    }
}
{special Shirts and Trousers}
{special Hats and Scarves}

テキスト プロシージャにおけるアニメーションの使用

次の例は sale と呼ばれるテキスト プロシージャを示し、define-text-proc で定義されています。このテキスト プロシージャは animate メソッドから Timer を取得して使用し、テキストを緑と赤に切り替えます。

例: テキスト プロシージャにおけるアニメーションの使用
{define-text-proc {sale ...}:any
    let color-str:String = "green"
    let flash:TextFlowBox =
        {TextFlowBox
            font-weight = "bold",
            color = color-str,
            {value ...}
        }
    {flash.animate
        interval = 1s,
        {on TimerEvent do
            {if color-str == "red" then
                set color-str = "green"
             else
                set color-str = "red"
            }
            set flash.color = color-str
        }
    }
    {return {paragraph {value flash}}}
}
{sale We Are Having A Sale!}

いつテキスト プロシージャを定義するか

テキスト プロシージャはテキスト書式の特定の実装であるため、テキスト書式の場合と同じように他のテキスト プロシージャに基づいて新しいテキスト プロシージャを定義することができます。既存のテキスト プロシージャを新しいテキスト プロシージャのベースにして、オプション設定のみを変更できます。これには define-text-format を呼び出します。
次の例ではテキスト プロシージャ sale を定義し、次に sale に基づいてテキスト書式 big-sale を定義して大きいフォント サイズを指定します。このメソッドを使うと、文字と段落オプション設定を変更するだけで新しいテキスト プロシージャを定義できます。

例: 既存のテキスト プロシージャの変更
{define-text-proc {sale ...}:any
    let color-str:String = "green"
    let flash:TextFlowBox =
        {TextFlowBox
            font-weight = "bold",
            color = color-str,
            {value ...}
        }
    {flash.animate
        interval = 1s,
        {on TimerEvent do
            {if color-str == "red" then
                set color-str = "green"
             else
                set color-str = "red"
            }
            set flash.color = color-str
        }
    }
    {return {paragraph {value flash}}}
}
{define-text-format big-sale as
    sale with font-size = 26pt
}
{sale We are having a sale!}
{big-sale A Really Big Sale!!!}

いつ新しいテキスト プロシージャを定義するか

前述の例では、big-sale はフォント サイズのみを再定義しています。点滅する色を青と黄色にするには、まったく新しいテキスト プロシージャを書く必要があります。次の例では、この新しいテキスト プロシージャの作成を示します。実装するコードは sale に似ていますが、Timer イベント ハンドラで異なる色が使用されています。

例: 新しいテキスト プロシージャの定義
{define-text-proc {swedish-sale ...}:any
    let color-str:String = "yellow"
    let flash:TextFlowBox =
        {TextFlowBox
            font-weight = "bold",
            font-style = "italic",
            color = color-str,
            {value ...}
        }
    {flash.animate
        interval = 1s,
        {on TimerEvent do
            {if color-str == "yellow" then
                set color-str = "blue"
             else
                set color-str = "yellow"
            }
            set flash.color = color-str
        }
    }
    {return {paragraph {value flash}}}
}
{swedish-sale Products from Sweden}