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