diff --git a/app/Entities/Tools/ExportFormatter.php b/app/Entities/Tools/ExportFormatter.php index f993d332d..5617db692 100644 --- a/app/Entities/Tools/ExportFormatter.php +++ b/app/Entities/Tools/ExportFormatter.php @@ -147,10 +147,31 @@ class ExportFormatter { $html = $this->containHtml($html); $html = $this->replaceIframesWithLinks($html); + $html = $this->openDetailElements($html); return $this->pdfGenerator->fromHtml($html); } + /** + * Within the given HTML content, Open any detail blocks + */ + protected function openDetailElements(string $html): string + { + libxml_use_internal_errors(true); + + $doc = new DOMDocument(); + $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); + $xPath = new DOMXPath($doc); + + $details = $xPath->query('//details'); + /** @var DOMElement $detail */ + foreach ($details as $detail) { + $detail->setAttribute('open', 'open'); + } + + return $doc->saveHTML(); + } + /** * Within the given HTML content, replace any iframe elements * with anchor links within paragraph blocks. diff --git a/tests/Entity/ExportTest.php b/tests/Entity/ExportTest.php index fc6b74088..445cd24f3 100644 --- a/tests/Entity/ExportTest.php +++ b/tests/Entity/ExportTest.php @@ -309,6 +309,24 @@ class ExportTest extends TestCase $this->assertStringContainsString('

https://www.youtube.com/embed/ShqUjt33uOs

', $pdfHtml); } + public function test_page_pdf_export_opens_details_blocks() + { + $page = Page::query()->first()->forceFill([ + 'html' => '
Hello

Content!

', + ]); + $page->save(); + + $pdfHtml = ''; + $mockPdfGenerator = $this->mock(PdfGenerator::class); + $mockPdfGenerator->shouldReceive('fromHtml') + ->with(\Mockery::capture($pdfHtml)) + ->andReturn(''); + $mockPdfGenerator->shouldReceive('getActiveEngine')->andReturn(PdfGenerator::ENGINE_DOMPDF); + + $this->asEditor()->get($page->getUrl('/export/pdf')); + $this->assertStringContainsString('
first();