<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TEI |</title><link>https://clementgodbarge.com/sv/tag/tei/</link><atom:link href="https://clementgodbarge.com/sv/tag/tei/index.xml" rel="self" type="application/rss+xml"/><description>TEI</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>sv-se</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>TEI</title><link>https://clementgodbarge.com/sv/tag/tei/</link></image><item><title>tei-mcp v0.3: TEI-kodning utan att skriva om källan</title><link>https://clementgodbarge.com/sv/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;När jag
var målet att hindra
AI-assistenter från att hallucinera TEI-uppmärkning. Schemaförankringen
löste en del av problemet: med direkt, verktygsbaserad tillgång till
P5-specifikationen behöver modellen inte längre gissa vad ett element
betyder eller vilka attribut det tar. Resultatet validerar.&lt;/p&gt;
&lt;p&gt;Men hallucinationen har två ansikten i TEI-kodning, och schemat fångar
bara det ena. Att validera mot specifikationen säger dig att &lt;em&gt;uppmärkningen&lt;/em&gt;
är välformad. Det säger inget om den &lt;em&gt;text&lt;/em&gt; uppmärkningen omsluter. Och
det är där – i själva texten – de mer skadliga hallucinationerna håller till.
Spannlåst komposition (span-locked composition), huvudnyheten i v0.3, är
utformad just för att förhindra dem.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Innehållsförteckning&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#hallucinationen-som-schemat-inte-kan-fånga"&gt;Hallucinationen som schemat inte kan fånga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#spannlåst-komposition"&gt;Spannlåst komposition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vad-det-är-och-vad-det-inte-är"&gt;Vad det är, och vad det inte är&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#varför-det-spelar-roll-bortom-tei"&gt;Varför det spelar roll bortom TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hämta-uppdateringen"&gt;Hämta uppdateringen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="hallucinationen-som-schemat-inte-kan-fånga"&gt;Hallucinationen som schemat inte kan fånga&lt;/h2&gt;
&lt;p&gt;Be en modell koda ett franskt brev från 1500-talet, och du får ofta tillbaka
ett TEI-dokument som ser oklanderligt ut. Headern är ifylld,
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;-taggarna sitter rätt, &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; är välformad. Kör det genom
&lt;code&gt;validate_document&lt;/code&gt; och det går igenom.&lt;/p&gt;
&lt;p&gt;Jämför sedan brödtexten med källan.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; har blivit &lt;code&gt;même&lt;/code&gt;. Ett komma har flyttat på sig. &lt;code&gt;luy&lt;/code&gt; har i tysthet
moderniserats till &lt;code&gt;lui&lt;/code&gt;. En sats som var svårläst i handskriften har
”rättats” till något prydligare. Ingen av ändringarna var begärd. Ingen av
dem flaggas. Dokumentet är schemagiltigt och tyst felaktigt.&lt;/p&gt;
&lt;p&gt;För ett arkivflöde – där den kodade texten blir den permanenta post som
senare läsare, sökindex och citeringar förlitar sig på – är detta den
typ av fel som betyder mest. En felformad tagg är irriterande. En moderniserad
stavning som ingen upptäcker på fem år är en korruption.&lt;/p&gt;
&lt;h2 id="spannlåst-komposition"&gt;Spannlåst komposition&lt;/h2&gt;
&lt;p&gt;Den nya versionen (v0.3) levererar en mekanism mot hallucinationer som
siktar rakt på just den här typen av fel. Designmålet är att göra hallucinationer i
brödtexten omöjliga per konstruktion, inte bara osannolika.&lt;/p&gt;
&lt;p&gt;Idén är enkel: &lt;strong&gt;modellen skriver aldrig brödtext&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I stället ser arbetsflödet ut så här:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Modellen anropar &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; och får källans råtext som
en oföränderlig sträng.&lt;/li&gt;
&lt;li&gt;För varje tagg den vill sätta anropar den
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; – och
registrerar därmed ett TEI-element över ett teckenintervall i källan.&lt;/li&gt;
&lt;li&gt;När den är klar anropar den &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Servern flätar in
de registrerade taggarna i den ursprungliga råtexten, renderar den
färdiga TEI-filen och kontrollerar sedan &lt;em&gt;byte för byte&lt;/em&gt; att det
renderade dokumentets rena textinnehåll är identiskt med källan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Stämmer bytena kommer dokumentet tillbaka. Gör de inte det – om modellens
taggar på något sätt implicerar en brödtext som avviker från källan med ett
enda tecken – kastar &lt;code&gt;compose()&lt;/code&gt; ett fel i stället för att returnera ett
korrupt dokument.&lt;/p&gt;
&lt;p&gt;Det finns ingen väg genom det här arbetsflödet där modellen producerar ett
TEI-dokument vars brödtext avviker från källan. Invarianten är mekanisk,
inte beteendemässig. Du behöver inte lita på att modellen låter bli att
hallucinera; du behöver lita på en &lt;code&gt;==&lt;/code&gt;-jämförelse mellan två bytesträngar.&lt;/p&gt;
&lt;h2 id="vad-det-är-och-vad-det-inte-är"&gt;Vad det är, och vad det inte är&lt;/h2&gt;
&lt;p&gt;Spannlåst komposition är ett &lt;strong&gt;komplement&lt;/strong&gt; till schemaförankringen, inte en
ersättning. Schemaverktygen (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;,
&lt;code&gt;valid_children&lt;/code&gt; och resten av de ursprungliga sexton) hjälper modellen att
producera &lt;em&gt;giltig&lt;/em&gt; TEI. Spannlåst komposition garanterar att brödtexten
inuti den TEI-filen är &lt;em&gt;trogen&lt;/em&gt; källan. Ett kodningsflöde som ska kunna tas
i drift måste uppfylla båda kraven, och nu täcks båda av en och samma
server.&lt;/p&gt;
&lt;p&gt;Det är heller inget trollspö som fixar allt. &lt;code&gt;compose()&lt;/code&gt; kontrollerar ännu
inte att de registrerade taggarna är tillåtna enligt en laddad
ODD-anpassning – det kommer i en uppföljning. Registrerade taggar ligger i
processminnet och överlever inte en omstart. Och källfilerna måste vara
läsbara från den plats där servern körs. Allt detta går att åtgärda; inget
av det rubbar den centrala invarianten.&lt;/p&gt;
&lt;h2 id="varför-det-spelar-roll-bortom-tei"&gt;Varför det spelar roll bortom TEI&lt;/h2&gt;
&lt;p&gt;Mönstret går att generalisera. Varje gång en modell ombeds annotera,
omvandla eller omsluta en text – och varje gång textens integritet väger
tyngre än modellens förmåga att ”förbättra” den – passar samma slags
lösning. Be inte modellen skriva om texten. Be den producera instruktioner
över texten, och låt en deterministisk kompositör tillämpa dem under en
likhetsinvariant.&lt;/p&gt;
&lt;p&gt;För digitala utgåvor i synnerhet förändrar detta vad man med gott samvete
kan be en modell om. Kodningen blir med ett slag en uppgift man kan
delegera utan att manuellt behöva jämföra varje resultat med källan.
Maskinen tar den tråkiga vägen; utgivaren granskar uppmärkningen, inte
stavningen.&lt;/p&gt;
&lt;h2 id="hämta-uppdateringen"&gt;Hämta uppdateringen&lt;/h2&gt;
&lt;p&gt;Har du redan tei-mcp installerat:&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;Eller från början:&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;För att använda spannlåst komposition pekar du servern mot en katalog med
källfiler i råtext:&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;Varje fils namnstam blir dess dokument-ID (&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Källkod, fullständig dokumentation och designanteckningarna om invarianten:
&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/sv/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-tei-p5-för-ai-agenter"&gt;tei-mcp: TEI P5 för AI-agenter&lt;/h2&gt;
&lt;p&gt;tei-mcp är en
-server med öppen källkod som ger AI-kodassistenter direkt tillgång till specifikationen
. I stället för att förlita sig på memorerade träningsdata – vilket ofta ger uppmärkning som ser rimlig ut men är fel – kan AI:n fråga specifikationen i realtid.&lt;/p&gt;
&lt;h2 id="funktioner"&gt;Funktioner&lt;/h2&gt;
&lt;p&gt;Servern tolkar ODD-filen för TEI P5 och exponerar 16 verktyg:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slå upp&lt;/strong&gt; vilket element, vilken klass, vilket makro eller vilken modul som helst på namn, med skiftlägesokänslig matchning och förslag vid felstavning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lös upp attribut&lt;/strong&gt; genom hela TEI:s klasshierarki (lokala + ärvda)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expandera innehållsmodeller&lt;/strong&gt; till strukturerade träd med upplösning av klasser och makron&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kontrollera nästling&lt;/strong&gt; – direkt förälder–barn eller rekursiv nåbarhet med spårad sökväg&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validera dokument&lt;/strong&gt; mot TEI P5: innehållsmodeller, attribut, slutna värdelistor, referensintegritet och utfasningsvarningar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validera enskilda element&lt;/strong&gt; för stegvisa redigeringsflöden&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ladda ODD-anpassningar&lt;/strong&gt; för att begränsa schemat till en projektspecifik delmängd&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sök&lt;/strong&gt; bland alla entitetstyper med reguljära uttryck&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;Eller kör direkt med:&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="användning"&gt;Användning&lt;/h2&gt;
&lt;p&gt;Lägg till i vilken MCP-kompatibel klient som helst (Claude, Cursor, Windsurf osv.):&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;Källkod och dokumentation finns i
.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 för AI-agenter</title><link>https://clementgodbarge.com/sv/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/post/tei-mcp/</guid><description>&lt;p&gt;Har du någon gång låtit en AI-kodassistent skriva TEI-XML har du nog märkt
att den gör fel. Element dyker upp där de inte hör hemma. Attribut hittas på.
Nästlingsreglerna ignoreras. Modellen har en ungefärlig känsla för hur TEI
ser ut, men ingen tillförlitlig kunskap om specifikationen.&lt;/p&gt;
&lt;p&gt;tei-mcp löser det genom att ge AI-agenter direkt, verktygsbaserad tillgång
till riktlinjerna för TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Innehållsförteckning&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#vad-är-mcp"&gt;Vad är MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vad-tei-mcp-gör"&gt;Vad tei-mcp gör&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#varför-det-spelar-roll"&gt;Varför det spelar roll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#kom-igång"&gt;Kom igång&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="vad-är-mcp"&gt;Vad är MCP?&lt;/h2&gt;
&lt;p&gt;
(MCP) är en öppen
standard som låter AI-applikationer ansluta till externa datakällor och
verktyg. Tänk på det som en USB-port för AI: ett enda protokoll som låter
vilken kompatibel klient som helst – Claude, Cursor, Windsurf och andra –
koppla in sig på specialiserade tjänster.&lt;/p&gt;
&lt;p&gt;En MCP-server exponerar &lt;em&gt;verktyg&lt;/em&gt; som AI:n kan anropa under ett samtal.
I stället för att förlita sig på memorerade träningsdata kan modellen fråga
en levande, auktoritativ källa.&lt;/p&gt;
&lt;h2 id="vad-tei-mcp-gör"&gt;Vad tei-mcp gör&lt;/h2&gt;
&lt;p&gt;tei-mcp tolkar ODD-specifikationen för TEI P5 och exponerar 16 verktyg som
täcker de vanligaste frågor en utgivare eller kodare ställer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vad är det här elementet?&lt;/strong&gt; Slå upp vilket element, vilken klass, vilket
makro eller vilken modul som helst på namn, med skiftlägesokänslig matchning
och förslag vid felstavning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vilka attribut tar det?&lt;/strong&gt; Lös upp attributen genom hela klasshierarkin –
lokala attribut först, sedan de ärvda i ordning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vad får finnas inuti?&lt;/strong&gt; Expandera innehållsmodeller till strukturerade
träd, eller få en platt lista över giltiga barnelement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Får det här elementet stå här?&lt;/strong&gt; Kontrollera nästlingen förälder–barn,
eller spåra nåbarheten genom hela elementhierarkin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Är mitt dokument giltigt?&lt;/strong&gt; Validera en TEI-XML-fil mot specifikationen:
innehållsmodeller, attributvärden, slutna värdelistor, referensintegritet
och utfasningsvarningar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Och mitt projektschema?&lt;/strong&gt; Ladda en ODD-anpassningsfil för att begränsa
allt ovanstående till ditt projekts specifika delmängd av TEI.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="varför-det-spelar-roll"&gt;Varför det spelar roll&lt;/h2&gt;
&lt;p&gt;TEI-kodning kräver att man ständigt slår i riktlinjerna. Erfarna kodare har
de vanligaste mönstren i ryggmärgen, men även de måste kontrollera
specifikationen för mindre bekanta element eller invecklade innehållsmodeller.
För AI-assistenter, som inte har någon sådan inövad kunskap, är problemet
värre: de hallucinerar fram uppmärkning som ser rimlig ut men är fel.&lt;/p&gt;
&lt;p&gt;Med tei-mcp behöver AI:n inte gissa. Den kan slå upp svaret i specifikationen
innan den skriver en enda vinkelparentes. Resultatet är uppmärkning som följer
TEI P5 – eller ditt projekts ODD-anpassning.&lt;/p&gt;
&lt;h2 id="kom-igång"&gt;Kom igång&lt;/h2&gt;
&lt;p&gt;Installera från 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;Lägg sedan till servern i din MCP-klients konfiguration:&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;Servern laddar ner TEI-specifikationen vid första körningen och fungerar
med vilken MCP-kompatibel klient som helst.&lt;/p&gt;
&lt;p&gt;Källkod och fullständig dokumentation:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/sv/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-parallell-xslt-bearbetning-av-stora-tei-korpusar"&gt;Multi-Saxon: parallell XSLT-bearbetning av stora TEI-korpusar&lt;/h2&gt;
&lt;p&gt;Multi-Saxon fyller en kännbar lucka bland XML-verktygen genom att möjliggöra parallell körning av XSLT 2.0- och 3.0-transformationer som LXML (ett populärt XML-bibliotek för Python) inte klarar. Multi-Saxon är utformat särskilt för stora samlingar av XML-TEI-dokument och kortar bearbetningstiden avsevärt genom effektiv parallellkörning.&lt;/p&gt;
&lt;h2 id="huvudfunktioner"&gt;Huvudfunktioner&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avancerat XSLT-stöd&lt;/strong&gt;: bearbetar XSLT 2.0- och 3.0-transformationer bortom LXML:s förmåga&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallell bearbetning&lt;/strong&gt;: kortar transformationstiden dramatiskt för stora dokumentsamlingar genom parallellisering&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEI-optimerat&lt;/strong&gt;: särskilt konstruerat för XML-dokument enligt Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skalbar prestanda&lt;/strong&gt;: hanterar effektivt korpusar från hundratals till tusentals dokument&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plattformsoberoende&lt;/strong&gt;: fungerar i olika operativsystem och miljöer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="problemet-multi-saxon-löser"&gt;Problemet Multi-Saxon löser&lt;/h2&gt;
&lt;p&gt;Forskare inom digital humaniora som arbetar med TEI ställs ofta inför två stora svårigheter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (ett vanligt XML-bibliotek för Python) stöder bara XSLT 1.0, vilket gör det omöjligt att använda de mer avancerade funktionerna i XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Att bearbeta stora TEI-korpusar sekventiellt kan ta oöverkomligt lång tid&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon löser båda problemen genom att utnyttja Saxons avancerade XSLT-funktioner och samtidigt fördela bearbetningen över flera processorkärnor, med betydande prestandavinster som följd.&lt;/p&gt;
&lt;h2 id="implementering"&gt;Implementering&lt;/h2&gt;
&lt;p&gt;Multi-Saxon kombinerar Python med Javas Saxon-processor i en högpresterande transformationskedja:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;använder Javas Saxon-bibliotek för robust XSLT 2.0/3.0-bearbetning&lt;/li&gt;
&lt;li&gt;använder multiprocessing för att fördela transformationerna över tillgängliga processorkärnor&lt;/li&gt;
&lt;li&gt;hanterar processorpooler effektivt för maximal genomströmning&lt;/li&gt;
&lt;li&gt;erbjuder ett enkelt gränssnitt för batchbearbetning av TEI-dokument&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="användningsexempel"&gt;Användningsexempel&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="betydelse-för-digital-humaniora"&gt;Betydelse för digital humaniora&lt;/h2&gt;
&lt;p&gt;För projekt inom digital humaniora med stora TEI-samlingar möjliggör Multi-Saxon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;komplexa transformationer av hela korpusar som vore omöjliga med LXML&lt;/li&gt;
&lt;li&gt;dramatiskt kortare bearbetningstider (ofta 5–10 gånger snabbare på flerkärniga system)&lt;/li&gt;
&lt;li&gt;mer avancerad analys tack vare funktionerna i XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;ett enklare arbetsflöde för bearbetning av hela dokumentsamlingar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Källkod och dokumentation finns i
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/sv/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/sv/code/persnamer/</guid><description>&lt;h2 id="persnamer-tei-kopplat-till-virtual-international-authority-file"&gt;persNamer: TEI kopplat till Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer är ett specialiserat Python-verktyg som förenklar integrationen av auktoriserade persondata från VIAF (Virtual International Authority File) i TEI-XML-dokument. Genom att omvandla VIAF-identifierare till färdig TEI-uppmärkning minskar persNamer avsevärt det manuella arbetet med att skapa strukturerade personposter för digitala vetenskapliga utgåvor.&lt;/p&gt;
&lt;h2 id="auktoritetskontrollens-utmaning-i-tei"&gt;Auktoritetskontrollens utmaning i TEI&lt;/h2&gt;
&lt;p&gt;Digitala vetenskapliga utgåvor kräver ofta exakt identifiering av historiska personer, med standardiserade namnformer och levnadsår. Att upprätthålla en konsekvent auktoritetskontroll genom ett helt projekt kräver att man:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;identifierar personerna i de historiska texterna&lt;/li&gt;
&lt;li&gt;hittar auktoritetsdata om dem&lt;/li&gt;
&lt;li&gt;skapar korrekt formaterade TEI-poster&lt;/li&gt;
&lt;li&gt;ser till att hänvisningarna är konsekventa genom hela projektet&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dessa steg är i regel manuella, tidskrävande och känsliga för inkonsekvenser.&lt;/p&gt;
&lt;h2 id="så-fungerar-persnamer"&gt;Så fungerar persNamer&lt;/h2&gt;
&lt;p&gt;persNamer automatiserar arbetsflödet genom att:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;hämta VIAF-data&lt;/strong&gt;: utifrån en VIAF-identifierare hämtar verktyget RDF-data via HTTP-innehållsförhandling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;extrahera nyckeluppgifter&lt;/strong&gt;: tolkar RDF-data och plockar ut det föredragna namnet, födelsedatum och dödsdatum&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;generera TEI-uppmärkning&lt;/strong&gt;: skapar två centrala XML-utdrag:
&lt;ul&gt;
&lt;li&gt;en &lt;strong&gt;post för auktoritetsfilen&lt;/strong&gt; (ett &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt;-element med genererat &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; och &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;en separat &lt;strong&gt;annotationstagg&lt;/strong&gt; (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; med ett &lt;code&gt;ref&lt;/code&gt;-attribut som pekar på auktoritetsposten)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Den dubbla utmatningen låter utgivaren underhålla en central auktoritetsfil och samtidigt enkelt infoga annotationstaggar i sina TEI-texter.&lt;/p&gt;
&lt;h2 id="huvudfunktioner"&gt;Huvudfunktioner&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standardiserad ID-generering&lt;/strong&gt;: skapar konsekventa XML-ID:n i formatet &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (t.ex. &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDF-tolkning&lt;/strong&gt;: använder &lt;code&gt;rdflib&lt;/code&gt; för att hämta uppgifter ur olika RDF-egenskaper (t.ex. &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;Kommandoradsgränssnitt&lt;/strong&gt;: körs enkelt med ett VIAF-nummer som enda obligatoriska argument&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utförlig utmatning&lt;/strong&gt;: ger detaljerad information om bearbetningen vid sidan av den färdiga XML-koden&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exempel"&gt;Exempel&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;Kommandot ger:&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="användning-inom-digital-humaniora"&gt;Användning inom digital humaniora&lt;/h2&gt;
&lt;p&gt;persNamer är särskilt värdefullt för:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;digitala vetenskapliga utgåvor som kräver auktoritetskontroll&lt;/li&gt;
&lt;li&gt;TEI-kodningsprojekt som arbetar med historiska personer&lt;/li&gt;
&lt;li&gt;initiativ kring länkade data som kopplar dokument till auktoritetsposter&lt;/li&gt;
&lt;li&gt;att säkra konsekvens i stora TEI-korpusar&lt;/li&gt;
&lt;li&gt;undervisning i auktoritetskontroll på kurser i digital humaniora&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementering"&gt;Implementering&lt;/h2&gt;
&lt;p&gt;persNamer är skrivet i Python och bygger på:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; för HTTP-anrop&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; för RDF-tolkning&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; för XML-hantering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Källkod och dokumentation finns i
.&lt;/p&gt;</description></item></channel></rss>