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