docs: add url transformer implementation plan #1
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace WPContentSync\Url;
|
||||||
|
|
||||||
|
final class UrlTransformer {
|
||||||
|
public function transformString( string $value, UrlMappingCollection $mappings ): string {
|
||||||
|
$transformed = $value;
|
||||||
|
|
||||||
|
foreach ( $mappings->all() as $mapping ) {
|
||||||
|
$transformed = $this->replaceMapping( $transformed, $mapping );
|
||||||
|
}
|
||||||
|
|
||||||
|
return $transformed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function replaceMapping( string $value, UrlMapping $mapping ): string {
|
||||||
|
$source = $mapping->sourceUrl();
|
||||||
|
$destination = $mapping->destinationUrl();
|
||||||
|
|
||||||
|
$replacements = array(
|
||||||
|
$source => $destination,
|
||||||
|
str_replace( '&', '&', $source ) => str_replace( '&', '&', $destination ),
|
||||||
|
$this->toProtocolRelative( $source ) => $this->toProtocolRelative( $destination ),
|
||||||
|
);
|
||||||
|
|
||||||
|
return strtr( $value, $replacements );
|
||||||
|
}
|
||||||
|
|
||||||
|
private function toProtocolRelative( string $url ): string {
|
||||||
|
return preg_replace( '#^https?:#', '', $url ) ?? $url;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace WPContentSync\Tests\Unit\Url;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use WPContentSync\Url\UrlMapping;
|
||||||
|
use WPContentSync\Url\UrlMappingCollection;
|
||||||
|
use WPContentSync\Url\UrlTransformer;
|
||||||
|
|
||||||
|
class UrlTransformerTest extends TestCase {
|
||||||
|
public function test_it_rewrites_plain_urls(): void {
|
||||||
|
$transformer = new UrlTransformer();
|
||||||
|
$mappings = new UrlMappingCollection(
|
||||||
|
array(
|
||||||
|
new UrlMapping( 'https://example.test', 'https://staging.example.test' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame(
|
||||||
|
'Visit https://staging.example.test/about for details.',
|
||||||
|
$transformer->transformString( 'Visit https://example.test/about for details.', $mappings )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_rewrites_html_attribute_urls(): void {
|
||||||
|
$transformer = new UrlTransformer();
|
||||||
|
$mappings = new UrlMappingCollection(
|
||||||
|
array(
|
||||||
|
new UrlMapping( 'https://example.test', 'https://staging.example.test' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame(
|
||||||
|
'<a href="https://staging.example.test/about"><img src="https://staging.example.test/image.jpg"></a>',
|
||||||
|
$transformer->transformString(
|
||||||
|
'<a href="https://example.test/about"><img src="https://example.test/image.jpg"></a>',
|
||||||
|
$mappings
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_rewrites_escaped_urls(): void {
|
||||||
|
$transformer = new UrlTransformer();
|
||||||
|
$mappings = new UrlMappingCollection(
|
||||||
|
array(
|
||||||
|
new UrlMapping( 'https://example.test/path?a=1&b=2', 'https://staging.example.test/path?a=1&b=2' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame(
|
||||||
|
'https://staging.example.test/path?a=1&b=2',
|
||||||
|
$transformer->transformString( 'https://example.test/path?a=1&b=2', $mappings )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_rewrites_protocol_relative_urls(): void {
|
||||||
|
$transformer = new UrlTransformer();
|
||||||
|
$mappings = new UrlMappingCollection(
|
||||||
|
array(
|
||||||
|
new UrlMapping( 'https://example.test', 'https://staging.example.test' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame(
|
||||||
|
'//staging.example.test/uploads/file.pdf',
|
||||||
|
$transformer->transformString( '//example.test/uploads/file.pdf', $mappings )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_supports_multiple_mappings(): void {
|
||||||
|
$transformer = new UrlTransformer();
|
||||||
|
$mappings = new UrlMappingCollection(
|
||||||
|
array(
|
||||||
|
new UrlMapping( 'https://example.test', 'https://staging.example.test' ),
|
||||||
|
new UrlMapping( 'https://cdn.example.test', 'https://cdn.staging.example.test' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame(
|
||||||
|
'https://staging.example.test https://cdn.staging.example.test/image.jpg',
|
||||||
|
$transformer->transformString( 'https://example.test https://cdn.example.test/image.jpg', $mappings )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user