1c3437056SNickeau<?php 2c3437056SNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4c3437056SNickeau 5*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 6*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataText; 7*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataWikiPath; 8c3437056SNickeau 9*04fd306cSNickeauclass Slug extends MetadataText 10c3437056SNickeau{ 11c3437056SNickeau 12c3437056SNickeau public const PROPERTY_NAME = "slug"; 13c3437056SNickeau 1482a60d03SNickeau 15c3437056SNickeau public static function createForPage(ResourceCombo $resource) 16c3437056SNickeau { 17c3437056SNickeau return (new Slug()) 18c3437056SNickeau ->setResource($resource); 19c3437056SNickeau } 20c3437056SNickeau 21*04fd306cSNickeau static public function getCanonical(): string 22c3437056SNickeau { 23c3437056SNickeau return self::PROPERTY_NAME; 24c3437056SNickeau } 25c3437056SNickeau 26c3437056SNickeau 2782a60d03SNickeau /** 2882a60d03SNickeau * The goal is to get only words that can be interpreted 2982a60d03SNickeau * We could also encode it 3082a60d03SNickeau * @param $string 3182a60d03SNickeau * @return string|null 3282a60d03SNickeau */ 33c3437056SNickeau public static function toSlugPath($string): ?string 34c3437056SNickeau { 35c3437056SNickeau if (empty($string)) return null; 36*04fd306cSNickeau $excludedCharacters = array_merge(WikiPath::getReservedWords(), StringUtility::SEPARATORS_CHARACTERS); 37*04fd306cSNickeau $excludedCharacters[] = WikiPath::SLUG_SEPARATOR; 38*04fd306cSNickeau $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 45*04fd306cSNickeau return strtolower(implode(WikiPath::SLUG_SEPARATOR, $wordsPart)); 464cadd4f8SNickeau }, $parts); 474cadd4f8SNickeau 48*04fd306cSNickeau $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); 53*04fd306cSNickeau WikiPath::addRootSeparatorIfNotPresent($slug); 544cadd4f8SNickeau return $slug; 55c3437056SNickeau } 56c3437056SNickeau 57*04fd306cSNickeau static public function getTab(): string 58c3437056SNickeau { 59c3437056SNickeau return MetaManagerForm::TAB_REDIRECTION_VALUE; 60c3437056SNickeau } 61c3437056SNickeau 62*04fd306cSNickeau static public function getDescription(): string 63c3437056SNickeau { 64c3437056SNickeau return "The slug is used in the url of the page (if chosen)"; 65c3437056SNickeau } 66c3437056SNickeau 67*04fd306cSNickeau static public function getLabel(): string 68c3437056SNickeau { 69c3437056SNickeau return "Slug Path"; 70c3437056SNickeau } 71c3437056SNickeau 72c3437056SNickeau public function setFromStoreValue($value): Metadata 73c3437056SNickeau { 74*04fd306cSNickeau return $this->setFromStoreValueWithoutException($value); 75c3437056SNickeau } 76c3437056SNickeau 77c3437056SNickeau public function setValue($value): Metadata 78c3437056SNickeau { 79*04fd306cSNickeau return $this->setFromStoreValueWithoutException($value); 80c3437056SNickeau } 81c3437056SNickeau 82*04fd306cSNickeau public function setFromStoreValueWithoutException($value): Metadata 83c3437056SNickeau { 84*04fd306cSNickeau return parent::setFromStoreValueWithoutException(self::toSlugPath($value)); 85c3437056SNickeau } 86c3437056SNickeau 87c3437056SNickeau 88c3437056SNickeau static public function getName(): string 89c3437056SNickeau { 90c3437056SNickeau return self::PROPERTY_NAME; 91c3437056SNickeau } 92c3437056SNickeau 93*04fd306cSNickeau static public function getPersistenceType(): string 94c3437056SNickeau { 95c3437056SNickeau return Metadata::PERSISTENT_METADATA; 96c3437056SNickeau } 97c3437056SNickeau 98*04fd306cSNickeau static public function isMutable(): bool 99c3437056SNickeau { 100c3437056SNickeau return true; 101c3437056SNickeau } 102c3437056SNickeau 103*04fd306cSNickeau /** 104*04fd306cSNickeau * @return string 105*04fd306cSNickeau */ 106*04fd306cSNickeau public function getDefaultValue(): string 107c3437056SNickeau { 108*04fd306cSNickeau $title = PageTitle::createForMarkup($this->getResource()) 109c3437056SNickeau ->getValueOrDefault(); 110c3437056SNickeau return self::toSlugPath($title); 111c3437056SNickeau } 112*04fd306cSNickeau 113*04fd306cSNickeau static public function isOnForm(): bool 114*04fd306cSNickeau { 115*04fd306cSNickeau return true; 116*04fd306cSNickeau } 117c3437056SNickeau} 118