Skip to content

Commit ac32eab

Browse files
committed
[BUGFIX] Fix tempnam() E_NOTICE when using PlantUML binary renderer
When using the local PlantUML binary renderer (renderer="plantuml"), the upstream PlantumlRenderer calls tempnam() with a subdirectory that may not exist, triggering a PHP E_NOTICE that appears in the rendered documentation output. This adds a DecoratingPlantumlBinaryRenderer that ensures the temp directory exists before delegating to the inner renderer, fixing the issue without requiring upstream changes or global E_NOTICE suppression. Resolves: TYPO3-Documentation#1099
1 parent 7ccdf48 commit ac32eab

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

packages/typo3-docs-theme/resources/config/typo3-docs-theme.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use phpDocumentor\Guides\Event\PostProjectNodeCreated;
99
use phpDocumentor\Guides\Event\PostRenderProcess;
1010
use phpDocumentor\Guides\Event\PreParseProcess;
11+
use phpDocumentor\Guides\Graphs\Renderer\PlantumlRenderer;
1112
use phpDocumentor\Guides\Graphs\Renderer\PlantumlServerRenderer;
1213
use phpDocumentor\Guides\ReferenceResolvers\DelegatingReferenceResolver;
1314
use phpDocumentor\Guides\ReferenceResolvers\Interlink\InventoryRepository;
@@ -56,6 +57,7 @@
5657
use T3Docs\Typo3DocsTheme\Parser\Productions\FieldList\TemplateFieldListItemRule;
5758
use T3Docs\Typo3DocsTheme\ReferenceResolvers\FileReferenceResolver;
5859
use T3Docs\Typo3DocsTheme\ReferenceResolvers\ObjectsInventory\ObjectInventory;
60+
use T3Docs\Typo3DocsTheme\Renderer\DecoratingPlantumlBinaryRenderer;
5961
use T3Docs\Typo3DocsTheme\Renderer\DecoratingPlantumlRenderer;
6062
use T3Docs\Typo3DocsTheme\Renderer\MainMenuJsonRenderer;
6163
use T3Docs\Typo3DocsTheme\Renderer\NodeRenderer\MainMenuJsonDocumentRenderer;
@@ -198,6 +200,10 @@
198200
->decorate(PlantumlServerRenderer::class)
199201
->public()
200202

203+
->set(DecoratingPlantumlBinaryRenderer::class)
204+
->decorate(PlantumlRenderer::class)
205+
->public()
206+
201207
->set(ConfvalMenuDirective::class)
202208
->set(DirectoryTreeDirective::class)
203209
->set(GlossaryDirective::class)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace T3Docs\Typo3DocsTheme\Renderer;
6+
7+
use phpDocumentor\Guides\Graphs\Renderer\DiagramRenderer;
8+
use phpDocumentor\Guides\Graphs\Renderer\PlantumlRenderer;
9+
use phpDocumentor\Guides\RenderContext;
10+
11+
use function is_dir;
12+
use function mkdir;
13+
use function sys_get_temp_dir;
14+
15+
/**
16+
* Decorator for PlantumlRenderer that ensures the temp directory exists.
17+
*
18+
* The upstream PlantumlRenderer uses tempnam() with a subdirectory that may not exist,
19+
* which triggers an E_NOTICE. This decorator creates the directory before rendering.
20+
*
21+
* @see https://github.com/TYPO3-Documentation/render-guides/pull/1099
22+
*/
23+
final class DecoratingPlantumlBinaryRenderer implements DiagramRenderer
24+
{
25+
private const TEMP_SUBDIRECTORY = '/phpdocumentor';
26+
27+
public function __construct(private readonly PlantumlRenderer $innerRenderer) {}
28+
29+
public function render(RenderContext $renderContext, string $diagram): string|null
30+
{
31+
$this->ensureTempDirectoryExists();
32+
33+
return $this->innerRenderer->render($renderContext, $diagram);
34+
}
35+
36+
private function ensureTempDirectoryExists(): void
37+
{
38+
$tempDir = sys_get_temp_dir() . self::TEMP_SUBDIRECTORY;
39+
40+
if (!is_dir($tempDir)) {
41+
mkdir($tempDir, 0o777, true);
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)