-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathProgram.fs
65 lines (56 loc) · 2.29 KB
/
Program.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// MIT License
open System
open System.IO
open System.Text
open TemplateEngine.Docx
open FSharp.Data
let split (ss:#seq<obj>) (s:string) =
s.Split(ss |> Seq.map string |> Seq.toArray, StringSplitOptions.None)
let read filePath =
let bin = File.ReadAllText(filePath, Encoding.UTF8)
let csv = CsvFile.Parse(bin, "," , '\u0022', hasHeaders = true)
in (csv.Headers,csv.Rows)
let file x =
match split [|" "|] x with
| [|""; name; ""|] -> name
| [|""; name|] -> name
| _ -> ""
let table k (headers,rows) : TableContent =
match headers with
| None -> new TableContent(k)
| Some a ->
let h = Seq.toList a
let r = List.fold (fun acc (x:CsvRow) -> (x.Columns |> Array.toList) :: acc) [] (rows |> Seq.toList)
let row = List.fold (fun acc (k,v) -> new FieldContent(k,v) :> IContentItem :: acc) []
let t = new TableContent(k)
let _ = t.Clear
let _ = do printfn "Headers: %A\nRows: %A" h r
in List.fold (fun acc x -> t.AddRow((row (List.zip h x)) |> List.toArray)) t r
let field x =
match x with
| [|""; "scalar"; k; v; ""|] -> new FieldContent(k,v) :> IContentItem
| [|""; "base64"; k; v; ""|] -> new FieldContent(k, System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(v))) :> IContentItem
| [|""; "vector"; k; v; ""|] -> table k (read v) :> IContentItem
| [|""; "zimage"; k; v; ""|] -> new ImageContent(k, File.ReadAllBytes(v)) :> IContentItem
| _ -> new EmptyContent() :> IContentItem
let ret (_:unit) = 0
let tmp (_:TemplateProcessor) = ()
let varList vars = seq { for i in split [|","|] vars do split [|" "|] i } |> List.ofSeq
let memo list = list |> List.map field
let content memo = memo |> List.toArray |> Content
let debug vars inp out = do
printfn "Vars: %A" vars
printfn "Template: %A" inp
printfn "Output: %A" out
let eval args =
match split [|"-vars"; "-in"; "-out"|] (args |> String.concat " ") with
| [|_; vars; inp; out|] -> do
File.Delete(file out)
File.Copy(file inp, file out)
let x = memo (varList vars) in do
debug x inp out
use z = new TemplateProcessor(file out)
z.FillContent(content x).SaveChanges() |> tmp
| _ -> ()
[<EntryPoint>]
let main args = args |> eval |> ret