it-praxisportal/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html

429 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kapitel G08: Textverarbeitung & Strings in Python</title>
<link rel="stylesheet" href="../../assets/style.css">
</head>
<body>
<div class="app-layout">
<aside class="app-sidebar">
<div class="sidebar-header">
<a href="../../index.html" class="sidebar-brand-link">
<div class="sidebar-logo">🐍</div>
<div>
<div class="sidebar-title">Python Portal</div>
<div class="sidebar-subtitle">Lernplattform</div>
</div>
</a>
</div>
<div class="sidebar-quick-nav">
<a href="../../index.html" class="sidebar-link">🏠 Startseite</a>
<a href="../../index.html#tutorial" class="sidebar-link">📖 Tutorial &amp; Workflow</a>
<a href="../../index.html#zertifikate" class="sidebar-link">🏆 Zertifikate</a>
</div>
<div class="sidebar-nav">
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🌱 1. Grundlagen</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">G01–G10</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧮</span>
<span class="sidebar-link-text">G01. Taschenrechner</span>
</a>
<a href="../../lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">📦</span>
<span class="sidebar-link-text">G02. Variablen & Typen</span>
</a>
<a href="../../lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💬</span>
<span class="sidebar-link-text">G03. Ein- & Ausgabe</span>
</a>
<a href="../../lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🚦</span>
<span class="sidebar-link-text">G04. Bedingungen (if)</span>
</a>
<a href="../../lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎡</span>
<span class="sidebar-link-text">G05. Schleifen (for/while)</span>
</a>
<a href="../../lehrpfad_1_grundlagen/06_funktionen_und_module/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🪄</span>
<span class="sidebar-link-text">G06. Funktionen & Module</span>
</a>
<a href="../../lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">📋</span>
<span class="sidebar-link-text">G07. Listen & Sequenzen</span>
</a>
<a href="../../lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html" class="sidebar-link active">
<span class="sidebar-link-icon">🔤</span>
<span class="sidebar-link-text">G08. String-Methoden</span>
</a>
<a href="../../lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🗃️</span>
<span class="sidebar-link-text">G09. Dicts & Sets</span>
</a>
<a href="../../lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🚀</span>
<span class="sidebar-link-text">G10. Comprehensions</span>
</a>
</div>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🏗️ 2. OOP Einstieg</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">00–06</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🔍</span>
<span class="sidebar-link-text">00. Fehlersuche & Debug</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏗️</span>
<span class="sidebar-link-text">01. Einstieg in Klassen</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/02_init_und_self/index.html" class="sidebar-link">
<span class="sidebar-link-icon">⚙️</span>
<span class="sidebar-link-text">02. Konstruktor & self</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏎️</span>
<span class="sidebar-link-text">03. Methoden & Verhalten</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧾</span>
<span class="sidebar-link-text">04. __str__ Darstellung</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💻</span>
<span class="sidebar-link-text">04b. VS Code Setup</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🌿</span>
<span class="sidebar-link-text">04c. Git-Versionskontrolle</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎵</span>
<span class="sidebar-link-text">05. Objekte kombinieren</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🥚</span>
<span class="sidebar-link-text">06. Projekt: Tamagotchi</span>
</a>
</div>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🚀 3. Fortgeschritten</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">07–16</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧠</span>
<span class="sidebar-link-text">07. Referenzen & Speicher</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html" class="sidebar-link">
<span class="sidebar-link-icon">➕</span>
<span class="sidebar-link-text">08. Operator Overloading</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧪</span>
<span class="sidebar-link-text">09. Unit Tests & TDD</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧬</span>
<span class="sidebar-link-text">10. Vererbung & super()</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎭</span>
<span class="sidebar-link-text">11. Polymorphie</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🛡️</span>
<span class="sidebar-link-text">12. Exceptions & Fehler</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💾</span>
<span class="sidebar-link-text">13. Persistenz (JSON/CSV)</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🖥️</span>
<span class="sidebar-link-text">14. Desktop-GUIs (Tkinter)</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎒</span>
<span class="sidebar-link-text">15. Container & *args</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏆</span>
<span class="sidebar-link-text">16. Master-Abschlussprojekt</span>
</a>
</div>
</div>
</div>
<div class="sidebar-footer">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="font-size: 0.85rem; font-weight: 700; color: white;" id="sidebar-level-text">⭐ Level 1</div>
<div style="font-size: 0.82rem; font-weight: 700; color: #38bdf8;" id="sidebar-xp-text">0 XP</div>
</div>
</div>
</aside>
<div class="app-main">
<header>
<div class="header-container">
<nav class="nav-links">
<a href="../../index.html">🏠 Zur Kursübersicht</a>
<span>&rsaquo;</span>
<a href="../07_listen_und_sequenzen/index.html">Kapitel G07</a>
<span>&rsaquo;</span>
<span style="color: white; font-weight: 600;">Kapitel G08</span>
</nav>
<div class="header-badge">Grundlagen G08 (Schulabgleich 11.0)</div>
<h1>Textverarbeitung &amp; Strings 🔤✨</h1>
<p>Lerne, wie du Texte zerlegst, bereinigst, durchsuchst und formatierst – mit den mächtigen String-Methoden von Python.</p>
</div>
</header>
<main class="container">
<!-- 📂 Schnellzugriff & Download aller Dateien dieser Einheit -->
<div style="background: #ffffff; border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 14px 20px; margin-bottom: 25px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: var(--shadow-sm);">
<div style="font-weight: 700; color: var(--text-main); display: flex; align-items: center; gap: 8px;">
<span>📂 Dateien dieser Einheit:</span>
</div>
<div style="display: flex; gap: 10px; flex-wrap: wrap;">
<a href="../../workspace.html?course=python&track=lehrpfad_1_grundlagen&chapter=08_textverarbeitung_und_strings" class="btn" style="background: #10b981; color: #fff; font-weight: 700;">💻 In Web-IDE öffnen &rarr;</a>
<a href="aufgabe.py" class="btn" style="padding: 6px 14px; font-size: 0.88rem; background: var(--primary);" download>📄 aufgabe.py (Startercode)</a>
<a href="test_aufgabe.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>🧪 test_aufgabe.py (Tests)</a>
<a href="musterloesung.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>💡 musterloesung.py (Lösung)</a>
<a href="README.md" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;">📖 README.md</a>
</div>
</div>
<!-- 1. Stempel-Analogie & Immutability -->
<section class="card">
<h2>1. 🏛️ Die Stempel-Analogie: Strings sind unveränderlich!</h2>
<p>
In Python sind <strong>Strings (<code>str</code>) unveränderlich (immutable)</strong>. Das bedeutet:
Sobald ein String erzeugt wurde, kann kein einzelner Buchstabe mehr ausgetauscht werden!
</p>
<div class="box box-analogie">
<div class="box-title">🖨️ Die Stempel- &amp; Druck-Analogie:</div>
<p>
Stell dir einen String wie ein gedrucktes Dokument vor. Wenn du <code>text.upper()</code> oder <code>text.replace("a", "b")</code> aufrufst,
wird nicht der Buchstabe auf dem Papier radiert.
Stattdessen nimmt Python ein <strong>frisches, neues Blatt Papier</strong> und stempelt den modifizierten Text darauf!
</p>
</div>
<div class="code-container">
<div class="code-header">
<div class="code-dots">
<span class="code-dot dot-red"></span>
<span class="code-dot dot-yellow"></span>
<span class="code-dot dot-green"></span>
</div>
<span>Python: Immutable Strings</span>
</div>
<pre><span class="var">name</span> = <span class="str">"python"</span>
<span class="cm"># ❌ Falsch: Einzelnes Zeichen überschreiben geht nicht!</span>
<span class="cm"># name[0] = "P" -> TypeError: 'str' object does not support item assignment</span>
<span class="cm"># ✅ Richtig: Die Methode liefert einen NEUEN String zurück, den wir neu zuweisen:</span>
<span class="var">name</span> = <span class="var">name</span>.<span class="fn">capitalize</span>() <span class="cm"># name ist jetzt "Python"</span></pre>
</div>
</section>
<!-- 2. Methoden Cheat-Sheet -->
<section class="card">
<h2>2. 🧰 Das große String-Methoden Cheat-Sheet</h2>
<p>Hier siehst du die wichtigsten Methoden für deine tägliche Textverarbeitung im Überblick:</p>
<h3>A. Groß- &amp; Kleinschreibung</h3>
<div class="code-container">
<pre><span class="var">t</span> = <span class="str">"hallo welt"</span>
<span class="fn">print</span>(<span class="var">t</span>.<span class="fn">upper</span>()) <span class="cm"># -> "HALLO WELT" (alles GROSS)</span>
<span class="fn">print</span>(<span class="var">t</span>.<span class="fn">lower</span>()) <span class="cm"># -> "hallo welt" (alles klein)</span>
<span class="fn">print</span>(<span class="var">t</span>.<span class="fn">capitalize</span>()) <span class="cm"># -> "Hallo welt" (nur erstes Zeichen groß)</span>
<span class="fn">print</span>(<span class="var">t</span>.<span class="fn">title</span>()) <span class="cm"># -> "Hallo Welt" (jedes Wort groß)</span></pre>
</div>
<h3>B. Leerzeichen bereinigen (.strip)</h3>
<div class="code-container">
<pre><span class="var">roh</span> = <span class="str">" max_mustermann \n "</span>
<span class="fn">print</span>(<span class="var">roh</span>.<span class="fn">strip</span>()) <span class="cm"># -> "max_mustermann" (entfernt Leerzeichen &amp; Umbrüche an beiden Enden)</span>
<span class="fn">print</span>(<span class="var">roh</span>.<span class="fn">lstrip</span>()) <span class="cm"># -> entfernt nur links</span>
<span class="fn">print</span>(<span class="var">roh</span>.<span class="fn">rstrip</span>()) <span class="cm"># -> entfernt nur rechts</span></pre>
</div>
<h3>C. Suchen, Zählen &amp; Ersetzen</h3>
<div class="code-container">
<pre><span class="var">satz</span> = <span class="str">"Python ist super und Python macht Spaß"</span>
<span class="cm"># Ersetzen:</span>
<span class="var">neu</span> = <span class="var">satz</span>.<span class="fn">replace</span>(<span class="str">"Python"</span>, <span class="str">"Coding"</span>) <span class="cm"># Ersetzt alle Vorkommen</span>
<span class="cm"># Zählen & Suchen:</span>
<span class="fn">print</span>(<span class="var">satz</span>.<span class="fn">count</span>(<span class="str">"Python"</span>)) <span class="cm"># -> 2</span>
<span class="fn">print</span>(<span class="var">satz</span>.<span class="fn">find</span>(<span class="str">"super"</span>)) <span class="cm"># -> Index 11 (-1 falls nicht vorhanden)</span>
<span class="fn">print</span>(<span class="var">satz</span>.<span class="fn">startswith</span>(<span class="str">"Python"</span>)) <span class="cm"># -> True</span>
<span class="fn">print</span>(<span class="var">satz</span>.<span class="fn">endswith</span>(<span class="str">"Spaß"</span>)) <span class="cm"># -> True</span></pre>
</div>
<h3>D. Zerlegen (.split) &amp; Zusammenfügen (.join)</h3>
<div class="code-container">
<pre><span class="cm"># 1. An Trennzeichen zerlegen:</span>
<span class="var">csv</span> = <span class="str">"Anna;17;Wien"</span>
<span class="var">spalten</span> = <span class="var">csv</span>.<span class="fn">split</span>(<span class="str">";"</span>) <span class="cm"># -> ["Anna", "17", "Wien"]</span>
<span class="cm"># 2. Ohne Parameter zerlegt .split() an beliebigen Whitespaces:</span>
<span class="var">woerter</span> = <span class="str">" Python macht Spaß "</span>.<span class="fn">split</span>()
<span class="fn">print</span>(<span class="var">woerter</span>) <span class="cm"># -> ["Python", "macht", "Spaß"]</span>
<span class="cm"># 3. Liste wieder zu einem formatierten String verknüpfen:</span>
<span class="var">liste</span> = [<span class="str">"Rot"</span>, <span class="str">"Grün"</span>, <span class="str">"Blau"</span>]
<span class="var">farben_text</span> = <span class="str">", "</span>.<span class="fn">join</span>(<span class="var">liste</span>) <span class="cm"># -> "Rot, Grün, Blau"</span></pre>
</div>
</section>
<!-- 3. Praxisbeispiel Palindrom & Textbereinigung -->
<section class="card">
<h2>3. 🌟 Praxisbeispiel: Palindrom &amp; Text-Bereinigung</h2>
<p>Ein Palindrom ist ein Text, der vorwärts wie rückwärts identisch ist (z.B. <em>"Dreh mal am Herd"</em>). Mit String-Methoden und Slicing ist die Prüfung ein Kinderspiel:</p>
<div class="code-container">
<div class="code-header">
<div class="code-dots">
<span class="code-dot dot-red"></span>
<span class="code-dot dot-yellow"></span>
<span class="code-dot dot-green"></span>
</div>
<span>Python: Palindrom-Prüfer</span>
</div>
<pre><span class="kw">def</span> <span class="fn">pruefe_palindrom</span>(<span class="var">text</span>):
<span class="cm"># 1. Alles in Kleinbuchstaben umwandeln:</span>
<span class="var">sauber</span> = <span class="var">text</span>.<span class="fn">lower</span>()
<span class="cm"># 2. Leerzeichen entfernen:</span>
<span class="var">sauber</span> = <span class="var">sauber</span>.<span class="fn">replace</span>(<span class="str">" "</span>, <span class="str">""</span>)
<span class="cm"># 3. Mit der Umkehrung (Slicing [::-1]) vergleichen:</span>
<span class="kw">return</span> <span class="var">sauber</span> == <span class="var">sauber</span>[::-<span class="num">1</span>]
<span class="fn">print</span>(<span class="fn">pruefe_palindrom</span>(<span class="str">"Anna"</span>)) <span class="cm"># -> True</span>
<span class="fn">print</span>(<span class="fn">pruefe_palindrom</span>(<span class="str">"Dreh mal am Herd"</span>)) <span class="cm"># -> True</span>
<span class="fn">print</span>(<span class="fn">pruefe_palindrom</span>(<span class="str">"Python"</span>)) <span class="cm"># -> False</span></pre>
</div>
</section>
<!-- 4. Aufgabenliste -->
<section class="card">
<h2>4. 🎯 Deine Aufgaben in <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code></h2>
<p>Öffne die Datei <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code> und löse die 5 Aufgaben:</p>
<ul class="task-list">
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t8_1">
<label for="t8_1" class="task-label">
<strong>TODO 1 (<code>ist_palindrom</code>):</strong> Prüfe, ob ein Text von beiden Seiten gleich lautet (ignoriere Groß/Klein und Leerzeichen).
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t8_2">
<label for="t8_2" class="task-label">
<strong>TODO 2 (<code>zaehle_vokale</code>):</strong> Zähle alle Vokale (a, e, i, o, u, ä, ö, ü) im Text unabhängig von Groß/Klein.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t8_3">
<label for="t8_3" class="task-label">
<strong>TODO 3 (<code>bereinige_benutzernamen</code>):</strong> Entferne Rand-Leerzeichen mit <code>.strip()</code>, mache alles lowercase und ersetze Leerzeichen durch <code>_</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t8_4">
<label for="t8_4" class="task-label">
<strong>TODO 4 (<code>woerter_zaehlen</code>):</strong> Ermittle die Wortanzahl mithilfe von <code>.split()</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t8_5">
<label for="t8_5" class="task-label">
<strong>TODO 5 (<code>maskiere_kreditkarte</code>):</strong> Ersetze alle Ziffern bis auf die letzten 4 durch <code>*</code> (z.B. <code>"************5678"</code>).
</label>
</li>
</ul>
<h3>💡 Lösungshinweise (Aufklappen bei Bedarf)</h3>
<details>
<summary>🔍 Tipp zu TODO 3 (Benutzernamen bereinigen)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">def</span> <span class="fn">bereinige_benutzernamen</span>(<span class="var">name</span>):
<span class="kw">return</span> <span class="var">name</span>.<span class="fn">strip</span>().<span class="fn">lower</span>().<span class="fn">replace</span>(<span class="str">" "</span>, <span class="str">"_"</span>)</pre>
</div>
</div>
</details>
<details>
<summary>🔍 Tipp zu TODO 5 (Kreditkarte maskieren)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">def</span> <span class="fn">maskiere_kreditkarte</span>(<span class="var">nummer</span>):
<span class="kw">if</span> <span class="fn">len</span>(<span class="var">nummer</span>) &lt;= <span class="num">4</span>:
<span class="kw">return</span> <span class="var">nummer</span>
<span class="kw">return</span> <span class="str">"*"</span> * (<span class="fn">len</span>(<span class="var">nummer</span>) - <span class="num">4</span>) + <span class="var">nummer</span>[-<span class="num">4</span>:]</pre>
</div>
</div>
</details>
</section>
<!-- 5. Testen & Navigation -->
<section class="card">
<h2>5. 🧪 Lösung überprüfen</h2>
<p>Führe im Terminal folgenden Befehl aus:</p>
<div class="code-container">
<div class="code-header">
<span>Terminal</span>
</div>
<pre><code>python3 test_aufgabe.py</code></pre>
</div>
<div class="footer-nav">
<a href="../07_listen_und_sequenzen/index.html" class="btn btn-secondary">&larr; Zurück zu Kapitel G07</a>
<a href="../09_dictionaries_und_sets/index.html" class="btn">Weiter zu Kapitel G09 &rarr;</a>
</div>
</section>
</main>
</div>
</div>
<button type="button" class="sidebar-mobile-toggle"><span>☰ Menü</span></button>
<div class="sidebar-overlay"></div>
<!-- Scripts -->
<script src="../../assets/gamification_data.js"></script>
<script src="../../assets/gamification.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/certificate.js"></script>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/runner.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>