<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Humanités Numériques |</title><link>https://clementgodbarge.com/fr/category/humanites-numeriques/</link><atom:link href="https://clementgodbarge.com/fr/category/humanites-numeriques/index.xml" rel="self" type="application/rss+xml"/><description>Humanités Numériques</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>fr-fr</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Humanités Numériques</title><link>https://clementgodbarge.com/fr/category/humanites-numeriques/</link></image><item><title>tei-mcp v0.3 : encoder en TEI sans toucher à la source</title><link>https://clementgodbarge.com/fr/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Quand j’ai
, il
s’agissait d’empêcher les assistants IA d’halluciner du balisage TEI. L’ancrage
dans le schéma a réglé une partie du problème : dès lors qu’il accède, par des
outils, à la spécification P5, le modèle n’a plus à deviner ce que signifie un
élément ni quels attributs il admet. Ce qu’il produit est valide.&lt;/p&gt;
&lt;p&gt;Mais l’hallucination, en TEI, a deux visages, et le schéma n’en démasque qu’un.
Valider contre la spécification vous assure que le &lt;em&gt;balisage&lt;/em&gt; est bien formé ;
cela ne dit rien du &lt;em&gt;texte&lt;/em&gt; que ce balisage enveloppe. Or c’est là, dans le texte
même, que nichent les hallucinations les plus dommageables. La composition à
empans verrouillés (&lt;em&gt;span-locked composition&lt;/em&gt;), pièce maîtresse de la v0.3, a
été conçue tout exprès pour les rendre impossibles.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Table des matières&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#lhallucination-qui-échappe-au-schéma"&gt;L’hallucination qui échappe au schéma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-composition-à-empans-verrouillés"&gt;La composition à empans verrouillés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ce-que-cest-et-ce-que-ce-nest-pas"&gt;Ce que c’est, et ce que ce n’est pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#au-delà-de-la-tei"&gt;Au-delà de la TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#obtenir-la-mise-à-jour"&gt;Obtenir la mise à jour&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="lhallucination-qui-échappe-au-schéma"&gt;L’hallucination qui échappe au schéma&lt;/h2&gt;
&lt;p&gt;Demandez à un modèle d’encoder une lettre française du XVI&lt;sup&gt;e&lt;/sup&gt; siècle : vous
recevrez souvent un document TEI d’allure impeccable. L’en-tête est rempli, les
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; sont à leur place, la &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; est bien formée. Passez-le à
&lt;code&gt;validate_document&lt;/code&gt; : il est reçu.&lt;/p&gt;
&lt;p&gt;Comparez maintenant le corps du texte à la source.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; est devenu &lt;code&gt;même&lt;/code&gt;. Une virgule a changé de place. &lt;code&gt;luy&lt;/code&gt; a été modernisé
en &lt;code&gt;lui&lt;/code&gt; sans un mot. Une proposition malaisée à lire dans le manuscrit a été
« corrigée » en quelque chose de plus net. Aucune de ces retouches n’a été
demandée ; aucune n’est signalée. Le document est valide au regard du schéma,
et faux en douce.&lt;/p&gt;
&lt;p&gt;Dans un flux de travail archivistique, où le texte encodé devient la version de
référence dont dépendront les lecteurs, les index de recherche et les citations,
c’est la faute qui compte le plus. Une balise mal formée agace ; une graphie
modernisée que personne ne remarque pendant cinq ans est une corruption.&lt;/p&gt;
&lt;h2 id="la-composition-à-empans-verrouillés"&gt;La composition à empans verrouillés&lt;/h2&gt;
&lt;p&gt;La nouvelle version (v0.3) embarque un mécanisme de prévention des hallucinations
qui vise exactement cette faute-là. Le principe qui a guidé sa conception :
rendre l’hallucination dans le corps du texte impossible par construction, et non
pas seulement improbable.&lt;/p&gt;
&lt;p&gt;L’idée est simple : &lt;strong&gt;le modèle ne tape jamais le corps du texte&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le travail se déroule ainsi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le modèle appelle &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; et reçoit le texte brut de la
source sous forme de chaîne immuable.&lt;/li&gt;
&lt;li&gt;Pour chaque balise qu’il veut poser, il appelle
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;, qui enregistre
un élément TEI sur un intervalle de caractères de la source.&lt;/li&gt;
&lt;li&gt;Quand il a fini, il appelle &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Le serveur entrelace
les balises enregistrées et le texte brut d’origine, produit le TEI final,
puis vérifie &lt;em&gt;octet par octet&lt;/em&gt; que le texte nu du document produit est
identique à la source.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si les octets concordent, le document est rendu. Sinon – si les balises du
modèle impliquent, d’une manière ou d’une autre, un corps qui s’écarte de la
source ne serait-ce que d’un caractère – &lt;code&gt;compose()&lt;/code&gt; lève une erreur au lieu de
rendre un document corrompu.&lt;/p&gt;
&lt;p&gt;Il n’existe dans ce flux de travail aucun chemin par lequel le modèle puisse
produire un document TEI dont le corps diffère de la source. L’invariant est
mécanique, non comportemental : vous n’avez pas à faire confiance au modèle pour
qu’il n’hallucine pas ; vous n’avez à faire confiance qu’à un &lt;code&gt;==&lt;/code&gt; entre deux
chaînes d’octets.&lt;/p&gt;
&lt;h2 id="ce-que-cest-et-ce-que-ce-nest-pas"&gt;Ce que c’est, et ce que ce n’est pas&lt;/h2&gt;
&lt;p&gt;La composition à empans verrouillés &lt;strong&gt;complète&lt;/strong&gt; l’ancrage dans le schéma ; elle
ne le remplace pas. Les outils d’ancrage (&lt;code&gt;validate_document&lt;/code&gt;,
&lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; et le reste des seize outils d’origine)
aident le modèle à produire du TEI &lt;em&gt;valide&lt;/em&gt; ; la composition à empans verrouillés
garantit que le corps du texte à l’intérieur de ce TEI est &lt;em&gt;fidèle&lt;/em&gt; à la source.
Un flux d’encodage digne d’être mis en production doit satisfaire à ces deux
exigences, et un seul serveur y pourvoit désormais.&lt;/p&gt;
&lt;p&gt;Ce n’est pas non plus un remède universel. &lt;code&gt;compose()&lt;/code&gt; ne vérifie pas encore
que les balises enregistrées sont admises par la personnalisation ODD chargée –
ce sera l’objet d’une prochaine étape. Les balises enregistrées vivent dans la
mémoire du processus et ne survivent pas à un redémarrage. Et les fichiers
sources doivent être lisibles depuis l’endroit où tourne le serveur. Tout cela
se corrige ; rien de tout cela n’entame l’invariant central.&lt;/p&gt;
&lt;h2 id="au-delà-de-la-tei"&gt;Au-delà de la TEI&lt;/h2&gt;
&lt;p&gt;Le procédé se généralise. Chaque fois qu’on demande à un modèle d’annoter, de
transformer ou d’envelopper un texte, et chaque fois que l’intégrité de ce texte
importe plus que le talent du modèle à l’« améliorer », la même forme de solution
s’applique. Ne demandez pas au modèle de retaper le texte ; demandez-lui des
instructions sur le texte, et laissez un compositeur déterministe les appliquer
sous un invariant d’égalité.&lt;/p&gt;
&lt;p&gt;Pour les éditions numériques en particulier, cela change ce que l’on peut
raisonnablement confier à un modèle. L’encodage devient d’un coup une tâche que
l’on peut déléguer sans avoir à comparer à la main chaque sortie avec la source.
La machine se charge de la besogne ; l’éditeur relit le balisage, non
l’orthographe.&lt;/p&gt;
&lt;h2 id="obtenir-la-mise-à-jour"&gt;Obtenir la mise à jour&lt;/h2&gt;
&lt;p&gt;Si tei-mcp est déjà installé :&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@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ou, pour une installation neuve :&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;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour utiliser la composition à empans verrouillés, indiquez au serveur un
répertoire de fichiers sources en texte brut :&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;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TEI_MCP_SPAN_SOURCE_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/sources
&lt;/span&gt;&lt;/span&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;p&gt;Le nom de chaque fichier, sans son extension, devient l’identifiant du document
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Code source, documentation complète et notes de conception de l’invariant :
&lt;/p&gt;</description></item><item><title>Une édition numérique d’un autre genre</title><link>https://clementgodbarge.com/fr/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/cavriana-edition/</guid><description>&lt;p&gt;La plupart des sources primaires ne sont jamais publiées. Le remède sur lequel nous comptons, l’édition numérique financée par subvention, coûte trop cher, dépend trop d’un centre unique et se brise trop facilement pour changer d’échelle. Je viens de publier
où j’explique pourquoi je bâtis autrement l’édition critique des lettres de Cavriana : des sources numérisées qui s’enrichissent au fil du temps, avec un minimum d’infrastructure et une maintenance automatisée, ouvertes à la collaboration, et si peu coûteuses qu’il n’est même plus besoin de subvention. C’est un plaidoyer pour des humanités numériques qui tiennent debout avec ou sans le soutien des institutions.&lt;/p&gt;</description></item><item><title>tei-mcp : la TEI P5 à la portée des agents IA</title><link>https://clementgodbarge.com/fr/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/tei-mcp/</guid><description>&lt;p&gt;Quiconque a demandé à un assistant IA d’écrire du XML TEI l’a constaté :
il se trompe. Des éléments surgissent là où ils n’ont rien à faire, des attributs
sont inventés de toutes pièces, les règles d’imbrication sont foulées aux pieds.
Le modèle a une vague idée de ce à quoi ressemble la TEI ; de la spécification
elle-même, il n’a aucune connaissance sûre.&lt;/p&gt;
&lt;p&gt;tei-mcp y remédie en donnant aux agents IA un accès direct, par des outils,
aux Guidelines de la TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Table des matières&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#quest-ce-que-mcp"&gt;Qu’est-ce que MCP ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ce-que-fait-tei-mcp"&gt;Ce que fait tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pourquoi-cela-compte"&gt;Pourquoi cela compte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#premiers-pas"&gt;Premiers pas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="quest-ce-que-mcp"&gt;Qu’est-ce que MCP ?&lt;/h2&gt;
&lt;p&gt;Le
(MCP) est une norme
ouverte qui permet aux applications d’IA de se relier à des sources de données et
à des outils extérieurs. C’est, si l’on veut, le port USB de l’IA : un protocole
unique grâce auquel n’importe quel client compatible – Claude, Cursor, Windsurf
et d’autres – se branche sur des services spécialisés.&lt;/p&gt;
&lt;p&gt;Un serveur MCP expose des &lt;em&gt;outils&lt;/em&gt; que l’IA peut appeler au fil de la conversation ;
au lieu de puiser dans le souvenir de ses données d’entraînement, le modèle
interroge une source vivante, qui fait autorité.&lt;/p&gt;
&lt;h2 id="ce-que-fait-tei-mcp"&gt;Ce que fait tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp lit la spécification ODD de la TEI P5 et expose seize outils, qui répondent
aux questions que se posent le plus souvent un éditeur ou un encodeur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qu’est-ce que cet élément ?&lt;/strong&gt; Recherche de tout élément, classe, macro ou
module par son nom, sans distinction de casse et avec suggestions en cas de
coquille.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quels attributs admet-il ?&lt;/strong&gt; Résolution des attributs à travers toute la
hiérarchie des classes – d’abord les attributs locaux, puis les attributs
hérités, dans l’ordre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Que peut-il contenir ?&lt;/strong&gt; Développement des modèles de contenu en arbres
structurés, ou simple liste des enfants admis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cet élément a-t-il sa place ici ?&lt;/strong&gt; Contrôle de l’imbrication parent-enfant,
ou recherche d’un chemin à travers toute la hiérarchie des éléments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mon document est-il valide ?&lt;/strong&gt; Validation d’un fichier XML TEI contre la
spécification : modèles de contenu, valeurs d’attributs, listes de valeurs
fermées, intégrité des renvois et avertissements d’obsolescence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Et le schéma de mon projet ?&lt;/strong&gt; Chargement d’un fichier de personnalisation ODD,
qui restreint tout ce qui précède au sous-ensemble de la TEI propre à votre projet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pourquoi-cela-compte"&gt;Pourquoi cela compte&lt;/h2&gt;
&lt;p&gt;Encoder en TEI, c’est avoir sans cesse les Guidelines sous la main. Les encodeurs
chevronnés ont intériorisé les tournures les plus courantes, mais eux-mêmes doivent
retourner à la spécification pour les éléments moins familiers ou les modèles de
contenu complexes. Pour les assistants IA, qui n’ont rien intériorisé du tout, le
mal est pire : ils hallucinent un balisage d’aspect plausible, et faux.&lt;/p&gt;
&lt;p&gt;Avec tei-mcp, l’IA n’a plus à deviner. Elle va chercher la réponse dans la
spécification avant d’écrire le moindre chevron, et le balisage qui en sort est
conforme à la TEI P5 – ou à la personnalisation ODD de votre projet.&lt;/p&gt;
&lt;h2 id="premiers-pas"&gt;Premiers pas&lt;/h2&gt;
&lt;p&gt;Installation depuis PyPI :&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;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis ajoutez le serveur à la configuration de votre client MCP :&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;Au premier lancement, le serveur télécharge la spécification TEI ; il fonctionne
avec tout client compatible MCP.&lt;/p&gt;
&lt;p&gt;Code source et documentation complète :
&lt;/p&gt;</description></item><item><title>Le binaire à portée de main : un émulateur de télégraphe ITA2</title><link>https://clementgodbarge.com/fr/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/baudot/</guid><description>&lt;h2 id="donner-corps-à-labstraction"&gt;Donner corps à l’abstraction&lt;/h2&gt;
&lt;p&gt;Cet émulateur ITA2 est d’abord un outil de classe. Il rend visible, et manipulable, une notion qui est au cœur de l’informatique comme des télécommunications : la représentation binaire, c’est-à-dire la façon dont un texte se change en une suite de uns et de zéros.
On l’enseigne d’ordinaire au tableau, abstraitement ; or il suffit de voir les trous se percer un à un dans la bande pour comprendre qu’un dispositif matériel peut porter de l’information numérique.
&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;
&lt;h2 id="un-peu-dhistoire-du-télégraphe-à-lordinateur"&gt;Un peu d’histoire : du télégraphe à l’ordinateur&lt;/h2&gt;
&lt;p&gt;Le code ITA2 (International Telegraph Alphabet No. 2), dit aussi code Baudot-Murray, fut mis au point dans les années 1920 ; il perfectionnait le code télégraphique conçu par Émile Baudot dès les années 1870. Ces premiers systèmes de télécommunication ont pesé directement sur l’informatique qui allait suivre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le codage sur 5 bits est l’un des premiers exemples de codage de caractères ;&lt;/li&gt;
&lt;li&gt;l’étroitesse du jeu de caractères (5 bits ne donnent que 32 combinaisons) a suscité l’ingénieuse bascule LETTRES/CHIFFRES (LETTERS/FIGURES) ;&lt;/li&gt;
&lt;li&gt;les téléscripteurs ont continué de s’en servir jusque fort avant dans le XX&lt;sup&gt;e&lt;/sup&gt; siècle.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="les-machines-à-états-en-jouant"&gt;Les machines à états, en jouant&lt;/h2&gt;
&lt;p&gt;La bascule LETTRES/CHIFFRES introduit sans qu’on y prenne garde la notion de machine à états. À force d’essais, les étudiants s’aperçoivent qu’un même motif désigne des caractères différents selon le mode en vigueur ; cette expérience concrète d’un codage qui dépend de l’état leur ouvre la voie vers des notions informatiques plus ardues.
Ainsi, le motif &lt;code&gt;00011&lt;/code&gt; représente :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la lettre « A » en mode LETTRES ;&lt;/li&gt;
&lt;li&gt;le chiffre « 1 » en mode CHIFFRES.
Cette double lecture, commandée par l’état, est au fondement même de la manière dont les ordinateurs traitent les données.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="en-classe"&gt;En classe&lt;/h2&gt;
&lt;p&gt;Quelques manières d’intégrer l’émulateur ITA2 à un cours :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Déchiffrement&lt;/strong&gt; : donner aux étudiants des messages codés en ITA2 à décoder&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Économie du codage&lt;/strong&gt; : expliquer pourquoi la bascule était précieuse pour ménager la bande passante&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Généalogie des codages&lt;/strong&gt; : comparer les 5 bits de l’ITA2 aux 7 bits de l’ASCII, puis à Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Informatique physique&lt;/strong&gt; : rapprocher ce système ancien des microcontrôleurs d’aujourd’hui, Arduino par exemple&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="un-outil-pour-tous-les-profils"&gt;Un outil pour tous les profils&lt;/h2&gt;
&lt;p&gt;Au-delà de son intérêt historique, l’émulateur convient à des étudiants dont les manières d’apprendre diffèrent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les visuels voient les motifs ;&lt;/li&gt;
&lt;li&gt;les manuels agissent directement sur le codage ;&lt;/li&gt;
&lt;li&gt;les esprits théoriciens peuvent pousser jusqu’aux mathématiques de la théorie de l’information.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sous-le-capot"&gt;Sous le capot&lt;/h2&gt;
&lt;p&gt;L’émulateur est écrit en JavaScript et s’intègre sans peine à toute plateforme pédagogique en ligne ; son code, modulaire, s’adapte à des contextes d’enseignement variés.
Le code source est disponible, et l’émulateur peut s’essayer, ici :
&lt;/p&gt;</description></item></channel></rss>