xref: /plugin/pagecss/action.php (revision 6a458d926978e44b3364ae61e8e8373d66dd839f)
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