1<?php
2
3/**
4 * SVG PHP Helper
5 *
6 * Based on https://github.com/chteuchteu/MaterialDesignIcons-PHP
7 *
8 * @author  Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com>
9 * @license MIT, GPLv2
10 */
11
12namespace dokuwiki\template\bootstrap3;
13
14class SVG
15{
16
17    public static $iconsPath;
18
19    public static $defaultAttributes = array();
20
21    /**
22     * Add icon
23     *
24     * @param string $icon  Icon name or full path
25     * @param string $class Icon Class
26     * @param int    $size  Icon size
27     * @param array  $attrs Icon attributes
28     *
29     * @return string
30     */
31    public static function icon($icon, $class = null, $size = 24, $attrs = array())
32    {
33        // Find the icon, ensure it exists
34        if (file_exists($icon)) {
35            $file_path = $icon;
36        } else {
37            $file_path = self::$iconsPath . $icon . '.svg';
38        }
39
40        if (!is_file($file_path)) {
41            msg(sprintf('Unrecognized icon "%s" (svg file "%s" does not exist).', $icon, $file_path), -1);
42            return false;
43        }
44
45        // Read the file
46        $svg = file_get_contents($file_path);
47
48        // Only keep the <path d="..." /> part
49        // Old REGEX: (<path d=".+" \/>)
50        if (preg_match('/((<path\b([\s\S]*?)\/>)|(<path\b([\s\S]*?)><\/path>))/', $svg, $matches) !== 1) {
51            msg(sprintf('"%s" could not be recognized as an icon file', $file_path), -1);
52            return false;
53        }
54
55        $svg = $matches[1];
56
57        // Add some (clean) attributes
58        $attributes = array_merge(
59            array(
60                'viewBox' => '0 0 24 24',
61                'xmlns'   => 'http://www.w3.org/2000/svg',
62                'width'   => $size,
63                'height'  => $size,
64                'role'    => 'presentation',
65            ),
66            self::$defaultAttributes,
67            $attrs
68        );
69
70        if ($class !== null) {
71            $attributes['class'] = $class;
72        }
73
74        // Remove possibly empty-ish attributes (self::$defaultAttributes or $attrs may contain null values)
75        $attributes = array_filter($attributes);
76
77        return sprintf(
78            '<svg %s>%s</svg>',
79            self::attributes($attributes),
80            $svg
81        );
82    }
83
84    /**
85     * Turns a 1-dimension array into an HTML-ready attributes set.
86     */
87    private static function attributes($attrs = array())
88    {
89        return implode(' ', array_map(
90            function ($val, $key) {
91                return $key . '="' . htmlspecialchars($val) . '"';
92            },
93            $attrs,
94            array_keys($attrs)
95        ));
96    }
97}
98