$links */ public function enrich(string $html, array $links = []): string { $data = json_decode(CheckedFile::read(__DIR__.'/../../database/data/corridor-investment-opportunities.json'), true, 512, JSON_THROW_ON_ERROR); $doc = new DOMDocument; $previous = libxml_use_internal_errors(true); try { $doc->loadHTML(''.$html.'', LIBXML_NONET); $body = $doc->getElementsByTagName('body')->item(0); if (! $body) { return $html; } $changed = false; foreach ($data['groups'] as $index => $group) { $marker = 'agronegocio-oportunidades-'.($index + 1); if ($doc->getElementById($marker)) { continue; } foreach (iterator_to_array($body->childNodes) as $heading) { if (! $heading instanceof DOMElement) { continue; } $name = preg_replace('/^[a-f]\)\s*/u', '', trim($heading->textContent)); if ($name !== $group['name']) { continue; } $chains = $heading->nextSibling; while ($chains && ! $chains instanceof DOMElement) { $chains = $chains->nextSibling; } // Insert only into the exact named section and its existing priority-chain paragraph. if (! $chains || ! str_starts_with(trim($chains->textContent), 'Cadeias de valor prioritárias:')) { continue; } $fragment = $doc->createDocumentFragment(); $label = $doc->createElement('p'); $strong = $doc->createElement('strong'); $strong->appendChild($doc->createTextNode('Oportunidades de investimento em agronegócio:')); $label->appendChild($strong); $fragment->appendChild($label); $list = $doc->createElement('ul'); $list->setAttribute('id', $marker); foreach ($group['opportunities'] as $itemIndex => $opportunity) { $item = $doc->createElement('li'); $chain = $doc->createElement('strong'); $chain->appendChild($doc->createTextNode($opportunity['chain'].': ')); $item->appendChild($chain); $item->appendChild($doc->createTextNode($opportunity['description'])); if (isset($links[$index][$itemIndex])) { $item->appendChild($doc->createTextNode(' ')); $link = $doc->createElement('a'); $link->setAttribute('href', $links[$index][$itemIndex]); $link->appendChild($doc->createTextNode('Conhecer a oportunidade e iniciar o roteiro')); $item->appendChild($link); } $list->appendChild($item); } $fragment->appendChild($list); $source = $doc->createElement('p'); $source->appendChild($doc->createTextNode('Fonte das oportunidades: '.$data['source'])); $fragment->appendChild($source); $body->insertBefore($fragment, $chains->nextSibling); $changed = true; break; } } return $changed ? implode('', array_map(fn ($node) => $doc->saveHTML($node), iterator_to_array($body->childNodes))) : $html; } finally { libxml_clear_errors(); libxml_use_internal_errors($previous); } } }