Tämä ajatus lähti liikkeelle vauhdikkaahkosta keskustelusta, jota kävin yleisen kielitieteen laitoksella. Vastaajani aloitti tuomalla esiin raakatekstin ongelmia, johon vastasin tuomalla esiin korkean tason merkintäkielten, kuten XML:n ongelmia. Molemmat olemme myös S-ekspressioiden kannattajia. Erityisesti puhuimme rivinvaihtojen hyödyllisyydestä tai hyödyttömyydestä verrattuna esim. kappalevaihtoihin tai riviä signifioivaan elementtiin.
Tulin siihen tulokseen, että rivinvaihtojen ja sanavälien kaltaiset elementit ovat verrattoman arvokkaita monestakin syystä. Ne ovat erittäin käytännöllisiä merkintäkieliä; niille on hyvin vakiintunut esitystapa; ne sallivat antaa antaa dokumentille syntaktista rakennetta vailla semanttista rakennetta, mikä mahdollistaa dokumentin tietomallin uudelleentulkinnan. (Esimerkiksi XSLT:ssa on sellainen ongelma, että sillä voi tehdä vain transformaatioita, jotka on ennakoitu käsiteltävän XML-dokumentin tietomallissa.)
Päätin, että haluan merkintäkielen, joka sallii:
Idea on tämä: tarvitaan kolme erityistä merkkiä (nyt Unicode-aikana nämä voisi ehkä varata erikseen), jotka on lahjoitettu kokonaan tälle merkintäkielelle. Nämä kolme merkkiä ovat UEO (universal embedding begin), UMEO (universal meta-embedding begin) ja UEC (universal embedding close). UEO- ja UEC-merkkejä käytetään antamaan dokumentille puumainen rakenne, vähän samaan tapaan kuin XML:ssa, mutta vailla semanttista informaatiota. Merkkien on tarkoitus korvata esitysmuotoon liittyvä (representationaalinen) whitespace, joten samalla voisi määrittää välilyöntiä seuraavat rivinvaihdot sekä niitä mahdollisesti seuraavat sarkainmerkit ja välilyönnit yhtäpitäviksi välilyönnin kanssa. Dokumentissa niitä voidaan käyttää taaksepäin yhteensopivuuden parantamiseksi (siis ohjeina ohjelmille, jotka eivät tajua yleisistä upotuksista mitään).
Periaatteessa tämä riittää raakatekstidokumenttien koodaamiseen. Raakatekstin semanttiset elementit (rivit tai kappaleet) muutetaan UEO- ja UEC-merkkien ympäröimiksi elementeiksi, ja toisaalta rakenteisen tekstin pystyy muuntamaan takaisin raakatekstiksi seuraavilla säännöillä:
Mutta tämä on vain merkintäkielen ei-semanttinen puoli. Rakenteisten dokumenttien semantiikka on dokumenttiin liittyvää metatietoa -- ja joskus metatiedon metatietoa. Esimerkiksi XML-dokumentissa elementin tagi on metatietoa siitä, mitä elementin sisältämä tieto on, ja tagin nimiavaruus (tms. tagia kuvaava lisätieto, kuten DTD) on tämän metatiedon metatietoa. Joskus myös elementtien sisältö on jossain mielessä metatietoa, kuten esimerkiksi HTML-dokumentissa <HEAD>-elementin sisältö.
Metatieto ei sinänsä kuulu dokumentin sisältöön, eikä sitä ole tarkoitettu näytettäväksi dokumentin muun sisällön ohella. Joskus dokumentista taas halutaan tarkastella nimenomaan sen metatietoa, tai analysoida dokumenttikokoelmia niiden metatiedon perusteella.
Ideana on, että koko metatietohierarkian voi esittää huomautuksilla, jotka pannaan UMEO- ja UEC-merkkien väliin. Esimerkiksi HTML-ilmaus <em class=nice>foobar</em> vastaa seuraavaa merkintää: UEO UMEO em UEC UMEO nice UEC foobar UEC. Toisaalta XML-ilmaus <record xmlns="http://...">data ...</record> vastaa seuraavaa merkintää: UEO UMEO record UMEO UEO xmlns http://... UEC UEC UEC data ... UEC.
Huomattakoon, että välilyöntien merkitys riippuu kontekstista. En halua sanella niiden käytölle mitään tiettyä standardisoitua tapaa, mutta esimerkiksi yllä niitä käytetään parametrin nimen ja arvon erottamiseen toisistaan. Välilyönnin voisi määrittää myös yhtäpitäväksi sen kanssa, että sen erottamat asiat ovat omissa upotuksissaan: UEO foo bar UEC == UEO UEO foo UEC UEO bar UEC UEC. Mutta tämä saattaa olla liiankin redusoiva tulkinta. Lisäksi välilyönneillä on erikoisasema tekstin asettelussa, joten ylläolevia kahta tulkintaa ei välttämättä edes asetella samalla tavalla.
kategoria: työkalut kategoria: projektit