Skip to content

Commit da847f8

Browse files
committed
Add first version of transformers sequence
1 parent e897e77 commit da847f8

7 files changed

+105
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace AmpProject\Optimizer\Exception;
4+
5+
use DomainException;
6+
7+
/**
8+
* Exception thrown when an invalid transformer sequence is provided
9+
* or missed transformer which required by another transformer.
10+
*
11+
* @package ampproject/amp-toolbox
12+
*/
13+
final class InvalidTransformersSequence extends DomainException implements AmpOptimizerException
14+
{
15+
16+
/**
17+
* @param string $transformerClass
18+
* @param array $missingTags
19+
* @return \AmpProject\Optimizer\Exception\InvalidTransformersSequence
20+
*/
21+
public static function forTransformer($transformerClass, array $missingTags)
22+
{
23+
$tagList = implode(',', $missingTags);
24+
$message = "Transformer '{$transformerClass}' must be after transformers that provide '{$tagList}' tags.";
25+
26+
return new self($message);
27+
}
28+
}

src/Optimizer/TransformationEngine.php

+2
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ private function initializeTransformers()
8888
{
8989
$this->transformers = [];
9090

91+
TransformersSequenceValidator::validate($this->configuration->get(Configuration::KEY_TRANSFORMERS));
92+
9193
foreach ($this->configuration->get(Configuration::KEY_TRANSFORMERS) as $transformerClass) {
9294
$this->transformers[$transformerClass] = new $transformerClass(
9395
...$this->getTransformerDependencies($transformerClass)

src/Optimizer/Transformer/PreloadHeroImage.php

+9-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use AmpProject\Optimizer\ImageDimensions;
1818
use AmpProject\Optimizer\Transformer;
1919
use AmpProject\Optimizer\TransformerConfiguration;
20+
use AmpProject\Optimizer\TransformerProvides;
2021
use AmpProject\RequestDestination;
2122
use AmpProject\Tag;
2223
use AmpProject\Url;
@@ -42,9 +43,11 @@
4243
*
4344
* @package ampproject/amp-toolbox
4445
*/
45-
final class PreloadHeroImage implements Transformer
46+
final class PreloadHeroImage implements Transformer, TransformerProvides
4647
{
4748

49+
const TAG = 'preload_hero_image';
50+
4851
/**
4952
* Class(es) to apply to a serverside-rendered image element.
5053
*
@@ -158,6 +161,11 @@ public function __construct(TransformerConfiguration $configuration)
158161
$this->configuration = $configuration;
159162
}
160163

164+
public static function provides()
165+
{
166+
return [self::TAG];
167+
}
168+
161169
/**
162170
* Apply transformations to the provided DOM document.
163171
*

src/Optimizer/Transformer/ServerSideRendering.php

+9-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use AmpProject\Optimizer\Exception\InvalidArgument;
1818
use AmpProject\Optimizer\Exception\InvalidHtmlAttribute;
1919
use AmpProject\Optimizer\Transformer;
20+
use AmpProject\Optimizer\TransformerRequires;
2021
use AmpProject\Role;
2122
use AmpProject\Tag;
2223
use DOMAttr;
@@ -37,9 +38,11 @@
3738
*
3839
* @package ampproject/amp-toolbox
3940
*/
40-
final class ServerSideRendering implements Transformer
41+
final class ServerSideRendering implements Transformer, TransformerRequires
4142
{
4243

44+
const TAG = 'server_side_rendering';
45+
4346
/**
4447
* List of layouts that support server-side rendering.
4548
*
@@ -94,6 +97,11 @@ final class ServerSideRendering implements Transformer
9497
*/
9598
private $customCss;
9699

100+
public static function requires()
101+
{
102+
return [PreloadHeroImage::TAG];
103+
}
104+
97105
/**
98106
* Apply transformations to the provided DOM document.
99107
*

src/Optimizer/TransformerProvides.php

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace AmpProject\Optimizer;
4+
5+
interface TransformerProvides
6+
{
7+
8+
/**
9+
* Return the collection of dependencies that this transformer provides.
10+
*
11+
* @return string[]
12+
*/
13+
public static function provides();
14+
}

src/Optimizer/TransformerRequires.php

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace AmpProject\Optimizer;
4+
5+
interface TransformerRequires
6+
{
7+
8+
/**
9+
* Return the collection of dependencies that this transformer requires.
10+
*
11+
* @return string[]
12+
*/
13+
public static function requires();
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace AmpProject\Optimizer;
4+
5+
use AmpProject\Optimizer\Exception\InvalidTransformersSequence;
6+
7+
class TransformersSequenceValidator
8+
{
9+
10+
/**
11+
* @param string[] $transformers
12+
*/
13+
public static function validate(array $transformers)
14+
{
15+
$providedTags = [];
16+
foreach (array_values($transformers) as $transformerClass) {
17+
if ($transformerClass instanceof TransformerRequires) {
18+
$missingTags = array_diff($transformerClass::requires(), $providedTags);
19+
if ($missingTags) {
20+
throw InvalidTransformersSequence::forTransformer($transformerClass, $missingTags);
21+
}
22+
}
23+
24+
if ($transformerClass instanceof TransformerProvides) {
25+
$providedTags = array_merge($providedTags, $transformerClass::provides());
26+
}
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)