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:
co-authored by
Claude Sonnet 5.5
parent
e951cc1353
commit
62f8465e60
@@ -17,13 +17,31 @@ defined('ABSPATH') || exit;
|
||||
* change the text) and are named in notes(). Other references – colors, other variables, dynamic content – stay
|
||||
* untouched. Pure PHP.
|
||||
*/
|
||||
final class VariableDetachRewrite implements NodeRewrite
|
||||
final class VariableDetachRewrite implements NodeRewrite, ReportsLeftovers
|
||||
{
|
||||
private const EMBEDDED = '%s: Die Variable steht hier eingebettet in einem längeren Text; dieser Verweis bleibt '
|
||||
. 'stehen – im Divi-Builder ersetzen.';
|
||||
private const EMBEDDED = 'Die Variable steht hier eingebettet in einem längeren Text; dieser Verweis bleibt '
|
||||
. 'unverändert – im Divi-Builder prüfen.';
|
||||
|
||||
public function __construct(private string $id, private string $value, private string $variableType)
|
||||
private const UNSAFE = 'Vor- oder Nachtext des Verweises enthält Markup oder einen Verweis; der Verweis bleibt '
|
||||
. 'unverändert – im Divi-Builder prüfen.';
|
||||
|
||||
/** @param bool $markupAllowed Whether "<" and ">" may enter the content (unfiltered_html); markers never may. */
|
||||
public function __construct(
|
||||
private string $id,
|
||||
private string $value,
|
||||
private string $variableType,
|
||||
private bool $markupAllowed = false
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether $text must not be inlined into content: it holds a reference marker (it never went through
|
||||
* VariableRef::canonical()) or – without unfiltered_html – markup (D7, S1).
|
||||
*/
|
||||
public static function unsafe(string $text, bool $markupAllowed): bool
|
||||
{
|
||||
return str_contains($text, VariableRef::MARKER) || str_contains($text, VariableRef::END)
|
||||
|| (! $markupAllowed && (str_contains($text, '<') || str_contains($text, '>')));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,8 +62,8 @@ final class VariableDetachRewrite implements NodeRewrite
|
||||
|
||||
public function rewrite(Block $block): ?array
|
||||
{
|
||||
if (! $block->isDivi()) {
|
||||
return null;
|
||||
if (! $block->isDivi() || $this->hasUnsafeAffix($block->attrs())) {
|
||||
return null; // fail closed: the block stays whole and leftover() reports it
|
||||
}
|
||||
|
||||
$changed = false;
|
||||
@@ -56,7 +74,19 @@ final class VariableDetachRewrite implements NodeRewrite
|
||||
|
||||
public function notes(Block $block, string $nodeId): array
|
||||
{
|
||||
return $this->embeds($block->attrs()) ? [sprintf(self::EMBEDDED, $nodeId)] : [];
|
||||
return []; // leftovers go through leftover(): they also matter for blocks rewrite() did not change
|
||||
}
|
||||
|
||||
public function leftover(Block $block): ?string
|
||||
{
|
||||
if (! $block->isDivi()) {
|
||||
return null;
|
||||
}
|
||||
if ($this->hasUnsafeAffix($block->attrs())) {
|
||||
return self::UNSAFE;
|
||||
}
|
||||
|
||||
return $this->embeds($block->attrs()) ? self::EMBEDDED : null;
|
||||
}
|
||||
|
||||
public function concernsInstance(Block $instance): bool
|
||||
@@ -86,6 +116,36 @@ final class VariableDetachRewrite implements NodeRewrite
|
||||
return $value;
|
||||
}
|
||||
|
||||
/** Whether a whole reference below $value carries before/after text that must not be inlined. */
|
||||
private function hasUnsafeAffix(mixed $value): bool
|
||||
{
|
||||
if (is_string($value)) {
|
||||
if ($this->variableType !== 'strings' || VariableRef::nameOf($value) !== $this->id) {
|
||||
return false;
|
||||
}
|
||||
$settings = VariableRef::settingsOf($value);
|
||||
|
||||
foreach (['before', 'after'] as $key) {
|
||||
$text = is_string($settings[$key] ?? null) ? $settings[$key] : '';
|
||||
if (self::unsafe($text, $this->markupAllowed)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
if (! is_array($value)) {
|
||||
return false;
|
||||
}
|
||||
foreach ($value as $item) {
|
||||
if ($this->hasUnsafeAffix($item)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Whether a string below $value names the variable inside a longer text. */
|
||||
private function embeds(mixed $value): bool
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user