Migrate to modular strict rules v2.2.0

This commit is contained in:
Enes Yakıştır
2026-05-13 12:13:32 +03:00
parent 4e1eda888a
commit 30c981eb68
7 changed files with 154 additions and 50 deletions
+31
View File
@@ -0,0 +1,31 @@
<?php
namespace YakNet\AccessibilityConsole\Core;
abstract class AbstractRule
{
/**
* @return Violation[]
*/
abstract public function check(\DOMDocument $doc): array;
/**
* Get the WCAG standard ID (e.g., WCAG 2.1 1.1.1)
*/
abstract public function getStandardId(): string;
/**
* Get the severity level (Critical, Major, Minor)
*/
abstract public function getSeverity(): string;
protected function createViolation(string $message, \DOMElement $element): Violation
{
return new Violation(
message: $message,
htmlSnippet: $element->ownerDocument->saveHTML($element),
severity: $this->getSeverity(),
standard: $this->getStandardId()
);
}
}
+10 -7
View File
@@ -2,23 +2,26 @@
namespace YakNet\AccessibilityConsole\Core;
use YakNet\AccessibilityConsole\Rules\RuleInterface;
class RuleEngine
{
/** @var RuleInterface[] */
/** @var AbstractRule[] */
private array $rules = [];
public function addRule(RuleInterface $rule): void
public function addRule(AbstractRule $rule): void
{
$this->rules[] = $rule;
}
/**
* @return RuleInterface[]
* @return Violation[]
*/
public function getRules(): array
public function run(\DOMDocument $doc): array
{
return $this->rules;
$allViolations = [];
foreach ($this->rules as $rule) {
$violations = $rule->check($doc);
$allViolations = array_merge($allViolations, $violations);
}
return $allViolations;
}
}
+12 -43
View File
@@ -2,62 +2,31 @@
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 __construct(private ?RuleEngine $engine = null)
{
if ($this->engine === null) {
$this->engine = new RuleEngine();
}
}
public function addRule(RuleInterface $rule): void
{
$this->rules[] = $rule;
}
/**
* Scan HTML content for accessibility violations.
*
* @param string $html
* @return Violation[]
*/
public function scan(string $html): array
{
if (trim($html) === '') {
if (empty(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);
$doc = new \DOMDocument();
// Suppress warnings for malformed HTML
@$doc->loadHTML('<?xml encoding="utf-8" ?>' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
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;
return $this->engine->run($doc);
}
}