1*c3437056SNickeau<?php 2*c3437056SNickeau 3*c3437056SNickeau 4*c3437056SNickeaunamespace ComboStrap; 5*c3437056SNickeau 6*c3437056SNickeau 7*c3437056SNickeauclass Canonical extends MetadataWikiPath 8*c3437056SNickeau{ 9*c3437056SNickeau 10*c3437056SNickeau public const PROPERTY_NAME = "canonical"; 11*c3437056SNickeau public const CANONICAL = "canonical"; 12*c3437056SNickeau 13*c3437056SNickeau /** 14*c3437056SNickeau * The auto-canonical feature does not create any canonical value on the file system 15*c3437056SNickeau * but creates a canonical in the database (where the {@link \action_plugin_combo_router} 16*c3437056SNickeau * takes its information and it enables to route via a calculated canonical 17*c3437056SNickeau * (ie the {@link Canonical::getDefaultValue()} 18*c3437056SNickeau */ 19*c3437056SNickeau public const CONF_CANONICAL_LAST_NAMES_COUNT = 'MinimalNamesCountForAutomaticCanonical'; 20*c3437056SNickeau 21*c3437056SNickeau public static function createForPage(Page $page): Canonical 22*c3437056SNickeau { 23*c3437056SNickeau return (new Canonical()) 24*c3437056SNickeau ->setResource($page); 25*c3437056SNickeau 26*c3437056SNickeau } 27*c3437056SNickeau 28*c3437056SNickeau public function getTab(): string 29*c3437056SNickeau { 30*c3437056SNickeau return MetaManagerForm::TAB_REDIRECTION_VALUE; 31*c3437056SNickeau } 32*c3437056SNickeau 33*c3437056SNickeau public function getDescription(): string 34*c3437056SNickeau { 35*c3437056SNickeau return "The canonical path is a short unique path for the page (used in named permalink)"; 36*c3437056SNickeau } 37*c3437056SNickeau 38*c3437056SNickeau public function getLabel(): string 39*c3437056SNickeau { 40*c3437056SNickeau return "Canonical Path"; 41*c3437056SNickeau } 42*c3437056SNickeau 43*c3437056SNickeau public static function getName(): string 44*c3437056SNickeau { 45*c3437056SNickeau return self::PROPERTY_NAME; 46*c3437056SNickeau } 47*c3437056SNickeau 48*c3437056SNickeau public function getPersistenceType(): string 49*c3437056SNickeau { 50*c3437056SNickeau return MetadataDokuWikiStore::PERSISTENT_METADATA; 51*c3437056SNickeau } 52*c3437056SNickeau 53*c3437056SNickeau public function getMutable(): bool 54*c3437056SNickeau { 55*c3437056SNickeau return true; 56*c3437056SNickeau } 57*c3437056SNickeau 58*c3437056SNickeau public function getDefaultValue(): ?string 59*c3437056SNickeau { 60*c3437056SNickeau /** 61*c3437056SNickeau * The last part of the id as canonical 62*c3437056SNickeau */ 63*c3437056SNickeau // How many last parts are taken into account in the canonical processing (2 by default) 64*c3437056SNickeau $canonicalLastNamesCount = PluginUtility::getConfValue(self::CONF_CANONICAL_LAST_NAMES_COUNT, 0); 65*c3437056SNickeau if ($canonicalLastNamesCount > 0) { 66*c3437056SNickeau /** 67*c3437056SNickeau * Takes the last names part 68*c3437056SNickeau */ 69*c3437056SNickeau $namesOriginal = $this->getResource()->getPath()->getNames(); 70*c3437056SNickeau /** 71*c3437056SNickeau * Delete the identical names at the end 72*c3437056SNickeau * To resolve this problem 73*c3437056SNickeau * The page (viz:viz) and the page (data:viz:viz) have the same canonical. 74*c3437056SNickeau * The page (viz:viz) will get the canonical viz 75*c3437056SNickeau * The page (data:viz) will get the canonical data:viz 76*c3437056SNickeau */ 77*c3437056SNickeau $i = sizeof($namesOriginal) - 1; 78*c3437056SNickeau $names = $namesOriginal; 79*c3437056SNickeau while ($namesOriginal[$i] == $namesOriginal[$i - 1]) { 80*c3437056SNickeau unset($names[$i]); 81*c3437056SNickeau $i--; 82*c3437056SNickeau if ($i <= 0) { 83*c3437056SNickeau break; 84*c3437056SNickeau } 85*c3437056SNickeau } 86*c3437056SNickeau /** 87*c3437056SNickeau * Minimal length check 88*c3437056SNickeau */ 89*c3437056SNickeau $namesLength = sizeof($names); 90*c3437056SNickeau if ($namesLength > $canonicalLastNamesCount) { 91*c3437056SNickeau $names = array_slice($names, $namesLength - $canonicalLastNamesCount); 92*c3437056SNickeau } 93*c3437056SNickeau /** 94*c3437056SNickeau * If this is a `start` page, delete the name 95*c3437056SNickeau * ie javascript:start will become javascript 96*c3437056SNickeau * (Not a home page) 97*c3437056SNickeau */ 98*c3437056SNickeau if ($this->getResource()->isStartPage()) { 99*c3437056SNickeau $names = array_slice($names, 0, $namesLength - 1); 100*c3437056SNickeau } 101*c3437056SNickeau $calculatedCanonical = implode(":", $names); 102*c3437056SNickeau DokuPath::addRootSeparatorIfNotPresent($calculatedCanonical); 103*c3437056SNickeau return $calculatedCanonical; 104*c3437056SNickeau } 105*c3437056SNickeau return null; 106*c3437056SNickeau } 107*c3437056SNickeau 108*c3437056SNickeau public function getCanonical(): string 109*c3437056SNickeau { 110*c3437056SNickeau return self::CANONICAL; 111*c3437056SNickeau } 112*c3437056SNickeau 113*c3437056SNickeau 114*c3437056SNickeau} 115