# Leitfaden für die Dokumentation der PHP-Klassenbibliothek 🥋✨

Dieses Dokument dient als zentrale Wissensbasis für Entwickler und KIs, die Dokumentationen im Verzeichnis `/harddisk/server/web/apps/dokumentation/server/` erstellen, aktualisieren oder überprüfen. Es fasst alle Konventionen, Architekturprinzipien, Formatierungsregeln und CSS/JS-Besonderheiten von **Daniel-san** zusammen.

---

## 1. Grundlegende Arbeitsregeln 🛡️

1. **Keine privaten Methoden oder Eigenschaften:**
   * In die Dokumentation gehören **ausschließlich** öffentliche Klassenmitglieder (`public`-Methoden, statische `public`-Funktionen, `public const` und Eigenschaften, die über die magische Methode `__get()` öffentlich abfragbar sind).
   * Private Methoden (z. B. interne Helfer wie `convertDbTable()`, `where()`, `getLoginArray()`) und interne Eigenschaften (z. B. `$loginArray`, `$mySqli`) dürfen **niemals** in der Dokumentation auftauchen!
2. **Keine unaufgeforderten Git-Befehle:**
   * Git wird ausschließlich von Daniel-san selbst gesteuert.
   * Keine Commits, Status-Checks oder Branch-Änderungen über automatisierte Skripte/CLI ohne explizite Aufforderung.
3. **Vorlage-Dateien:**
   * Die Datei `_VORLAGE.php` im Hauptverzeichnis ist veraltet und wird **ignoriert**.
   * Die primären Vorzeige- und Referenzdateien sind die aktuellen Klassen im Ordner `server/`, insbesondere [`db.class.php`](file:///harddisk/server/web/apps/dokumentation/server/db.class.php) und [`stream.class.php`](file:///harddisk/server/web/apps/dokumentation/server/stream.class.php).
4. **Pfade der Quellcodes:**
   * Die originalen PHP-Klassen liegen in `/harddisk/server/web/core/build/src/<name>.class.php`.
   * Bei jedem Abgleich muss der echte Quellcode als Referenz herangezogen werden.
5. **Kein `<nav>`-Element im Header:**
   * Der Index-Link `<a href="index.php">Index</a>` gehört **ausschließlich** ganz oben in die fixierte `<aside>`-Sidebar.
   * Ältere Vorlagen mit `<nav><a href="index.php">Index</a></nav>` im Kopfbereich sind veraltet und dürfen nicht mehr verwendet werden.
6. **Status-Tracking in `index.php`:**
   * In [`index.php`](file:///harddisk/server/web/apps/dokumentation/server/index.php) kennzeichnet `style="color: red"` unfertige, fehlende oder noch zu überarbeitende Dokumentationsdateien.
   * Sobald eine Klassendokumentation vollständig nach diesem Leitfaden erstellt oder modernisiert wurde, wird das rote Styling im Index entfernt.

---

## 2. Seiten-Architektur & HTML-Grundgerüst 📐

Jede Klassendokumentation ist eine eigenständige PHP/HTML-Datei und besitzt exakt folgende Gliederung:

```html
<!DOCTYPE html>
<html lang="de">
<?php include '../content/html/head.html'; ?>
<body>

<header>
  <h2>Klassenname - (dateiname.class.php)</h2>
</header>

<main>
  <!-- 1. Konstanten (falls vorhanden) -->
  <!-- 2. Objekt-Eigenschaften & magische Methoden (<article>) -->
  <!-- 3. Reguläre Objektmethoden -->
  <!-- 4. Statische Methoden (<section>) -->
</main>

<aside>
  <a href="index.php">Index</a>
  <h4>new klassenname()</h4>
  <ul>
    <li><a href="#__construct">__construct</a></li>
    <!-- Methoden-Sprungmarken -->
  </ul>
  <h4>Statisch</h4>
  <ul>
    <li><a href="#statischeMethode">klasse::statischeMethode</a></li>
  </ul>
</aside>

<?php include '../content/html/footer.html'; ?>
</body>
</html>
```

* **Sidebar-Layout:**
  * Das `<aside>`-Element ist rechts fixiert (`position: fixed; right: 0; width: 300px; height: 100vh; overflow-y: auto;`).
  * `<main>` hält mit `margin-right: 300px;` sauber Abstand zur Sidebar.
  * In der Sidebar werden alle Methoden mit Anker-Links (`<a href="#methodenName">`) aufgelistet.
* **Thematische Unterteilung mit `<h3>`-Zwischenüberschriften:**
  * Wenn eine Klasse viele Methoden besitzt oder sich Methoden in logische Gruppen unterteilen lassen (z. B. *Operationen*, *Mengenbeziehungen*, *Grundrechenarten*, *Darstellung*), werden passende `<h3>`-Zwischenüberschriften innerhalb von `<article>` (bzw. vor den jeweiligen `<section>`-Blöcken) platziert.
  * Diese `<h3>`-Überschriften im Inhaltsbereich spiegeln 1:1 die jeweiligen `<h4>`-Kategorien in der Sidebar wider und verbessern die Orientierung im Dokument erheblich.
* **Reine statische Utility-Klassen (z. B. `math`, `time\calendar`):**
  * Besitzt eine Klasse ausschließlich statische Methoden (kein Konstruktor, keine Instanziierung mit `new`, keine Objekteigenschaften), entfällt der `<article>`-Block und das `<h3>new klasse() - Object</h3>` vollständig.
  * Alle `<section>`-Methodenblöcke liegen direkt innerhalb von `<main>`, übersichtlich gruppiert nach thematischen `<h3>`-Zwischenüberschriften.
  * In der Sidebar entfällt `<h4>new klassenname()</h4>` und `<h4>Statisch</h4>`. Stattdessen spiegeln die `<h4>`-Kategorien direkt die thematischen Überschriften wider (z. B. `<h4>Kalender &amp; Datum</h4>`).
* **Namespaces in Header, Signatur & Sidebar:**
  * **Header:** Vollständige Angabe des Namespace im Dateititel, z. B. `<h2>Kalender - (time\calendar.class.php)</h2>`.
  * **Signatur:** Voll qualifizierter statischer Klassenaufruf in der Signatur: `<code class="select">static time\calendar::getEasterDate (...)</code>`.
  * **Sidebar:** Um Platz in der 300px breiten Sidebar zu sparen und Zeilenumbrüche zu vermeiden, wird der Namespace im Linktext weggelassen: `calendar::getEasterDate` bzw. bei Objektmethoden nur der Methodenname wie `add`.

---

## 3. Dokumentation von Konstanten & Eigenschaften 📋

### A. Konstanten
Konstanten stehen vor dem `<article>`-Block in einer Tabelle mit der Klasse `select`:

```html
<table class="select">
  <tr>
    <td><code>CONST MAXMULTIQUERY <b>= 30</b></code></td>
    <td>maximale Anfragen an die Datenbank</td>
  </tr>
  <tr>
    <td><code>CONST CHARSETDEFAULT <b>= 'utf8'</b></code></td>
    <td>Standard Charset</td>
  </tr>
</table>
```

### B. Eigenschaften (`new Class() - Object`)
Eigenschaften werden innerhalb des `<article>`-Blocks in einer `<table class="select">` definiert:
* **Schreibgeschützt / Read-Only (🔒):**
  `<code class="safe">$string db <b>= null</b></code>`
  *(Das CSS erzeugt über `code.safe::after` automatisch das Schloss-Symbol `\1F512`.)*
* **Persistiert / Gespeichert (💾):**
  `<code class="save">...</code>`
  *(Das CSS erzeugt über `code.save::after` automatisch das Disketten-Symbol `\1F4BE`.)*
* **Schreibbar (via `__set`):**
  `<code>$string table <b>= null</b></code>` (ohne `safe`-Klasse).

> [!IMPORTANT]
> **Nur echte Properties dokumentieren:**
> Es dürfen nur Eigenschaften aufgeführt werden, die in `__get()` tatsächlich als Property existieren. Reine Hilfsmethoden wie `isValid(): bool` gehören **nicht** als Property `$bool valid` in diese Tabelle, sondern als eigene Methode!

### C. Komplexe Array-Eigenschaften & semantische Tags
Wenn eine Eigenschaft ein assoziatives Array kapselt (z. B. `$specification` in `db.class.php`, `$language` in `lang.class.php` oder `$description` in `charset.class.php`), wird dessen Struktur nicht als Fließtext gequetscht, sondern als sauberer mehrzeiliger Block mit `<br>` unter der Beschreibung formatiert:

```html
<tr>
  <td><code class="safe">$array language <b>= null</b></code></td>
  <td>assoziatives Array mit Sprachübersetzungen aus der XML-Definition<br><code><array>[<br>'de' => <string>'Deutsch'</string>,<br>'en' => <string>'German'</string>,<br>'context' => <string>'language name'</string><br>]</array></code></td>
</tr>
```

* **Strikte Nutzung von `<array>` und `<string>`:** Der gesamte Array-Block muss zwingend in `<array>[ ... ]</array>` gewickelt werden (Lila: `#6f0193`). Alle String-Werte müssen in `<string>'...'</string>` stehen (Grün: `#008705`).
* **Keine unformatierten `<code>`-Tags:** Nackte `<code>['a' => 'b']</code>`-Tags ohne semantische Tags werden vom CSS nicht gefärbt und bleiben dunkelgrau. Auch in `<div>`- oder `<td>`-Texten müssen Code-Snippets entweder vollständig semantisch gewickelt sein (`<code><array>[<string>'wert'</string>]</array></code>`) oder im Fließtext schlicht als Fettdruck stehen (`<b>'wert'</b>`).

---

## 4. Dokumentation von Methoden (`<section id="...">`) ⚙️

Jede Methode erhält eine eigene `<section>` mit eindeutiger ID:

```html
<section id="methodenName">
  <code class="select">methodenName ($typ $param[, $typ $optional = default])</code>

  <table>
    <tr>
      <td><code>$param</code></td>
      <td>Beschreibung des Parameters; Pflicht</td>
    </tr>
    <tr>
      <td><code>$optional</code></td>
      <td>optional; Beschreibung des optionalen Parameters</td>
    </tr>
  </table>

  <div>gibt <b>true</b> bei Erfolg zurück; im Fehlerfall <b>null</b></div>

  <code>
    <var>$obj</var> = <func>new klasse()</func>;<br>
    <func>$obj->methodenName(<string>'wert'</string>)</func>;
  </code>
</section>
```

---

## 5. Die BNF-Klammerkonvention für Parameter 🔤

In den Signaturen (`<code class="select">`) gilt eine strikte Regel für eckige Klammern:

1. **Ohne eckige Klammern = Pflichtparameter:**
   * Parameter, die beim Aufruf zwingend erforderlich sind, stehen frei ohne eckige Klammern:
     `createRow ($array $values = null)`
     `real_escape_string ($string $numeric $value = null)`
2. **In eckigen Klammern `[, ...]` = Optionale Parameter:**
   * Parameter, die weggelassen werden können, werden in eckige Klammern gefasst.
3. **Verschachtelte Klammern bei stufenweiser Optionalität:**
   * Wenn Parameter 2 nur übergeben werden kann, wenn Parameter 1 gesetzt ist:
     `createCol ($string $column = null[, $string $setup = null[, $string $after = null]])`
4. **Spezialfälle / Mehrere Pflicht-Inputs (`getRow`):**
   * Wenn ein Aufruf in der Praxis beide Parameter benötigt (z. B. SQL-Logik `SELECT` gefolgt von `WHERE`), werden keine eckigen Klammern gesetzt, um Syntax-Verwirrung zu vermeiden:
     `getRow ($array $string $select = null, $array $string $where = null)`

---

## 6. Der CSS/JS-Kindselektor-Trick (`<span>`) 💡

### Problem
In `global.js` durchsucht ein Skript alle Elemente mit der Klasse `.select` und ersetzt Schlüsselwörter (wie `$string`, `$array`, `$bool`, `static`, `public`) automatisch durch:
* `<span class="type">$string</span>` (Datentyp)
* `<span class="status">static</span>` (Sichtbarkeit/Modifikator)

Wenn nun ein **Variablenname** oder ein **Methodenname** zufällig genauso heißt wie ein Typ oder Status-Wort (z. B. die Variable `$string` oder die Methode `static`), würde das JS auch den Namen als Typ/Status einfärben!

### Die Lösung
In `global.css` greifen die Formatierungsregeln mit dem **direkten Kind-Selektor** (`>`):
```css
code > span.type {
  color: var(--textColor4); /* Blau für Typen */
}

code > span.status {
  color: var(--textColor5); /* Rot für Status/Sichtbarkeit */
}
```

Wickelt man den Variablennamen oder Methodennamen im HTML in ein neutrales `<span>`:

**1. Für Datentypen (`<span class="type">` – Blau wird verhindert):**
```html
<code class="select">beispiel ($string <span>$string</span> <b>= null</b>)</code>
```
Macht `global.js` daraus:
```html
<code>... <span><span class="type">$string</span></span> ...</code>
```
Dadurch ist `<span class="type">` kein *direktes* Kind von `<code>` mehr. Die Typ-Farbe greift **nicht**, und der Variablenname behält seine normale goldene Textfarbe!

**2. Für Modifikatoren / Status (`<span class="status">` – Rot wird verhindert):**
```html
<code class="select">static doc::<span>static</span> ([$bool $new <b>= null</b>])</code>
```
Macht `global.js` daraus:
```html
<code>... <span><span class="status">static</span></span> ...</code>
```
Dadurch ist `<span class="status">` kein *direktes* Kind von `<code>` mehr. Die Status-Farbe greift **nicht**, und der Methodenname behält seine normale goldene Textfarbe!

> [!TIP]
> **Bevorzugte Lösung (Weg A):**
> Am besten werden Kollisionen von vornherein durch **sprechende Parameternamen** vermieden (z. B. `$numbers`, `$elements`, `$items`, `$value`, `$data`, `$other` statt `$array` oder `$string`). So liest sich die Dokumentation natürlicher, und es sind keine zusätzlichen `<span>`-Elemente nötig!
>
> **Die vollständige Keyword-Blacklist aus `global.js`:**
> * **Typen (`selectVar`):** `CONST`, `$string`, `$integer`, `$numeric`, `$float`, `$array`, `$mixed`, `$object`, `$func`, `$bool`, `$resource`
> * **Modifikatoren (`selectStatus`):** `public`, `protected`, `private`, `static`
>
> Diese Bezeichner dürfen niemals als alleiniger Variablenname verwendet werden, da sie sonst von `global.js` automatisch als Typ oder Modifikator eingefärbt werden.

---

## 7. Semantische Highlighting-Tags in Beispielen & Tabellen 🎨

In Codeblöcken (`<code>`) innerhalb von `<section>`, Tabellenzellen (`<td>`) und Beschreibungen (`<div>`) wird kein externes Highlighting verwendet, sondern semantische Custom-Tags:

| Tag | Bedeutung | Farbe / Stil | Beispiel |
| :--- | :--- | :--- | :--- |
| `<var>` | Variablen | Orange (`#dd7000`) | `<var>$db</var>` |
| `<func>` | Funktionen / Methoden | Gold / Ocker (`#a58100`) | `<func>query()</func>` |
| `<string>` | Zeichenketten | Grün (`#008705`) | `<string>'test'</string>` |
| `<array>` | Arrays / Indizes | Lila (`#6f0193`) | `<array>['a' => 1]</array>` |
| `<num>` | Zahlenwerte | Blau (`#0006c9`) | `<num>42</num>` |
| `<const>` | Konstanten | Dunkelrot (`#870000`) | `<const>MAXMULTIQUERY</const>` |
| `<object>` | Objekte | Rot (`#db201d`) | `<object>new db()</object>` |
| `<com>` | Kommentare | Grau (`#9d9d9d`) | `<com>// Hinweis</com>` |

---

## 8. Typografie & Sprachstandard ✍️

* **Standard statt Standart:**
  * Immer das korrekte deutsche Wort **Standard** (mit 'd') verwenden (z. B. Standard-Charset, Standard-Datenbank).
* **Einrückung:**
  * Konsequent **2 Leerzeichen** im Code und HTML.
* **Verlinkungen:**
  * Referenzen zu anderen Klassen werden relativ verlinkt:
    `<a href="mime.class.php" target="_blank">new mime()</a>`
* **Native PHP-Klassen & Interfaces:**
  * Werden native PHP-Klassen (`\DateTime`, `\ArrayIterator`) oder Interfaces (`\Countable`, `\IteratorAggregate`) verwendet, werden sie in der Methodenbeschreibung sauber zu php.net verlinkt (z. B. `<a href="https://www.php.net/manual/de/class.datetime.php" target="_blank">new DateTime</a>`).
  * In der Methodenbeschreibung wird explizit erwähnt, welches Sprach-Feature freigeschaltet wird (z. B. *„implementiert \Countable; ermöglicht auch count($set)“* oder *„implementiert \IteratorAggregate; ermöglicht direkt foreach ($set as $item)“*).

---

*Zusammenfassung erstellt am 24. September 2026. Möge die Dokumentation stets präzise, elegant und synchron zum Code sein! 🥋🌸*
