fix: Variablen-Detach meldet verbleibende eingebettete Verweise und lehnt Werte mit Verweis, Markup oder leerem Inhalt ab

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-19 14:19:41 +02:00
co-authored by Claude Sonnet 5.5
parent e951cc1353
commit 62f8465e60
9 changed files with 303 additions and 35 deletions
@@ -148,19 +148,42 @@ final class VariableDetachRewriteTest extends TestCase
$attrs = $rewrite->rewrite($first);
self::assertSame($embedded, $attrs['content']['innerContent']['desktop']['value'] ?? null);
$first->setAttrs((array) $attrs);
self::assertSame(
['s0.r0.c0.m0: Die Variable steht hier eingebettet in einem längeren Text; dieser Verweis bleibt stehen – '
. 'im Divi-Builder ersetzen.'],
$rewrite->notes($first, 's0.r0.c0.m0')
);
self::assertStringContainsString('eingebettet', (string) $rewrite->leftover($first));
self::assertStringContainsString('bleibt unverändert', (string) $rewrite->leftover($first));
self::assertNotNull($rewrite->leftover(self::node($index, 'm1')), 'embedded only: still reported');
self::assertNull($rewrite->rewrite(self::node($index, 'm1')), 'only embedded: nothing to replace');
self::assertSame(
[],
(new VariableDetachRewrite(self::CLAIM, 'x', 'strings'))->notes($first, 's0.r0.c0.m0'),
'another variable is not noted'
self::assertNull(
(new VariableDetachRewrite(self::CLAIM, 'x', 'strings'))->leftover($first),
'another variable is not reported'
);
}
public function testUnsafeBeforeAndAfterLeaveTheBlockWholeAndReportIt(): void
{
$index = self::index([
['divi/text', ['content' => ['innerContent' => self::desktop(self::ref(self::CLAIM, ['before' => '<b>']))]]],
['divi/text', ['content' => ['innerContent' => self::desktop(
// Built by hand: VariableRef::serialize() itself refuses a marker in the settings.
'$variable(' . Json::encode(['type' => 'content', 'value' => [
'name' => self::CLAIM, 'settings' => ['after' => 'a $variable(b']
]]) . ')$'
)]]],
['divi/text', ['content' => ['innerContent' => self::desktop(self::ref(self::CLAIM, ['before' => '<b>']))]]],
]);
$strict = new VariableDetachRewrite(self::CLAIM, 'x', 'strings');
$allowed = new VariableDetachRewrite(self::CLAIM, 'x', 'strings', true);
self::assertNull($strict->rewrite(self::node($index, 'm0')));
self::assertStringContainsString('Markup', (string) $strict->leftover(self::node($index, 'm0')));
self::assertNull($allowed->rewrite(self::node($index, 'm1')), 'a marker is never inlined');
self::assertNotNull($allowed->leftover(self::node($index, 'm1')));
$third = self::node($index, 'm2');
$attrs = (array) $allowed->rewrite($third);
self::assertSame('<b>x', $attrs['content']['innerContent']['desktop']['value'] ?? null);
$third->setAttrs($attrs);
self::assertNull($allowed->leftover($third));
}
public function testInstancesThatMentionTheIdConcernTheRewrite(): void
{
$index = self::index([