完成卷宗、故事、节点页面框架构建

This commit is contained in:
codeboss 2025-02-20 11:08:17 +08:00
parent a9787bff56
commit 1d41c55535
2 changed files with 46 additions and 22 deletions

View File

@ -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-definepoint-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<Content.PointDefine>(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<Content.PointDefine>(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<Content.PointRefer>(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<Content.AssembleRefer<Content.PointRefer>, Present.IDomUnit> (fun x->x))
)

View File

@ -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<VolumePage, IDomUnit> (fun x->x)
let story_pages = story_page_build(visitor.contents()) |> List.map<StoryPage, IDomUnit> (fun x->x)
let volume_pages = volume_page_assemble(visitor.contents()) |> List.map<VolumePage, IDomUnit> (fun x->x)
let story_pages = story_page_assemble(visitor.contents()) |> List.map<StoryPage, IDomUnit> (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())