1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeauuse ComboStrap\DatabasePageRow; 4*04fd306cSNickeauuse ComboStrap\WikiPath; 5*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 6*04fd306cSNickeauuse ComboStrap\FileSystems; 7*04fd306cSNickeauuse ComboStrap\LogUtility; 8*04fd306cSNickeauuse ComboStrap\MarkupPath; 9*04fd306cSNickeauuse ComboStrap\PageUrlPath; 10*04fd306cSNickeauuse ComboStrap\PluginUtility; 11*04fd306cSNickeau 12*04fd306cSNickeau 13*04fd306cSNickeau/** 14*04fd306cSNickeau * * Change the lang of the page if present 15*04fd306cSNickeau * * Modify some style 16*04fd306cSNickeau */ 17*04fd306cSNickeauclass action_plugin_combo_lang extends DokuWiki_Action_Plugin 18*04fd306cSNickeau{ 19*04fd306cSNickeau 20*04fd306cSNickeau const CANONICAL = "lang"; 21*04fd306cSNickeau 22*04fd306cSNickeau /** 23*04fd306cSNickeau * 24*04fd306cSNickeau * hack as: 25*04fd306cSNickeau * * {@link getID()} invoked later reads the id from the input variable 26*04fd306cSNickeau * * {@link PluginUtility::getRequestedWikiId()} read it then also 27*04fd306cSNickeau * 28*04fd306cSNickeau * @param string $normalizedId 29*04fd306cSNickeau * @return void 30*04fd306cSNickeau */ 31*04fd306cSNickeau private static function setNormalizedId(string $normalizedId) 32*04fd306cSNickeau { 33*04fd306cSNickeau global $INPUT; 34*04fd306cSNickeau $INPUT->set("id", $normalizedId); 35*04fd306cSNickeau } 36*04fd306cSNickeau 37*04fd306cSNickeau public function register(Doku_Event_Handler $controller) 38*04fd306cSNickeau { 39*04fd306cSNickeau 40*04fd306cSNickeau /** 41*04fd306cSNickeau * https://www.dokuwiki.org/devel:event:init_lang_load 42*04fd306cSNickeau */ 43*04fd306cSNickeau $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'load_lang', array()); 44*04fd306cSNickeau $controller->register_hook('INIT_LANG_LOAD', 'AFTER', $this, 'modifyRtlStyling', array()); 45*04fd306cSNickeau 46*04fd306cSNickeau 47*04fd306cSNickeau } 48*04fd306cSNickeau 49*04fd306cSNickeau public function load_lang(Doku_Event $event, $param) 50*04fd306cSNickeau { 51*04fd306cSNickeau /** 52*04fd306cSNickeau * On the test setup of Dokuwiki 53*04fd306cSNickeau * this event is send without any context 54*04fd306cSNickeau * data 55*04fd306cSNickeau * 56*04fd306cSNickeau * This event is send before DokuWiki environment has initialized 57*04fd306cSNickeau * unfortunately 58*04fd306cSNickeau * 59*04fd306cSNickeau * We don't have any ID and we can't set them because 60*04fd306cSNickeau * they will be overwritten by calling the {@link getID()} function 61*04fd306cSNickeau * 62*04fd306cSNickeau */ 63*04fd306cSNickeau /** 64*04fd306cSNickeau * Arabic characters should not be deleted, otherwise the page id abbr becomes the last name 65*04fd306cSNickeau * when URL encoding is used with arabic language 66*04fd306cSNickeau * ie: 67*04fd306cSNickeau * locale:%F8%B5%F9%81%F8%AD%F8%A9-id1tgpx9 68*04fd306cSNickeau * becomes 69*04fd306cSNickeau * locale:id1tgpx9 70*04fd306cSNickeau */ 71*04fd306cSNickeau $clean = false; 72*04fd306cSNickeau /** @noinspection PhpConditionAlreadyCheckedInspection */ 73*04fd306cSNickeau $id = getID("id", $clean); 74*04fd306cSNickeau $id = WikiPath::normalizeWikiPath($id); 75*04fd306cSNickeau self::setNormalizedId($id); 76*04fd306cSNickeau $page = MarkupPath::createMarkupFromId($id); 77*04fd306cSNickeau if (!FileSystems::exists($page->getPathObject())) { 78*04fd306cSNickeau // Is it a permanent link 79*04fd306cSNickeau try { 80*04fd306cSNickeau $lastPartName = $page->getPathObject()->getLastNameWithoutExtension(); 81*04fd306cSNickeau } catch (ExceptionNotFound $e) { 82*04fd306cSNickeau // only the root does not have any name, it should therefore never happen 83*04fd306cSNickeau LogUtility::internalError("No last name, we were unable to set the request id right", self::CANONICAL); 84*04fd306cSNickeau return; 85*04fd306cSNickeau } 86*04fd306cSNickeau $encodedPageId = PageUrlPath::getShortEncodedPageIdFromUrlId($lastPartName); 87*04fd306cSNickeau if ($encodedPageId !== null) { 88*04fd306cSNickeau $pageId = PageUrlPath::decodePageId($encodedPageId); 89*04fd306cSNickeau if ($pageId !== null) { 90*04fd306cSNickeau $page = DatabasePageRow::createFromPageIdAbbr($pageId)->getMarkupPath(); 91*04fd306cSNickeau if ($page === null) { 92*04fd306cSNickeau return; 93*04fd306cSNickeau } 94*04fd306cSNickeau if (!FileSystems::exists($page->getPathObject())) { 95*04fd306cSNickeau return; 96*04fd306cSNickeau } 97*04fd306cSNickeau 98*04fd306cSNickeau self::setNormalizedId($page->getPathObject()->getWikiId()); 99*04fd306cSNickeau 100*04fd306cSNickeau } 101*04fd306cSNickeau } 102*04fd306cSNickeau } 103*04fd306cSNickeau $pageLang = $page->getLangOrDefault(); 104*04fd306cSNickeau global $conf; 105*04fd306cSNickeau $initialLang = $event->data; 106*04fd306cSNickeau if ($initialLang !== $pageLang) { 107*04fd306cSNickeau $conf['lang'] = $pageLang; 108*04fd306cSNickeau $event->data = $pageLang; 109*04fd306cSNickeau } 110*04fd306cSNickeau 111*04fd306cSNickeau 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau /** 115*04fd306cSNickeau * 116*04fd306cSNickeau * 117*04fd306cSNickeau * In case of a RTL lang, we put the secedit button to the left 118*04fd306cSNickeau * 119*04fd306cSNickeau * @param Doku_Event $event 120*04fd306cSNickeau * @param $params 121*04fd306cSNickeau * 122*04fd306cSNickeau */ 123*04fd306cSNickeau function modifyRtlStyling(Doku_Event $event, $params) 124*04fd306cSNickeau { 125*04fd306cSNickeau 126*04fd306cSNickeau /** 127*04fd306cSNickeau * Lang for a page 128*04fd306cSNickeau * 129*04fd306cSNickeau * https://www.w3.org/International/questions/qa-html-language-declarations 130*04fd306cSNickeau * * Always use a language attribute on the html element. 131*04fd306cSNickeau * * When serving XHTML 1.x (ie. using a MIME type such as application/xhtml+xml), 132*04fd306cSNickeau * use both the lang attribute and the xml:lang attribute together 133*04fd306cSNickeau * 134*04fd306cSNickeau * See also {@link \ComboStrap\Lang::processLangAttribute()} for the localization of an element 135*04fd306cSNickeau * 136*04fd306cSNickeau * put the button to the end when the page has a language direction of rtl 137*04fd306cSNickeau */ 138*04fd306cSNickeau global $lang; 139*04fd306cSNickeau if ($lang['direction'] === "rtl") { 140*04fd306cSNickeau PluginUtility::getSnippetManager()->attachCssInternalStylesheet(self::CANONICAL . "-rtl"); 141*04fd306cSNickeau } 142*04fd306cSNickeau 143*04fd306cSNickeau 144*04fd306cSNickeau } 145*04fd306cSNickeau 146*04fd306cSNickeau 147*04fd306cSNickeau} 148*04fd306cSNickeau 149*04fd306cSNickeau 150*04fd306cSNickeau 151