diff --git a/slides/dhbw/01_web_eng.md b/slides/dhbw/01_web_eng.md index 031c177..da914cc 100644 --- a/slides/dhbw/01_web_eng.md +++ b/slides/dhbw/01_web_eng.md @@ -9,48 +9,17 @@ title: Web Engineering --- @@ -62,7 +31,6 @@ a { # Web Engineering **DHBW Stuttgart** · Informatik / Wirtschaftsinformatik - **Sommersemester 2026** --- @@ -71,7 +39,7 @@ a { - **CODE CRISPIES** — [codecrispi.es](https://codecrispi.es/) - **Online Code-Editor** — [codepen.io](https://codepen.io/pen/) -- **MDN** (Mozilla Developer Network) — [developer.mozilla.org/de/](https://developer.mozilla.org/de/) +- **MDN** — [developer.mozilla.org](https://developer.mozilla.org/de/) - **Flexbox-Spiel** — [flexboxfroggy.com](https://flexboxfroggy.com/) - **Grid-Spiel** — [cssgridgarden.com](https://cssgridgarden.com/) @@ -89,229 +57,117 @@ a { ![bg right:33% fit](./assets/logos/collage.png) -**Michael Werner Czechowski** +Michael Czechowski -- Systems and Platform Engineer -- Schwerpunkte: - - Web-Technologien, Barriere-Armut, Open Source -- Hintergrund: - - Philosophie (Uni Stuttgart) - - Wirtschaftsinformatik (Leibniz-FH Hannover) -- Honorardozent (DHBW Stuttgart, HdM Stuttgart, Leibniz-FH) -- Kontakt: michael.czechowski@lehre.dhbw-stuttgart.de +- Software Engineer, ehemals freischaffend +- Lektor an HdM Stuttgart + DHBW +- librete.ch --- -# Vorlesungsplan +# Vorlesungsplan (Auszug) - - -
-
108.05.
Intro · Projektgruppen · Internet 101
-
215.05.
HTML und CSS (Frameworks)
-
322.05.
JS (Frameworks) und npm
-
429.05.
nodeJS: Scripting, Running, Building
-
505.06.
Express API, CRUD, Middlewares
-
612.06.
Projektwerkstattbericht
-
719.06.
Testing (Unit · Integration · E2E)
-
826.06.
TypeScript
-
903.07.
Docker · Proxies · DBs
-
1010.07.
Wrap-up & Projektsupport
-
1117.07.
Präsentation
-
+| Termin | Thema | +|--------|-------| +| 1 | Web Engineering (heute) | +| 2 | CSS Extended | +| 3 | Node.js Basics | +| 4 | Node.js Advanced | +| 5 | Testing | +| 6 | TypeScript | +| 7 | Docker | +| 8 | Best Practices | --- -# Prüfungsleistung – Übersicht +# Prüfungsleistung — 75 P + 10 Bonus -Eigenes Projekt: **Web-App** ODER **Backend** (API/CLI — Command-Line Interface). +**Projekt-Abgabe** statt Klausur. -**Grundanforderungen (75 Punkte)** - -| Punkte | Bereich | -|--------|---------| -| 20 | Idee, Konzeption, Planung | -| 5 | Plattformunabhängigkeit | -| 25 | Clean Code (KISS, SOLID, DI, Testing, Error Handling) | -| 15 | Präsentation | -| 10 | Dokumentation | - -**Zusatzpunkte (max. 10):** TypeScript, Docker, Dev/Prod-Parity, `.env`, npm-Publish, Domain, HTTPS, Responsive Design. +| Bereich | Punkte | +|---------|-------:| +| Projekt-Struktur + README | 10 | +| Code-Qualität | 15 | +| Git-Hygiene | 10 | +| Tests | 10 | +| Docker | 10 | +| HTTP / API | 10 | +| Frontend + A11y | 10 | +| Präsentation + Bonus | 5 + 10 | --- -# Prüfungsleistung – Idee & Konzeption (20 P.) + -- "Powerpoint"-Präsentation + Folien -- Aussagekräftiger Arbeitstitel + Beschreibung -- **Elevator Pitch** (max. 1 Min.) -- Repo-Link (GitHub / GitLab / Codeberg / BitBucket) -- **Logs**: wie hat sich Projekt verändert vs. Ursprungsidee? -- Schematischer Projektaufbau (UML o. Ä.) - ---- - -# Prüfungsleistung – Clean Code (25 P.) - -- `README.md` (clone, start, contribute) -- **KISS** – Keep It Simple, Stupid -- **SOLID:** - - **S**ingle Responsibility Principle - - **O**pen/Closed Principle - - **L**iskov Substitution Principle - - **I**nterface Segregation Principle - - **D**ependency Inversion Principle -- **DI** – Dependency Injection -- **Testing-Pyramide** (Unit, Integration, E2E) -- **Exception/Error Handling** - ---- - -# Prüfungsleistung – Abgabe & Termine - -- **Code-Upload:** bis 27.07. -- **Präsentation:** 17.07. (Gruppen, ~10 Min.) - -Details: https://librete.ch/DHBW/pruefungsleistung +# Kontext: was ist „das Web"? --- # Internet-Timeline -| Jahr | Meilenstein | -|------|-------------| -| **1966** | ARPANET-Projekt startet (DARPA) | -| **1969** | Erste Verbindung zwischen UCLA und Stanford | -| **1974** | TCP/IP-Protokoll entwickelt | -| **1989** | Tim Berners-Lee erfindet das WWW (CERN) | -| **1993** | Mosaic — erster grafischer Browser | -| **1994** | W3C gegründet (HTML, CSS, SVG, WCAG) | -| **1995** | ECMAScript / JavaScript wird Standard | -| **2008** | V8 JavaScript Engine (Chrome / Node.js) | - ---- - - - - -![bg fit](./assets/arpanet.jpg) +| Jahr | Was | +|------|-----| +| 1969 | ARPANET — 4 Knoten | +| 1971 | Email (Ray Tomlinson, `@`) | +| 1983 | TCP/IP-Standard | +| **1989** | **WWW** (Berners-Lee, CERN) | +| 1993 | Mosaic-Browser → Web wird populär | --- # Das WWW (1989) -**Tim Berners-Lee** am **CERN** (Genf) +**Tim Berners-Lee am CERN.** Drei Standards: -**Problem:** Wissenschaftler:innen können Forschungsdokumente nicht verlinken — Inkompatible Systeme, kein gemeinsames Format. +- **HTTP** — Protokoll +- **HTML** — Format +- **URL** — Adresse -**Lösung — drei Bausteine:** - -- **HTML** — Auszeichnungssprache für Dokumente -- **HTTP** — Protokoll zur Übertragung -- **URL** — eindeutige Adressen - -**1991:** erste Webseite geht online · 1993 vom CERN gemeinfrei freigegeben. - -→ WWW ≠ Internet. Das WWW ist eine **Anwendung auf** dem Internet. +Patentfrei → Web konnte explodieren. --- - - +# Heute: physische Infrastruktur -![bg fit](./assets/mosaic.jpg) +- ~400 Unterseekabel +- 1,3 Mio km Glasfaser weltweit +- DE-CIX Frankfurt: größter Internet-Knoten (~12 Tbit/s) + +Das Web ist **physisch.** --- - - +# URL → Pixel in 7 Schritten -![bg cover](./assets/img_633d7b91366e0-1025x538-768x403.jpg) +1. **URL parsen** — Schema, Host, Port, Path +2. **DNS-Lookup** — Host-Name → IP +3. **TCP-Handshake** mit Server +4. **TLS-Handshake** (https) +5. **HTTP-Request** senden +6. Server antwortet mit **HTML + CSS + JS** +7. Browser **parsed + rendert** → Pixel --- -# Heute: Physische Infrastruktur +# HTTP — Anatomie -- **5,5 Milliarden** Menschen online -- **> 400 Unterseekabel**, ca. **1,3 Mio. km** Glasfaser -- Daten reisen mit **Lichtgeschwindigkeit** -- Latenz Frankfurt — New York: ~80 ms +```http +GET /index.html HTTP/1.1 +Host: librete.ch +User-Agent: Mozilla/5.0 ... -→ Keine "Cloud" ohne Kabel. Das Internet ist **physische** Infrastruktur — und damit angreifbar. - -**Geopolitik:** Five-Eyes-Allianz (USA, UK, CA, AU, NZ) zapft Unterseekabel ab (Programm "Tempora", aufgedeckt 2013 durch Snowden). DE ist Teil der Fourteen Eyes. - ---- - - - - -![bg fit](./assets/demos/browser-server-sequence.png) - - ---- - -# HTTP – Hypertext Transfer Protocol - -**Request:** -``` -GET /products HTTP/1.1 -Host: localhost:8080 -``` - -**Response:** -``` HTTP/1.1 200 OK -Content-Type: application/json +Content-Type: text/html +Content-Length: 1234 -[{"id": 1, "name": "Produkt A"}, ...] +... ``` +**Statuscodes:** 200 OK · 301 Moved · 404 Not Found · 500 Server Error + --- - - - + # Onboarding ## Tools, Runtimes, Workflows @@ -320,1190 +176,511 @@ Content-Type: application/json # Werkzeuge & Betriebssystem -**Erforderliche Werkzeuge:** -- **Terminal** (zsh / bash / fish / pwsh) — Kommandozeile -- **Editor** (siehe folgende Folie) -- **JavaScript-Runtime** (Node.js / Bun / Deno) -- **Browser mit DevTools** (Chromium / Firefox / Safari) -- **Git** — verteiltes Versionskontrollsystem (Stand der Industrie) - -**OS-Empfehlung:** - -| OS | Status | -|----|--------| -| **macOS** | First-class, viele Tools "just work" | -| **Linux** | First-class, beste Server-Parität | -| **Windows + WSL2** | Empfohlen — Windows-CLI hat Edge Cases | -| **Windows nativ** (PowerShell) | Funktioniert, aber holpriger Pfad | +| Bereich | Empfehlung | +|---------|------------| +| Editor | **VS Code** · JetBrains (edu lizenz frei) | +| Browser | **Chromium / Firefox** | +| Terminal | macOS Terminal · Linux Terminal · Windows Terminal | +| Paket-Manager | macOS: brew · Linux: apt/dnf · Windows: winget/scoop/choco | +| Versions-Control | Git + GitHub/Gitea | --- -# Node.js installieren – macOS +# Node.js installieren -Empfohlen: **LTS** (aktuell **Node.js 24** — Stand 2026). +**Best Practice:** Versions-Manager statt Direkt-Install. -Paketmanager: **[Homebrew](https://brew.sh)** +| OS | Empfehlung | +|----|------------| +| macOS | `brew install fnm` → `fnm install --lts` | +| Linux | `curl -fsSL https://fnm.vercel.app/install \| bash` | +| Windows | `winget install Schniz.fnm` | -```bash -# Homebrew installieren (falls nicht vorhanden) -/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - -# Node.js LTS installieren -brew install node@24 - -# Version prüfen -node --version -npm --version -``` - -Alternative: Installer von [nodejs.org](https://nodejs.org) +**Aktuelle LTS:** Node 24. --- -# Node.js installieren – Linux +# Warum Versions-Manager? -Empfohlen: **LTS** (aktuell **Node.js 24**). +**Direkt-Install** (z.B. `brew install node`) bringt Probleme: +- Projekt-A braucht Node 18, Projekt-B braucht Node 22 → Konflikt +- Update bricht alte Projekte +- Kein automatisches Switching pro Projekt -**Debian / Ubuntu** ([NodeSource](https://github.com/nodesource/distributions)): -```bash -curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - -sudo apt install -y nodejs -``` - -**Arch / Manjaro:** -```bash -sudo pacman -S nodejs npm -``` - -**Fedora / RHEL:** -```bash -sudo dnf module install nodejs:24/common -``` - -→ Distro-Pakete sind oft **veraltet**. Versionsmanager (folgende Folie) bevorzugen. - ---- - -# Node.js installieren – Windows - -Empfohlen: **LTS** (aktuell **Node.js 24**). - -**Option 1: winget** (empfohlen, Win 10/11): -```powershell -winget install OpenJS.NodeJS.LTS -``` - -**Option 2: Chocolatey** ([chocolatey.org](https://chocolatey.org)): -```powershell -choco install nodejs-lts -``` - -**Option 3: Scoop** ([scoop.sh](https://scoop.sh)): -```powershell -scoop install nodejs-lts -``` - -**Option 4:** Installer von [nodejs.org](https://nodejs.org) - -→ **Empfehlung:** WSL2 + Linux-Workflow nutzen. - ---- - -# Direkt-Install: Wenn es eng wird - -**Typisches Szenario** — drei parallele Projekte mit unterschiedlichen Anforderungen: - -| Projekt | Stack | Node-Version | -|---------|-------|--------------| -| Praktikums-API | Express (Legacy) | 18.x (LTS Hydrogen) | -| Studienarbeit | Next.js 15 | 22.x (LTS Jod) | -| Aktuelles Lab-Projekt | neueste Features | 24.x (Iron, current LTS) | - -System-Install kennt nur **eine** Node-Version global → Konflikt. - ---- - -# Symptome im Alltag - -- `npm install` bricht mit `engines`-Warning ab -- native Module (z. B. `node-sass`) bauen nicht -- CI-Pipeline ist grün, lokal rot — oder umgekehrt -- erheblicher Zeitverlust beim Debuggen von Versions-Konflikten - -→ Lösung: **Versionsmanager** und Node-Version pro Projekt pinnen. - ---- - -# Node-Versionsmanager - -Verschiedene Projekte brauchen oft verschiedene Node-Versionen. **Lösung:** Versionsmanager. - -| Tool | Sprache | Geschwindigkeit | Plattform | -|------|---------|-----------------|-----------| -| **nvm** | Bash | langsam (Shell-Funktion) | macOS, Linux | -| **fnm** | Rust | sehr schnell | macOS, Linux, Windows | -| **asdf** | Bash | mittel, multi-language | macOS, Linux | -| **volta** | Rust | schnell, pinning per `package.json` | alle | - -```bash -# fnm -curl -fsSL https://fnm.vercel.app/install | bash -fnm install --lts # aktuell Node 24 -fnm use lts-latest - -# .nvmrc / .node-version automatisch -echo "lts/*" > .nvmrc -fnm use # liest .nvmrc -``` +**fnm / nvm / volta:** pro Projekt Node-Version, automatisch via `.nvmrc`. --- # Alternative Runtimes -| Runtime | Erschienen | Engine | USP | -|---------|------------|--------|-----| -| **Node.js** | 2009 | V8 (C++) | Standard, größtes Ökosystem | -| **Deno** | 2020 | V8 (Rust) | Sicherheit, TypeScript nativ, Std-Lib | -| **Bun** | 2022 | JavaScriptCore (Zig) | Geschwindigkeit, all-in-one | +| Runtime | Stärke | +|---------|--------| +| **Node** | Standard, größtes Ökosystem | +| **Deno** | Sicher by default, TypeScript nativ | +| **Bun** | Schnell, all-in-one (runtime + bundler + tester) | -```bash -# Deno -curl -fsSL https://deno.land/install.sh | sh -deno run main.ts - -# Bun -curl -fsSL https://bun.sh/install | bash -bun install -bun run dev -``` - -→ Im Kurs primär **Node.js**. Bun und Deno sind ebenfalls zulässig. - ---- - -# Editor - -- **VS Code** (empfohlen) — kostenlos, große Plugin-Auswahl -- **JetBrains WebStorm** — sehr mächtig, kostenpflichtig - - kostenlos für Studierende via [JetBrains Education](https://www.jetbrains.com/community/education/#students) -- **Vim / Neovim / Emacs** — für CLI-Profis -- **Zed** — modern, schnell +Für DHBW-Kurs: **Node 24 LTS.** --- # Browser DevTools -Chromium / Firefox / Safari — `F12` oder `Cmd+Opt+I` +**F12** öffnet das Power-Tool jeder Webentwicklung. -Chromium = Open-Source-Basis von Chrome, Edge, Brave, Opera, Vivaldi etc. - -**Wichtigste Panels:** -- **Network** — HTTP-Requests, Responses, Timing -- **Console** — `console.log`, JS-Errors, REPL -- **Elements** — DOM-Inspektor, Live-CSS-Editor -- **Sources** — Debugger, Breakpoints, Source-Maps -- **Performance** — Profiling, Frame-Rate, FPS -- **Application** — LocalStorage, Cookies, Service Workers +| Tab | Wofür | +|-----|-------| +| Elements | DOM-Baum inspizieren + live editieren | +| Console | JS ausführen, Errors lesen | +| Network | HTTP-Requests sehen, Latenz | +| Performance | Render + Memory profilen | +| Lighthouse | A11y · SEO · Perf-Audit | --- # HTTP-Clients -- **Bruno** ([usebruno.com](https://usebruno.com)) — open source, git-friendly -- **Hoppscotch** ([hoppscotch.io](https://hoppscotch.io)) — open source, browser-basiert (vormals Postwoman) -- **Insomnia** / **Postman** — etabliert, freemium -- **curl** / **httpie** — CLI (Command-Line Interface, scriptbar) +Tools zum Testen von APIs: + +- **curl** — CLI, überall +- **Hoppscotch** — Browser, Open Source +- **Postman** — GUI, kommerziell +- **VS Code REST Client** — Plugin --- -# Git Setup & Workflow +# Git Setup -**Einmalige Konfiguration:** -```bash -git config --global user.name "Vorname Nachname" -git config --global user.email "vorname.nachname@example.com" +```sh +git config --global user.name "Dein Name" +git config --global user.email "du@dhbw.de" git config --global init.defaultBranch main -git config --global pull.rebase true +git config --global core.autocrlf input # Windows: true ``` -**SSH-Key für GitHub/GitLab:** -```bash -ssh-keygen -t ed25519 -C "vorname.nachname@example.com" -cat ~/.ssh/id_ed25519.pub # → in GitHub-Settings einfügen -``` - -**Tägliche Befehle:** -```bash -git status # was hat sich geändert? -git add # für Commit vormerken -git commit -m "feat: ..." # Conventional Commits -git push # hochladen -git pull --rebase # neueste Änderungen holen +**SSH-Key** für GitHub/Gitea ohne Passwort-Prompt: +```sh +ssh-keygen -t ed25519 -C "du@dhbw.de" +cat ~/.ssh/id_ed25519.pub # zu GitHub kopieren ``` --- # Projekt-Skeleton -```bash -mkdir mein-projekt && cd mein-projekt -git init -npm init -y # erzeugt package.json -echo "node_modules" > .gitignore -echo ".env" >> .gitignore -npm install express ``` - -**`package.json` minimal:** -```json -{ - "name": "mein-projekt", - "version": "0.1.0", - "type": "module", - "scripts": { - "start": "node index.js", - "dev": "node --watch index.js" - } -} +mein-projekt/ +├── .git/ +├── .gitignore # node_modules/, .env, build/ +├── README.md # was, wie, warum +├── package.json # npm metadata + scripts +├── src/ # eigener Code +├── public/ # statische Assets (für Web) +├── tests/ # Unit + Integration +└── Dockerfile # für Container-Deploy ``` -`.env` für Secrets (nie committen!), `.env.example` mit Dummy-Werten committen. - --- - - - + -# HTML – Hypertext Markup Language +# HTML +## Hypertext Markup Language --- -# Was ist HTML? (1/2) +# Was ist HTML? -**H**yper**T**ext **M**arkup **L**anguage +**Tim Berners-Lee, 1989.** Struktur-Format des Webs. -- **Keine** Programmiersprache -- Am ehesten eine Formattierungssprache -- Beschreibt **Struktur und Aufbau** einer Webseite +**Syntax:** Tags mit Attributen umfassen Inhalt. +**Browser parst HTML** → DOM (Document Object Model) → rendert. + +Plain-Text mit Tags. Lesbar mit jedem Editor. + +--- + +# HTML-Anatomie ```html -

Das ist ein Absatz.

- +Mein Link ``` -Erfunden 1989 von Tim Berners-Lee. Aktuelle Version: HTML5 (seit 2014). +- `` — Closing-Tag +- Alles zusammen = **Element** --- -# Was ist HTML? (2/2) - -- Mit HTML werden **HTML-Dokumente** beschrieben (`index.html`) -- Ein HTML-Dokument beschreibt das **Document Object Model (DOM)** -- Der DOM ist eine **hierarchische Baumstruktur** (Eltern, Kinder, Geschwister) - - *parent* nodes / elements - - *child* nodes / elements - - *sibling* nodes / elements - -In HTML sprechen wir von **Elementen**, in JavaScript eher von **Nodes**. - ---- - -# HTML-Anatomie (1/2) - -``` - Opening tag Closing tag - │ │ - ▼ ▼ -

My cat is very grumpy

- └────────┬─────────┘ - Content - └─────────────────────────────────┘ - Element -``` - -- **Opening tag** + **Content** + **Closing tag** = **Element** -- Öffnende und schließende Tags müssen identisch sein -- Schließendes Tag hat ein `/` nach der Spitzklammer - ---- - -# HTML-Anatomie — Attribute - -``` - Attribute - ┌───────────────┐ -

My cat is very grumpy

-``` - -- **Attribute** stehen im opening tag -- Format: `name="wert"` (Anführungszeichen empfohlen) -- Mehrere Attribute durch Leerzeichen getrennt: `` - ---- - -# HTML-Anatomie (2/2) - -Wir unterscheiden **umschließende** und **selbst-schließende** Tags. - -**Umschließend:** -- ` ... ` – fett-gedruckter Text (inline) -- ` ... ` – Hyperlink -- ` ... ` – sichtbarer Teil eines HTML-Dokuments -- `
...
` – Aufklapp-Text / Akkordion - -**Selbst-schließend:** -- `` – Bild, Vektorgrafik -- `` – Eingabefeld -- `` – Metadaten - ---- - -# Darstellungsebene und Metadaten +# Self-closing Tags ```html - - - METADATEN - - - DARSTELLUNGSEBENE - - +Sonnenuntergang +
+ + + ``` -Ein HTML-Dokument besteht aus zwei Teilen: -- ` ... ` – Metadaten für Browser, Suchmaschinen, Social Sharing -- ` ... ` – darzustellender Inhalt, Text, Formulare +Kein Closing-Tag. Inhalt aus Attributen + (für ``) User-Eingabe. --- -# HTML Metadaten - -```html - - - DHBW Stuttgart - - - - ... - -``` - -*Webseiten besuchen nicht nur Menschen, sondern auch Suchmaschinen, Bots, Screen-Reader. Metadaten helfen beim "Verstehen" der Inhalte.* - ---- - -# HTML Metadaten – Vertiefung - -| Tag | Funktion | -|-----|----------| -| `` | Browser-Tab, Suchergebnis-Titel | -| `<meta charset>` | Zeichenkodierung (Umlaute!) | -| `<meta viewport>` | Mobile Darstellung | -| `<meta description>` | Suchergebnis-Snippet (max 160 Zeichen) | - -**Open Graph** (Social-Media-Vorschau): -```html -<meta property="og:title" content="Artikel-Titel"> -<meta property="og:image" content="https://example.com/preview.jpg"> -``` - -→ Wirkt auf Mastodon, LinkedIn, Signal, Slack, MS Teams ... - -**SEO:** Google nutzt `<title>` + `<meta description>` für Ranking + Snippet. - ---- - -# HTML-Tags und Attribute - -![bg right:35%](./assets/demos/tag-attribut.png) - -```html -<body> - <p class="wichtig">Das ist ein wichtiger Absatz.</p> - <p>Das ist ein gewöhnlicher Absatz.</p> -</body> -``` - -| Teil | Bezeichnung | -|------|-------------| -| `<p>` | Opening Tag | -| `class="wichtig"` | Attribut | -| `Das ist ein wichtiger Absatz.` | Inhalt | -| `</p>` | Closing Tag | - ---- - -# HTML-Tags und Attribute (selbst-schließend) - -![bg right:35%](./assets/demos/input-date.png) - -```html -Geburtsdatum <input type="date" /> -``` - -| Teil | Bezeichnung | -|------|-------------| -| `<input ...` | Eingabefeld | -| `type="date"` | Attribut *type* mit Wert *date* | -| `... />` | Schließendes `/` im (öffnenden) Tag | - ---- - -# Vollständiges Grundgerüst - -![bg right:35%](./assets/demos/grundgeruest.png) +# Document-Grundgerüst ```html <!DOCTYPE html> <html lang="de"> <head> - <title>Portfolio von ... - - + + + Meine Seite + -

Hallo Welt!

-

Das ist mein erster Absatz.

+

Hallo Welt

``` --- -# Die wichtigsten Tags +# Semantische HTML-Tags | Tag | Bedeutung | |-----|-----------| -| `

` … `

` | Überschriften (h1 = größte) | -| `

` | Absatz (Paragraph) | -| ` ... ` | Hyperlink | -| `` | Bild | -| `