diff --git a/README.md b/README.md
index 0f828c4..42dfa15 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,11 @@ Flush an image
poser license MIT blue
```
+Choose a different style
+```bash
+poser license MIT blue -s "for-the-badge"
+```
+
## Usage as library
#### 1. Add to composer dependencies
@@ -65,7 +70,7 @@ $image = $poser->generate('license', 'MIT', '428F7E', 'plastic');
echo $image->getStyle();
```
-The allowed styles are: `plastic`, `flat` and `flat-square`.
+The allowed styles are: `plastic`, `flat`, `flat-square`, and `for-the-badge`.
## Encoding
diff --git a/composer.json b/composer.json
index e7960c9..341e20d 100644
--- a/composer.json
+++ b/composer.json
@@ -29,12 +29,17 @@
{
"type": "vcs",
"url": "https://github.com/JellyBellyDev/phpspec-data-provider-extension"
+ },
+ {
+ "type": "vcs",
+ "url": "https://github.com/ricardoboss/easysvg"
}
],
"require": {
"php": ">=7.4",
"ext-gd": "*",
"ext-simplexml": "*",
+ "kartsims/easysvg": "^2.0",
"symfony/console": "^4.0|^5.0|^6.0"
},
"require-dev": {
@@ -47,7 +52,10 @@
},
"config": {
"bin-dir": "bin",
- "sort-packages": true
+ "sort-packages": true,
+ "allow-plugins": {
+ "composer/package-versions-deprecated": true
+ }
},
"bin": ["bin/poser"],
"scripts": {
diff --git a/src/Calculator/Font/Verdana-Bold.svg b/src/Calculator/Font/Verdana-Bold.svg
new file mode 100644
index 0000000..0f812cf
--- /dev/null
+++ b/src/Calculator/Font/Verdana-Bold.svg
@@ -0,0 +1,2209 @@
+
+
+
diff --git a/src/Calculator/Font/Verdana.svg b/src/Calculator/Font/Verdana.svg
new file mode 100644
index 0000000..9f0f2d4
--- /dev/null
+++ b/src/Calculator/Font/Verdana.svg
@@ -0,0 +1,22495 @@
+
+
+
diff --git a/src/Render/LocalSvgRenderer.php b/src/Render/LocalSvgRenderer.php
index 94c5391..d4e94aa 100644
--- a/src/Render/LocalSvgRenderer.php
+++ b/src/Render/LocalSvgRenderer.php
@@ -27,21 +27,13 @@ abstract class LocalSvgRenderer implements RenderInterface
{
public const VENDOR_COLOR = '#555';
- private ?TextSizeCalculatorInterface $textSizeCalculator = null;
-
- private ?string $templatesDirectory = null;
+ private TextSizeCalculatorInterface $textSizeCalculator;
+ private string $templatesDirectory;
public function __construct(?TextSizeCalculatorInterface $textSizeCalculator = null, ?string $templatesDirectory = null)
{
- $this->textSizeCalculator = $textSizeCalculator;
- if (null === $this->textSizeCalculator) {
- $this->textSizeCalculator = new GDTextSizeCalculator();
- }
-
- $this->templatesDirectory = $templatesDirectory;
- if (null === $this->templatesDirectory) {
- $this->templatesDirectory = __DIR__ . '/../Resources/templates';
- }
+ $this->textSizeCalculator = $textSizeCalculator ?? new GDTextSizeCalculator();
+ $this->templatesDirectory = $templatesDirectory ?? (__DIR__ . '/../Resources/templates');
}
public function render(Badge $badge): Image
@@ -99,7 +91,7 @@ private function renderSvg(string $render, array $parameters, string $style): Im
return Image::createFromString($render, $style);
}
- private function buildParameters(Badge $badge): array
+ protected function buildParameters(Badge $badge): array
{
$parameters = [];
diff --git a/src/Render/SvgForTheBadgeRenderer.php b/src/Render/SvgForTheBadgeRenderer.php
new file mode 100644
index 0000000..1f63998
--- /dev/null
+++ b/src/Render/SvgForTheBadgeRenderer.php
@@ -0,0 +1,78 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PUGX\Poser\Render;
+
+use EasySVG;
+use PUGX\Poser\Badge;
+use PUGX\Poser\Calculator\TextSizeCalculatorInterface;
+
+class SvgForTheBadgeRenderer extends LocalSvgRenderer
+{
+ public const VENDOR_TEXT_FONT = __DIR__ . '/../Calculator/Font/Verdana.svg';
+ public const VALUE_TEXT_FONT = __DIR__ . '/../Calculator/Font/Verdana-Bold.svg';
+ public const TEXT_FONT_SIZE = 10;
+ public const TEXT_FONT_COLOR = '#FFFFFF';
+ public const TEXT_LETTER_SPACING = 0.1;
+ public const PADDING_X = 10;
+
+ private EasySVG $easy;
+
+ public function __construct(
+ ?EasySVG $easySVG = null,
+ ?TextSizeCalculatorInterface $textSizeCalculator = null,
+ ?string $templatesDirectory = null
+ ) {
+ parent::__construct($textSizeCalculator, $templatesDirectory);
+
+ if (null === $easySVG) {
+ $easySVG = new EasySVG();
+ }
+
+ $this->easy = $easySVG;
+ }
+
+ public function getBadgeStyle(): string
+ {
+ return 'for-the-badge';
+ }
+
+ protected function getTemplateName(): string
+ {
+ return $this->getBadgeStyle();
+ }
+
+ protected function buildParameters(Badge $badge): array
+ {
+ $parameters = parent::buildParameters($badge);
+
+ $parameters['vendor'] = \mb_strtoupper($parameters['vendor']);
+ $parameters['value'] = \mb_strtoupper($parameters['value']);
+
+ $this->easy->clearSVG();
+ $this->easy->setLetterSpacing(self::TEXT_LETTER_SPACING);
+ $this->easy->setFont(self::VENDOR_TEXT_FONT, self::TEXT_FONT_SIZE, self::TEXT_FONT_COLOR);
+ $vendorDimensions = $this->easy->textDimensions($parameters['vendor']);
+ $parameters['vendorWidth'] = $vendorDimensions[0] + 2 * self::PADDING_X;
+ $parameters['vendorStartPosition'] = \round($parameters['vendorWidth'] / 2, 1) + 1;
+
+ $this->easy->clearSVG();
+ $this->easy->setLetterSpacing(self::TEXT_LETTER_SPACING);
+ $this->easy->setFont(self::VALUE_TEXT_FONT, self::TEXT_FONT_SIZE, self::TEXT_FONT_COLOR);
+ $valueDimensions = $this->easy->textDimensions($parameters['value']);
+ $parameters['valueWidth'] = $valueDimensions[0] + 2 * self::PADDING_X;
+ $parameters['valueStartPosition'] = $parameters['vendorWidth'] + \round($parameters['valueWidth'] / 2, 1) - 1;
+
+ $parameters['totalWidth'] = $parameters['valueWidth'] + $parameters['vendorWidth'];
+
+ return $parameters;
+ }
+}
diff --git a/src/Resources/templates/for-the-badge.svg b/src/Resources/templates/for-the-badge.svg
new file mode 100644
index 0000000..e334c7f
--- /dev/null
+++ b/src/Resources/templates/for-the-badge.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/UI/Command.php b/src/UI/Command.php
index 0c093b9..568dc99 100644
--- a/src/UI/Command.php
+++ b/src/UI/Command.php
@@ -6,6 +6,7 @@
use PUGX\Poser\Poser;
use PUGX\Poser\Render\SvgFlatRender;
use PUGX\Poser\Render\SvgFlatSquareRender;
+use PUGX\Poser\Render\SvgForTheBadgeRenderer;
use PUGX\Poser\Render\SvgPlasticRender;
use PUGX\Poser\ValueObject\InputRequest;
use Symfony\Component\Console\Command\Command as BaseCommand;
@@ -36,6 +37,7 @@ public function __construct(string $name = null)
new SvgPlasticRender(),
new SvgFlatRender(),
new SvgFlatSquareRender(),
+ new SvgForTheBadgeRenderer(),
]);
$this->header = self::HEADER;
}
@@ -46,6 +48,7 @@ private function init(): void
new SvgPlasticRender(),
new SvgFlatRender(),
new SvgFlatSquareRender(),
+ new SvgForTheBadgeRenderer(),
]);
$this->header = self::HEADER;
}