Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
duncanmcclean committed Oct 24, 2024
1 parent 076d4f7 commit 8aff400
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 13 deletions.
6 changes: 6 additions & 0 deletions src/Http/Controllers/MappingsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ public function __invoke(MappingsRequest $request)

return [
'fields' => $blueprint->fields()->all()
->reject(function (Field $field) {
$transformer = Importer::getTransformer($field->type());

return in_array($field->type(), ['section', 'grid', 'replicator', 'group'])
&& ! $transformer;
})
->map(function (Field $field) use ($request, $row) {
$fields = [];

Expand Down
40 changes: 39 additions & 1 deletion src/Transformers/BardTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Statamic\Importer\Transformers;

use Illuminate\Support\Facades\Http;
use Statamic\Facades\AssetContainer;
use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor;
use Statamic\Importer\WordPress\Gutenberg;
Expand All @@ -22,7 +23,44 @@ public function transform(string $value): array
);
}

return (new BardAugmentor($this->field->fieldtype()))->renderHtmlToProsemirror($value)['content'];
$value = (new BardAugmentor($this->field->fieldtype()))->renderHtmlToProsemirror($value)['content'];

return collect($value)
->map(function (array $node): ?array {
if ($this->field->get('container') && $node['type'] === 'image') {
$baseUrl = $this->config('assets_base_url');
$downloadWhenMissing = $this->config('assets_download_when_missing', false);
$assetContainer = AssetContainer::find($this->field->get('container'));

$path = Str::of($node['attrs']['src'])
->after(Str::removeRight($baseUrl, '/'))
->trim('/')
->__toString();

$asset = $assetContainer->asset($path);

if (! $asset && $downloadWhenMissing) {
$request = Http::get(Str::removeRight($baseUrl, '/').Str::ensureLeft($path, '/'));

if (! $request->ok()) {
return null;
}

$assetContainer->disk()->put($path, $request->body());
$asset = $assetContainer->makeAsset($path);
}

if (! $asset) {
return null;
}

$node['attrs']['src'] = $asset->id();
}

return $node;
})
->filter()
->all();
}

private function enableBardButtons(): void
Expand Down
18 changes: 8 additions & 10 deletions src/WordPress/Gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,8 @@ public static function toBard(array $config, Blueprint $blueprint, Field $field,
];
}

if ($block['blockName'] === 'core/image') {
$assetContainer = $field->get('container')
? AssetContainer::find($field->get('container'))
: AssetContainer::all()->first();
if ($field->get('container') && $block['blockName'] === 'core/image') {
$assetContainer = AssetContainer::find($field->get('container'));

$crawler = new Crawler($block['innerHTML']);
$url = $crawler->filter('img')->first()->attr('src');
Expand Down Expand Up @@ -97,11 +95,15 @@ public static function toBard(array $config, Blueprint $blueprint, Field $field,
}

if ($block['blockName'] === 'core/gallery') {
$assetContainer = $field->get('container')
? AssetContainer::find($field->get('container'))
: AssetContainer::all()->first();

static::ensureBardSet($blueprint, $field, 'gallery', [
'display' => __('Gallery'),
'icon' => 'media-image-picture-gallery',
'fields' => [
['handle' => 'images', 'field' => ['type' => 'assets', 'display' => __('Images')]],
['handle' => 'images', 'field' => ['type' => 'assets', 'display' => __('Images'), 'container' => $assetContainer->handle()]],
],
]);

Expand All @@ -113,11 +115,7 @@ public static function toBard(array $config, Blueprint $blueprint, Field $field,
'type' => 'gallery',
'images' => collect($block['innerBlocks'])
->filter(fn ($block) => $block['blockName'] === 'core/image')
->map(function (array $block) use ($config, $field): string {
$assetContainer = $field->get('container')
? AssetContainer::find($field->get('container'))
: AssetContainer::all()->first();

->map(function (array $block) use ($config, $field, $assetContainer): string {
$crawler = new Crawler($block['innerHTML']);
$url = $crawler->filter('img')->first()->attr('src');

Expand Down
38 changes: 37 additions & 1 deletion tests/Transformers/BardTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Statamic\Importer\Tests\Transformers;

use Illuminate\Support\Facades\Storage;
use PHPUnit\Framework\Attributes\Test;
use Statamic\Facades\AssetContainer;
use Statamic\Facades\Collection;
use Statamic\Importer\Tests\TestCase;
use Statamic\Importer\Transformers\BardTransformer;
Expand All @@ -23,7 +25,7 @@ public function setUp(): void
$this->collection = tap(Collection::make('pages'))->save();

$this->blueprint = $this->collection->entryBlueprint();
$this->blueprint->ensureField('content', ['type' => 'bard'])->save();
$this->blueprint->ensureField('content', ['type' => 'bard', 'container' => 'assets'])->save();

$this->field = $this->blueprint->field('content');
}
Expand Down Expand Up @@ -68,4 +70,38 @@ public function it_converts_html_to_prosemirror()
['type' => 'text', 'text' => ' Maxime iam et inventore. ipsam in dignissimos qui occaecati.'],
]], $output);
}

#[Test]
public function it_handles_images()
{
AssetContainer::make('assets')->disk('public')->save();
Storage::disk('public')->put('2024/10/image.png', 'original');

$transformer = new BardTransformer($this->blueprint, $this->field, [
'assets_base_url' => 'https://example.com/wp-content/uploads',
]);

$output = $transformer->transform(<<<'HTML'
<p>Nam voluptatem rem molestiae cumque doloremque. <strong>Saepe animi deserunt</strong> Maxime iam et inventore. ipsam in dignissimos qui occaecati.</p>
<img src="https://example.com/wp-content/uploads/2024/10/image.png" />
HTML);

$this->assertEquals([
[
'type' => 'paragraph',
'attrs' => ['textAlign' => 'left'],
'content' => [
['type' => 'text', 'text' => 'Nam voluptatem rem molestiae cumque doloremque. '],
['type' => 'text', 'text' => 'Saepe animi deserunt', 'marks' => [['type' => 'bold']]],
['type' => 'text', 'text' => ' Maxime iam et inventore. ipsam in dignissimos qui occaecati.'],
],
],
[
'type' => 'image',
'attrs' => [
'src' => 'assets::2024/10/image.png',
],
],
], $output);
}
}
26 changes: 25 additions & 1 deletion tests/WordPress/GutenbergTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function setUp(): void
'sections' => [
'main' => [
'fields' => [
['handle' => 'content', 'field' => ['type' => 'bard']],
['handle' => 'content', 'field' => ['type' => 'bard', 'container' => 'assets']],
],
],
],
Expand Down Expand Up @@ -219,6 +219,30 @@ public function it_transforms_image_blocks()
], $output);
}

#[Test]
public function it_doesnt_transforms_image_blocks_when_container_is_missing_from_bard_config()
{
Http::preventStrayRequests();

AssetContainer::make('assets')->disk('public')->save();
Storage::disk('public')->put('2024/10/image.png', 'original');

$this->blueprint->ensureFieldHasConfig('content', ['type' => 'bard', 'container' => null])->save();

$output = Gutenberg::toBard(
config: [],
blueprint: $this->blueprint,
field: $this->blueprint->field('content'),
value: <<<'HTML'
<!-- wp:image {"id":41,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="https://example.com/wp-content/uploads/2024/10/image.png" alt="" class="wp-image-41"/></figure>
<!-- /wp:image -->
HTML
);

$this->assertEquals([], $output);
}

#[Test]
public function it_transforms_image_blocks_and_downloads_images_that_dont_exist_in_asset_container()
{
Expand Down

0 comments on commit 8aff400

Please sign in to comment.