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