feat: Divi composer – short/full form to blocks with structure rules, presets and labels
Labels, background_color and preset ids go through the choke point (S13); ambiguous preset names fail with their ids (S13a); fullwidth + rows is an error. Carry-ins: control characters stripped before the marker check (S32), kind override may only tighten, reference alt texts dropped, color check via VariableRef::typeOf (S33). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7
This commit is contained in:
@@ -215,11 +215,16 @@ final class ShortformWriterTest extends TestCase
|
||||
{
|
||||
$rows = self::malicious();
|
||||
$sanitizer = ComposeFixture::sanitizer();
|
||||
foreach (['text: tag-split marker', 'text: NUL-split marker', 'text: octet-split marker'] as $row) {
|
||||
foreach (['text: tag-split marker', 'text: octet-split marker'] as $row) {
|
||||
self::assertStringNotContainsString('$variable(', $rows[$row][1]);
|
||||
self::assertStringContainsString('$variable(', $sanitizer->text($rows[$row][1]));
|
||||
}
|
||||
|
||||
// S32: like sanitize_text_field, the fake text() keeps NUL – so the marker the NUL row
|
||||
// hides is rebuilt only by AttrWriter's control-character stripping (production code).
|
||||
self::assertStringNotContainsString('$variable(', $sanitizer->text($rows['text: NUL-split marker'][1]));
|
||||
self::assertStringContainsString(chr(0), $sanitizer->text($rows['text: NUL-split marker'][1]));
|
||||
|
||||
foreach (['url: stripped-characters marker', 'url: NUL-split marker', 'url: line-break octet marker'] as $row) {
|
||||
self::assertStringNotContainsString('$variable(', $rows[$row][1]);
|
||||
self::assertStringContainsString('$variable(', $sanitizer->url($rows[$row][1]));
|
||||
@@ -228,6 +233,18 @@ final class ShortformWriterTest extends TestCase
|
||||
self::assertStringContainsString(chr(0), $rows['text: NUL-split marker'][1]);
|
||||
}
|
||||
|
||||
/** Ruling S33b: an attachment alt carrying a reference (whole or split) is dropped, never canonicalized. */
|
||||
public function testMediaAltWithAReferenceIsDropped(): void
|
||||
{
|
||||
foreach ([44, 45] as $id) {
|
||||
$result = ComposeFixture::shortform()->apply('image', [], ['image_id' => $id], 'n');
|
||||
|
||||
self::assertSame([], $result['errors'], (string) $id);
|
||||
self::assertSame(['src', 'id'], array_keys($result['attrs']['image']['innerContent']['desktop']['value']));
|
||||
self::assertStringNotContainsString('variable', (string) json_encode($result['attrs']));
|
||||
}
|
||||
}
|
||||
|
||||
/** Ruling S21 applies to short-form text too: before/after of a reference are cleaned, not rejected. */
|
||||
public function testReferenceSettingsInTextAreCleaned(): void
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user