Kapitel 9 Dokumentrepresentation Vi har tidigare sett hur rena textfiler (plain text) representeras för datorn. En teckenkodning ger varje tecken ett visst numeriskt värde, inklusive sådana kontrolltecken som nyrad. Vid teckenkodningar med högst 256 olika värden lagras dessa en i varje byte (som var och en kan ha 256 olika värden). För Unicode som har många fler värden lagras tecknen på något sätt där en del eller alla tecken tar upp flera bytes. När mer komplicerad information, som ordbehandlingstext, ljud, bild, film, databaser, program m. m. ska lagras kan det också ske i form av text på något sätt eller som binärfiler där de olika koderna inte har tecken som motsvarigheter. När texter lagras i filer eller sänds i kommunikation mellan datorer gäller det att avsändare och mottagare är överens om vilken kodning som används så att informationen tolkas som det var tänkt. 9.1 Uppmärkt text I många sammanhang är det vanligt att textfiler är uppmärkta med taggar som anger att en viss del av texten ska tolkas eller behandlas på ett visst sätt. Ett exempel vi har sett på det är HTML där uppmärkningen sker med starttaggar som <em> och sluttaggar som </em>. Ett helt uttryck som <em>hej</em> kallas för ett element, där elementets innehåll är»hej«. Rättelse: I förklaringen efter uppgift 8.24 (s. 96) ska inte ordet hemmamatch stå med. I andra sammanhang skulle man kunna tänka sig att andra egenskaper hos texten märktes upp. I en del fall har man kanske anledning att märka upp varje ord med ordklass. I ett annat fall kanske man vill märka upp bara kapitel och stycken. I ett tredje fall kanske man vill visa exakt hur en viss utgåva av en tryckt skrift såg ut och märka upp sidor och rader. En uppmärkning av Röda rummet skulle kunna börja <rubrik>stockholm i fågelperspektiv</rubrik> <mening>det var en afton i början av maj.</mening> <mening>den lilla trädgården på... och blommor.</mening> Här är kapitelrubriken uppmärkt och dessutom meningar. Det finns taggar som visar var de uppmärkta delarna börjar och var de slutar. En uppmärkning som anger ordklass för alla ord skulle kunna innehålla t. ex. något som <pron>det</pron> <verb>var</verb> <art>en</art> <subst>afton</subst> <prep>i</prep> <subst>början</subst> <prep>av</prep> <subst>maj</subst><punkt>.</punkt> 9.2 HTML är SGML Den här syntaxen med taggar med <> och / var inget nytt påhitt för HTML, utan det är ett fall av SGML (Standard Generalized Markup Language). Till SGML hör bland annat syntaxen med </> samt sätt att definiera olika märkspråk genom att tala om vilka element som kan förekomma och i vilka kombinationer. 99
9. DOKUMENTREPRESENTATION I kapitel 7 fick ni skriva HTML-sidor med en del element som t. ex. p, ul och li. Till HTML-standarden hör information om t. ex. att ett ul-element kan innehålla li-element men inte tvärtom, osv. T. ex. kan ett stycke, dvs. ett element p, inte innehålla ett annat stycke. Om det står <p>foo<p>bar</p> så betyder det samma sak som <p>foo</p><p>bar</p>. Det finns en implicit </p> där eftersom första stycket ska vara avslutat när det andra börjar. Ett stycke kan heller inte innehålla t. ex. en ul. Så om man skrev kod i stil med detta: <p>då s a häxan <ul> < l i >snipp < l i >snapp < l i >snut </ ul> Och så var sagan s l u t. </ p> där man tänker sig ett element p som i sig innehåller lite text (»Då sa häxan«), ett element ul, och sen lite mer text (»Och så var sagan slut.«) så har man gjort fel. Det finns nämligen en implicit </p> precis före <ul>, och det </p> som står sist i exemplet motsvarar inget påbörjat stycke. En validering av detta klagar mycket riktigt: end tag for element "P" which is not open I praktiken är webbläsare förlåtande och gör det bästa den kan även när sidor inte är korrekt HTML, och många sådana fel ger det utseende man väntade sig i alla fall. Men för mer komplicerade fel kan olika webbläsares tolkning av vad som är det bästa att göra av situationen skilja sig åt. Korrekt HTML däremot ska alla webbläsare tolka likadant. Det går alltså bra att inte skriva ut sluttaggarna i en del fall. Det gäller också t. ex. alla lielement i exemplet ovan som saknar sluttaggar. Bara <li>snipp går lika bra som <li>snipp</li> där. 9.3 SGML och XML SGML är en gammal standard och 1998 kom en variant, XML (Extensible Markup Language) inspirerad av den. XML är gjord för att vara enklare att tolka för program. T. ex. måste alla element alltid avslutas. XML har blivit mycket populärt i en mängd sammanhang där man har strukturerad text. När nya märkspråk ska konstrueras så väljer man i allmänhet att använda XML. Då får man enhetlighet och kan använda sig av en mängd verktyg som analyserar och konverterar XML-filer på olika sätt. Nyare versioner av HTML, XHTML, är gjorda som XML istället för SGML. 9.3.1 Taggar Ett element i XML börjar med en starttagg och slutar med en sluttagg och däremellan kan det finnas text och andra element. Starttaggar skrivs med <> runt ett namn och sluttaggarna likadant men med / före namnet, så som i exemplen ovan. Det som står mellan starttaggen och sluttaggen kallas elementets innehåll. Innehållet i elementet <name>melker Melkersson</name> är t. ex.»melker Melkersson«. Innehållet kan i sin tur innehålla nya element: <name><firstname>melker</firstname> <lastname>melkersson</lastname></name> Element måste ligga helt inom andra element. Det går inte att låta dem korsa varandras gränser i stil med <kursiv>herr <name>melker</kursiv> Melkersson</name>. Här är det fel vid </kursiv> eftersom name-taggen inte har avslutats än. När ett element har ett tomt innehåll behöver man inte skriva <foo></foo> utan man kan istället skriva på det speciella sättet <foo/>. 1 I traditionell HTML har en del element aldrig en sluttag, t. ex. br och img. I XHTML måste de också ha det. Istället för <br></br> använder man då denna kortform <br/>. I XML är det skillnad på versaler och gemener i taggar. I XHTML ska taggarna skrivas med gemener. 9.3.2 Attribut Ett element kan även innehålla attribut med värden. Exempel: <name type="person">melker Melkersson</name> Här har elementet ett attribut type med värdet person. 1 I XHTML skriver man ofta ett extra mellanrum också: <foo />. Det behövs inte, men det skadar inte, och kan vara praktiskt av kompatibilitetsskäl med äldre webbläsare. 100
SGML och XML Man använder dubbla eller enkla citattecken runt värdena. I XML måste citattecken alltid vara med. Så är det inte i SGML. Ett annat sätt än det tidigare att märka upp en mening med ordklasser skulle kunna vara <w wc="pron">det</w> <w wc="verb">var</w> <w wc="art">en</w> <w wc="subst">afton</w> <w wc="prep">i</w> <w wc="subst">början</w> <w wc="prep">av</w> <w wc="subst">maj</w><inter>.</inter> Här användes en tagg w för ord (word) med ett attribut wc (= word category = ordklass). 9.3.3 Toppnivå Ett XML-dokument börjar med en deklaration i stil med <?xml version="1.0" encoding="utf-8"?> Den visar vilken version av XML som används och vilken teckenkodning detta dokument använder. (Om inget sägs om detta så är det UTF-8.) Efter det kommer själva innehållet, och det är alltid bara ett element. Alla övriga element måste finnas i detta elements innehåll. 9.3.4 Teckenreferenser och entiteter Om man vill lägga in text som man har problem med att skriva så kan man lägga in vilka tecken som helst genom att skriva deras Unicode-kod mellan &# och ;. Ett promilletecken ( ) kan man t. ex. vid behov beteckna med. Ofta använder man hexadecimala beteckningar istället som börjar med x. Då blir t. ex. promille istället. Vet du inte vad hexadecimala tal behöver du inte vara orolig för det. Det räcker med att känna igen att referenserna kan se ut på den formen också. Entiteter använder också &; men däremellan skriver man istället ett namn, t. ex. för. Vilka entitetsnamn som finns är olika för olika slags XMLdokument, men alltid finns i alla fall & (&) < (<) > (>) ' (') " (") eftersom dessa tecken ingår i XML-syntaxen och därför kan vara besvärliga att skriva annars i vissa fall. Observera att de numeriska teckenreferenserna alltid sker till Unicode-koder oavsett vilken teckenkodning som XML-filen använder. Även om man har t. ex. en Latin1-fil med <?xml version="1.0" encoding="iso-8859-1"?> så går det ändå att på detta sätt referera till vilka tecken som helst. 9.3.5 Olika XML-språk XML är liksom SGML inte ett märkspråk, utan ett sätt att definiera en mängd olika märkspråk som använder samma grundsyntax men helt olika uppmärkning. En definition av ett sådant språk anger inte bara vilka element som ska finnas, utan även hur de förhåller sig till varandra, t. ex. att en li kan finnas inne i en ul men inte tvärtom för att ta ett exempel från XHTML. Ett exempel som < l i > <ul>så här f å r man i n t e göra! </ ul> </ l i > är ogiltig XHTML. Men det är fortfarande välformad XML. Med välformad (well-formed) menas bara att man följer de allmänna syntaxreglerna för XML, som t. ex. att alla sluttaggar är avslutade. Med giltig (valid) menas att man följer de specifika reglerna för ett visst märkspråk. 9.3.6 Fler exempel på XML-format Ett exempel är Open Document Format (ODF) för officeprogram. Olika officeprogram har normalt sparat sina filer i speciella binära format som är olika för olika program. När man i en ordbehandlare kan importera dokument från en annan ordbehandlare är det inte för att formatet liknar varann utan för att den första ordbehandlaren innehåller kod som förstår sig på de andra ordbehandlarens format. Open Document är ett försök att skapa en gemensam plattform som bygger på XML. Det blev en ISO-standard 2006 och används bland annat av Openoffice.org. Microsoft Offices nya format Office Open XML (OOXML) är också XML-baserat, men annorlunda. 101
9. DOKUMENTREPRESENTATION I språkteknologiska tillämpningar används ofta XML-uppmärkta texter. Ett exempel är TEI (Text Encoding Initiative). I korpuslingvistik används ofta ett format som heter XCES (Corpus Encoding Standard for XML). 9.4 MIME Program som kommunicerar med varann behöver vara överens om hur data som de skickar mellan varann ska tolkas. När data skickas så följer det därför ofta med en etikett på vilken det står vad det är för slags data så att mottagaren ska få veta det. På sådana etiketter använder man ofta ett standardiserat format MIME för att beskriva olika format. Förkortningen står för Multipurpose Internet Mail Extensions, eftersom denna standard först utvecklades för datorpost, men den används i andra sammanhang också. MIME-etiketterna består av två delar med snedstreck emellan, t. ex. image/jpeg för en bild i JPEG-format, image/png för en bild i PNG-format osv. Den första delen anger alltså vad det är för typ av format och den andra vilket specifikt format det är. Andra möjliga förled är bl. a. audio för ljud, video för video och application för diverse information som måste behandlas av något särskilt program, t. ex. application/pdf eller application/ msword. Det är IANA som håller rätt på vilka beteckningar som är de officiella så att alla använder samma. Textfiler använder förleden text och i synnerhet kallas vanlig text text/plain. För text-typer kan man lägga till en specifikation av vilken teckenkodning som används på detta sätt: text/html; charset=iso-8859-1. Detta används till exempel i datorpost då det i brevhuvudet kan finnas en rad i stil med Content-Type: text/plain; charset=utf-8 som talar om att brevet innehåller ren text kodad med UTF-8. (Denna rad ser man vanligen inte, för program för att läsa datorpost brukar dölja sådana tekniska detaljer, men ha ett särskilt kommando som»visa hela huvudet«eller»visa original«som visar även detta.) MIME-typerna används även på webben. För»traditionell«HTML är MIME-typen text/html och för XHTML är det application/xhtml+xml. (Format som bygger på XML har +xml i slutet av sina etiketter.) Varje gång en webbserver skickar ut ett dokument till en webbläsare så skickar den först ut en innehållsdeklaration med en rad i stil med Content-Type: text/html; charset=utf-8 som talar om vad det är för slags data som kommer därnäst. Med vår webbserver kan man styra om vad som sänds där i filen.htaccess. 9.4.1 När man inte har MIME Det finns ingen information i sig i filsystemet om vad de olika filerna är för slags dokument, så om man öppnar en fil från t. ex. filhanteraren så får den göra en mer eller mindre kompetent gissning om vad det är för slags dokument. Dels kan sådana program gå efter filnamnsändelsen och t. ex. utgå från att en fil foo.png är en bild i bildformatet PNG. Men den kan också titta inne i filen, i synnerhet på hur den börjar. Många format har filer som alltid börjar på samma sätt vilket gör dem lätta att känna igen. Ett skalprogram som känner igen filer på ett sådant sätt och beskriver innehållet är file. $ [gray].90file small.txt turing.jpg small.txt: Non-ISO extended-ascii text turing.jpg: JPEG image data, JFIF standard 1.02 9.5 Filarkiv Ett filarkiv är en fil som i sig samlar en mängd andra filer. Det kan t. ex. användas för att enklare skicka en hel mängd filer till någon annan i ett svep. Man kan packa upp filarkivet och därmed få fram de ingående filerna igen. I avsnitt 6.5 talades det också om att packa upp, men då gällde det att packa upp en komprimerad fil för att få fram originalet igen, vilket inte är samma sak. I många fall är filarkiv alltid komprimerade, men det normala filarkivetformatet i Unix, tar, är inte komprimerat, utan ett arkiv är ungefär lika stort som de ingående filerna tillsammans. En sådan tarfil har filnamnsändelsen.tar och ofta komprimerar man den i sin tur och får då en filnamn som slutar med.tar.gz. 102
Filarkiv För att hantera sådana filarkiv använder man kommandot tar. $ [gray].90tar -c -f texter.tar *.txt $ [gray].90rm *.txt $ [gray].90tar -x -f texter.tar Första väljaren är -c för att skapa ett arkiv (Create), väljaren -f ska ha ett argument som är arkivfilen (i detta fall texter.tar) och argumenten (*.txt här) är filerna som ska läggas i arkivet. I det andra fallet är förstaväljaren -x för att packa upp ett arkiv (extract). Filerna som togs bort med rm återställs. Med en väljare -v blir tar mer pratig (verbose) och talar om namnet på varje inblandad fil. Med en väljare -z kommer tar att använda gzip/gunzip för att hantera ett komprimerat filarkiv. Om man har en fil foo.tar.gz som man ska packa upp behöver man alltså inte använda gunzip (eller zcat) först, utan kan direkt skriva $ [gray].90tar -xvzf foo.tar.gz (I detta exempel fördes väljarna ihop. Då får man lov att sätta -f sist så att man kan ge den ett argument.) Den vanliga kombinerade ändelsen.tar.gz ersätts ibland med bara.tgz, speciellt i andra filsystem som inte klarar flera punkter. 103
Laboration 9: XML och XHTML Redovisning Skicka mail till Per med svar på frågorna senast fredagen den 16/11. Med detta mail ska du också skicka med bilagor med de filer som du ändrat i enligt instruktionerna. Packa upp filerna De filer du ska använda i denna labb ligger i filarkivet /local/kurs/ids/xml.tar.gz. Packa upp det i din kurskatalog. Alla filer i filarkivet ligger i en katalog xml så du får en ny underkatalog med detta namn med filer som du ska använda i denna labb. XML i Emacs Öppna filen svt1.xml där i Emacs. Innehållet är tydligen en tevetablå i nåt XML-format. Uppgift 9.1 Vad har elementet på toppnivån i detta dokument för namn? Notera härnäst att det står (nxml Invalid) i informationsraden. Det första inom parentesen är namnet på det editeringsläge (den mode, arbetsmiljö) som Emacs befinner sig i. Tillägget Invalid betyder i detta fall att det är en ogiltig XML-fil. Denna Emacs-mode använder sin kunskap om XMLsyntax för att markera när syntaxen inte stämmer. Ett sätt att direkt flytta sig till felet är att klicka på detta ord Invalid. Rätta felet! Snart ändras Invalid till Valid. nxml-mode: Detta är inte den vanliga XMLmoden i Emacs, utan ett alternativ med fler finesser. Det är därför den heter nxml. De olika raderna i filen börjar med olika många mellanslag för att det ska bli lättare att läsa så att man ser hur strukturen är. Ett program som förstår sig på XML och som ska göra något med denna fil kommer inte att bry sig om hur indragen är, men det är bra om filen är någorlunda läsbar för människor också! Detta kan Emacs ordna åt dig. Teveprogrammet Konstapel Abel saknar starttid. Gå till den tomma rad där det borde stå och tryck TAB så får du ett lagom indrag. TAB fungerar så i de flesta Emacslägen, att istället för att alltid gå fram lika långt så går det fram»lagom«långt för det som man just editerar. (Det kan användas både för en ny rad som här, eller för att ändra indraget på en rad som redan finns.) Skriv nu in <starts>18:15 (precis så, utan sluttagg). Nu blir det Invalid i informationsraden igen. En finess i detta emacsläge är att det hela tiden kollar av ifall du har en korrekt XML-fil eller inte. Med röd understrykning visas var det finns fel. Uppgift 9.2 Var visas det vara fel? Varför just där? Ta fram hjälpen för denna Emacs-mode. (Se s. 36 eller Help Describe i menyerna om du har glömt hur man gör det.) I den hjälp du får upp nämns ett kommando som avslutar det aktuella elementet genom att lägga in en sluttagg. Uppgift 9.3 Hur fick du fram hjälpen? Hur utför man det kommandot? (Gör så!) Nu bör bufferten ha blivit Valid igen. Med detta menas än så länge bara att det är välformad XML efter Emacs bara vet att detta är XML men inte vet vilket särskilt XML-märkspråk det är. Tala om det med XML Set Schema File... och ange filen schedule.rnc i samma katalog. Du får en fråga 104
XHTML»Save schema location to... «Svara y! Nu minns Emacs vilket schema som gäller för denna fil. Där beskrivs en ganska petig syntax för hur de olika delarna av en sån här tevetablå måste se ut och denna fil stämmer inte riktigt med denna syntax. Så nu hittas flera fel. Tryck på Invalid i informationsraden för att gå till det första felet. Med C-c C-n kan du gå till nästa fel. Varje gång du går till ett fel så kommer det ett litet meddelande om vad felet är i ekoarean. För att gå till det första felet utan att behöva använda musen kan du använda M-< som går till början av bufferten innan du går till nästa fel. Rätta alla felen! Exakt hur syntaxen måste vara här bör framgå av de exempel som inte ger fel. I och med att Emacs vet precis vilken syntax som gäller för denna fil så kan man få mycket hjälp när man lägger till nya saker i filen också, bland annat genom att man kan få komplettering av symboler så att man inte behöver skriva hela»programme«osv. Uppgift 9.4 Hur ska man trycka för att få komplettering av symboler? (Det beskrivs i hjälptexten till detta Emacsläge.) Skriv till ett program i slutet av tablån. Börja med bara <p och använd sedan komplettering. När det då står <programme så använd kommandot C-c C-b som lägger in ett helt block. Uppgift 9.5 Härnäst är det dags för en tagg med starts. Hur lite måste du skriva härnäst innan du kan få fram den med komplettering? Fullfölj detta nya programinslag i tablån och lägg till ytterligare två. Du kan hitta på fritt eller ta från verkligheten, vilket du vill. Se till att din slutliga fil är»valid«och använder lagom indrag som underlättar läsningen. schedule.rnc Titta i den där filen schedule.rnc som beskrev formatet. Det finns olika sätt att beskriva syntaxen för ett viss slags XML-dokument. Detta kallas för RE- LAX NG. Detta format är inget du behöver lära dig, men många delar av det bör ändå framgå tydligt med tanke på hur filen såg ut. Se i synnerhet på det pattern som definieras där för att beskriva vad elementet starts får ha för värden. Detta är ett reguljärt uttryck och det godkänner inte bara tider som»17:15«utan också t. ex.»12:75«och»55:15«som inte är riktiga tider. Förbättra detta reguljära uttryck så att det är mer nogräknat! När du har ändrat i schedule.rnc måste du sätta filschemat för svt1.xml på nytt för att den ska använda den nya filen ifall du vill prova att ditt reguljära uttryck fungerar som avsett. (Prova gärna med lite felaktiga tider, men glöm inte att återställa till korrekta tider efteråt, så att det du lämnar inte innehåller några fel!) XHTML Kopiera din HTML-fil ids7-a.html från labb 7 i public_html till ids9.xhtml i samma katalog. Den nya filnamnändelsen visar att detta ska vara XHTML. Byt därför ut den inledande deklarationen av dokumenttyp! Det nya du ska skriva där är två rader som finns i start.xhtml. Ett sätt att lägga in det är med C-x i som lägger in innehållet i en fil i den buffert du editerar.) Se sedan till att fixa så att den är korrekt XHTML. Emacs ser vad det är för slags XML och säger Using schema...xhtml.rnc i ekoarean vilket anger att Emacs vet om att det är XHTML du ska skriva. Därigenom kommer den att vara bättre på att hitta fel och du kommer att få komplettering på taggar, attribut och t. o. m. värden. Sådan komplettering har du stor nytta av för ett av de första felen som är markerade. Trots att Emacs har validerat filen så avsluta ändå med att validera den med samma validerare som i labb 7 också. Du ska få»this Page Is Valid XHTML 1.0 Transitional!«Kopiera då in den föreslagna koden för att lägga en bild som visar att det är korrekt. CSS för XML Kopiera ut din svt1.xml så att den publiceras på webben. Öppna den i Firefox. Dokumentträdet visas utan någon särskild formattering eftersom webbläsaren inte vet något om hur dessa element ska formatteras. Den vet bara att detta är XML. Lägg in en rad <?xml-stylesheet type="text/css" href="tv.css"?> 105
LABORATION 9: XML OCH XHTML som andra rad i kopian och kopiera tv.css till samma katalog. I den filen ges information om hur olika element ska visas. Se vilken effekt detta ger för hur Firefox visar svt1.xml. Detta är samma språk CSS som du såg i labb 7. Ändra på något sätt. Antingen nån småsak (inte så svårt) eller läs på om CSS (t. ex. på http: //w3.org/) och kom på ett sätt att använda något av den information som står som attributvärden i filen, t. ex. skriva»(på finska.)«i slutet av program som har lang="fi". (Det senare är mycket svårare. Klar överkurs.) Lite ljud som omväxling Programmet text2wave ingår i paketet Festival och omvandlar från text till ljud. Det har tyvärr ingen dokumentation vare sig i Info eller på man-sida, men du kan få viss hjälp med text2wave --help i alla fall. Skriv text2wave /local/texts/jabberwocky >jabber.wav för att skapa en ljudfil med texten istället. (Om du inte hade haft >jabber.wav på slutet hade du fått ut detta binära innehåll i terminalen istället!) Uppgift 9.6 Vad säger programmet file om denna fil jabber.wav? Den beskrivningen är mer detaljerad än vad MIME-beteckningen skulle vara. Uppgift 9.7 Det finns en väljare till file som gör att den skriver ut en MIME-beteckning istället. Hur lyder den väljaren? Du kan lyssna på wav-filen med play jabber.wav. Programmet play har tyvärr inte heller någon man-sida eller dokumentation i Info. 2 Om man vill lyssna på detta direkt, utan att behöva skapa en ljudfil först så skulle man kunna tro att det skulle funka med men play kräver att få ett filnamn som argument. Uppgift 9.8 Exakt hur löd felmeddelandet man fick i detta fall? Nästa försök blir då att ge den - som argument eftersom det istället för ett filnamn betyder att den ska läsa från standard input istället: text2wave /local/texts/jabberwocky play - Men det ger ett felmeddelande om att den inte kunde avgöra filtypen! Uppgift 9.9 Exakt hur löd felmeddelandet man fick i detta fall? Med play kan man spela upp ljudfiler av flera olika format och tydligen använde sig play av det faktum att filen hette nånting på.wav för att veta att det var på wav-format förut. Det finns en väljare till play som du kan ge värdet wav för att tala om formatet, så på det sättet kan man klara av detta. Uppgift 9.10 Hur ska du skriva för att i bara en kommandorad utan att spara några mellanresultat få texten»this is an example«uppläst? Du ska inte behöva skapa någon ljudfil som mellanresultat, och heller inte någon textfil med»this is an example«. Den där wav-filen är i binärt format, men trots det så finns det några koder som direkt motsvarar tecken i början av filen. Öppna den i Emacs! Uppgift 9.11 Vilka är de fyra första tecknen i wavfilen? Större delen av filens innehåll motsvarar kontrolltecken sedda i textformat som här och visas med koder i Emacs. I synnerhet är ^@ en beteckning på kontrolltecknet NUL som har koden 0. Man kan se att rätt många bytes har värdet 0. text2wave /local/texts/jabberwocky play 2 Om du öppnar denna ljudfil i filhanteraren kommer den använda sig av filmspelaren Totem som kommer att spåna till ett bildspel också. 106