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