mathiasreker / php-svg-optimizer
php-svg-optimizer 是一个PHP库,通过应用各种转换和清理操作来优化SVG文件。
Requires
- php: >=8.2
- ext-dom: *
- ext-libxml: *
Requires (Dev)
- ergebnis/composer-normalize: ^2.43
- ergebnis/phpstan-rules: ^2.2
- friendsofphp/php-cs-fixer: ^3.64
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12
- phpstan/phpstan-strict-rules: ^1.6
- phpunit/phpunit: ^11.3
- povils/phpmnd: ^3.5
- rector/rector: ^1.2
- shipmonk/phpstan-rules: ^3.2
- squizlabs/php_codesniffer: ^3.10
- symplify/phpstan-rules: ^13.0
- tomasvotruba/cognitive-complexity: ^0.2
README
php-svg-optimizer
是一个PHP库,通过应用各种转换和清理操作来优化SVG文件。
版本和依赖关系
要求
ext-dom
:处理XML所需的PHP扩展。ext-libxml
:处理XML错误所需的PHP扩展。
安装
要安装库,请运行
composer require mathiasreker/php-svg-optimizer
为确保库使用时的健壮性,处理异常至关重要,因为无效或格式错误的SVG文件可能导致运行时错误。捕获这些异常将允许您优雅地处理潜在问题,并防止您的应用程序崩溃。
指定规则的示例
<?php declare(strict_types=1); require_once __DIR__ . '/vendor/autoload.php'; use MathiasReker\PhpSvgOptimizer\Services\SvgOptimizerService; try { $svgOptimizer = SvgOptimizerService::fromFile('path/to/source.svg') ->withRules( removeTitleAndDesc: false, removeComments: true, removeUnnecessaryWhitespace: true, removeDefaultAttributes: false, removeMetadata: true, flattenGroups: true, convertColorsToHex: true, minifySvgCoordinates: true, minifyTransformations: false, ) ->optimize() ->saveToFile('path/to/output.svg'); } catch (\Exception $exception) { echo $exception->getMessage(); }
使用默认规则从文件解析并保存到文件的示例
<?php declare(strict_types=1); require_once __DIR__ . '/vendor/autoload.php'; use MathiasReker\PhpSvgOptimizer\Services\SvgOptimizerService; try { $svgOptimizer = SvgOptimizerService::fromFile('path/to/source.svg') ->optimize() ->saveToFile('path/to/output.svg'); $metaData = $svgOptimizer->getMetaData(); echo sprintf('Optimized size: %d bytes%s', $metaData->getOptimizedSize(), \PHP_EOL); echo sprintf('Original size: %d bytes%s', $metaData->getOriginalSize(), \PHP_EOL); echo sprintf('Size reduction: %d bytes%s', $metaData->getSavedBytes(), \PHP_EOL); echo sprintf('Reduction percentage: %s %%%s', $metaData->getSavedPercentage(), \PHP_EOL); } catch (\Exception $exception) { echo $exception->getMessage(); }
使用默认规则从文件解析并返回内容的示例
<?php declare(strict_types=1); require_once __DIR__ . '/vendor/autoload.php'; use MathiasReker\PhpSvgOptimizer\Services\Providers\FileProvider; use MathiasReker\PhpSvgOptimizer\Services\SvgOptimizerService; try { $svgOptimizer = SvgOptimizerService::fromFile('path/to/source.svg') ->optimize(); echo sprintf('Get content: ', $svgOptimizer->getContent(), \PHP_EOL); $metaData = $svgOptimizer->getMetaData(); echo sprintf('Optimized size: %d bytes%s', $metaData->getOptimizedSize(), \PHP_EOL); echo sprintf('Original size: %d bytes%s', $metaData->getOriginalSize(), \PHP_EOL); echo sprintf('Size reduction: %d bytes%s', $metaData->getSavedBytes(), \PHP_EOL); echo sprintf('Reduction percentage: %s %%%s', $metaData->getSavedPercentage(), \PHP_EOL); } catch (\Exception $exception) { echo $exception->getMessage(); }
使用默认规则从字符串解析并返回内容的示例
<?php declare(strict_types=1); require_once __DIR__ . '/vendor/autoload.php'; use MathiasReker\PhpSvgOptimizer\Services\Providers\StringProvider; use MathiasReker\PhpSvgOptimizer\Services\SvgOptimizerService; try { $svgOptimizer = SvgOptimizerService::fromString('<svg>...</svg>') ->optimize(); echo sprintf('Content: ', $svgOptimizer->getContent(), \PHP_EOL); $metaData = $svgOptimizer->getMetaData(); echo sprintf('Optimized size: %d bytes%s', $metaData->getOptimizedSize(), \PHP_EOL); echo sprintf('Original size: %d bytes%s', $metaData->getOriginalSize(), \PHP_EOL); echo sprintf('Size reduction: %d bytes%s', $metaData->getSavedBytes(), \PHP_EOL); echo sprintf('Reduction percentage: %s %%%s', $metaData->getSavedPercentage(), \PHP_EOL); } catch (\Exception $exception) { echo $exception->getMessage(); }
使用默认规则从目录解析并优化所有SVG文件(覆盖原始文件)的示例
<?php declare(strict_types=1); require_once __DIR__ . '/vendor/autoload.php'; use MathiasReker\PhpSvgOptimizer\Services\Providers\FileProvider; use MathiasReker\PhpSvgOptimizer\Services\SvgOptimizerService; $totalOriginalSize = 0; $totalOptimizedSize = 0; $optimizedFiles = 0; $optimizeSvg = function (string $filePath) use (&$totalOriginalSize, &$totalOptimizedSize, &$optimizedFiles): void { try { $svgOptimizer = SvgOptimizerService::fromFile($filePath) ->optimize() ->saveToFile($filePath); $metaData = $svgOptimizer->getMetaData(); $totalOriginalSize += $metaData->getOriginalSize(); $totalOptimizedSize += $metaData->getOptimizedSize(); ++$optimizedFiles; } catch (\Exception) { // Skip the file if an exception occurs } }; $directoryPath = 'path/to/directory'; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($directoryPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($iterator as $fileInfo) { if ($fileInfo->isFile() && 'svg' === $fileInfo->getExtension()) { $optimizeSvg($fileInfo->getPathname()); } } $reduction = $totalOriginalSize - $totalOptimizedSize; $reductionPercentage = $totalOriginalSize > 0 ? ($reduction / $totalOriginalSize) * 100 : 0; echo sprintf('Files optimized: %d%s', $optimizedFiles, \PHP_EOL); echo sprintf('Total size reduction: %d bytes%s', $reduction, \PHP_EOL); echo sprintf('Total reduction percentage: %s %%%s', number_format($reductionPercentage, 2), \PHP_EOL);
文档
静态工厂方法,从文件路径创建 SvgOptimizerService
。
$svgOptimizer = SvgOptimizerService::fromFile('path/to/source.svg');
静态工厂方法,从字符串创建 SvgOptimizerService
。
$svgOptimizer = SvgOptimizerService::fromString('<svg>...</svg>');
withRules
方法
配置要应用的SVG优化规则。该方法接受布尔参数,用于确定是否启用或禁用特定规则。
参数
从SVG中移除 <title>
和 <desc>
标签
$svgOptimizer->withRules(removeTitleAndDesc: true);
从SVG中移除所有注释
$svgOptimizer->withRules(removeComments: true);
清理SVG中的不必要的空白
$svgOptimizer->withRules(removeUnnecessaryWhitespace: true);
移除与常见默认值匹配的默认属性值
$svgOptimizer->withRules(removeDefaultAttributes: true);
从SVG中移除 <metadata>
标签
$svgOptimizer->withRules(removeMetadata: true);
扁平化嵌套的 <g>
元素,将它们的子元素移动到父节点
$svgOptimizer->withRules(flattenGroups: true);
将 rgb()
颜色值转换为十六进制格式
$svgOptimizer->withRules(convertColorsToHex: true);
通过删除不必要的精度来最小化坐标值
$svgOptimizer->withRules(minifySvgCoordinates: true);
通过删除冗余值来最小化变换属性
$svgOptimizer->withRules(minifyTransformations: true);
所有选项默认设置为true。您可以通过传递所需值来单独配置它们
$svgOptimizer->withRules( removeTitleAndDesc: false, removeComments: true, removeUnnecessaryWhitespace: true, removeDefaultAttributes: false, removeMetadata: true, flattenGroups: true, convertColorsToHex: true, minifySvgCoordinates: true, minifyTransformations: false, );
optimize
方法
最终确定优化过程并生成优化后的SVG文件。
$svgOptimizer->optimize();
saveToFile
方法
将优化后的SVG文件保存到指定的路径。
$svgOptimizer->saveToFile('path/to/output.svg');
getContent
方法
返回优化后的SVG内容。
$svgOptimizer->getContent();
getOptimizedSize
方法
返回优化后SVG文件的大小。
$svgOptimizer->getMetaData()->getOptimizedSize();
getOriginalSize
方法
返回原始SVG文件的大小。
$svgOptimizer->getMetaData()->getOriginalSize();
getSavedBytes
方法
返回优化过程中节省的字节数。
$svgOptimizer->getMetaData()->getSavedBytes();
getSavedPercentage
方法
返回优化过程中节省的百分比。
$svgOptimizer->getMetaData()->getSavedPercentage();
路线图
有关建议功能和已知问题的完整列表,请参阅 公开问题。
贡献
我们欢迎所有贡献!如果您有任何改进建议,请随意克隆存储库并提交拉取请求。您也可以创建一个问题并使用“增强”标签。如果您发现这个项目很有帮助,请不要忘记给它加星!
库结构和贡献指南
该库实现了策略模式,其中策略封装为位于 /src/Services/Rules
目录的“规则”。
添加新规则
-
创建规则:在
/src/Services/Rules
目录中添加一个实现SvgOptimizerRuleInterface
的新类。 -
编写测试:确保您的新的规则经过彻底测试,在
/tests/Services/Rules
中创建相应的测试用例。 -
集成规则:将您的新规则添加到
/src/Services/SvgOptimizerService.php
中的构建器。 -
更新文档:最后,更新
README.md
以反映新规则及其目的的添加。
按照这些步骤操作,您将确保您的贡献能够很好地集成到项目中。
Docker
要使用Docker使用该项目,可以使用以下命令启动容器:
docker-compose up -d
然后,访问容器
docker exec -it php-svg-optimizer bash
工具
PHP编码标准修复器
composer cs-fix
PHP编码标准检查器
composer cs-check
PHP Stan (级别9)
composer phpstan
单元测试
composer test
魔法数字检测器
composer magic-number-detector
运行所有格式化工具
composer format
许可协议
该项目采用MIT许可协议。有关更多信息,请参阅LICENSE文件。