xref: /template/strap/ComboStrap/Canonical.php (revision c3437056399326d621a01da73b649707fbb0ae69)
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