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