diff --git a/spec/PUGX/Poser/Render/SvgFlatSquareRenderSpec.php b/spec/PUGX/Poser/Render/SvgFlatSquareRenderSpec.php new file mode 100644 index 0000000..d16b007 --- /dev/null +++ b/spec/PUGX/Poser/Render/SvgFlatSquareRenderSpec.php @@ -0,0 +1,69 @@ +calculateWidth(Argument::any())->willReturn(20); + $this->beConstructedWith($calculator); + } + + function it_should_render_a_svg() + { + $badge = Badge::fromURI('version-stable-97CA00.svg'); + $this->render($badge)->shouldBeAValidSVGImage(); + } + + public function getMatchers() + { + return array( + 'beAValidSVGImage' => function($subject) { + + $regex = '/^$/'; + $matches = array(); + + return preg_match($regex, (string) $subject, $matches, PREG_OFFSET_CAPTURE, 0); + } + ); + } + + function it_should_render_a_license_mit_exactly_like_this_svg() + { + $template = << + + + + + + + + + + + + + + license + license + MIT + MIT + + +EOF; + + $badge = Badge::fromURI('license-MIT-blue.svg'); + $this->render($badge)->__toString()->shouldBeLike($template); + } + + +} diff --git a/src/Render/SvgFlatSquareRender.php b/src/Render/SvgFlatSquareRender.php new file mode 100644 index 0000000..902c09f --- /dev/null +++ b/src/Render/SvgFlatSquareRender.php @@ -0,0 +1,162 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PUGX\Poser\Render; + +use PUGX\Poser\Badge; +use PUGX\Poser\Calculator\TextSizeCalculatorInterface; +use PUGX\Poser\Calculator\GDTextSizeCalculator; +use PUGX\Poser\Image; +/** + * Class SvgFlatGenerator + * + * @author Giulio De Donato + */ +class SvgFlatSquareRender implements RenderInterface +{ + const VENDOR_COLOR = '#555'; + private $textSizeCalculator; +/* + private static $template = << + + + + + + + + + + + + + + {{ vendor }} + {{ vendor }} + {{ value }} + {{ value }} + + +EOF; + + +quasi ok +รน private static $template = << + + + + + + + + + + + + + + + + + {{ vendor }} + {{ vendor }} + {{ value }} + {{ value }} + + +EOF; +*/ + +private static $template = << + + + + + + + + + + + + + + {{ vendor }} + {{ vendor }} + {{ value }} + {{ value }} + + +EOF; + + /** + * Constructor. + * + * @param TextSizeCalculatorInterface $textSizeCalculator + */ + public function __construct(TextSizeCalculatorInterface $textSizeCalculator = null) + { + $this->textSizeCalculator = $textSizeCalculator; + + if (null === $this->textSizeCalculator) { + $this->textSizeCalculator = new GDTextSizeCalculator(); + } + } + + /** + * @param Badge $badge + * + * @return mixed + */ + public function render(Badge $badge) + { + $parameters = array(); + + $parameters['vendorWidth'] = $this->stringWidth($badge->getSubject()); + $parameters['valueWidth'] = $this->stringWidth($badge->getStatus()); + $parameters['totalWidth'] = $parameters['valueWidth'] + $parameters['vendorWidth']; + $parameters['vendorColor'] = self::VENDOR_COLOR; + $parameters['valueColor'] = $badge->getHexColor(); + $parameters['vendor'] = $badge->getSubject(); + $parameters['value'] = $badge->getStatus(); + $parameters['vendorStartPosition'] = round($parameters['vendorWidth'] / 2, 1) + 1; + $parameters['valueStartPosition'] = $parameters['vendorWidth'] + round($parameters['valueWidth'] / 2, 1) - 1; + + return $this->renderSvg(self::$template, $parameters, $badge->getFormat()); + } + + /** + * A list of all supported formats. + * + * @return array + */ + public function supportedFormats() + { + return array('flat-square'); + } + + private function stringWidth($text) + { + return $this->textSizeCalculator->calculateWidth($text); + } + + private function renderSvg($render, $parameters, $format) + { + foreach ($parameters as $key => $variable) { + $render = str_replace(sprintf('{{ %s }}', $key), $variable, $render); + } + + return Image::createFromString($render, $format); + } +} diff --git a/src/UI/Command.php b/src/UI/Command.php index be66dd6..ee1705b 100644 --- a/src/UI/Command.php +++ b/src/UI/Command.php @@ -3,6 +3,7 @@ namespace PUGX\Poser\UI; use PUGX\Poser\Render\SvgFlatRender; +use PUGX\Poser\Render\SvgFlatSquareRender; use Symfony\Component\Console\Command\Command as BaseCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -27,7 +28,11 @@ class Command extends BaseCommand private function init() { - $this->poser = new Poser(array(new SvgRender(), new SvgFlatRender())); + $this->poser = new Poser(array( + new SvgRender(), + new SvgFlatRender(), + new SvgFlatSquareRender() + )); $this->format = 'flat'; $this->header = self::HEADER; }