xref: /plugin/combo/action/snippets.php (revision d2ffcff9d34a4eb25389de2cadc56faca90aa841)
15f891b7eSNickeau<?php
25f891b7eSNickeau
35f891b7eSNickeauuse ComboStrap\LogUtility;
45f891b7eSNickeauuse ComboStrap\PluginUtility;
55f891b7eSNickeauuse ComboStrap\SnippetManager;
65f891b7eSNickeau
75f891b7eSNickeauif (!defined('DOKU_INC')) die();
85f891b7eSNickeau
95f891b7eSNickeau/**
105f891b7eSNickeau *
115f891b7eSNickeau *
125f891b7eSNickeau * Add the snippet needed by the components
135f891b7eSNickeau *
145f891b7eSNickeau */
155f891b7eSNickeauclass action_plugin_combo_snippets extends DokuWiki_Action_Plugin
165f891b7eSNickeau{
175f891b7eSNickeau
185f891b7eSNickeau
195f891b7eSNickeau    /**
205f891b7eSNickeau     * @var bool - to trace if the header output was called
215f891b7eSNickeau     */
225f891b7eSNickeau    private $headerOutputWasCalled = false;
235f891b7eSNickeau
245f891b7eSNickeau    function __construct()
255f891b7eSNickeau    {
265f891b7eSNickeau        // enable direct access to language strings
275f891b7eSNickeau        // ie $this->lang
285f891b7eSNickeau        $this->setupLocale();
295f891b7eSNickeau    }
305f891b7eSNickeau
315f891b7eSNickeau    public function register(Doku_Event_Handler $controller)
325f891b7eSNickeau    {
335f891b7eSNickeau        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'componentSnippetHead', array());
345f891b7eSNickeau        $controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, 'componentSnippetContent', array());
355f891b7eSNickeau    }
365f891b7eSNickeau
375f891b7eSNickeau    /**
385f891b7eSNickeau     * Dokuwiki has already a canonical methodology
395f891b7eSNickeau     * https://www.dokuwiki.org/canonical
405f891b7eSNickeau     *
415f891b7eSNickeau     * @param $event
425f891b7eSNickeau     */
435f891b7eSNickeau    function componentSnippetHead($event)
445f891b7eSNickeau    {
455f891b7eSNickeau
465f891b7eSNickeau
475f891b7eSNickeau        global $ID;
485f891b7eSNickeau        if (empty($ID)) {
495f891b7eSNickeau            return;
505f891b7eSNickeau        }
515f891b7eSNickeau
525f891b7eSNickeau        /**
535f891b7eSNickeau         * Advertise that the header output was called
545f891b7eSNickeau         * If the user is using another template
555f891b7eSNickeau         * than strap that does not put the component snippet
565f891b7eSNickeau         * in the head
575f891b7eSNickeau         * Used in
585f891b7eSNickeau         */
595f891b7eSNickeau        $this->headerOutputWasCalled = true;
605f891b7eSNickeau
615f891b7eSNickeau        $snippetManager = PluginUtility::getSnippetManager();
625f891b7eSNickeau
635f891b7eSNickeau        /**
645f891b7eSNickeau         * Because the cache is at the bar level,
655f891b7eSNickeau         * a rendering for a page may run without the others
665f891b7eSNickeau         * Therefore we saved the data in between
675f891b7eSNickeau         * (The storage is done at the page level)
685f891b7eSNickeau         * Adapted from {@link p_cached_output()}
695f891b7eSNickeau         */
70*d2ffcff9Sgerardnico        $cache = new \dokuwiki\Cache\Cache($ID, "snippet");
71*d2ffcff9Sgerardnico        // note: $cache->useCache()) permits to add dependencies and get a cache results
72*d2ffcff9Sgerardnico        // in case we want to add dependencies on the bar
735f891b7eSNickeau        $data = $cache->retrieveCache();
745f891b7eSNickeau        global $conf;
755f891b7eSNickeau        if ($conf['allowdebug']) {
76*d2ffcff9Sgerardnico            LogUtility::log2file("Snippet cache file {$cache->cache} used", LogUtility::LVL_MSG_DEBUG);
775f891b7eSNickeau        }
785f891b7eSNickeau        if (!empty($data)) {
795f891b7eSNickeau            $storedArray = unserialize($data);
80*d2ffcff9Sgerardnico        } else {
81*d2ffcff9Sgerardnico            $storedArray = array();
825f891b7eSNickeau        }
835f891b7eSNickeau        $snippetManager->mergeWithPreviousRun($storedArray);
84*d2ffcff9Sgerardnico
855f891b7eSNickeau        $cache->storeCache(serialize($snippetManager->getData()));
865f891b7eSNickeau
875f891b7eSNickeau
885f891b7eSNickeau        /**
895f891b7eSNickeau         * tags
905f891b7eSNickeau         */
915f891b7eSNickeau        foreach ($snippetManager->getTags() as $component => $tags) {
925f891b7eSNickeau            foreach ($tags as $tagType => $tagRows) {
935f891b7eSNickeau                foreach ($tagRows as $tagRow) {
945f891b7eSNickeau                    $tagRow["class"] = SnippetManager::getClassFromTag($component);;
955f891b7eSNickeau                    $event->data[$tagType][] = $tagRow;
965f891b7eSNickeau                }
975f891b7eSNickeau            }
985f891b7eSNickeau        }
995f891b7eSNickeau
1005f891b7eSNickeau        /**
1015f891b7eSNickeau         * Css
1025f891b7eSNickeau         */
1035f891b7eSNickeau        foreach ($snippetManager->getCss() as $component => $snippet) {
1045f891b7eSNickeau            $event->data['style'][] = array(
1055f891b7eSNickeau                "class" => SnippetManager::getClassFromTag($component),
1065f891b7eSNickeau                "_data" => $snippet
1075f891b7eSNickeau            );
1085f891b7eSNickeau        }
1095f891b7eSNickeau
1105f891b7eSNickeau        /**
1115f891b7eSNickeau         * Javascript
1125f891b7eSNickeau         */
1135f891b7eSNickeau        foreach ($snippetManager->getJavascript() as $component => $snippet) {
1145f891b7eSNickeau            $event->data['script'][] = array(
1155f891b7eSNickeau                "class" => SnippetManager::getClassFromTag($component),
1165f891b7eSNickeau                "type" => "text/javascript",
1175f891b7eSNickeau                "_data" => $snippet
1185f891b7eSNickeau            );
1195f891b7eSNickeau        }
1205f891b7eSNickeau
1215f891b7eSNickeau
1225f891b7eSNickeau        $snippetManager->close();
1235f891b7eSNickeau
1245f891b7eSNickeau    }
1255f891b7eSNickeau
1265f891b7eSNickeau    /**
1275f891b7eSNickeau     * Used if the template does not run the content
1285f891b7eSNickeau     * before the calling of the header as strap does.
1295f891b7eSNickeau     *
1305f891b7eSNickeau     * In this case, the {@link \ComboStrap\SnippetManager::close()} has
1315f891b7eSNickeau     * not run, and the snippets are still in memory.
1325f891b7eSNickeau     *
1335f891b7eSNickeau     * We store them in the HTML and they
1345f891b7eSNickeau     * follows then the HTML cache of DokuWiki
1355f891b7eSNickeau     * @param $event
1365f891b7eSNickeau     */
1375f891b7eSNickeau    function componentSnippetContent($event)
1385f891b7eSNickeau    {
1395f891b7eSNickeau
1405f891b7eSNickeau
1415f891b7eSNickeau        /**
1425f891b7eSNickeau         * Run only if the header output was already called
1435f891b7eSNickeau         */
1445f891b7eSNickeau        if ($this->headerOutputWasCalled) {
1455f891b7eSNickeau
1465f891b7eSNickeau            $snippetManager = PluginUtility::getSnippetManager();
1475f891b7eSNickeau
1485f891b7eSNickeau            /**
1495f891b7eSNickeau             * tags
1505f891b7eSNickeau             */
1515f891b7eSNickeau            foreach ($snippetManager->getTags() as $component => $tags) {
1525f891b7eSNickeau                foreach ($tags as $tagType => $tagRows) {
1535f891b7eSNickeau                    foreach ($tagRows as $tagRow) {
1545f891b7eSNickeau                        $class = SnippetManager::getClassFromTag($component);
1555f891b7eSNickeau                        $event->data .= "<$tagType class=\"$class\"";
1565f891b7eSNickeau                        foreach ($tagRow as $attributeName => $attributeValue) {
1575f891b7eSNickeau                            if ($attributeName != "_data") {
1585f891b7eSNickeau                                $event->data .= " $attributeName=\"$attributeValue\"";
1595f891b7eSNickeau                            } else {
1605f891b7eSNickeau                                $content = $attributeValue;
1615f891b7eSNickeau                            }
1625f891b7eSNickeau                        }
1635f891b7eSNickeau                        $event->data .= ">";
1645f891b7eSNickeau                        if (!empty($content)) {
1655f891b7eSNickeau                            $event->data .= $content;
1665f891b7eSNickeau                        }
1675f891b7eSNickeau                        $event->data .= "</$tagType>";
1685f891b7eSNickeau                    }
1695f891b7eSNickeau                }
1705f891b7eSNickeau            }
1715f891b7eSNickeau
1725f891b7eSNickeau            /**
1735f891b7eSNickeau             * Css
1745f891b7eSNickeau             */
1755f891b7eSNickeau            foreach ($snippetManager->getCss() as $component => $snippet) {
1765f891b7eSNickeau
1775f891b7eSNickeau                $class = SnippetManager::getClassFromTag($component);
1785f891b7eSNickeau                $event->data .= "<style class=\"$class\">$snippet</style>" . DOKU_LF;
1795f891b7eSNickeau
1805f891b7eSNickeau            }
1815f891b7eSNickeau
1825f891b7eSNickeau            /**
1835f891b7eSNickeau             * Javascript
1845f891b7eSNickeau             */
1855f891b7eSNickeau            foreach ($snippetManager->getJavascript() as $component => $snippet) {
1865f891b7eSNickeau                $class = SnippetManager::getClassFromTag($component);
1875f891b7eSNickeau                $event->data .= "<script class=\"$class\" type=\"text/javascript\">$snippet</script>" . DOKU_LF;
1885f891b7eSNickeau            }
1895f891b7eSNickeau
1905f891b7eSNickeau            $snippetManager->close();
1915f891b7eSNickeau
1925f891b7eSNickeau            /**
1935f891b7eSNickeau             * Set the value back
1945f891b7eSNickeau             */
1955f891b7eSNickeau            $this->headerOutputWasCalled = false;
1965f891b7eSNickeau
1975f891b7eSNickeau        }
1985f891b7eSNickeau
1995f891b7eSNickeau    }
2005f891b7eSNickeau
2015f891b7eSNickeau    /**
2025f891b7eSNickeau     * Adapted from {@link p_cached_output()}
2035f891b7eSNickeau     */
2045f891b7eSNickeau    function getCachedSnippet()
2055f891b7eSNickeau    {
2065f891b7eSNickeau
2075f891b7eSNickeau        global $ID;
2085f891b7eSNickeau        $file = wikiFN($ID);
2095f891b7eSNickeau        $format = "combo_head";
2105f891b7eSNickeau        global $conf;
2115f891b7eSNickeau
2125f891b7eSNickeau
2135f891b7eSNickeau    }
2145f891b7eSNickeau
2155f891b7eSNickeau//    function storeSnippetArray()
2165f891b7eSNickeau//    {
2175f891b7eSNickeau//        global $conf;
2185f891b7eSNickeau//
2195f891b7eSNickeau//        $cache = new CacheRenderer($ID, $file, $format);
2205f891b7eSNickeau//        if (!empty($headHtml)) {
2215f891b7eSNickeau//            if ($cache->storeCache($headHtml)) {              // storeCache() attempts to save cachefile
2225f891b7eSNickeau//                if ($conf['allowdebug']) {
2235f891b7eSNickeau//
2245f891b7eSNickeau//                    LogUtility::log2file("No cache file used, but created {$cache->cache} ");
2255f891b7eSNickeau//                }
2265f891b7eSNickeau//            } else {
2275f891b7eSNickeau//                $cache->removeCache();                     //try to delete cachefile
2285f891b7eSNickeau//                if ($conf['allowdebug']) {
2295f891b7eSNickeau//                    LogUtility::log2file("no cachefile used, caching forbidden");
2305f891b7eSNickeau//                }
2315f891b7eSNickeau//            }
2325f891b7eSNickeau//        }
2335f891b7eSNickeau//    }
2345f891b7eSNickeau
2355f891b7eSNickeau
2365f891b7eSNickeau}
237