104fd306cSNickeau<?php 204fd306cSNickeau 3*ad54dffdSgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php'); 4*ad54dffdSgerardnico 504fd306cSNickeauuse ComboStrap\DatabasePageRow; 604fd306cSNickeauuse ComboStrap\WikiPath; 704fd306cSNickeauuse ComboStrap\ExceptionNotFound; 804fd306cSNickeauuse ComboStrap\FileSystems; 904fd306cSNickeauuse ComboStrap\LogUtility; 1004fd306cSNickeauuse ComboStrap\MarkupPath; 1104fd306cSNickeauuse ComboStrap\PageUrlPath; 1204fd306cSNickeauuse ComboStrap\PluginUtility; 1304fd306cSNickeau 1404fd306cSNickeau 1504fd306cSNickeau/** 1604fd306cSNickeau * * Change the lang of the page if present 1704fd306cSNickeau * * Modify some style 1804fd306cSNickeau */ 1904fd306cSNickeauclass action_plugin_combo_lang extends DokuWiki_Action_Plugin 2004fd306cSNickeau{ 2104fd306cSNickeau 2204fd306cSNickeau const CANONICAL = "lang"; 2304fd306cSNickeau 2404fd306cSNickeau /** 2504fd306cSNickeau * 2604fd306cSNickeau * hack as: 2704fd306cSNickeau * * {@link getID()} invoked later reads the id from the input variable 2804fd306cSNickeau * * {@link PluginUtility::getRequestedWikiId()} read it then also 2904fd306cSNickeau * 3004fd306cSNickeau * @param string $normalizedId 3104fd306cSNickeau * @return void 3204fd306cSNickeau */ 3304fd306cSNickeau private static function setNormalizedId(string $normalizedId) 3404fd306cSNickeau { 3504fd306cSNickeau global $INPUT; 3604fd306cSNickeau $INPUT->set("id", $normalizedId); 3704fd306cSNickeau } 3804fd306cSNickeau 3904fd306cSNickeau public function register(Doku_Event_Handler $controller) 4004fd306cSNickeau { 4104fd306cSNickeau 4204fd306cSNickeau /** 4304fd306cSNickeau * https://www.dokuwiki.org/devel:event:init_lang_load 4404fd306cSNickeau */ 4504fd306cSNickeau $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'load_lang', array()); 4604fd306cSNickeau $controller->register_hook('INIT_LANG_LOAD', 'AFTER', $this, 'modifyRtlStyling', array()); 4704fd306cSNickeau 4804fd306cSNickeau 4904fd306cSNickeau } 5004fd306cSNickeau 5104fd306cSNickeau public function load_lang(Doku_Event $event, $param) 5204fd306cSNickeau { 5304fd306cSNickeau /** 5404fd306cSNickeau * On the test setup of Dokuwiki 5504fd306cSNickeau * this event is send without any context 5604fd306cSNickeau * data 5704fd306cSNickeau * 5804fd306cSNickeau * This event is send before DokuWiki environment has initialized 5904fd306cSNickeau * unfortunately 6004fd306cSNickeau * 6104fd306cSNickeau * We don't have any ID and we can't set them because 6204fd306cSNickeau * they will be overwritten by calling the {@link getID()} function 6304fd306cSNickeau * 6404fd306cSNickeau */ 6504fd306cSNickeau /** 6604fd306cSNickeau * Arabic characters should not be deleted, otherwise the page id abbr becomes the last name 6704fd306cSNickeau * when URL encoding is used with arabic language 6804fd306cSNickeau * ie: 6904fd306cSNickeau * locale:%F8%B5%F9%81%F8%AD%F8%A9-id1tgpx9 7004fd306cSNickeau * becomes 7104fd306cSNickeau * locale:id1tgpx9 7204fd306cSNickeau */ 7304fd306cSNickeau $clean = false; 7404fd306cSNickeau /** @noinspection PhpConditionAlreadyCheckedInspection */ 7504fd306cSNickeau $id = getID("id", $clean); 7604fd306cSNickeau $id = WikiPath::normalizeWikiPath($id); 7704fd306cSNickeau self::setNormalizedId($id); 7804fd306cSNickeau $page = MarkupPath::createMarkupFromId($id); 7904fd306cSNickeau if (!FileSystems::exists($page->getPathObject())) { 8004fd306cSNickeau // Is it a permanent link 8104fd306cSNickeau try { 8204fd306cSNickeau $lastPartName = $page->getPathObject()->getLastNameWithoutExtension(); 8304fd306cSNickeau } catch (ExceptionNotFound $e) { 8404fd306cSNickeau // only the root does not have any name, it should therefore never happen 8504fd306cSNickeau LogUtility::internalError("No last name, we were unable to set the request id right", self::CANONICAL); 8604fd306cSNickeau return; 8704fd306cSNickeau } 8804fd306cSNickeau $encodedPageId = PageUrlPath::getShortEncodedPageIdFromUrlId($lastPartName); 8904fd306cSNickeau if ($encodedPageId !== null) { 9004fd306cSNickeau $pageId = PageUrlPath::decodePageId($encodedPageId); 9104fd306cSNickeau if ($pageId !== null) { 9204fd306cSNickeau $page = DatabasePageRow::createFromPageIdAbbr($pageId)->getMarkupPath(); 9304fd306cSNickeau if ($page === null) { 9404fd306cSNickeau return; 9504fd306cSNickeau } 9604fd306cSNickeau if (!FileSystems::exists($page->getPathObject())) { 9704fd306cSNickeau return; 9804fd306cSNickeau } 9904fd306cSNickeau 10004fd306cSNickeau self::setNormalizedId($page->getPathObject()->getWikiId()); 10104fd306cSNickeau 10204fd306cSNickeau } 10304fd306cSNickeau } 10404fd306cSNickeau } 10504fd306cSNickeau $pageLang = $page->getLangOrDefault(); 10604fd306cSNickeau global $conf; 10704fd306cSNickeau $initialLang = $event->data; 10804fd306cSNickeau if ($initialLang !== $pageLang) { 10904fd306cSNickeau $conf['lang'] = $pageLang; 11004fd306cSNickeau $event->data = $pageLang; 11104fd306cSNickeau } 11204fd306cSNickeau 11304fd306cSNickeau 11404fd306cSNickeau } 11504fd306cSNickeau 11604fd306cSNickeau /** 11704fd306cSNickeau * 11804fd306cSNickeau * 11904fd306cSNickeau * In case of a RTL lang, we put the secedit button to the left 12004fd306cSNickeau * 12104fd306cSNickeau * @param Doku_Event $event 12204fd306cSNickeau * @param $params 12304fd306cSNickeau * 12404fd306cSNickeau */ 12504fd306cSNickeau function modifyRtlStyling(Doku_Event $event, $params) 12604fd306cSNickeau { 12704fd306cSNickeau 12804fd306cSNickeau /** 12904fd306cSNickeau * Lang for a page 13004fd306cSNickeau * 13104fd306cSNickeau * https://www.w3.org/International/questions/qa-html-language-declarations 13204fd306cSNickeau * * Always use a language attribute on the html element. 13304fd306cSNickeau * * When serving XHTML 1.x (ie. using a MIME type such as application/xhtml+xml), 13404fd306cSNickeau * use both the lang attribute and the xml:lang attribute together 13504fd306cSNickeau * 13604fd306cSNickeau * See also {@link \ComboStrap\Lang::processLangAttribute()} for the localization of an element 13704fd306cSNickeau * 13804fd306cSNickeau * put the button to the end when the page has a language direction of rtl 13904fd306cSNickeau */ 14004fd306cSNickeau global $lang; 14104fd306cSNickeau if ($lang['direction'] === "rtl") { 14204fd306cSNickeau PluginUtility::getSnippetManager()->attachCssInternalStylesheet(self::CANONICAL . "-rtl"); 14304fd306cSNickeau } 14404fd306cSNickeau 14504fd306cSNickeau 14604fd306cSNickeau } 14704fd306cSNickeau 14804fd306cSNickeau 14904fd306cSNickeau} 15004fd306cSNickeau 15104fd306cSNickeau 15204fd306cSNickeau 153