bladeExpr /** * Разбирает HTML и возвращает: * fields — определения полей для BlockLayoutRegistry * blade — черновик Blade-шаблона * is_repeater — обнаружена ли repeater-структура */ public function parse(string $html): array { $this->usedNames = []; $this->tokens = []; $this->dom = new DOMDocument('1.0', 'UTF-8'); libxml_use_internal_errors(true); // charset-мета нужна чтобы DOMDocument корректно читал UTF-8 (emoji, кириллица) $this->dom->loadHTML( '' . '
' . $html . '
' ); libxml_clear_errors(); $wrapper = $this->dom->getElementById('BLPARSER'); if (!$wrapper) { return ['fields' => [], 'blade' => $html, 'is_repeater' => false]; } // Ищем repeater-группу $repeater = $this->detectRepeater($wrapper); if ($repeater) { [$container, $items] = $repeater; return $this->buildRepeater($wrapper, $container, $items); } return $this->buildFlat($wrapper); } }