<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Code |</title><link>https://clementgodbarge.com/de/code/</link><atom:link href="https://clementgodbarge.com/de/code/index.xml" rel="self" type="application/rss+xml"/><description>Code</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de-de</language><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Code</title><link>https://clementgodbarge.com/de/code/</link></image><item><title>tei-mcp</title><link>https://clementgodbarge.com/de/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-tei-p5-für-ki-agenten"&gt;tei-mcp: TEI P5 für KI-Agenten&lt;/h2&gt;
&lt;p&gt;tei-mcp ist ein quelloffener
-Server, der KI-Programmierassistenten unmittelbaren Zugriff auf die
-Spezifikation verschafft. Statt sich auf angelerntes Trainingswissen zu verlassen – das oft plausibel aussehendes, aber falsches Markup hervorbringt –, kann die KI die Spezifikation in Echtzeit befragen.&lt;/p&gt;
&lt;h2 id="funktionen"&gt;Funktionen&lt;/h2&gt;
&lt;p&gt;Der Server liest das ODD von TEI P5 ein und stellt 16 Tools bereit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nachschlagen&lt;/strong&gt; von Elementen, Klassen, Makros und Modulen nach Namen, ohne Rücksicht auf Groß- und Kleinschreibung und mit Vorschlägen bei Tippfehlern&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute auflösen&lt;/strong&gt; über die gesamte TEI-Klassenhierarchie (lokal + geerbt)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inhaltsmodelle entfalten&lt;/strong&gt; zu strukturierten Bäumen, mit Auflösung von Klassen und Makros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verschachtelung prüfen&lt;/strong&gt; – direkte Eltern-Kind-Beziehung oder rekursive Erreichbarkeit mit Pfadverfolgung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dokumente validieren&lt;/strong&gt; gegen TEI P5: Inhaltsmodelle, Attribute, geschlossene Wertelisten, Integrität der Verweise und Warnungen vor veralteten Konstrukten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Einzelne Elemente validieren&lt;/strong&gt; für schrittweises Bearbeiten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODD-Anpassungen laden&lt;/strong&gt;, um das Schema auf die projektspezifische Teilmenge einzuschränken&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suchen&lt;/strong&gt; über alle Entitätstypen hinweg mit regulären Ausdrücken&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oder direkt starten mit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="verwendung"&gt;Verwendung&lt;/h2&gt;
&lt;p&gt;In einen beliebigen MCP-kompatiblen Client eintragen (Claude, Cursor, Windsurf usw.):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quellcode und Dokumentation finden Sie im
.&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/de/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-parallele-xslt-verarbeitung-für-große-tei-korpora"&gt;Multi-Saxon: Parallele XSLT-Verarbeitung für große TEI-Korpora&lt;/h2&gt;
&lt;p&gt;Multi-Saxon schließt eine empfindliche Lücke im Werkzeugkasten der XML-Verarbeitung: Es führt XSLT-2.0- und -3.0-Transformationen parallel aus, an denen LXML (die verbreitete Python-Bibliothek für XML) scheitert. Eigens für große Sammlungen von XML-TEI-Dokumenten gebaut, verkürzt Multi-Saxon die Verarbeitungszeit durch effiziente Parallelisierung beträchtlich.&lt;/p&gt;
&lt;h2 id="hauptmerkmale"&gt;Hauptmerkmale&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Erweiterte XSLT-Unterstützung&lt;/strong&gt;: Verarbeitet XSLT-2.0- und -3.0-Transformationen, die LXML nicht beherrscht&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallele Verarbeitung&lt;/strong&gt;: Verkürzt die Transformationszeit großer Dokumentsammlungen durch Parallelisierung drastisch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEI-optimiert&lt;/strong&gt;: Eigens für XML-Dokumente der Text Encoding Initiative (TEI) ausgelegt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skalierbare Leistung&lt;/strong&gt;: Verarbeitet Korpora von Hunderten bis Tausenden von Dokumenten effizient&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plattformübergreifend&lt;/strong&gt;: Läuft unter verschiedenen Betriebssystemen und in verschiedenen Umgebungen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="das-problem-das-multi-saxon-löst"&gt;Das Problem, das Multi-Saxon löst&lt;/h2&gt;
&lt;p&gt;Wer in den Digital Humanities mit TEI arbeitet, stößt regelmäßig auf zwei Hindernisse:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (die gängige Python-Bibliothek zur XML-Verarbeitung) unterstützt nur XSLT 1.0; die weiterentwickelten Möglichkeiten von XSLT 2.0/3.0 bleiben damit außer Reichweite&lt;/li&gt;
&lt;li&gt;Große TEI-Korpora Dokument für Dokument zu verarbeiten kann unzumutbar lange dauern&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon räumt beide Hindernisse aus dem Weg: Es nutzt die fortgeschrittenen XSLT-Fähigkeiten von Saxon und verteilt die Arbeit auf mehrere Prozessorkerne, was erhebliche Geschwindigkeitsgewinne bringt.&lt;/p&gt;
&lt;h2 id="implementierung"&gt;Implementierung&lt;/h2&gt;
&lt;p&gt;Multi-Saxon verbindet Python mit dem Java-Prozessor Saxon zu einer leistungsfähigen Transformations-Pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nutzt die Java-Bibliothek Saxon für robuste XSLT-2.0/3.0-Verarbeitung&lt;/li&gt;
&lt;li&gt;Verteilt die Transformationen per Multiprocessing auf die verfügbaren CPU-Kerne&lt;/li&gt;
&lt;li&gt;Verwaltet die Prozessor-Pools so, dass der Durchsatz maximal wird&lt;/li&gt;
&lt;li&gt;Bietet eine schlichte Schnittstelle für die Stapelverarbeitung von TEI-Dokumenten&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="anwendungsbeispiel"&gt;Anwendungsbeispiel&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multi_saxon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize with your XSLT stylesheet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transform.xsl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform a single document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform an entire directory in parallel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="was-das-für-die-digital-humanities-bedeutet"&gt;Was das für die Digital Humanities bedeutet&lt;/h2&gt;
&lt;p&gt;Projekten der Digital Humanities mit großen TEI-Dokumentsammlungen eröffnet Multi-Saxon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Komplexe korpusweite Transformationen, die mit LXML unmöglich wären&lt;/li&gt;
&lt;li&gt;Drastisch kürzere Verarbeitungszeiten (auf Mehrkernsystemen oft um den Faktor 5–10)&lt;/li&gt;
&lt;li&gt;Anspruchsvollere Analysen dank der fortgeschrittenen Funktionen von XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Einfachere Arbeitsabläufe bei der Verarbeitung ganzer Dokumentsammlungen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quellcode und Dokumentation finden Sie im
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/de/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/persnamer/</guid><description>&lt;h2 id="persnamer-tei-mit-dem-virtual-international-authority-file-verknüpfen"&gt;persNamer: TEI mit dem Virtual International Authority File verknüpfen&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer ist ein spezialisiertes Python-Werkzeug, das Personen-Normdaten aus VIAF (Virtual International Authority File) ohne Umwege in TEI-XML-Dokumente holt. Weil es VIAF-Identifikatoren in fertiges TEI-Markup übersetzt, erspart persNamer einen Großteil der Handarbeit, die strukturierte Personeneinträge in digitalen wissenschaftlichen Editionen sonst verlangen.&lt;/p&gt;
&lt;h2 id="die-mühen-der-normdatenpflege-in-tei"&gt;Die Mühen der Normdatenpflege in TEI&lt;/h2&gt;
&lt;p&gt;Digitale wissenschaftliche Editionen müssen historische Personen häufig exakt identifizieren, samt normiertem Namen und Lebensdaten. Wer die Normdaten über ein ganzes Projekt hinweg konsistent halten will, muss:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Personen in historischen Texten erkennen&lt;/li&gt;
&lt;li&gt;verlässliche Normdaten zu ihnen finden&lt;/li&gt;
&lt;li&gt;korrekt formatierte TEI-Einträge anlegen&lt;/li&gt;
&lt;li&gt;dafür sorgen, dass die Verweise im ganzen Projekt einheitlich bleiben&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All das geschieht in der Regel von Hand, kostet Zeit und lädt zu Inkonsistenzen ein.&lt;/p&gt;
&lt;h2 id="wie-persnamer-arbeitet"&gt;Wie persNamer arbeitet&lt;/h2&gt;
&lt;p&gt;persNamer automatisiert diesen Ablauf, indem es:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VIAF-Daten abruft&lt;/strong&gt;: Zu einem gegebenen VIAF-Identifikator holt das Werkzeug per HTTP Content Negotiation die RDF-Daten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;die Kerninformationen ausliest&lt;/strong&gt;: Aus dem RDF zieht es den bevorzugten Namen sowie Geburts- und Sterbedatum&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEI-Markup erzeugt&lt;/strong&gt;: Es liefert zwei unentbehrliche XML-Schnipsel:
&lt;ul&gt;
&lt;li&gt;einen &lt;strong&gt;Eintrag für die Normdatei&lt;/strong&gt; (&lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt;-Element mit generierter &lt;code&gt;xml:id&lt;/code&gt;, &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;birth&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;death&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;ein eigenes &lt;strong&gt;Annotations-Tag&lt;/strong&gt; (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; mit einem &lt;code&gt;ref&lt;/code&gt;-Attribut, das auf den Normdateneintrag verweist)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Diese zweifache Ausgabe erlaubt es Editorinnen und Editoren, eine zentrale Normdatei zu führen und die Annotations-Tags zugleich bequem in ihre TEI-Texte einzusetzen.&lt;/p&gt;
&lt;h2 id="hauptmerkmale"&gt;Hauptmerkmale&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Einheitliche ID-Vergabe&lt;/strong&gt;: Erzeugt konsistente XML-IDs nach dem Muster &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (z. B. &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDF-Parsing&lt;/strong&gt;: Liest mit &lt;code&gt;rdflib&lt;/code&gt; Informationen aus verschiedenen RDF-Eigenschaften aus (z. B. &lt;code&gt;rdfs:label&lt;/code&gt;, &lt;code&gt;schema:name&lt;/code&gt;, &lt;code&gt;viaf:mainHead&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kommandozeile&lt;/strong&gt;: Ein Aufruf mit der VIAF-Nummer als einzigem Pflichtargument genügt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ausführliche Ausgabe&lt;/strong&gt;: Liefert neben dem fertigen XML detaillierte Angaben zur Verarbeitung&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="anwendungsbeispiel"&gt;Anwendungsbeispiel&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python persNamer.py &lt;span class="m"&gt;314802260&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dieser Befehl erzeugt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;person&lt;/span&gt; &lt;span class="na"&gt;xml:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;persName&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;birth&amp;gt;&lt;/span&gt;1535&lt;span class="nt"&gt;&amp;lt;/birth&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;death&amp;gt;&lt;/span&gt;1572-08-24&lt;span class="nt"&gt;&amp;lt;/death&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;VIAF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;314802260&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;persName&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="einsatz-in-den-digital-humanities"&gt;Einsatz in den Digital Humanities&lt;/h2&gt;
&lt;p&gt;persNamer ist besonders nützlich für:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;digitale wissenschaftliche Editionen, die Normdatenpflege verlangen&lt;/li&gt;
&lt;li&gt;TEI-Kodierungsprojekte, in denen historische Persönlichkeiten vorkommen&lt;/li&gt;
&lt;li&gt;Linked-Data-Vorhaben, die Dokumente mit Normdatensätzen verknüpfen&lt;/li&gt;
&lt;li&gt;die Wahrung der Konsistenz in großen TEI-Korpora&lt;/li&gt;
&lt;li&gt;die Vermittlung der Normdatenpflege in Lehrveranstaltungen der Digital Humanities&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementierung"&gt;Implementierung&lt;/h2&gt;
&lt;p&gt;persNamer ist in Python geschrieben und stützt sich auf:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; für HTTP-Anfragen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; für das RDF-Parsing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; für die XML-Verarbeitung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quellcode und Dokumentation finden Sie im
.&lt;/p&gt;</description></item><item><title>ITA2-Telegrafen-Emulator</title><link>https://clementgodbarge.com/de/code/baudot-emulator/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/baudot-emulator/</guid><description>&lt;p&gt;Dieser ITA2-Emulator ist ein handfestes Lehrmittel: Er macht sichtbar und anfassbar, was an der Kodierung sonst abstrakt bleibt. Wer Text eintippt und zusieht, wie er sich augenblicklich in Lochmuster verwandelt, lernt dabei gleich mehrere Grundbegriffe von Informatik und Telekommunikation kennen.&lt;/p&gt;
&lt;h2 id="didaktischer-nutzen"&gt;Didaktischer Nutzen&lt;/h2&gt;
&lt;p&gt;Zum einen führt er die Binärdarstellung vor – wie aus Text ein Muster aus Einsen und Nullen wird. Oft lehren wir das rein abstrakt; wer aber die Löcher tatsächlich im Streifen erscheinen sieht, begreift viel leichter, dass ein physisches System digitale Information tragen kann.&lt;/p&gt;
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;Mit der LETTERS/FIGURES-Umschaltung ist zum anderen der Zustandsautomat wie von selbst im Raum. Beim Ausprobieren entdecken die Studierenden, dass ein und dasselbe Muster je nach Modus ein anderes Zeichen bedeutet – eine handfeste Erfahrung mit zustandsabhängiger Kodierung, die den Boden für anspruchsvollere Begriffe der Informatik bereitet.&lt;/p&gt;
&lt;h2 id="zur-implementierung"&gt;Zur Implementierung&lt;/h2&gt;
&lt;p&gt;Der Emulator ist in JavaScript und HTML/CSS geschrieben und lässt sich daher ohne Umstände in jede Webseite einbetten. Der Code ist modular aufgebaut und für verschiedene Unterrichtssituationen anpassbar.&lt;/p&gt;
&lt;p&gt;Quellcode und Emulator zum Selbstausprobieren finden Sie im
.&lt;/p&gt;</description></item></channel></rss>