feat: FontSignature (Magic Bytes) und FontNameRules (Namensregeln eigener Schriften)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
172a703903
commit
775d611cfa
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace LIT\MCP\Tests\Unit\Integrations\Divi\Design;
|
||||
|
||||
use LIT\MCP\Integrations\Divi\Design\FontNameRules;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class FontNameRulesTest extends TestCase
|
||||
{
|
||||
private const RESERVED = ['Open Sans', 'Roboto', 'Arial', 'Times New Roman', 'Hausschrift'];
|
||||
|
||||
public function testLettersDigitsSpacesUnderscoresAndHyphensAreAllowed(): void
|
||||
{
|
||||
self::assertNull(FontNameRules::check('Inter Display_2-Bold', self::RESERVED));
|
||||
self::assertNull(FontNameRules::check('X', self::RESERVED));
|
||||
}
|
||||
|
||||
public function testOtherCharactersAreRefusedWithTheNameDiviWouldStore(): void
|
||||
{
|
||||
$problem = (string) FontNameRules::check('Grotesk (Pro)!', self::RESERVED);
|
||||
self::assertStringContainsString('nur Buchstaben', $problem);
|
||||
self::assertStringContainsString('„Grotesk Pro“', $problem);
|
||||
|
||||
self::assertStringContainsString('„Mller“', (string) FontNameRules::check('Müller', self::RESERVED));
|
||||
self::assertStringContainsString('nur Buchstaben', (string) FontNameRules::check('a.b', self::RESERVED));
|
||||
self::assertStringContainsString('nur Buchstaben', (string) FontNameRules::check("Tab\tName", self::RESERVED));
|
||||
self::assertStringContainsString('nichts übrig', (string) FontNameRules::check('«»', self::RESERVED));
|
||||
}
|
||||
|
||||
public function testEmptyAndPaddedNamesAreRefused(): void
|
||||
{
|
||||
self::assertStringContainsString('1–100 Zeichen', (string) FontNameRules::check('', self::RESERVED));
|
||||
self::assertStringContainsString('1–100 Zeichen', (string) FontNameRules::check(' ', self::RESERVED));
|
||||
self::assertStringContainsString('Anfang oder Ende', (string) FontNameRules::check(' Inter', self::RESERVED));
|
||||
self::assertStringContainsString('Anfang oder Ende', (string) FontNameRules::check('Inter ', self::RESERVED));
|
||||
}
|
||||
|
||||
public function testTheLengthLimitIsOneHundredCharactersOrDivisBound(): void
|
||||
{
|
||||
self::assertNull(FontNameRules::check(str_repeat('a', 100), self::RESERVED));
|
||||
self::assertStringContainsString(
|
||||
'höchstens 100 Zeichen (101 angegeben)',
|
||||
(string) FontNameRules::check(str_repeat('a', 101), self::RESERVED)
|
||||
);
|
||||
self::assertStringContainsString(
|
||||
'höchstens 50 Zeichen',
|
||||
(string) FontNameRules::check(str_repeat('a', 51), self::RESERVED, 50)
|
||||
);
|
||||
}
|
||||
|
||||
public function testNamesOfGoogleWebSafeAndUploadedFontsAreTakenWhateverTheCase(): void
|
||||
{
|
||||
self::assertSame('Open Sans', FontNameRules::taken('open sans', self::RESERVED));
|
||||
self::assertSame('Arial', FontNameRules::taken('ARIAL', self::RESERVED), 'web-safe fonts too (Divi skips them)');
|
||||
self::assertSame('Hausschrift', FontNameRules::taken('Hausschrift', self::RESERVED));
|
||||
self::assertNull(FontNameRules::taken('Open Sans Pro', self::RESERVED));
|
||||
self::assertNull(FontNameRules::taken('Roboto', []));
|
||||
|
||||
$problem = (string) FontNameRules::check('times new roman', self::RESERVED);
|
||||
self::assertStringContainsString('„Times New Roman“ gibt es schon', $problem);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace LIT\MCP\Tests\Unit\Integrations\Divi\Design;
|
||||
|
||||
use LIT\MCP\Integrations\Divi\Design\FontSignature;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class FontSignatureTest extends TestCase
|
||||
{
|
||||
public function testTheFourFormatsAreRecognizedByTheirFirstFourBytes(): void
|
||||
{
|
||||
self::assertSame('woff2', FontSignature::detect("wOF2\x00\x01\x00\x00\x00\x00\x12\x34"));
|
||||
self::assertSame('woff', FontSignature::detect("wOFF\x00\x01\x00\x00"));
|
||||
self::assertSame('ttf', FontSignature::detect("\x00\x01\x00\x00\x00\x0c\x00\x80"));
|
||||
self::assertSame('ttf', FontSignature::detect('true' . "\x00\x0c"), 'Apple TrueType');
|
||||
self::assertSame('otf', FontSignature::detect("OTTO\x00\x0a\x00\x80"));
|
||||
}
|
||||
|
||||
public function testEverythingElseIsNoFont(): void
|
||||
{
|
||||
self::assertNull(FontSignature::detect(''));
|
||||
self::assertNull(FontSignature::detect('wOF'), 'too short');
|
||||
self::assertNull(FontSignature::detect('wof2'), 'case matters');
|
||||
self::assertNull(FontSignature::detect('ttcf'), 'font collections are not accepted');
|
||||
self::assertNull(FontSignature::detect("\x89PNG\r\n\x1a\n"));
|
||||
self::assertNull(FontSignature::detect('<?php evil();'));
|
||||
self::assertNull(FontSignature::detect("\x00wOF2"), 'the magic must start at byte 0');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user