xref: /plugin/combo/ComboStrap/Slug.php (revision 82a60d039cd81033dc8147c27f0a50716b7a5301)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeauuse ComboStrap\DokuPath;
5c3437056SNickeauuse ComboStrap\MetaManagerForm;
6c3437056SNickeauuse ComboStrap\Metadata;
7c3437056SNickeauuse ComboStrap\MetadataWikiPath;
8c3437056SNickeauuse ComboStrap\PageTitle;
9c3437056SNickeauuse ComboStrap\ResourceCombo;
10c3437056SNickeau
11c3437056SNickeauclass Slug extends MetadataWikiPath
12c3437056SNickeau{
13c3437056SNickeau
14c3437056SNickeau    public const PROPERTY_NAME = "slug";
15c3437056SNickeau
16*82a60d03SNickeau
17*82a60d03SNickeau    const SEPARATORS_CHARACTERS = [".", "(", ")", ","];
18*82a60d03SNickeau
19c3437056SNickeau    public static function createForPage(ResourceCombo $resource)
20c3437056SNickeau    {
21c3437056SNickeau        return (new Slug())
22c3437056SNickeau            ->setResource($resource);
23c3437056SNickeau    }
24c3437056SNickeau
25c3437056SNickeau    public function getCanonical(): string
26c3437056SNickeau    {
27c3437056SNickeau        return self::PROPERTY_NAME;
28c3437056SNickeau    }
29c3437056SNickeau
30c3437056SNickeau
31*82a60d03SNickeau    /**
32*82a60d03SNickeau     * The goal is to get only words that can be interpreted
33*82a60d03SNickeau     * We could also encode it
34*82a60d03SNickeau     * @param $string
35*82a60d03SNickeau     * @return string|null
36*82a60d03SNickeau     */
37c3437056SNickeau    public static function toSlugPath($string): ?string
38c3437056SNickeau    {
39c3437056SNickeau        if (empty($string)) return null;
40c3437056SNickeau        // Reserved word to space
41c3437056SNickeau        $slugWithoutReservedWord = str_replace(DokuPath::getReservedWords(), " ", $string);
42*82a60d03SNickeau        // Delete points, comma, parenthesis
43*82a60d03SNickeau        $slugWithoutSeparator = str_replace(self::SEPARATORS_CHARACTERS, " ", $slugWithoutReservedWord);
44c3437056SNickeau        // Doubles spaces to space
45*82a60d03SNickeau        $slugWithoutDoubleSpace = preg_replace("/\s{2,}/", " ", $slugWithoutSeparator);
46c3437056SNickeau        // Trim space
47c3437056SNickeau        $slugTrimmed = trim($slugWithoutDoubleSpace);
48c3437056SNickeau        // No Space around the path part
49c3437056SNickeau        $slugParts = explode(DokuPath::PATH_SEPARATOR, $slugTrimmed);
50c3437056SNickeau        $slugParts = array_map(function ($e) {
51c3437056SNickeau            return trim($e);
52c3437056SNickeau        }, $slugParts);
53c3437056SNickeau        $slugWithoutSpaceAroundParts = implode(DokuPath::PATH_SEPARATOR, $slugParts);
54c3437056SNickeau        // Space to separator
55c3437056SNickeau        $slugWithoutSpace = str_replace(" ", DokuPath::SLUG_SEPARATOR, $slugWithoutSpaceAroundParts);
56c3437056SNickeau        // No double separator
57c3437056SNickeau        $slugWithoutDoubleSeparator = preg_replace("/" . DokuPath::SLUG_SEPARATOR . "{2,}/", DokuPath::SLUG_SEPARATOR, $slugWithoutSpace);
58c3437056SNickeau        // Root
59c3437056SNickeau        DokuPath::addRootSeparatorIfNotPresent($slugWithoutDoubleSeparator);
60c3437056SNickeau        // Lower case
61c3437056SNickeau        return strtolower($slugWithoutDoubleSeparator);
62c3437056SNickeau    }
63c3437056SNickeau
64c3437056SNickeau    public function getTab(): string
65c3437056SNickeau    {
66c3437056SNickeau        return MetaManagerForm::TAB_REDIRECTION_VALUE;
67c3437056SNickeau    }
68c3437056SNickeau
69c3437056SNickeau    public function getDescription(): string
70c3437056SNickeau    {
71c3437056SNickeau        return "The slug is used in the url of the page (if chosen)";
72c3437056SNickeau    }
73c3437056SNickeau
74c3437056SNickeau    public function getLabel(): string
75c3437056SNickeau    {
76c3437056SNickeau        return "Slug Path";
77c3437056SNickeau    }
78c3437056SNickeau
79c3437056SNickeau    public function setFromStoreValue($value): Metadata
80c3437056SNickeau    {
81c3437056SNickeau        return $this->buildFromStoreValue($value);
82c3437056SNickeau    }
83c3437056SNickeau
84c3437056SNickeau    public function setValue($value): Metadata
85c3437056SNickeau    {
86c3437056SNickeau        return $this->buildFromStoreValue($value);
87c3437056SNickeau    }
88c3437056SNickeau
89c3437056SNickeau    public function buildFromStoreValue($value): Metadata
90c3437056SNickeau    {
91c3437056SNickeau        return parent::buildFromStoreValue(self::toSlugPath($value));
92c3437056SNickeau    }
93c3437056SNickeau
94c3437056SNickeau
95c3437056SNickeau    static public function getName(): string
96c3437056SNickeau    {
97c3437056SNickeau        return self::PROPERTY_NAME;
98c3437056SNickeau    }
99c3437056SNickeau
100c3437056SNickeau    public function getPersistenceType(): string
101c3437056SNickeau    {
102c3437056SNickeau        return Metadata::PERSISTENT_METADATA;
103c3437056SNickeau    }
104c3437056SNickeau
105c3437056SNickeau    public function getMutable(): bool
106c3437056SNickeau    {
107c3437056SNickeau        return true;
108c3437056SNickeau    }
109c3437056SNickeau
110c3437056SNickeau    public function getDefaultValue(): ?string
111c3437056SNickeau    {
112c3437056SNickeau        $title = PageTitle::createForPage($this->getResource())
113c3437056SNickeau            ->getValueOrDefault();
114c3437056SNickeau        if ($title === null) {
115c3437056SNickeau            return null;
116c3437056SNickeau        }
117c3437056SNickeau        return self::toSlugPath($title);
118c3437056SNickeau    }
119c3437056SNickeau}
120