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