Index: library/lib/nxdoc-html.tcl =================================================================== diff -u -rfa7635cbfe2309b8e6282e2c7925fa2617b061aa -r187fbd20a453ae9d73e9b48f88b8d6a8c79685c2 --- library/lib/nxdoc-html.tcl (.../nxdoc-html.tcl) (revision fa7635cbfe2309b8e6282e2c7925fa2617b061aa) +++ library/lib/nxdoc-html.tcl (.../nxdoc-html.tcl) (revision 187fbd20a453ae9d73e9b48f88b8d6a8c79685c2) @@ -2,12 +2,13 @@ namespace eval ::nx::doc {} package require nx::doc 1.0 +package require nx::pp namespace eval ::nx::doc { Renderer create html { - :method render {project entity theme {tmplName ""}} { + :class method render {project entity theme {tmplName ""}} { set top_level_entities [$project navigatable_parts] set init [subst { set project $project @@ -18,8 +19,8 @@ $entity render -initscript $init -theme $theme {*}$tmplName } - :method installAssets {project theme targetDir} { - set assets [glob -directory [file join [::nx::doc::find_asset_path] $theme] *] + :class method installAssets {project theme targetDir} { + set assets [glob -directory [file join [findAssetPath] $theme] *] file mkdir $targetDir if {$assets eq ""} return; file copy -force -- {*}$assets $targetDir @@ -103,14 +104,28 @@ return "\[[join $js_array ,\n]\]" } - :public method navigatable_parts {} { + :public method navigatable_parts args { # # TODO: Should I wrap up delegating calls to the originator # entity behind a unified interface (a gatekeeper?) # - return [[:origin] owned_parts \ + set ownedParts [[:origin] owned_parts \ -where "!\${:@stashed}" \ -class ::nx::doc::StructuredEntity] + + foreach mergeParts $args { + dict for {feature featureInstances} $mergeParts { + if {![dict exists $ownedParts $feature]} { + dict set ownedParts $feature $featureInstances + } else { + set prevInst [lindex [dict get $ownedParts $feature] 1] + lappend prevInst {*}$featureInstances + dict set ownedParts $feature [lsort -unique $prevInst] + } + } + } + + return $ownedParts } :method listing {{-inline true} script} { @@ -241,12 +256,12 @@ :public method filename {} { return "index" } - :public method navigatable_parts {} { + :public method navigatable_parts args { # # TODO: Should I wrap up delegating calls to the originator # entity behind a unified interface (a gatekeeper?) # - set top_level_entities [next] + set top_level_entities [next [list]] dict for {feature instances} $top_level_entities { if {[$feature name] eq "@package"} { foreach pkg $instances { @@ -364,7 +379,7 @@ dict set inherited $entity [$entity !get \ -sortedby name \ -with name $member] - if {[info exists previous_entity]} { + if {[info exists previous_entity] && [dict exists $inherited $previous_entity]} { dict set inherited $previous_entity \ [dict remove [dict get $inherited $previous_entity] \ {*}[dict keys [dict get $inherited $entity]]]