1 <?php
2 
3 use dokuwiki\Extension\SyntaxPlugin;
4 
5 /**
6  * DokuWiki Plugin iconify (Syntax Component)
7  *
8  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
9  * @author Tokano <contact@tokano.fr>
10  */
11 class syntax_plugin_iconify extends SyntaxPlugin
12 {
13     /** @inheritDoc */
14     public function getType()
15     {
16         return 'substition';
17     }
18 
19     /** @inheritDoc */
20     public function getPType()
21     {
22         return 'block';
23     }
24 
25     /** @inheritDoc */
26     public function getSort()
27     {
28         return 999; // Load late
29     }
30 
31     /** @inheritDoc */
32     public function connectTo($mode)
33     {
34         $this->Lexer->addSpecialPattern('<iconify [^>]+>', $mode, 'plugin_iconify');
35     }
36 
37     /** @inheritDoc */
38     public function handle($match, $state, $pos, Doku_Handler $handler)
39     {
40         $params = trim(substr($match, 8, -1));
41 
42         // Parse parameters
43         $parts = preg_split('/\s+/', $params);
44         $icon = $parts[0]; // First part is the icon name
45         $color = null;
46         $size = null;
47 
48         // Check for color and size parameters
49         foreach ($parts as $part) {
50             if (strpos($part, 'color=') === 0) {
51                 $color = substr($part, 6);
52             } elseif (strpos($part, 'size=') === 0) {
53                 $size = substr($part, 5);
54             }
55         }
56 
57         return [
58             "icon" => $icon,
59             "color" => $color,
60             "size" => $size
61         ];
62     }
63 
64     /** @inheritDoc */
65     public function render($mode, Doku_Renderer $renderer, $data)
66     {
67         if ($mode !== 'xhtml') {
68             return false;
69         }
70 
71         $icon = htmlspecialchars($data['icon']);
72         $style = "";
73 
74         // Add default size from configuration if size is not set
75         $defaultSize = $this->getConf('default_size') ?: '24px'; // Default size is 24px
76         $size = $data['size'] ?: $defaultSize;
77 
78         // Generate style for size and color
79         if (!empty($size)) {
80             $style .= "font-size: $size;";
81         }
82         if (!empty($data['color'])) {
83             $color = htmlspecialchars($data['color']);
84             $style .= "color: $color;";
85         }
86 
87         $renderer->doc .= "<span class='iconify' data-icon='$icon' style='$style'></span>";
88 
89         return true;
90     }
91 }
92