diff --git a/AstConv/Program.fs b/AstConv/Program.fs index 638faa8..eb20f89 100644 --- a/AstConv/Program.fs +++ b/AstConv/Program.fs @@ -2,78 +2,93 @@ open HtmlStruct.Content open System.Xml open HtmlStruct.Assemble -open HtmlStruct.Content open HtmlStruct.Present open System.IO -open System.Text open System open System.Diagnostics +let html_generate (file_in:FileInfo) (dir_o:DirectoryInfo) = + let out_dir = Uri(dir_o.FullName) + + let doc = XmlDocument() + doc.Load(file_in.FullName) + + let prog = Program.GenerateFrom(doc) + let entry = AstVisitEntry(prog) + let visitor = UnitGenerate(prog) + entry.visitWith(visitor) |> ignore + + let volume_pages = volume_page_assemble(visitor.contents()) |> List.map (fun x->x) + let story_pages = story_page_assemble(visitor.contents()) |> List.map (fun x->x) + let point_pages = slice_page_assemble(volume_pages @ story_pages) + + volume_pages @ story_pages @ point_pages |> List.iter (fun it -> (it:?>PageAccess).setPageRoot(out_dir)) + let makers = volume_pages @ story_pages @ point_pages + |> List.map(fun page_unit -> + match page_unit with + | :? SlicePage as point -> + PageMaker(point) :> PageText + | :? VolumePage as vol -> + PageMaker(vol) + | :? StoryPage as story -> + PageMaker(story) + | _ -> failwith "" + ) + + let index_page = IndexPage("汇总页面", volume_pages @ story_pages @ point_pages) + index_page.setPageRoot(out_dir) + let content = (index_page :> PageText).getHtmlText() + let href = index_page.pageURL() + File.WriteAllLines(href, [content]) + for refs in makers do + let file_path = (refs.bindPage() :?> PageAccess).pageURL() + File.WriteAllLines(file_path, [refs.getHtmlText()]) + + let graph = StorylineGraphMake("故事线网络", story_pages|> List.map(fun x -> x :?> PageAccess)) + let graph_code = graph.getGraphCode() + + let stream = new StreamWriter(Path.Combine(dir_o.FullName, "storys_display.dot"), false) + stream.Write(graph_code) + stream.Flush() + Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "storys_display.svg")} {Path.Combine(dir_o.FullName, "storys_display.dot")}""") |> ignore + + let graph2 = VolumeGraphMake("卷章引用网络", (volume_pages@story_pages)|> List.map(fun d -> d :?> PageAccess)) + let graph2_code = graph2.getGraphCode() + let stream2 = new StreamWriter(Path.Combine(dir_o.FullName, "volume_display.dot"), false) + stream2.Write(graph2_code) + stream2.Flush() + Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "volume_display.svg")} {Path.Combine(dir_o.FullName, "volume_display.dot")}""") |> ignore + let args = System.Environment.GetCommandLineArgs()|> Array.toList -if args.Length = 2 && args.Item(1) = "--help" then - System.Console.WriteLine("AstConv.exe -file xast文件路径 -odir 输出文件夹路径") + +// 参数校验 +match args.Length with +| 2 when args.Item(1) = "--help" -> + printfn "AstConv.exe --file xast文件路径 --html 输出文件夹路径\n\t构建HTML透视文档。" + printfn "AstConv.exe --file xast文件路径 --format\n\t格式化所有源文件。" exit 0 -if args.Length <> 5 then - failwith "程序调用参数错误:AstConv.exe -file xast文件路径 -odir 输出文件夹路径" +// 格式化 +| 4 when args.Item(1) = "--file" && args.Item(3) = "--format" -> + printfn "开发中" -let file_in, dir_o = match args.Item(1), args.Item(3) with - | "-file","-odir" -> - if not(FileInfo(args.Item 2).Exists) then - failwith "指定xast文件不存在" - if not(DirectoryInfo(args.Item 4).Exists) then - failwith "指定输出文件夹不存在" - FileInfo(args.Item 2), DirectoryInfo(args.Item 4) - | _ -> failwith "程序调用参数错误:AstConv.exe -file xast文件路径 -odir 输出文件夹路径" +// html生成 +| 5 when args.Item(1) = "--file" && args.Item(3) = "--html" -> + if not(FileInfo(args.Item 2).Exists) then + printfn "Arguments-Error:指定xast文件不存在" + exit 0 + if not(DirectoryInfo(args.Item 4).Exists) then + printfn "Arguments-Error:指定输出文件夹不存在" + exit 0 -let out_dir = Uri(dir_o.FullName) + let xfile, xdir = FileInfo(args.Item 2), DirectoryInfo(args.Item 4) + // 构建html页面 + html_generate xfile xdir + exit 0 -let doc = XmlDocument() -doc.Load(file_in.FullName) - -let prog = Program.GenerateFrom(doc) -let entry = AstVisitEntry(prog) -let visitor = UnitGenerate(prog) -entry.visitWith(visitor) |> ignore - -let volume_pages = volume_page_assemble(visitor.contents()) |> List.map (fun x->x) -let story_pages = story_page_assemble(visitor.contents()) |> List.map (fun x->x) -let point_pages = slice_page_assemble(volume_pages @ story_pages) - -volume_pages @ story_pages @ point_pages |> List.iter (fun it -> (it:?>PageAccess).setPageRoot(out_dir)) -let makers = volume_pages @ story_pages @ point_pages - |> List.map(fun page_unit -> - match page_unit with - | :? SlicePage as point -> - PageMaker(point) :> PageText - | :? VolumePage as vol -> - PageMaker(vol) - | :? StoryPage as story -> - PageMaker(story) - | _ -> failwith "" - ) - -let index_page = IndexPage("汇总页面", volume_pages @ story_pages @ point_pages) -index_page.setPageRoot(out_dir) -let content = (index_page :> PageText).getHtmlText() -let href = index_page.pageURL() -File.WriteAllLines(href, [content]) -for refs in makers do - let file_path = (refs.bindPage() :?> PageAccess).pageURL() - File.WriteAllLines(file_path, [refs.getHtmlText()]) - -let graph = StorylineGraphMake("故事线网络", story_pages|> List.map(fun x -> x :?> PageAccess)) -let graph_code = graph.getGraphCode() - -let stream = new StreamWriter(Path.Combine(dir_o.FullName, "storys_display.dot"), false) -stream.Write(graph_code) -stream.Flush() -Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "storys_display.svg")} {Path.Combine(dir_o.FullName, "storys_display.dot")}""") |> ignore - -let graph2 = VolumeGraphMake("卷章引用网络", (volume_pages@story_pages)|> List.map(fun d -> d :?> PageAccess)) -let graph2_code = graph2.getGraphCode() -let stream2 = new StreamWriter(Path.Combine(dir_o.FullName, "volume_display.dot"), false) -stream2.Write(graph2_code) -stream2.Flush() -Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "volume_display.svg")} {Path.Combine(dir_o.FullName, "volume_display.dot")}""") |> ignore +| _ -> + printfn "命令调用格式错误:" + printfn "AstConv.exe --file xast文件路径 --html 输出文件夹路径\n\t构建HTML透视文档。" + printfn "AstConv.exe --file xast文件路径 --format\n\t格式化所有源文件。" + exit 0 \ No newline at end of file