(toiminnot)

hwechtla-tl: Uusi rakenteisten dokumenttien merkintätekniikka

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


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:

  1. merkitä dokumenttiin rakennetta (erityisesti syntaksia) ottamatta kantaa siihen, mitä tuo rakenne on
  2. mahdollistaa dokumentin esittämisen ja muokkaamisen vailla (ohjelman) suurempaa ymmärrystä siitä, mitä se sisältää
  3. käsitellä dokumenttia erilaisilla fiksuilla (mutta geneerisillä) työkaluilla siten, että ne pystyvät hyötymään dokumentin rakenteesta
  4. round-tripata SGML- ja XML-dokumentteja muodon kautta ilman, että niistä katoaa informaatiota
  5. käyttää vahvempaa tietomallia kuin perinteisissä merkintäkielissä
  6. merkintäkieltä ymmärtämättömän ohjelman järkevästi esittää merkintäkielellä rakenteistettuja dokumentteja

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ä:

  1. Jos elementti sisältää vain elementtejä (ei suoraan tekstiä), ja kaikki alielementit mahtuvat yhdelle riville, ne esitetään vierekkäin.
  2. Jos elementti sisältää vain elementtejä mutta ne eivät mahdu yhdelle riville, ne esitetään päällekkäin.
  3. Jos elementti sisältää myös tekstiä (tai vain tekstiä), se esitetään aseteltuna tarpeeksi suurelle määrälle rivejä täyttämällä riviä sanoilla (välilyönnein erotetuilla elementeillä), kunnes se on täynnä, ja siirtymällä sitten seuraavalle riville. Alielementit asetellaan siten, että niiden sisältö tulee samalle riville, jos mahtuu, ja jollei mahdu, se siirretään omaan (pysty)tilaansa ja sisennetään.

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


kommentoi (viimeksi muutettu 27.06.2005 15:41)