88 lines
4.1 KiB
PHP
88 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Support\CheckedFile;
|
|
use DOMDocument;
|
|
use DOMElement;
|
|
|
|
/** Supplement the six named agribusiness sections without changing corridor masters or source documents. */
|
|
final class CorridorAgribusiness
|
|
{
|
|
/**
|
|
* @param array<array-key, mixed> $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('<?xml encoding="UTF-8"><html><body>'.$html.'</body></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);
|
|
}
|
|
}
|
|
}
|