xref: /plugin/combo/ComboStrap/Slug.php (revision 241d63fa73ef2a57ee74f4b954a7b5c8eba40a9d)
1c3437056SNickeau<?php
2c3437056SNickeau
304fd306cSNickeaunamespace ComboStrap;
4c3437056SNickeau
504fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
604fd306cSNickeauuse ComboStrap\Meta\Api\MetadataText;
7c3437056SNickeau
804fd306cSNickeauclass Slug extends MetadataText
9c3437056SNickeau{
10c3437056SNickeau
11c3437056SNickeau    public const PROPERTY_NAME = "slug";
12c3437056SNickeau
1382a60d03SNickeau
14c3437056SNickeau    public static function createForPage(ResourceCombo $resource)
15c3437056SNickeau    {
16c3437056SNickeau        return (new Slug())
17c3437056SNickeau            ->setResource($resource);
18c3437056SNickeau    }
19c3437056SNickeau
2004fd306cSNickeau    static public function getCanonical(): string
21c3437056SNickeau    {
22c3437056SNickeau        return self::PROPERTY_NAME;
23c3437056SNickeau    }
24c3437056SNickeau
25c3437056SNickeau
2682a60d03SNickeau    /**
2782a60d03SNickeau     * The goal is to get only words that can be interpreted
2882a60d03SNickeau     * We could also encode it
2982a60d03SNickeau     * @param $string
30*241d63faSgerardnico     * @return string
31*241d63faSgerardnico     * @throws ExceptionNull
3282a60d03SNickeau     */
33*241d63faSgerardnico    public static function toSlugPath($string): string
34c3437056SNickeau    {
35*241d63faSgerardnico        if (empty($string)) throw new ExceptionNull("The slug value should not be empty");
3604fd306cSNickeau        $excludedCharacters = array_merge(WikiPath::getReservedWords(), StringUtility::SEPARATORS_CHARACTERS);
3704fd306cSNickeau        $excludedCharacters[] = WikiPath::SLUG_SEPARATOR;
3804fd306cSNickeau        $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
4504fd306cSNickeau            return strtolower(implode(WikiPath::SLUG_SEPARATOR, $wordsPart));
464cadd4f8SNickeau        }, $parts);
474cadd4f8SNickeau
4804fd306cSNickeau        $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);
5304fd306cSNickeau        WikiPath::addRootSeparatorIfNotPresent($slug);
544cadd4f8SNickeau        return $slug;
55c3437056SNickeau    }
56c3437056SNickeau
5704fd306cSNickeau    static public function getTab(): string
58c3437056SNickeau    {
59c3437056SNickeau        return MetaManagerForm::TAB_REDIRECTION_VALUE;
60c3437056SNickeau    }
61c3437056SNickeau
6204fd306cSNickeau    static public function getDescription(): string
63c3437056SNickeau    {
64c3437056SNickeau        return "The slug is used in the url of the page (if chosen)";
65c3437056SNickeau    }
66c3437056SNickeau
6704fd306cSNickeau    static public function getLabel(): string
68c3437056SNickeau    {
69c3437056SNickeau        return "Slug Path";
70c3437056SNickeau    }
71c3437056SNickeau
72c3437056SNickeau    public function setFromStoreValue($value): Metadata
73c3437056SNickeau    {
7404fd306cSNickeau        return $this->setFromStoreValueWithoutException($value);
75c3437056SNickeau    }
76c3437056SNickeau
77c3437056SNickeau    public function setValue($value): Metadata
78c3437056SNickeau    {
7904fd306cSNickeau        return $this->setFromStoreValueWithoutException($value);
80c3437056SNickeau    }
81c3437056SNickeau
8204fd306cSNickeau    public function setFromStoreValueWithoutException($value): Metadata
83c3437056SNickeau    {
84*241d63faSgerardnico        try {
85*241d63faSgerardnico            $slug = self::toSlugPath($value);
86*241d63faSgerardnico        } catch (ExceptionNull $e) {
87*241d63faSgerardnico            $slug = null;
88*241d63faSgerardnico        }
89*241d63faSgerardnico        return parent::setFromStoreValueWithoutException($slug);
90c3437056SNickeau    }
91c3437056SNickeau
92c3437056SNickeau
93c3437056SNickeau    static public function getName(): string
94c3437056SNickeau    {
95c3437056SNickeau        return self::PROPERTY_NAME;
96c3437056SNickeau    }
97c3437056SNickeau
9804fd306cSNickeau    static public function getPersistenceType(): string
99c3437056SNickeau    {
100c3437056SNickeau        return Metadata::PERSISTENT_METADATA;
101c3437056SNickeau    }
102c3437056SNickeau
10304fd306cSNickeau    static public function isMutable(): bool
104c3437056SNickeau    {
105c3437056SNickeau        return true;
106c3437056SNickeau    }
107c3437056SNickeau
10804fd306cSNickeau    /**
10904fd306cSNickeau     * @return string
11004fd306cSNickeau     */
11104fd306cSNickeau    public function getDefaultValue(): string
112c3437056SNickeau    {
113*241d63faSgerardnico        $title = PageTitle::createForMarkup($this->getResource())->getValueOrDefault();
114*241d63faSgerardnico        try {
115c3437056SNickeau            return self::toSlugPath($title);
116*241d63faSgerardnico        } catch (ExceptionNull $e) {
117*241d63faSgerardnico            throw new \RuntimeException("The default title of the page (" . $this->getResource() . ") should not be empty.");
118*241d63faSgerardnico        }
119*241d63faSgerardnico
120c3437056SNickeau    }
12104fd306cSNickeau
12204fd306cSNickeau    static public function isOnForm(): bool
12304fd306cSNickeau    {
12404fd306cSNickeau        return true;
12504fd306cSNickeau    }
126c3437056SNickeau}
127