1*6a458d92SdWiGhT<?php 2*6a458d92SdWiGhTuse dokuwiki\Extension\ActionPlugin; 3*6a458d92SdWiGhTuse dokuwiki\Extension\EventHandler; 4*6a458d92SdWiGhTuse dokuwiki\Extension\Event; 5*6a458d92SdWiGhT 6*6a458d92SdWiGhTclass action_plugin_pagecss extends ActionPlugin { 7*6a458d92SdWiGhT 8*6a458d92SdWiGhT public function register(EventHandler $controller) { 9*6a458d92SdWiGhT $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'inject_css'); 10*6a458d92SdWiGhT $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handle_metadata'); 11*6a458d92SdWiGhT } 12*6a458d92SdWiGhT 13*6a458d92SdWiGhT public function handle_metadata(\Doku_Event $event) { 14*6a458d92SdWiGhT global $ID; 15*6a458d92SdWiGhT $text = rawWiki($ID); // Use raw page content instead of description 16*6a458d92SdWiGhT 17*6a458d92SdWiGhT preg_match_all('/<pagecss>(.*?)<\/pagecss>/s', $text, $matches); 18*6a458d92SdWiGhT if (!empty($matches[1])) { 19*6a458d92SdWiGhT $styles = implode(" ", array_map('trim', $matches[1])); 20*6a458d92SdWiGhT if ($styles) { 21*6a458d92SdWiGhT preg_match_all('/\.([a-zA-Z0-9_-]+)\s*\{[^}]*\}/', $styles, $class_matches); 22*6a458d92SdWiGhT $extra = ''; 23*6a458d92SdWiGhT foreach ($class_matches[1] as $classname) { 24*6a458d92SdWiGhT $pattern = '/\.' . preg_quote($classname, '/') . '\s*\{([^}]*)\}/'; 25*6a458d92SdWiGhT if (preg_match($pattern, $styles, $style_block)) { 26*6a458d92SdWiGhT $extra .= ".wrap_$classname {{$style_block[1]}}\n"; 27*6a458d92SdWiGhT } 28*6a458d92SdWiGhT } 29*6a458d92SdWiGhT $styles .= "\n" . trim($extra); 30*6a458d92SdWiGhT p_set_metadata($ID, ['pagecss' => ['styles' => $styles]]); 31*6a458d92SdWiGhT return; 32*6a458d92SdWiGhT } 33*6a458d92SdWiGhT } 34*6a458d92SdWiGhT 35*6a458d92SdWiGhT p_set_metadata($ID, ['pagecss' => ['styles' => '']]); 36*6a458d92SdWiGhT } 37*6a458d92SdWiGhT 38*6a458d92SdWiGhT public function inject_css(Doku_Event $event) { 39*6a458d92SdWiGhT global $ID; 40*6a458d92SdWiGhT $data = p_get_metadata($ID, 'pagecss'); 41*6a458d92SdWiGhT $styles = $data['styles'] ?? ''; 42*6a458d92SdWiGhT 43*6a458d92SdWiGhT if ($styles && is_string($styles)) { 44*6a458d92SdWiGhT $event->data['style'][] = [ 45*6a458d92SdWiGhT 'type' => 'text/css', 46*6a458d92SdWiGhT 'media' => 'screen', 47*6a458d92SdWiGhT '_data' => $styles, 48*6a458d92SdWiGhT ]; 49*6a458d92SdWiGhT } 50*6a458d92SdWiGhT } 51*6a458d92SdWiGhT} 52