※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

タグを処理するアルゴリズム


アルゴリズムのスケルトン>会話インクルードのアルゴリズムA-1?からの続きです。
タグを処理するアルゴリズムの一つを紹介。

Talkコマンドにおいてタグはフォントの変更にのみ使われるので、タグの開始地点が見つかったら("<"が見つかったら)、そこを基点に一気にタグのデータを取得し、解析してフォントを変更します。

メッセージウィンドウ内で使われる標準フォントも変更できるように、標準フォントを変数に記録しておきます。
こうすることでシナリオ作者が標準フォントを自由に簡単に設定できるようにします。

TalkInclude:

// タグデータの開始地点を示す
Local _TagStart
// タグデータを記録する
Local _TagData

Do While (ptr &lt;= MessLen)

  Switch Mid(mess, ptr, 1)
  Case &quot;&lt;&quot;
    // タグの開始を示すブラがきたので、タグを読み取る処理を行う
    // タグデータの開始地点にポインタを合わせ、別の変数に記憶しておく
    // タグの開始地点と終了地点を見つけることでタグデータを取得する
    Incr ptr
    _TagStart = ptr

    // タグデータの終了地点(&quot;&gt;&quot;)を探す
    Do While (Mid(mess, ptr, 1) != &quot;&gt;&quot;)
      Incr ptr
    Loop

    // タグの終了地点が見つかったので、タグデータを別変数に格納する
    _TagData = Mid(mess, _TagStart, ptr - _TagStart)

    // タグデータ解析関数にタグデータを渡す
    // フォントの修正値を返すので、
    // それを受け取りFontコマンドで変更する
    _TagData = TagAnalyzer(_TagData)

    // フォントを変更
    Font _TagData
  Case ...
    ...
  EndSw
Loop

// フォントを初期化する
InitFont:
// フォントウェイトを初期化
FontWeight = &quot;Regular&quot;
// フォントサイズを初期化
FontSize = &quot;10pt&quot;
// フォントカラーを初期化
FontColor = &quot;#ffffff&quot;
// フォントファミリーを初期化
FontFamily = &quot;ゴシック&quot;
Font 10pt Regular #ffffff ゴシック
Return

// タグデータを解析し、フォントの修正データを算出する
// 表現の揺らぎには可能な限り対応する 変数もelemだけを使いまわす
TagAnalyzer:
// 変更先フォントを記録する変数
Local elem

// フォントカラーに関するデータの場合
elem = Left(Args(1),6)
If (elem = &quot;color=&quot;) or (elem = &quot;COLOR=&quot;) or (elem = &quot;Color=&quot;) Then
  elem = Mid(Args(1),7)
  Switch elem
  Case &quot;Red&quot; &quot;red&quot; &quot;RED&quot;
    elem = &quot;#ff0000&quot;
  Case &quot;Blue&quot; &quot;blue&quot; &quot;BLUE&quot;
    elem = &quot;#0000ff&quot;
  Case &quot;Yellow&quot; &quot;yellow&quot; &quot;YELLOW&quot;
    elem = &quot;#ffff00&quot;
  Case &quot;Green&quot; &quot;green&quot; &quot;GREEN&quot;
    elem = &quot;#008000&quot;
  Case &quot;Purple&quot; &quot;purple&quot; &quot;PURPLE&quot;
    elem = &quot;#800080&quot;
  Case &quot;Gray&quot; &quot;gray&quot; &quot;GRAY&quot;
    elem = &quot;#808080&quot;
  Case &quot;Silver&quot; &quot;silver&quot; &quot;SILVER&quot;
    elem = &quot;#c0c0c0&quot;
  Case &quot;White&quot; &quot;white&quot; &quot;WHITE&quot;
    elem = &quot;#ffffff&quot;
  Case &quot;Black&quot; &quot;black&quot; &quot;BLACK&quot;
    elem = &quot;#000000&quot;
  Case &quot;Lime&quot; &quot;lime&quot; &quot;LIME&quot;
    elem = &quot;#00ff00&quot;
  Case &quot;Aqua&quot; &quot;aqua&quot; &quot;AQUA&quot;
    elem = &quot;#00ffff&quot;
  Case &quot;Fuchsia&quot; &quot;fuchsia&quot; &quot;FUCHSIA&quot;
    elem = &quot;#ff00ff&quot;
  Case &quot;Maroon&quot; &quot;maroon&quot; &quot;MAROON&quot;
    elem = &quot;#800000&quot;
  Case &quot;Olive&quot; &quot;olive&quot; &quot;OLIVE&quot;
    elem = &quot;#808000&quot;
  Case &quot;Teal&quot; &quot;teal&quot; &quot;TEAL&quot;
    elem = &quot;#008080&quot;
  Case &quot;Navy&quot; &quot;navy&quot; &quot;NAVY&quot;
    elem = &quot;#000080&quot;
  Case Else
    If Left(elem, 3) = &quot;RGB&quot; Then
      elem = Eval(elem)
    Endif
  EndSw

  // 以降の処理は無駄なのでここでReturnしてしまう
  Return elem
Endif

// 単純な構造のタグの場合はまとめて処理
Switch Args(1)
Case &quot;B&quot; &quot;b&quot;
  # フォントウェイトをBoldに設定
  elem = &quot;Bold&quot;
Case &quot;I&quot; &quot;i&quot;
  # フォントウェイトをItalicに設定
  elem = &quot;Italic&quot;
Case &quot;BIG&quot; &quot;big&quot; &quot;Big&quot;
  # フォントサイズを+2
  elem = Replace(LT_FontSize, &quot;pt&quot;, &quot;&quot;)
  Incr elem 2
  elem = elem &amp; &quot;pt&quot;
Case &quot;SMALL&quot; &quot;small&quot; &quot;Small&quot;
  elem = Replace(LT_FontSize, &quot;pt&quot;, &quot;&quot;)
  Incr elem -2
  elem = elem &amp; &quot;pt&quot;
EndSw

// フォントサイズを変更
Switch Left(Args(1),5)
Case &quot;size=&quot; &quot;SIZE=&quot; &quot;Size=&quot;
  elem = Mid(Args(1),6)
  elem = Replace(elem, &quot;pt&quot;, &quot;&quot;)
  elem = elem &amp; &quot;pt&quot;
EndSw

// フォントファミリーを変更
Switch Left(Args(1),7)
Case &quot;family=&quot; &quot;FAMILY=&quot; &quot;Family=&quot;
  elem = Mid(Args(1),8)
EndSw

// フォントの設定を解除の場合
If Left(Args(1), 1) = &quot;/&quot; Then
  Switch Mid(Args(1),2)
  Case &quot;B&quot; &quot;b&quot; &quot;I&quot; &quot;i&quot;
    elem = FontWeight
  Case &quot;BIG&quot; &quot;big&quot; &quot;Big&quot; &quot;SMALL&quot; &quot;small&quot; &quot;Small&quot; &quot;SIZE&quot; &quot;size&quot; &quot;Size&quot;
    elem = FontSize
  Case &quot;COLOR&quot; &quot;color&quot; &quot;Color&quot;
    elem = FontColor
  Case &quot;family&quot; &quot;FAMILY&quot; &quot;Family&quot;
    elem = FontFamily
  EndSw
Endif

// 算出したデータを返す
Return elem