xref: /plugin/combo/ComboStrap/SlotSystem.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4*04fd306cSNickeau
5*04fd306cSNickeauclass SlotSystem
6*04fd306cSNickeau{
7*04fd306cSNickeau
8*04fd306cSNickeau    const CANONICAL = "slot-system";
9*04fd306cSNickeau
10*04fd306cSNickeau    /**
11*04fd306cSNickeau     * A slot should never run in its own path as context path
12*04fd306cSNickeau     * This function returns the context path in which see should run
13*04fd306cSNickeau     * (ie the last visited path)
14*04fd306cSNickeau     *
15*04fd306cSNickeau     * This context path is given globally via the {@link ExecutionContext::getContextPath()}
16*04fd306cSNickeau     * when the {@link MarkupPath::isSlot() page is a slot}
17*04fd306cSNickeau     * @throws ExceptionNotFound
18*04fd306cSNickeau     */
19*04fd306cSNickeau    public static function getContextPath(): MarkupPath
20*04fd306cSNickeau    {
21*04fd306cSNickeau        $crumbs = $_SESSION[DOKU_COOKIE]['bc'] ?? array();
22*04fd306cSNickeau        if (empty($crumbs)) {
23*04fd306cSNickeau            throw new ExceptionNotFound("No historical crumbs");
24*04fd306cSNickeau        }
25*04fd306cSNickeau        $size = sizeof($crumbs);
26*04fd306cSNickeau        $visitedIds = array_keys($crumbs);
27*04fd306cSNickeau        for ($i = $size - 1; $i > 0; $i--) {
28*04fd306cSNickeau            $id = $visitedIds[$i];
29*04fd306cSNickeau            $markupPath = MarkupPath::createMarkupFromId($id);
30*04fd306cSNickeau            if (!$markupPath->isSlot()) {
31*04fd306cSNickeau                return $markupPath;
32*04fd306cSNickeau            }
33*04fd306cSNickeau        }
34*04fd306cSNickeau        throw new ExceptionNotFound("No historical crumbs");
35*04fd306cSNickeau    }
36*04fd306cSNickeau
37*04fd306cSNickeau    public static function sendContextPathMessage(MarkupPath $contextPath): void
38*04fd306cSNickeau    {
39*04fd306cSNickeau        try {
40*04fd306cSNickeau            $anchorLink = LinkMarkup::createFromPageIdOrPath($contextPath->getWikiId())
41*04fd306cSNickeau                    ->toAttributes()
42*04fd306cSNickeau                    ->toHtmlEnterTag("a")
43*04fd306cSNickeau                . $contextPath->getTitleOrDefault()
44*04fd306cSNickeau                . "</a>";
45*04fd306cSNickeau        } catch (ExceptionBadArgument|ExceptionNotFound $e) {
46*04fd306cSNickeau            LogUtility::internalError("Should not happen");
47*04fd306cSNickeau            $anchorLink = $contextPath->getTitleOrDefault();
48*04fd306cSNickeau        }
49*04fd306cSNickeau        $docLink = PluginUtility::getDocumentationHyperLink("slot", "slot");
50*04fd306cSNickeau
51*04fd306cSNickeau        $html = <<<EOF
52*04fd306cSNickeau  <p>This page is a $docLink.</p>
53*04fd306cSNickeau   <p>It returns information as if it was run within the last visited path: $anchorLink</p>
54*04fd306cSNickeauEOF;
55*04fd306cSNickeau        LogUtility::warning($html, self::CANONICAL);
56*04fd306cSNickeau
57*04fd306cSNickeau    }
58*04fd306cSNickeau
59*04fd306cSNickeau    public static function getSlotNames(): array
60*04fd306cSNickeau    {
61*04fd306cSNickeau
62*04fd306cSNickeau
63*04fd306cSNickeau        return [
64*04fd306cSNickeau
65*04fd306cSNickeau            self::getPageHeaderSlotName(),
66*04fd306cSNickeau            self::getSidebarName(),
67*04fd306cSNickeau            self::getPageFooterSlotName(),
68*04fd306cSNickeau            self::getMainHeaderSlotName(),
69*04fd306cSNickeau            self::getMainFooterSlotName()
70*04fd306cSNickeau        ];
71*04fd306cSNickeau
72*04fd306cSNickeau
73*04fd306cSNickeau    }
74*04fd306cSNickeau
75*04fd306cSNickeau    /**
76*04fd306cSNickeau     *
77*04fd306cSNickeau     */
78*04fd306cSNickeau    public static function getMainHeaderSlotName(): ?string
79*04fd306cSNickeau    {
80*04fd306cSNickeau        return Site::SLOT_MAIN_HEADER_NAME;
81*04fd306cSNickeau    }
82*04fd306cSNickeau
83*04fd306cSNickeau    /**
84*04fd306cSNickeau     */
85*04fd306cSNickeau    public static function getPageFooterSlotName()
86*04fd306cSNickeau    {
87*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()->getConfValue(TemplateSlot::CONF_PAGE_FOOTER_NAME, TemplateSlot::CONF_PAGE_FOOTER_NAME_DEFAULT);
88*04fd306cSNickeau    }
89*04fd306cSNickeau
90*04fd306cSNickeau    /**
91*04fd306cSNickeau     *
92*04fd306cSNickeau     */
93*04fd306cSNickeau    public static function getPageHeaderSlotName()
94*04fd306cSNickeau    {
95*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getPageHeaderSlotName();
96*04fd306cSNickeau    }
97*04fd306cSNickeau
98*04fd306cSNickeau    /**
99*04fd306cSNickeau     * @deprecated
100*04fd306cSNickeau     */
101*04fd306cSNickeau    public static function getMainSideSlotName()
102*04fd306cSNickeau    {
103*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()->getConfValue(TemplateSlot::CONF_PAGE_MAIN_SIDEKICK_NAME, TemplateSlot::CONF_PAGE_MAIN_SIDEKICK_NAME_DEFAULT);
104*04fd306cSNickeau    }
105*04fd306cSNickeau
106*04fd306cSNickeau    /**
107*04fd306cSNickeau     *
108*04fd306cSNickeau     */
109*04fd306cSNickeau    public static function getMainFooterSlotName(): string
110*04fd306cSNickeau    {
111*04fd306cSNickeau        return Site::SLOT_MAIN_FOOTER_NAME;
112*04fd306cSNickeau    }
113*04fd306cSNickeau
114*04fd306cSNickeau    /**
115*04fd306cSNickeau     * @return string - the name of the sidebar page
116*04fd306cSNickeau     */
117*04fd306cSNickeau    public static function getSidebarName(): string
118*04fd306cSNickeau    {
119*04fd306cSNickeau        global $conf;
120*04fd306cSNickeau        return $conf["sidebar"];
121*04fd306cSNickeau    }
122*04fd306cSNickeau
123*04fd306cSNickeau    public static function isMainHeaderSlot(Path $sourcePath): bool
124*04fd306cSNickeau    {
125*04fd306cSNickeau        try {
126*04fd306cSNickeau            $nameWithoutExtension = $sourcePath->getLastNameWithoutExtension();
127*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
128*04fd306cSNickeau            return false;
129*04fd306cSNickeau        }
130*04fd306cSNickeau        $mainHeaderSlotName = self::getMainHeaderSlotName();
131*04fd306cSNickeau        return $nameWithoutExtension === $mainHeaderSlotName;
132*04fd306cSNickeau    }
133*04fd306cSNickeau}
134