mirror of
https://github.com/twigphp/Twig.git
synced 2026-10-23 20:25:37 +00:00
ac423430aa
* 3.x: Fix CS Move functions for CoreExtension Move functions for EscaperExtension Move functions for StringLoaderExtension Move functions for DebugExtension Move functions for MarkdownExtension Move functions for InkyExtension Move functions for CssInlinerExtension Move functions for HtmlExtension Deprecate internal extension functions in favor of methods on the extension classes Tweak deprecated docs
114 lines
3.0 KiB
PHP
114 lines
3.0 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Twig.
|
|
*
|
|
* (c) Fabien Potencier
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Twig\Extra\Html;
|
|
|
|
use Symfony\Component\Mime\MimeTypes;
|
|
use Twig\Error\RuntimeError;
|
|
use Twig\Extension\AbstractExtension;
|
|
use Twig\TwigFilter;
|
|
use Twig\TwigFunction;
|
|
|
|
final class HtmlExtension extends AbstractExtension
|
|
{
|
|
private $mimeTypes;
|
|
|
|
public function __construct(MimeTypes $mimeTypes = null)
|
|
{
|
|
$this->mimeTypes = $mimeTypes;
|
|
}
|
|
|
|
public function getFilters(): array
|
|
{
|
|
return [
|
|
new TwigFilter('data_uri', [$this, 'dataUri']),
|
|
];
|
|
}
|
|
|
|
public function getFunctions(): array
|
|
{
|
|
return [
|
|
new TwigFunction('html_classes', [self::class, 'htmlClasses']),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Creates a data URI (RFC 2397).
|
|
*
|
|
* Length validation is not performed on purpose, validation should
|
|
* be done before calling this filter.
|
|
*
|
|
* @return string The generated data URI
|
|
*
|
|
* @internal
|
|
*/
|
|
public function dataUri(string $data, string $mime = null, array $parameters = []): string
|
|
{
|
|
$repr = 'data:';
|
|
|
|
if (null === $mime) {
|
|
if (null === $this->mimeTypes) {
|
|
$this->mimeTypes = new MimeTypes();
|
|
}
|
|
|
|
$tmp = tempnam(sys_get_temp_dir(), 'mime');
|
|
file_put_contents($tmp, $data);
|
|
try {
|
|
if (null === $mime = $this->mimeTypes->guessMimeType($tmp)) {
|
|
$mime = 'text/plain';
|
|
}
|
|
} finally {
|
|
@unlink($tmp);
|
|
}
|
|
}
|
|
$repr .= $mime;
|
|
|
|
foreach ($parameters as $key => $value) {
|
|
$repr .= ';'.$key.'='.rawurlencode($value);
|
|
}
|
|
|
|
if (str_starts_with($mime, 'text/')) {
|
|
$repr .= ','.rawurlencode($data);
|
|
} else {
|
|
$repr .= ';base64,'.base64_encode($data);
|
|
}
|
|
|
|
return $repr;
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
public static function htmlClasses(...$args): string
|
|
{
|
|
$classes = [];
|
|
foreach ($args as $i => $arg) {
|
|
if (\is_string($arg)) {
|
|
$classes[] = $arg;
|
|
} elseif (\is_array($arg)) {
|
|
foreach ($arg as $class => $condition) {
|
|
if (!\is_string($class)) {
|
|
throw new RuntimeError(sprintf('The html_classes function argument %d (key %d) should be a string, got "%s".', $i, $class, \gettype($class)));
|
|
}
|
|
if (!$condition) {
|
|
continue;
|
|
}
|
|
$classes[] = $class;
|
|
}
|
|
} else {
|
|
throw new RuntimeError(sprintf('The html_classes function argument %d should be either a string or an array, got "%s".', $i, \gettype($arg)));
|
|
}
|
|
}
|
|
|
|
return implode(' ', array_unique($classes));
|
|
}
|
|
}
|