Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

"assetic/framework": "~3.0",
"doctrine/dbal": "^2.6",
"enshrined/svg-sanitize": "^0.15",
"erusev/parsedown-extra": "~0.7",
"laravel/framework": "^9.1",
"laravel/tinker": "^2.7",
Expand Down
3 changes: 3 additions & 0 deletions src/Foundation/Bootstrap/RegisterWinter.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ public function bootstrap(Application $app): void
$app->singleton('string', function () {
return new \Winter\Storm\Support\Str;
});
$app->singleton('svg', function () {
return new \Winter\Storm\Support\Svg;
});

/*
* Change paths based on config
Expand Down
21 changes: 21 additions & 0 deletions src/Support/Facades/Svg.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php namespace Winter\Storm\Support\Facades;

use Winter\Storm\Support\Facade;

/**
* @method static string extract(string $path, bool $minify = true)
*
* @see \Winter\Storm\Support\Svg
*/
class Svg extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'svg';
}
}
60 changes: 60 additions & 0 deletions src/Support/Svg.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php namespace Winter\Storm\Support;

use Winter\Storm\Exception\ApplicationException;
use enshrined\svgSanitize\Sanitizer;

/**
* A simple wrapper for SVG extraction.
*
* Under the hood, this uses the "svg-sanitizer" library by Daryll Doyle (https://github.com/darylldoyle/svg-sanitizer)
* to sanitize and/or extract the SVG for usage within Winter.
*
* @author Winter CMS
*/
class Svg
{
/**
* Extracts and sanitizes SVG code from a given file.
*
* @param string $path The path to the SVG file.
* @param boolean $minify Whether to minify the extracted SVG code.
* @return string
* @throws ApplicationException If no file, or a malformed SVG, is found at the given path.
*/
public static function extract($path, $minify = true)
{
if (!is_file($path)) {
throw new ApplicationException(sprintf('No SVG file found at path "%s"', $path));
}

$sanitized = static::sanitize(file_get_contents($path), $minify);

if (!$sanitized) {
throw new ApplicationException(sprintf('Malformed SVG encountered at path "%s"', $path));
}

return $sanitized;
}

/**
* Sanitizes SVG code.
*
* See https://github.com/darylldoyle/svg-sanitizer for usage of the underlying sanitization library.
*
* @param string $svg SVG code.
* @param boolean $minify Whether to minify the given SVG code.
* @return string
*/
protected static function sanitize($svg, $minify = true)
{
$sanitizer = new Sanitizer();
$sanitizer->removeRemoteReferences(true);
$sanitizer->removeXMLTag(true);

if ($minify) {
$sanitizer->minify(true);
}

return trim($sanitizer->sanitize($svg));
}
}
22 changes: 22 additions & 0 deletions tests/Support/SvgTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

use Winter\Storm\Support\Svg;

class SvgTest extends TestCase
{
public function testCleanSvg()
{
$svg = Svg::extract(dirname(__DIR__) . '/fixtures/svg/winter.svg');
$fixture = trim(file_get_contents(dirname(__DIR__) . '/fixtures/svg/extracted/winter.svg'));

$this->assertEquals($fixture, $svg);
}

public function testDirtySvg()
{
$svg = Svg::extract(dirname(__DIR__) . '/fixtures/svg/winter-dirty.svg');
$fixture = trim(file_get_contents(dirname(__DIR__) . '/fixtures/svg/extracted/winter-dirty.svg'));

$this->assertEquals($fixture, $svg);
}
}
1 change: 1 addition & 0 deletions tests/fixtures/svg/extracted/winter-dirty.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions tests/fixtures/svg/extracted/winter.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 59 additions & 0 deletions tests/fixtures/svg/winter-dirty.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
56 changes: 56 additions & 0 deletions tests/fixtures/svg/winter.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.