98 lines
2.5 KiB
PHP
98 lines
2.5 KiB
PHP
<?php
|
|
|
|
/**
|
|
* SVG PHP Helper
|
|
*
|
|
* Based on https://github.com/chteuchteu/MaterialDesignIcons-PHP
|
|
*
|
|
* @author Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com>
|
|
* @license MIT, GPLv2
|
|
*/
|
|
|
|
namespace dokuwiki\template\bootstrap3;
|
|
|
|
class SVG
|
|
{
|
|
|
|
public static $iconsPath;
|
|
|
|
public static $defaultAttributes = array();
|
|
|
|
/**
|
|
* Add icon
|
|
*
|
|
* @param string $icon Icon name or full path
|
|
* @param string $class Icon Class
|
|
* @param int $size Icon size
|
|
* @param array $attrs Icon attributes
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function icon($icon, $class = null, $size = 24, $attrs = array())
|
|
{
|
|
// Find the icon, ensure it exists
|
|
if (file_exists($icon)) {
|
|
$file_path = $icon;
|
|
} else {
|
|
$file_path = self::$iconsPath . $icon . '.svg';
|
|
}
|
|
|
|
if (!is_file($file_path)) {
|
|
msg(sprintf('Unrecognized icon "%s" (svg file "%s" does not exist).', $icon, $file_path), -1);
|
|
return false;
|
|
}
|
|
|
|
// Read the file
|
|
$svg = file_get_contents($file_path);
|
|
|
|
// Only keep the <path d="..." /> part
|
|
// Old REGEX: (<path d=".+" \/>)
|
|
if (preg_match('/((<path\b([\s\S]*?)\/>)|(<path\b([\s\S]*?)><\/path>))/', $svg, $matches) !== 1) {
|
|
msg(sprintf('"%s" could not be recognized as an icon file', $file_path), -1);
|
|
return false;
|
|
}
|
|
|
|
$svg = $matches[1];
|
|
|
|
// Add some (clean) attributes
|
|
$attributes = array_merge(
|
|
array(
|
|
'viewBox' => '0 0 24 24',
|
|
'xmlns' => 'http://www.w3.org/2000/svg',
|
|
'width' => $size,
|
|
'height' => $size,
|
|
'role' => 'presentation',
|
|
),
|
|
self::$defaultAttributes,
|
|
$attrs
|
|
);
|
|
|
|
if ($class !== null) {
|
|
$attributes['class'] = $class;
|
|
}
|
|
|
|
// Remove possibly empty-ish attributes (self::$defaultAttributes or $attrs may contain null values)
|
|
$attributes = array_filter($attributes);
|
|
|
|
return sprintf(
|
|
'<svg %s>%s</svg>',
|
|
self::attributes($attributes),
|
|
$svg
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Turns a 1-dimension array into an HTML-ready attributes set.
|
|
*/
|
|
private static function attributes($attrs = array())
|
|
{
|
|
return implode(' ', array_map(
|
|
function ($val, $key) {
|
|
return $key . '="' . htmlspecialchars($val) . '"';
|
|
},
|
|
$attrs,
|
|
array_keys($attrs)
|
|
));
|
|
}
|
|
}
|