Major upgrade v2.0.0

This commit is contained in:
Enes Yakıştır
2026-05-13 09:10:43 +03:00
commit e348025579
41 changed files with 2139 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
class Config
{
private array $settings = [];
public function __construct(array $settings = [])
{
$this->settings = $settings;
}
public static function fromYaml(string $path): self
{
// Placeholder for YAML loading logic
return new self([]);
}
public function get(string $key, mixed $default = null): mixed
{
return $this->settings[$key] ?? $default;
}
public function getGeminiApiKey(): ?string
{
return $this->get('gemini_api_key') ?? $_ENV['GEMINI_API_KEY'] ?? getenv('GEMINI_API_KEY') ?: null;
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
use YakNet\AccessibilityConsole\Rules\RuleInterface;
class RuleEngine
{
/** @var RuleInterface[] */
private array $rules = [];
public function addRule(RuleInterface $rule): void
{
$this->rules[] = $rule;
}
/**
* @return RuleInterface[]
*/
public function getRules(): array
{
return $this->rules;
}
}
+63
View File
@@ -0,0 +1,63 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
use DOMDocument;
use YakNet\AccessibilityConsole\Rules\RuleInterface;
class Scanner
{
private array $rules = [];
public function __construct(
private readonly ?RuleEngine $engine = null
) {
if ($this->engine) {
$this->rules = $this->engine->getRules();
}
}
public function addRule(RuleInterface $rule): void
{
$this->rules[] = $rule;
}
/**
* @return Violation[]
*/
public function scan(string $html): array
{
if (trim($html) === '') {
return [];
}
$dom = new DOMDocument();
$previousState = libxml_use_internal_errors(true);
$loaded = $dom->loadHTML('<?xml encoding="utf-8" ?>' . $html, LIBXML_NOERROR | LIBXML_NOWARNING);
libxml_clear_errors();
libxml_use_internal_errors($previousState);
if (!$loaded) {
return [];
}
$violations = [];
$elements = $dom->getElementsByTagName('*');
foreach ($elements as $element) {
if (!$element instanceof \DOMElement) continue;
foreach ($this->rules as $rule) {
try {
$violation = $rule->check($element);
if ($violation) {
$violations[] = $violation;
}
} catch (\Throwable) {
continue;
}
}
}
return $violations;
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
enum Severity: string
{
case INFO = 'info';
case WARNING = 'warning';
case ERROR = 'error';
case CRITICAL = 'critical';
public function color(): string
{
return match($this) {
self::INFO => 'info',
self::WARNING => 'comment',
self::ERROR => 'error',
self::CRITICAL => 'error',
};
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
readonly class Violation
{
public function __construct(
public string $ruleId,
public string $message,
public Severity $severity,
public WCAGStandard $standard,
public string $htmlSnippet,
public ?array $location = null, // ['file' => '...', 'line' => 0]
public ?string $fixSuggestion = null
) {}
public function toArray(): array
{
return [
'ruleId' => $this->ruleId,
'message' => $this->message,
'severity' => $this->severity->value,
'standard' => $this->standard->value,
'htmlSnippet' => $this->htmlSnippet,
'location' => $this->location,
'fixSuggestion' => $this->fixSuggestion,
];
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
enum WCAGStandard: string
{
case A = 'A';
case AA = 'AA';
case AAA = 'AAA';
}