Git Komut Rehberi & Terminal Asistanı
Sıfırdan Yeni Bir Depo Başlatın:
Mevcut Bir Git Deposu veya Klasörü Gönderin:
Hataları Geri Alma, İptal & Temizlik:
Son commit'i geri al (yapılan değişiklikleri korur):
git reset --soft HEAD~1
Yapılan yerel değişiklikleri iptal et (çalışma ağacını temizler):
git restore .
Takip edilmeyen gereksiz dosyaları sil:
git clean -fd
Değişiklikleri geçici sakla ve geri getir (stash):
git stash git stash pop
Dal (Branch) ve Sürüm Etiketleri:
Yeni dal aç ve geçiş yap:
git checkout -b yeni-ozellik git push -u origin yeni-ozellik
Sürüm etiketi (tag) oluştur ve gönder:
git tag -a v1.0.0 -m "Sürüm 1.0.0" git push origin --tags
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f262b7b35 | ||
|
|
30c981eb68 | ||
|
|
4e1eda888a |
+7
-2
@@ -17,7 +17,7 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "YakNet Bilişim",
|
||||
"email": "[email protected].tr",
|
||||
"email": "[email protected].tr",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
@@ -45,5 +45,10 @@
|
||||
"bin/a11y"
|
||||
],
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
"prefer-stable": true,
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"php-http/discovery": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ If it's about ARIA roles, add the correct ones.
|
||||
PROMPT;
|
||||
|
||||
try {
|
||||
$result = $this->client->geminiPro()->generateContent($prompt);
|
||||
$result = $this->client->generativeModel('gemini-2.5-flash')->generateContent($prompt);
|
||||
$suggestion = trim($result->text());
|
||||
|
||||
// Clean up if AI included markdown blocks anyway
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace YakNet\AccessibilityConsole\Core;
|
||||
|
||||
abstract class AbstractRule
|
||||
{
|
||||
/**
|
||||
* @return Violation[]
|
||||
*/
|
||||
abstract public function check(\DOMDocument $doc): array;
|
||||
|
||||
/**
|
||||
* Get the WCAG standard Enum
|
||||
*/
|
||||
abstract public function getStandard(): WCAGStandard;
|
||||
|
||||
/**
|
||||
* Get the severity level Enum
|
||||
*/
|
||||
abstract public function getSeverity(): Severity;
|
||||
|
||||
protected function createViolation(string $message, \DOMElement $element): Violation
|
||||
{
|
||||
return new Violation(
|
||||
ruleId: (new \ReflectionClass($this))->getShortName(),
|
||||
message: $message,
|
||||
severity: $this->getSeverity(),
|
||||
standard: $this->getStandard(),
|
||||
htmlSnippet: $element->ownerDocument->saveHTML($element)
|
||||
);
|
||||
}
|
||||
}
|
||||
+10
-7
@@ -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
@@ -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 addRule(RuleInterface $rule): void
|
||||
public function __construct(private ?RuleEngine $engine = null)
|
||||
{
|
||||
$this->rules[] = $rule;
|
||||
if ($this->engine === null) {
|
||||
$this->engine = new RuleEngine();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace YakNet\AccessibilityConsole\Rules;
|
||||
|
||||
use YakNet\AccessibilityConsole\Core\AbstractRule;
|
||||
use YakNet\AccessibilityConsole\Core\Severity;
|
||||
use YakNet\AccessibilityConsole\Core\WCAGStandard;
|
||||
|
||||
class EmptyLinkRule extends AbstractRule
|
||||
{
|
||||
public function check(\DOMDocument $doc): array
|
||||
{
|
||||
$violations = [];
|
||||
$links = $doc->getElementsByTagName('a');
|
||||
|
||||
foreach ($links as $link) {
|
||||
if (trim($link->textContent) === '' && !$link->hasAttribute('aria-label')) {
|
||||
$violations[] = $this->createViolation(
|
||||
"Bağlantı (a) etiketi metin içermiyor ve 'aria-label' tanımlanmamış. Ekran okuyucular bu linkin nereye gittiğini anlayamaz.",
|
||||
$link
|
||||
);
|
||||
}
|
||||
}
|
||||
return $violations;
|
||||
}
|
||||
|
||||
public function getStandard(): WCAGStandard { return WCAGStandard::A; }
|
||||
public function getSeverity(): Severity { return Severity::CRITICAL; }
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace YakNet\AccessibilityConsole\Rules;
|
||||
|
||||
use YakNet\AccessibilityConsole\Core\AbstractRule;
|
||||
use YakNet\AccessibilityConsole\Core\Severity;
|
||||
use YakNet\AccessibilityConsole\Core\WCAGStandard;
|
||||
|
||||
class HeadingOrderRule extends AbstractRule
|
||||
{
|
||||
public function check(\DOMDocument $doc): array
|
||||
{
|
||||
$violations = [];
|
||||
$xpath = new \DOMXPath($doc);
|
||||
$headings = $xpath->query('//h1|//h2|//h3|//h4|//h5|//h6');
|
||||
|
||||
$lastLevel = 0;
|
||||
foreach ($headings as $h) {
|
||||
$level = (int)substr($h->tagName, 1);
|
||||
if ($lastLevel > 0 && $level > $lastLevel + 1) {
|
||||
$violations[] = $this->createViolation(
|
||||
"Başlık hiyerarşisi bozuk. H{$lastLevel} etiketinden doğrudan H{$level} etiketine geçiş yapılmış. Sıralı olmalıdır.",
|
||||
$h
|
||||
);
|
||||
}
|
||||
$lastLevel = $level;
|
||||
}
|
||||
return $violations;
|
||||
}
|
||||
|
||||
public function getStandard(): WCAGStandard { return WCAGStandard::A; }
|
||||
public function getSeverity(): Severity { return Severity::WARNING; }
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace YakNet\AccessibilityConsole\Rules;
|
||||
|
||||
use YakNet\AccessibilityConsole\Core\AbstractRule;
|
||||
use YakNet\AccessibilityConsole\Core\Severity;
|
||||
use YakNet\AccessibilityConsole\Core\WCAGStandard;
|
||||
|
||||
class ImageAltRule extends AbstractRule
|
||||
{
|
||||
public function check(\DOMDocument $doc): array
|
||||
{
|
||||
$violations = [];
|
||||
$images = $doc->getElementsByTagName('img');
|
||||
|
||||
foreach ($images as $img) {
|
||||
if (!$img->hasAttribute('alt') || trim($img->getAttribute('alt')) === '') {
|
||||
$violations[] = $this->createViolation(
|
||||
"Görüntü (img) etiketi 'alt' özniteliğine sahip değil veya boş. WCAG 1.1.1 uyarınca her görüntünün bir açıklaması olmalıdır.",
|
||||
$img
|
||||
);
|
||||
}
|
||||
}
|
||||
return $violations;
|
||||
}
|
||||
|
||||
public function getStandard(): WCAGStandard { return WCAGStandard::A; }
|
||||
public function getSeverity(): Severity { return Severity::CRITICAL; }
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace YakNet\AccessibilityConsole\Rules;
|
||||
|
||||
use YakNet\AccessibilityConsole\Core\RuleEngine;
|
||||
|
||||
class StrictRuleSet extends RuleEngine
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->addRule(new ImageAltRule());
|
||||
$this->addRule(new HeadingOrderRule());
|
||||
$this->addRule(new EmptyLinkRule());
|
||||
// Daha fazla kural buraya eklenebilir
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user