1 | <?php |
||
2 | |||
3 | declare(strict_types=1); |
||
4 | |||
5 | namespace Koriym\AppStateDiagram; |
||
6 | |||
7 | use function array_keys; |
||
8 | use function dirname; |
||
9 | use function htmlspecialchars; |
||
10 | use function implode; |
||
11 | use function nl2br; |
||
12 | use function pathinfo; |
||
13 | use function sprintf; |
||
14 | use function strtoupper; |
||
15 | use function uasort; |
||
16 | |||
17 | use const PATHINFO_BASENAME; |
||
18 | use const PHP_EOL; |
||
19 | |||
20 | final class IndexPage |
||
21 | { |
||
22 | /** @var string */ |
||
23 | public $content; |
||
24 | |||
25 | /** @var string */ |
||
26 | public $file; |
||
27 | |||
28 | public function __construct(Profile $profile, string $mode = DumpDocs::MODE_HTML) |
||
29 | { |
||
30 | $profilePath = pathinfo($profile->alpsFile, PATHINFO_BASENAME); |
||
31 | $descriptors = $profile->descriptors; |
||
32 | uasort($descriptors, static function (AbstractDescriptor $a, AbstractDescriptor $b): int { |
||
33 | $compareId = strtoupper($a->id) <=> strtoupper($b->id); |
||
34 | if ($compareId !== 0) { |
||
35 | return $compareId; |
||
36 | } |
||
37 | |||
38 | $order = ['semantic' => 0, 'safe' => 1, 'unsafe' => 2, 'idempotent' => 3]; |
||
39 | |||
40 | return $order[$a->type] <=> $order[$b->type]; |
||
41 | }); |
||
42 | $linkRelations = $this->linkRelations($profile->linkRelations); |
||
43 | $ext = $mode === DumpDocs::MODE_MARKDOWN ? 'md' : DumpDocs::MODE_HTML; |
||
44 | $semantics = $this->semantics($descriptors, $ext); |
||
45 | $tags = $this->tags($profile->tags, $ext); |
||
46 | $htmlTitle = htmlspecialchars($profile->title ?: 'ALPS'); |
||
47 | $htmlDoc = nl2br(htmlspecialchars($profile->doc)); |
||
48 | $profileImage = $mode === DumpDocs::MODE_HTML ? 'docs/asd.html' : 'docs/asd.md'; |
||
49 | $md = <<<EOT |
||
50 | # {$htmlTitle} |
||
51 | |||
52 | {$htmlDoc} |
||
53 | |||
54 | * [ALPS]({$profilePath}) |
||
55 | * [Application State Diagram]($profileImage) |
||
56 | * Semantic Descriptors |
||
57 | {$semantics}{$tags}{$linkRelations} |
||
58 | EOT; |
||
59 | $this->file = sprintf('%s/index.%s', dirname($profile->alpsFile), $ext); |
||
60 | $this->content = $mode === DumpDocs::MODE_MARKDOWN ? $md : (new MdToHtml())($htmlTitle, $md); |
||
61 | } |
||
62 | |||
63 | /** @param array<string, AbstractDescriptor> $semantics */ |
||
64 | private function semantics(array $semantics, string $ext): string |
||
65 | { |
||
66 | $lines = []; |
||
67 | foreach ($semantics as $semantic) { |
||
68 | $href = sprintf('docs/%s.%s.%s', $semantic->type, $semantic->id, $ext); |
||
69 | $title = $semantic->title ? sprintf(', %s', $semantic->title) : ''; |
||
70 | $lines[] = sprintf(' * [%s](%s) (%s)%s', $semantic->id, $href, $semantic->type, $title); |
||
71 | } |
||
72 | |||
73 | return implode(PHP_EOL, $lines); |
||
74 | } |
||
75 | |||
76 | /** @param array<string, list<string>> $tags */ |
||
0 ignored issues
–
show
Documentation
Bug
introduced
by
![]() |
|||
77 | private function tags(array $tags, string $ext): string |
||
78 | { |
||
79 | if ($tags === []) { |
||
80 | return ''; |
||
81 | } |
||
82 | |||
83 | $lines = []; |
||
84 | $tagKeys = array_keys($tags); |
||
85 | foreach ($tagKeys as $tag) { |
||
86 | $href = "docs/tag.{$tag}.{$ext}"; |
||
87 | $lines[] = " * [{$tag}]({$href})"; |
||
88 | } |
||
89 | |||
90 | return PHP_EOL . ' * Tags' . PHP_EOL . implode(PHP_EOL, $lines); |
||
91 | } |
||
92 | |||
93 | private function linkRelations(LinkRelations $linkRelations): string |
||
94 | { |
||
95 | if ((string) $linkRelations === '') { |
||
96 | return ''; |
||
97 | } |
||
98 | |||
99 | return PHP_EOL . ' * Links' . PHP_EOL . $linkRelations; |
||
100 | } |
||
101 | } |
||
102 |