1+ <?php declare (strict_types=1 );
2+ namespace Smeghead \PhpClassDiagram \DiagramElement \ExternalPackage ;
3+
4+ class PackageHierarchy {
5+ /**
6+ * @var string[] external packages.
7+ */
8+ private array $ externalPackages ;
9+
10+ private PackageNode $ root ;
11+
12+ /**
13+ * @param string[] $externalPackages external package list
14+ */
15+ public function __construct (array $ externalPackages ) {
16+ $ this ->externalPackages = $ externalPackages ;
17+ $ this ->root = new PackageNode ('root ' );
18+ foreach ($ externalPackages as $ p ) {
19+ $ this ->root ->register (explode ('. ' , $ p ));
20+ }
21+ }
22+
23+ public function dump (): string {
24+ $ elements = [];
25+ foreach ($ this ->root ->getChildren () as $ c ) {
26+ $ elements [] = $ c ->dump (1 );
27+ }
28+ return implode ("\n" , $ elements );
29+ }
30+ }
31+
32+ class PackageNode {
33+ private string $ name ;
34+ /** @var PackageNode[] children */
35+ private array $ children = [];
36+
37+ public function __construct (string $ name ) {
38+ $ this ->name = $ name ;
39+ }
40+
41+ /**
42+ * @return PackageNode[]
43+ */
44+ public function getChildren (): array {
45+ return $ this ->children ;
46+ }
47+
48+ /**
49+ * @param string[] $packages
50+ */
51+ public function register (array $ packages ): void {
52+ if (count ($ packages ) === 0 ) {
53+ return ;
54+ }
55+ $ next = array_shift ($ packages );
56+ foreach ($ this ->children as $ c ) {
57+ if ($ c ->name === $ next ) {
58+ $ c ->register ($ packages );
59+ return ;
60+ }
61+ }
62+ $ new = new PackageNode ($ next );
63+ $ new ->register ($ packages );
64+ $ this ->children [] = $ new ;
65+ }
66+
67+ public function dump (int $ indent ): string {
68+ $ lines = [];
69+ $ lines [] = sprintf ('%spackage %s as %s { ' , str_repeat (' ' , $ indent ), $ this ->name , $ this ->name );
70+ foreach ($ this ->children as $ c ) {
71+ $ lines [] = $ c ->dump ($ indent + 1 );
72+ }
73+ $ lines [] = sprintf ('%s} ' , str_repeat (' ' , $ indent ));
74+ return implode ("\n" , $ lines );
75+ }
76+ }
0 commit comments