xref: /plugin/combo/ComboStrap/Slug.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4c3437056SNickeau
5*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
6*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataText;
7*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataWikiPath;
8c3437056SNickeau
9*04fd306cSNickeauclass Slug extends MetadataText
10c3437056SNickeau{
11c3437056SNickeau
12c3437056SNickeau    public const PROPERTY_NAME = "slug";
13c3437056SNickeau
1482a60d03SNickeau
15c3437056SNickeau    public static function createForPage(ResourceCombo $resource)
16c3437056SNickeau    {
17c3437056SNickeau        return (new Slug())
18c3437056SNickeau            ->setResource($resource);
19c3437056SNickeau    }
20c3437056SNickeau
21*04fd306cSNickeau    static public function getCanonical(): string
22c3437056SNickeau    {
23c3437056SNickeau        return self::PROPERTY_NAME;
24c3437056SNickeau    }
25c3437056SNickeau
26c3437056SNickeau
2782a60d03SNickeau    /**
2882a60d03SNickeau     * The goal is to get only words that can be interpreted
2982a60d03SNickeau     * We could also encode it
3082a60d03SNickeau     * @param $string
3182a60d03SNickeau     * @return string|null
3282a60d03SNickeau     */
33c3437056SNickeau    public static function toSlugPath($string): ?string
34c3437056SNickeau    {
35c3437056SNickeau        if (empty($string)) return null;
36*04fd306cSNickeau        $excludedCharacters = array_merge(WikiPath::getReservedWords(), StringUtility::SEPARATORS_CHARACTERS);
37*04fd306cSNickeau        $excludedCharacters[] = WikiPath::SLUG_SEPARATOR;
38*04fd306cSNickeau        $parts = explode(WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, $string);
394cadd4f8SNickeau        $parts = array_map(function ($e) use ($excludedCharacters) {
404cadd4f8SNickeau            $wordsPart = StringUtility::getWords(
414cadd4f8SNickeau                $e,
424cadd4f8SNickeau                $excludedCharacters
434cadd4f8SNickeau            );
444cadd4f8SNickeau            // Implode and Lower case
45*04fd306cSNickeau            return strtolower(implode(WikiPath::SLUG_SEPARATOR, $wordsPart));
464cadd4f8SNickeau        }, $parts);
474cadd4f8SNickeau
48*04fd306cSNickeau        $slug = implode(WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, $parts);
49c3437056SNickeau        // Space to separator
504cadd4f8SNickeau        //$slugWithoutSpace = str_replace(" ", DokuPath::SLUG_SEPARATOR, $slugWithoutSpaceAroundParts);
51c3437056SNickeau        // No double separator
524cadd4f8SNickeau        //$slugWithoutDoubleSeparator = preg_replace("/" . DokuPath::SLUG_SEPARATOR . "{2,}/", DokuPath::SLUG_SEPARATOR, $slugWithoutSpace);
53*04fd306cSNickeau        WikiPath::addRootSeparatorIfNotPresent($slug);
544cadd4f8SNickeau        return $slug;
55c3437056SNickeau    }
56c3437056SNickeau
57*04fd306cSNickeau    static public function getTab(): string
58c3437056SNickeau    {
59c3437056SNickeau        return MetaManagerForm::TAB_REDIRECTION_VALUE;
60c3437056SNickeau    }
61c3437056SNickeau
62*04fd306cSNickeau    static public function getDescription(): string
63c3437056SNickeau    {
64c3437056SNickeau        return "The slug is used in the url of the page (if chosen)";
65c3437056SNickeau    }
66c3437056SNickeau
67*04fd306cSNickeau    static public function getLabel(): string
68c3437056SNickeau    {
69c3437056SNickeau        return "Slug Path";
70c3437056SNickeau    }
71c3437056SNickeau
72c3437056SNickeau    public function setFromStoreValue($value): Metadata
73c3437056SNickeau    {
74*04fd306cSNickeau        return $this->setFromStoreValueWithoutException($value);
75c3437056SNickeau    }
76c3437056SNickeau
77c3437056SNickeau    public function setValue($value): Metadata
78c3437056SNickeau    {
79*04fd306cSNickeau        return $this->setFromStoreValueWithoutException($value);
80c3437056SNickeau    }
81c3437056SNickeau
82*04fd306cSNickeau    public function setFromStoreValueWithoutException($value): Metadata
83c3437056SNickeau    {
84*04fd306cSNickeau        return parent::setFromStoreValueWithoutException(self::toSlugPath($value));
85c3437056SNickeau    }
86c3437056SNickeau
87c3437056SNickeau
88c3437056SNickeau    static public function getName(): string
89c3437056SNickeau    {
90c3437056SNickeau        return self::PROPERTY_NAME;
91c3437056SNickeau    }
92c3437056SNickeau
93*04fd306cSNickeau    static public function getPersistenceType(): string
94c3437056SNickeau    {
95c3437056SNickeau        return Metadata::PERSISTENT_METADATA;
96c3437056SNickeau    }
97c3437056SNickeau
98*04fd306cSNickeau    static public function isMutable(): bool
99c3437056SNickeau    {
100c3437056SNickeau        return true;
101c3437056SNickeau    }
102c3437056SNickeau
103*04fd306cSNickeau    /**
104*04fd306cSNickeau     * @return string
105*04fd306cSNickeau     */
106*04fd306cSNickeau    public function getDefaultValue(): string
107c3437056SNickeau    {
108*04fd306cSNickeau        $title = PageTitle::createForMarkup($this->getResource())
109c3437056SNickeau            ->getValueOrDefault();
110c3437056SNickeau        return self::toSlugPath($title);
111c3437056SNickeau    }
112*04fd306cSNickeau
113*04fd306cSNickeau    static public function isOnForm(): bool
114*04fd306cSNickeau    {
115*04fd306cSNickeau        return true;
116*04fd306cSNickeau    }
117c3437056SNickeau}
118