1c3437056SNickeau<?php 2c3437056SNickeau 304fd306cSNickeaunamespace ComboStrap; 4c3437056SNickeau 504fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 604fd306cSNickeauuse ComboStrap\Meta\Api\MetadataText; 7c3437056SNickeau 804fd306cSNickeauclass Slug extends MetadataText 9c3437056SNickeau{ 10c3437056SNickeau 11c3437056SNickeau public const PROPERTY_NAME = "slug"; 12c3437056SNickeau 1382a60d03SNickeau 14c3437056SNickeau public static function createForPage(ResourceCombo $resource) 15c3437056SNickeau { 16c3437056SNickeau return (new Slug()) 17c3437056SNickeau ->setResource($resource); 18c3437056SNickeau } 19c3437056SNickeau 2004fd306cSNickeau static public function getCanonical(): string 21c3437056SNickeau { 22c3437056SNickeau return self::PROPERTY_NAME; 23c3437056SNickeau } 24c3437056SNickeau 25c3437056SNickeau 2682a60d03SNickeau /** 2782a60d03SNickeau * The goal is to get only words that can be interpreted 2882a60d03SNickeau * We could also encode it 2982a60d03SNickeau * @param $string 30*241d63faSgerardnico * @return string 31*241d63faSgerardnico * @throws ExceptionNull 3282a60d03SNickeau */ 33*241d63faSgerardnico public static function toSlugPath($string): string 34c3437056SNickeau { 35*241d63faSgerardnico if (empty($string)) throw new ExceptionNull("The slug value should not be empty"); 3604fd306cSNickeau $excludedCharacters = array_merge(WikiPath::getReservedWords(), StringUtility::SEPARATORS_CHARACTERS); 3704fd306cSNickeau $excludedCharacters[] = WikiPath::SLUG_SEPARATOR; 3804fd306cSNickeau $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 4504fd306cSNickeau return strtolower(implode(WikiPath::SLUG_SEPARATOR, $wordsPart)); 464cadd4f8SNickeau }, $parts); 474cadd4f8SNickeau 4804fd306cSNickeau $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); 5304fd306cSNickeau WikiPath::addRootSeparatorIfNotPresent($slug); 544cadd4f8SNickeau return $slug; 55c3437056SNickeau } 56c3437056SNickeau 5704fd306cSNickeau static public function getTab(): string 58c3437056SNickeau { 59c3437056SNickeau return MetaManagerForm::TAB_REDIRECTION_VALUE; 60c3437056SNickeau } 61c3437056SNickeau 6204fd306cSNickeau static public function getDescription(): string 63c3437056SNickeau { 64c3437056SNickeau return "The slug is used in the url of the page (if chosen)"; 65c3437056SNickeau } 66c3437056SNickeau 6704fd306cSNickeau static public function getLabel(): string 68c3437056SNickeau { 69c3437056SNickeau return "Slug Path"; 70c3437056SNickeau } 71c3437056SNickeau 72c3437056SNickeau public function setFromStoreValue($value): Metadata 73c3437056SNickeau { 7404fd306cSNickeau return $this->setFromStoreValueWithoutException($value); 75c3437056SNickeau } 76c3437056SNickeau 77c3437056SNickeau public function setValue($value): Metadata 78c3437056SNickeau { 7904fd306cSNickeau return $this->setFromStoreValueWithoutException($value); 80c3437056SNickeau } 81c3437056SNickeau 8204fd306cSNickeau public function setFromStoreValueWithoutException($value): Metadata 83c3437056SNickeau { 84*241d63faSgerardnico try { 85*241d63faSgerardnico $slug = self::toSlugPath($value); 86*241d63faSgerardnico } catch (ExceptionNull $e) { 87*241d63faSgerardnico $slug = null; 88*241d63faSgerardnico } 89*241d63faSgerardnico return parent::setFromStoreValueWithoutException($slug); 90c3437056SNickeau } 91c3437056SNickeau 92c3437056SNickeau 93c3437056SNickeau static public function getName(): string 94c3437056SNickeau { 95c3437056SNickeau return self::PROPERTY_NAME; 96c3437056SNickeau } 97c3437056SNickeau 9804fd306cSNickeau static public function getPersistenceType(): string 99c3437056SNickeau { 100c3437056SNickeau return Metadata::PERSISTENT_METADATA; 101c3437056SNickeau } 102c3437056SNickeau 10304fd306cSNickeau static public function isMutable(): bool 104c3437056SNickeau { 105c3437056SNickeau return true; 106c3437056SNickeau } 107c3437056SNickeau 10804fd306cSNickeau /** 10904fd306cSNickeau * @return string 11004fd306cSNickeau */ 11104fd306cSNickeau public function getDefaultValue(): string 112c3437056SNickeau { 113*241d63faSgerardnico $title = PageTitle::createForMarkup($this->getResource())->getValueOrDefault(); 114*241d63faSgerardnico try { 115c3437056SNickeau return self::toSlugPath($title); 116*241d63faSgerardnico } catch (ExceptionNull $e) { 117*241d63faSgerardnico throw new \RuntimeException("The default title of the page (" . $this->getResource() . ") should not be empty."); 118*241d63faSgerardnico } 119*241d63faSgerardnico 120c3437056SNickeau } 12104fd306cSNickeau 12204fd306cSNickeau static public function isOnForm(): bool 12304fd306cSNickeau { 12404fd306cSNickeau return true; 12504fd306cSNickeau } 126c3437056SNickeau} 127