| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- <?php
- namespace App\Support\Traits;
- use DOMElement;
- /*
- * Трейт: обнаружение repeater-структуры в DOM.
- * Используется классом BlockLayoutParser.
- */
- trait BlockLayoutDetectorTrait
- {
- /** @return array{0:DOMElement,1:DOMElement[]}|null */
- private function detectRepeater(DOMElement $wrapper): ?array
- {
- $children = $this->elementChildren($wrapper);
- // Уровень 1: прямые дети обёртки одинаковы
- if (count($children) >= 2 && $this->allSimilar($children)) {
- return [$wrapper, $children];
- }
- // Уровень 2: единственный дочерний элемент содержит похожих детей
- if (count($children) === 1) {
- $grand = $this->elementChildren($children[0]);
- if (count($grand) >= 2 && $this->allSimilar($grand)) {
- return [$children[0], $grand];
- }
- }
- return null;
- }
- /** Все элементы имеют одинаковый тег и класс (считаем «похожими»). */
- private function allSimilar(array $els): bool
- {
- $tag = strtolower($els[0]->tagName);
- $class = $els[0]->getAttribute('class');
- foreach (array_slice($els, 1) as $el) {
- if (strtolower($el->tagName) !== $tag) return false;
- if ($el->getAttribute('class') !== $class) return false;
- }
- return true;
- }
- }
|