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