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