Skip to content

Commit fffdde7

Browse files
committed
[TASK] Add Formatter interface for xml
1 parent be8d4d4 commit fffdde7

File tree

5 files changed

+58
-6
lines changed

5 files changed

+58
-6
lines changed

packages/fractor-xml/config/application.php

+5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
declare(strict_types=1);
44

5+
use a9f\FractorXml\Contract\Formatter;
56
use a9f\FractorXml\Contract\XmlFractor;
7+
use a9f\FractorXml\PrettyXmlFormatter;
68
use a9f\FractorXml\XmlFileProcessor;
79
use Symfony\Component\DependencyInjection\ContainerBuilder;
810
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
@@ -19,5 +21,8 @@
1921
$services->set(XmlFileProcessor::class)
2022
->arg('$rules', tagged_iterator('fractor.xml_rule'));
2123

24+
$services->set(\PrettyXml\Formatter::class);
25+
$services->alias(Formatter::class, PrettyXmlFormatter::class);
26+
2227
$containerBuilder->registerForAutoconfiguration(XmlFractor::class)->addTag('fractor.xml_rule');
2328
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorXml\Contract;
6+
7+
use a9f\Fractor\ValueObject\Indent;
8+
9+
interface Formatter
10+
{
11+
public function format(Indent $indent, string $content): string;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorXml;
6+
7+
use a9f\Fractor\ValueObject\Indent;
8+
use a9f\FractorXml\Contract\Formatter;
9+
10+
final readonly class PrettyXmlFormatter implements Formatter
11+
{
12+
public function __construct(
13+
private \PrettyXml\Formatter $prettyXmlFormatter
14+
) {
15+
}
16+
17+
public function format(Indent $indent, string $content): string
18+
{
19+
$indentCharacter = $indent->isSpace() ? Indent::CHARACTERS[Indent::STYLE_SPACE] : Indent::CHARACTERS[Indent::STYLE_TAB];
20+
$this->prettyXmlFormatter->setIndentCharacter($indentCharacter);
21+
$this->prettyXmlFormatter->setIndentSize($indent->length());
22+
23+
return $this->prettyXmlFormatter->format($content);
24+
}
25+
}

packages/fractor-xml/src/XmlFileProcessor.php

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
use a9f\Fractor\Application\Contract\FileProcessor;
88
use a9f\Fractor\Application\ValueObject\File;
99
use a9f\Fractor\Exception\ShouldNotHappenException;
10+
use a9f\Fractor\ValueObject\Indent;
11+
use a9f\FractorXml\Contract\Formatter;
1012
use a9f\FractorXml\Contract\XmlFractor;
1113
use a9f\FractorXml\ValueObjectFactory\DomDocumentFactory;
12-
use PrettyXml\Formatter as PrettyXMLFormatter;
1314

1415
/**
1516
* @implements FileProcessor<XmlFractor>
@@ -21,7 +22,7 @@
2122
*/
2223
public function __construct(
2324
private DomDocumentFactory $domDocumentFactory,
24-
private PrettyXMLFormatter $formatter,
25+
private Formatter $formatter,
2526
private iterable $rules
2627
) {
2728
}
@@ -44,8 +45,9 @@ public function handle(File $file, iterable $appliedRules): void
4445
$iterator->traverseDocument($file, $document);
4546

4647
$newXml = $this->saveXml($document);
48+
4749
// TODO make the indentation configurable in fractor config
48-
$newXml = $this->formatter->format($newXml);
50+
$newXml = $this->formatter->format(Indent::fromSizeAndStyle(4, Indent::STYLE_SPACE), $newXml);
4951

5052
if ($newXml === $originalXml) {
5153
return;

packages/fractor/src/ValueObject/Indent.php

+11-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,19 @@
1212
*/
1313
final readonly class Indent
1414
{
15+
public const STYLE_SPACE = 'space';
16+
17+
public const STYLE_TAB = 'tab';
18+
1519
/**
1620
* @var array<string, string>
1721
*/
1822
public const CHARACTERS = [
19-
'space' => ' ',
20-
'tab' => "\t",
23+
self::STYLE_SPACE => ' ',
24+
self::STYLE_TAB => "\t",
2125
];
2226

27+
2328
private function __construct(
2429
private string $value
2530
) {
@@ -49,7 +54,10 @@ public function length(): int
4954
return strlen($this->value);
5055
}
5156

52-
private static function fromSizeAndStyle(int $size, string $style): self
57+
/**
58+
* @phpstan-param self::STYLE_* $style
59+
*/
60+
public static function fromSizeAndStyle(int $size, string $style): self
5361
{
5462
Assert::greaterThanEq($size, 1);
5563
Assert::keyExists(self::CHARACTERS, $style);

0 commit comments

Comments
 (0)