diff --git a/AstConv/HtmlStruct.fs b/AstConv/HtmlStruct.fs index 3def14e..79c46be 100644 --- a/AstConv/HtmlStruct.fs +++ b/AstConv/HtmlStruct.fs @@ -31,8 +31,7 @@ open System class let mutable assemble_page_url: string = "" - member this.elementID(): string = - item.address() + member this.elementID(): string = item.address() member this.setAssembleURL(url: string) = assemble_page_url <- url member this.assembleURL():string = @@ -100,7 +99,7 @@ open System interface IContainer with member this.children(): IDomUnit list = refer_list member this.append(childs: IDomUnit list): IContainer = - raise (System.NotImplementedException()) + PointPage(page_hrefs, point, refer_list @ childs) end @@ -162,12 +161,12 @@ open System /// 具有回退功能的元素 - type AssembleRefer<'T when 'T :> Present.Forwards and 'T :> Present.IDomUnit and 'T:> Present.IContainer>(item: 'T, page: Present.PageAccess) = + type AssembleRefer<'T when 'T :> Present.Forwards and 'T :> Present.IDomUnit and 'T:> Present.IContainer>(from: string,item: 'T, page: Present.PageAccess) = class inherit Present.Backwards(item, page) interface Present.IDomUnit with - member this.name(): string = item.name() + member this.name() = from member this.object() = item.object() member this.getHtmlWith(pnode: XmlElement): XmlElement = raise (System.NotImplementedException()) @@ -328,26 +327,26 @@ open System name_seqs |> Array.reduce(fun a b-> a+b) /// 构建所有卷宗页面 - let rec volume_page_build (nodes: Present.IDomUnit list): Present.VolumePage list = + let rec volume_page_assemble (nodes: Present.IDomUnit list): Present.VolumePage list = match nodes with | [] -> [] | _ -> match nodes.Head with | :? Content.VolumeDefine as vole -> let con: Present.IContainer = vole - Present.VolumePage(page_address_make(vole), vole, con.children())::volume_page_build(nodes.Tail) - | _ -> volume_page_build(nodes.Tail) + Present.VolumePage(page_address_make(vole), vole, con.children())::volume_page_assemble(nodes.Tail) + | _ -> volume_page_assemble(nodes.Tail) /// 构建所有故事线页面 - let rec story_page_build (nodes: Present.IDomUnit list): Present.StoryPage list = + let rec story_page_assemble (nodes: Present.IDomUnit list): Present.StoryPage list = match nodes with | [] -> [] | _ -> match nodes.Head with | :? Content.StoryDefine as storye -> let con: Present.IContainer = storye - Present.StoryPage(page_address_make(storye), storye, con.children())::story_page_build(nodes.Tail) - | _ -> story_page_build(nodes.Tail) + Present.StoryPage(page_address_make(storye), storye, con.children())::story_page_assemble(nodes.Tail) + | _ -> story_page_assemble(nodes.Tail) /// 提取point-define和point-refer let rec private point_peers_extract(nodes: Present.IDomUnit list):(Present.IDomUnit option*Present.IDomUnit option*Present.IDomUnit option)list = @@ -425,17 +424,40 @@ open System /// 构建节点汇总页面 /// param nodes volume-pages@story-pages - let rec point_assemble_page_build(nodes: Present.IDomUnit list) = + let rec point_page_assemble(nodes: Present.IDomUnit list) = let refers_about = point_peers_extract(nodes) let pages = refers_about |> List.map ( - fun (page_defs, _, dc) -> - match dc.Value with + fun (page_defs, slice_defs, point_defs) -> + match point_defs.Value with | :? Content.PointDefine as defs -> - let page_x = page_defs.Value :?> Present.StoryPage - let copy_pt = Content.AssembleRefer(defs, page_x) - Some(Present.PointPage(page_address_make(defs), copy_pt)) + let name_seqs = $"{page_defs.Value.name()}&{slice_defs.Value.name()}&{point_defs.Value.name()}" + let refer_point = Content.AssembleRefer(name_seqs, defs, page_defs.Value :?> Present.StoryPage) + let page_assemble = Present.PointPage(page_address_make(defs), refer_point) + defs.setAssembleURL(page_assemble.accessLink()) + Some(page_assemble) | _ -> None ) |> List.filter (fun d -> d <> None) - for p in pages do - Console.WriteLine((p.Value :> Present.IDomUnit).object().address()) + + let refer_nodes = refers_about |> List.filter( + fun (_, _, n) -> + match n.Value with + | :? Content.PointRefer -> true + | _ -> false + ) + |> List.map( + fun (page_defs, _, point_refs) -> + let refer_object = point_refs.Value.object() :?> AstImport.PointRef + let refer_name = $"{refer_object.storyRef()}&{refer_object.sliceRef()}&{refer_object.pointRef()}" + let refs = point_refs.Value :?> Content.PointRefer + Content.AssembleRefer(refer_name, refs, page_defs.Value :?> Present.PageAccess) + ) + + + pages |> List.map( + fun page_one -> + let page_old = page_one.Value :> Present.IContainer + let page_dom = page_one.Value :> Present.IDomUnit + let nodes = refer_nodes |> List.filter(fun d -> (d:>Present.IDomUnit).name() = page_dom.name()) + page_old.append(nodes |> List.map, Present.IDomUnit> (fun x->x)) + ) \ No newline at end of file diff --git a/AstConv/Program.fs b/AstConv/Program.fs index 63cf9ac..bc159f4 100644 --- a/AstConv/Program.fs +++ b/AstConv/Program.fs @@ -15,7 +15,9 @@ let entry = AstVisitEntry(prog) let visitor = UnitGenerate(prog) entry.visitWith(visitor) |> ignore -let volume_pages = volume_page_build(visitor.contents()) |> List.map (fun x->x) -let story_pages = story_page_build(visitor.contents()) |> List.map (fun x->x) +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 refers = point_page_assemble(volume_pages @ story_pages) -let refers = point_assemble_page_build(volume_pages @ story_pages) +for refs in refers do + System.Console.WriteLine(refs.ToString()) \ No newline at end of file