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