adrema/app/Lib/Editor/EditorData.php

91 lines
2.3 KiB
PHP
Raw Normal View History

2024-07-04 23:54:37 +02:00
<?php
namespace App\Lib\Editor;
2024-12-22 18:34:00 +01:00
use Livewire\Wireable;
use Spatie\LaravelData\Concerns\WireableData;
2024-07-04 23:54:37 +02:00
use Spatie\LaravelData\Data;
2024-07-04 23:56:47 +02:00
/** @todo replace blocks with actual block data classes */
2024-12-22 18:34:00 +01:00
class EditorData extends Data implements Editorable, Wireable
2024-07-04 23:54:37 +02:00
{
2024-12-22 18:34:00 +01:00
use WireableData;
2024-07-08 23:06:45 +02:00
/** @param array<int, mixed> $blocks */
2024-07-04 23:54:37 +02:00
public function __construct(
public string $version,
public array $blocks,
public int $time
) {
}
public function placeholder(string $search, string $replacement): self
{
$replacedBlocks = str(json_encode($this->blocks))->replace('{' . $search . '}', $replacement);
2024-07-08 20:48:08 +02:00
$this->blocks = json_decode($replacedBlocks, true);
2024-07-04 23:54:37 +02:00
return $this;
}
/**
* @param array<int, string> $wanted
*/
public function hasAll(array $wanted): bool
{
return collect($wanted)->first(fn ($search) => !str(json_encode($this->blocks))->contains($search)) === null;
}
2024-07-06 15:08:13 +02:00
public static function default(): self
{
return static::from([
'version' => '1.0',
'blocks' => [],
'time' => 0,
]);
}
public function append(Editorable $editorable): self
{
2024-07-08 22:39:11 +02:00
$this->blocks = array_merge($this->blocks, $editorable->toEditorData()->blocks);
return $this;
2024-07-06 15:08:13 +02:00
}
2024-07-08 23:06:45 +02:00
/**
* @param array<int, string> $replacements
*/
2024-07-04 23:54:37 +02:00
public function replaceWithList(string $blockContent, array $replacements): self
{
2024-07-08 22:39:11 +02:00
$this->blocks = collect($this->blocks)->map(function ($block) use ($blockContent, $replacements) {
2024-07-04 23:54:37 +02:00
if (data_get($block, 'type') !== 'paragraph') {
return $block;
}
if (data_get($block, 'data.text') === '{' . $blockContent . '}') {
return [
...((array)$block),
'type' => 'list',
'data' => [
'style' => 'unordered',
'items' => collect($replacements)->map(fn ($replacement) => [
'content' => $replacement,
'items' => [],
]),
]
];
}
return $block;
})->toArray();
2024-07-08 22:39:11 +02:00
return $this;
2024-07-06 15:08:13 +02:00
}
public function toEditorData(): EditorData
{
2024-07-04 23:54:37 +02:00
return $this;
}
}