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