T4嵌り

  • else を使う時は <#} else { #> と記述しないといけない
  • <#+ #>で関数やクラスを定義する場合は独立したファイルに記述し、それを使用する時は <#@ include file=”Common.tt” #> でインクルードしないといけない。
  • <#@ include file=”Common.tt” #> を記述する度に改行が追加される。
    下記の様に空のコントロールブロックを追加すると何故か回避される。
    <#@ include file=”Common.tt” #><##>
    CRLFになっていない場合も発生する場合もあるらしい。
    参考:stackoverflow
  • コメントを入れる <# // コメント #>

基本

  • テンプレートのメタ定義
    • 使用する言語の定義
    • 出力ファイル拡張子
    • 参照アセンブリ
    • インポート宣言
    • 文中への直接コード埋め込み
      <#= “Hello” #>
    • インデントを入れる
      PushIndent, PopIndent, ClearIndent
    • 繰り返し構文

      出力
    • C++ コード生成サンプル
  • Visual Studio のプロジェクト
    • C# プロジェクトを作る。C++ プロジェクトでは .tt は扱えない

何を自動生成するべきか

  • 欲しい物
    • デスクリプタ
      • DDONE 構造体定義
        • 構造体名
          • デスクリプタ名
        • メンバ変数名
          • パラメータ名を変数名
          • ビット幅をビットセットで表す
          • reserved で reserved を挿入
      • セッター・ゲッター・ダンパー
        • メンバ変数名
        • 引数の型をどう定義するか?
          • スクレープ時に _count で int にするとか?
          • struct の xml だけ手で書く
            この時 enum 名を自分で書く
          • enum 生成だけ html テーブルを指定して列挙子を xml 化する
            •  html になっている時点で xml 化する必要が無い気はする。
            • 同じ DOM 構造に落とし込めるのでその後の T4 テンプレートが作りやすくなる。
      • DONE セッター・ゲッターのアサート
        • ポインタならヌルチェックを挟むだけ
        • その他の不正な値を取得する必要がある
          • ⇒ もうこれはやらなくてもいいのでは?
    • enum
      • どうやってスクレイピングするか?
        • デスクリプタの変数名から判定できるか?
          多分難しい。
  • 自動生成して活用できる事
    • C#向けにもコード生成ができる
    • この位かな…。
  • C# のデータ型
    http://www.kumei.ne.jp/c_lang/cs/cs_05.htm

xml から enum を自動生成する

Enum.xml

Enum.tt

Enum.h

html のテーブルから enum を生成する

html の任意箇所の xpath を取得する。FireFox の場合

要素の検証 -> 取得したいタグを右クリック -> コピー -> xpath

/html/body/p[11]/table

/html/body/p[11]/table/tbody/tr[2]/td[4]

/html/body/p[11]/table/tbody/tr[3]/td[1]

※html のテーブルの要素のインデックスは 1 から始まる点に注意。

メモ

  • html を xml として読み込まそうとするとタグの開始・終了が合わない等のエラーが出る事がある
  • sjis の場合は XmlDocument で読み込めない。読み込み時にエラーが発生する。
  • xhtml が元からあれば直接読み込める
  • xml があればラッキー

XmlDocument によるアクセス

TODO: 全然まとまっていない。

  • 要素下記で hoge が要素名、foo が値
    <hoge>foo</hoge>
    XElement::Element(hoge).Value で “foo” が取得される。
  • XElement はどうやって取得するか?
    • XElement は XDocument からの要素アクセスに使われる。

取り敢えずこれ使え

XDocument を使う

参考:

html

ソース

参考:IEnumerable について