release: v3.2.0 - Enterprise Edition with Live Web Dashboard, PDF/Excel Exporters, Framework Stubs & 110 WCAG Rules

This commit is contained in:
Enes Yakıştır
2026-07-31 00:13:31 +03:00
parent 58b1618d96
commit 73fbf485d2
36 changed files with 1420 additions and 11 deletions
+33 -8
View File
@@ -2,11 +2,17 @@
namespace YakNet\AccessibilityConsole\Rules;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use ReflectionClass;
use YakNet\AccessibilityConsole\Core\AbstractRule;
class RuleLevels
{
/**
* Get rule instances for the specified level.
* Levels are incremental: Level 5 includes all rules from Levels 1, 2, 3, and 4.
* Recursively scans src/Rules and all subdirectories for rule classes.
*
* @param int $level
* @return array<int, \YakNet\AccessibilityConsole\Rules\RuleInterface|\YakNet\AccessibilityConsole\Core\AbstractRule>
@@ -14,27 +20,46 @@ class RuleLevels
public static function getRulesForLevel(int $level): array
{
$rules = [];
$files = glob(__DIR__ . '/*.php');
if ($files === false) {
$dir = __DIR__;
if (!is_dir($dir)) {
return [];
}
foreach ($files as $file) {
$className = pathinfo($file, PATHINFO_FILENAME);
$fqcn = 'YakNet\AccessibilityConsole\Rules\\' . $className;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
);
/** @var \SplFileInfo $file */
foreach ($iterator as $file) {
if ($file->getExtension() !== 'php') {
continue;
}
$realPath = $file->getRealPath();
$relativePath = str_replace([$dir . DIRECTORY_SEPARATOR, '.php'], ['', ''], $realPath);
$subNamespace = str_replace(DIRECTORY_SEPARATOR, '\\', $relativePath);
$fqcn = 'YakNet\AccessibilityConsole\Rules\\' . $subNamespace;
if (!class_exists($fqcn)) {
// Fallback to flat namespace if class is in root Rules namespace
$flatClassName = $file->getBasename('.php');
$fqcn = 'YakNet\AccessibilityConsole\Rules\\' . $flatClassName;
}
if (class_exists($fqcn)) {
$reflection = new \ReflectionClass($fqcn);
$reflection = new ReflectionClass($fqcn);
if ($reflection->isAbstract() || $reflection->isInterface() || $reflection->isTrait()) {
continue;
}
// Check if it is a concrete rule
$isRule = $reflection->isSubclassOf(\YakNet\AccessibilityConsole\Core\AbstractRule::class) ||
$reflection->implementsInterface(\YakNet\AccessibilityConsole\Rules\RuleInterface::class);
$isRule = $reflection->isSubclassOf(AbstractRule::class) ||
$reflection->implementsInterface(RuleInterface::class);
if ($isRule) {
$className = $file->getBasename('.php');
// Exclude Turkish custom rules to match standard behavior
if (in_array($className, ['EmptyLinkRule', 'HeadingOrderRule', 'ImageAltRule'], true)) {
continue;