no more legacy documents
TRANSCRIPT
・構文木の走査、変換
・テスト容易性の確保のしやすさ
・副作用をなくす方向に力が働く
・金融系
・やったことないのでノーコメント
得意なこと(一例)
・言語処理系
・F#のコンパイラはF#で書かれている
・木構造の分解と再構築
・木の回転
・汎用のExcel操作は不要
・読み込みも不要
・モデルを構築したら後は書き出すだけ
Excel方眼紙を倒す前提
・Excel方眼紙は最終出力と割り切る
・生成されたファイルを弄ってはいけない
・弄ったら(弄られたら)負け
・最終出力なので・・・
登場人物
・Sdm : 構造化された文書のモデル。抽象度高い
・Edm : Excel文書のモデル。セルと一対一対応
・Edm.Writer.EPPlus : EdmをEPPlusを使ってExcel
ファイルに出力。
・Sdm2Edm : SdmをEdmに変換する仕組みを提供。
・Sdm2Edmがある程度やってくれる
・論理的なページ機能もある
EPPlus直接使うんじゃダメ?
・抽象度を分ける
・文書の構造と表現を分ける
・HTMLとCSSみたいな?
・セルのアドレス計算からの解放
Sdm概要// 今のところ画像には非対応type Component = | Heading of TextStyleGroup list * Level:int * Value:Text | Paragraph of TextStyleGroup list * Lines: Text list | List of ListStyleGroup list * Items: Component list | Table of TableStyleGroup list * TableContents
type Page = { Name: string; Components: Component list }
Edm概要type Cell = { Row: int; Column: int // マージもカンタン MergedRows: int; MergedColumns: int Format: FormatInfo Data: Data }type Sheet = { Name: string Cells: Cell list Drawings: Drawing list }
Sdm2Edm概要// 実際はデフォルト実装付きのクラスを継承する方が便利// Textだけを実装すればいいConvertionRule抽象クラスと、// 何も実装しなくていいSimpleConvertionRuleクラスが用意されているtype IConvertionRule = abstract Text: ComponentRange * TextStyleGroup list * Text -> ConvertedResult abstract ArroundHeading: ComponentRange * TextStyleGroup list * int * Cell list ->ConvertedResult (* snip *) abstract Drawing: groups:TextStyleGroup list -> Drawing list
・Edm to Edm
・あふれたら新しいシートを作るPager
・他のPagerも簡単に作れる
Sdm2Edmでできること
・SdmからEdmに変換
・何も実装しなくてもOK
・カスタマイズもある程度可能
・Edmのページ処理