]> BookStack Code Mirror - bookstack/blob - app/Activity/Tools/TagClassGenerator.php
5bcb44113d6ecaaa596a8ce6aed8da689e180910
[bookstack] / app / Activity / Tools / TagClassGenerator.php
1 <?php
2
3 namespace BookStack\Activity\Tools;
4
5 use BookStack\Activity\Models\Tag;
6 use BookStack\Entities\Models\BookChild;
7 use BookStack\Entities\Models\Entity;
8 use BookStack\Entities\Models\Page;
9
10 class TagClassGenerator
11 {
12     public function __construct(
13         protected Entity $entity
14     ) {
15     }
16
17     /**
18      * @return string[]
19      */
20     public function generate(): array
21     {
22         $classes = [];
23         $tags = $this->entity->tags->all();
24
25         foreach ($tags as $tag) {
26              array_push($classes, ...$this->generateClassesForTag($tag));
27         }
28
29         if ($this->entity instanceof BookChild && userCan('view', $this->entity->book)) {
30             $bookTags = $this->entity->book->tags;
31             foreach ($bookTags as $bookTag) {
32                  array_push($classes, ...$this->generateClassesForTag($bookTag, 'book-'));
33             }
34         }
35
36         if ($this->entity instanceof Page && $this->entity->chapter && userCan('view', $this->entity->chapter)) {
37             $chapterTags = $this->entity->chapter->tags;
38             foreach ($chapterTags as $chapterTag) {
39                  array_push($classes, ...$this->generateClassesForTag($chapterTag, 'chapter-'));
40             }
41         }
42
43         return array_unique($classes);
44     }
45
46     public function generateAsString(): string
47     {
48         return implode(' ', $this->generate());
49     }
50
51     /**
52      * @return string[]
53      */
54     protected function generateClassesForTag(Tag $tag, string $prefix = ''): array
55     {
56         $classes = [];
57         $name = $this->normalizeTagClassString($tag->name);
58         $value = $this->normalizeTagClassString($tag->value);
59         $classes[] = "{$prefix}tag-name-{$name}";
60         if ($value) {
61             $classes[] = "{$prefix}tag-value-{$value}";
62             $classes[] = "{$prefix}tag-pair-{$name}-{$value}";
63         }
64         return $classes;
65     }
66
67     protected function normalizeTagClassString(string $value): string
68     {
69         $value = str_replace(' ', '', strtolower($value));
70         $value = str_replace('-', '', strtolower($value));
71
72         return $value;
73     }
74 }