|null Structure fingerprint => entry. */ private ?array $index = null; public function __construct(private LibraryAccess $access, private Parser $parser = new Parser()) { } /** @return list */ public function warnings(DiviChange $change): array { if (! $this->access->revealsIds()) { return []; } $warnings = []; foreach ($change->entries() as $entry) { $block = $entry['block']; if ( $entry['action'] !== 'inserted' || ! $block instanceof Block || $block->name() !== 'divi/section' || $block->isOpaque() || $block->isGlobal() ) { continue; } $match = $this->index()[Fingerprint::structure($block)] ?? null; if ($match !== null) { $warnings[] = sprintf( 'Ein gleich aufgebauter Abschnitt liegt in der Divi-Bibliothek: „%s“ (%d) – lit-library-insert ' . 'erwägen; weitere Vorkommen mit lit/library-find-similar.', $match['title'], $match['id'] ); } } return array_values(array_unique($warnings)); } /** @return array */ private function index(): array { if ($this->index !== null) { return $this->index; } $this->index = []; foreach ($this->access->store()->find(['layout_type' => 'section'], self::MAX_ITEMS - 1, 0) as $item) { if (! current_user_can('edit_post', (int) $item->ID)) { continue; } try { $roots = LibraryContent::roots(LibraryContent::load($this->parser, (string) $item->post_content)); } catch (MalformedMarkup) { continue; } if (count($roots) === 1 && $roots[0]->name() === 'divi/section') { $this->index[Fingerprint::structure($roots[0])] ??= [ 'id' => (int) $item->ID, 'title' => (string) $item->post_title, ]; } } return $this->index; } }