Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Pismeno programiranje (Literate Programming) u XML-u


Norman Walsh

Siže

Pismeno programiranje je programiranje i metodologija dokumentacije. Njegovo centralno načelo je da je dokumentacija važnija od izvornog koda i trebalo bi da bude u fokusu programerovih aktivnosti.

Pismeno programiranje olakšava ovakav pristup, kombinujući kod i dokumentaciju u jedinstveni, ujednačeni izvorni dokument. Jedan interesantan aspekt ove kombinovane forme je da ona nije ni izvorni kod, ni dokumentacija. Umesto toga, sistem pismenog programiranja pruža alatke koje omogućavaju korisniku da automatski izvuče izvorni kod ili dokumentaciju, ali nijedna od tih izvučenih formi se nikad ne menja.

Korišćenje sistema pismenog programiranja pruža neke zanimljive pogodnosti za mnoge stilove programiranja. Iz razloga što je kombinovani format mašinski obrađen da proizvede izvorni kod, autor više ne mora da održava ili piše kod na linearan način, kako kompjuter na kraju očekuje. Ovo, očigledno, ide u prilog vrh-dole i dno-gore dizajnerskih strategija. Ovo može biti korisno i za moderne metodologije programiranja, kao što je Ekstremno programiranje (Extreme Programming).

Tipični sistemi pismenog programiranja su prilično složeni. Izgrađeni su povrh nekih dokumentacionih sistema (kao što je teX) i opisani u terminima macro-a i drugih dokumentacionih grupa koje su potrebne da se opiše jedan xweb dokument.

Ipak, brzo postaje očigledno da XML može da značajno pojednostavi ovu situaciju. Kada ustanovimo da dokumentacioni format uključuje nekoliko (namespaced) elemenata, moguće je primeniti pismeno programiranje u XML povrh bilo kog formata koji autor izabere: DocBook, TEI, XHTML, izaberite sami.

U poslednjih nekoliko godina, broj XML rečnika je eksplodirao. Gde je nekada bilo samo nekoliko, sada ih je na stotine. Uz to, mnogi od ovih novih rečnika imaju razne vrste sofisticiranih očekivanja u obradi: XSLT, W3C XML Schema, RELAX NG, Schematron, SAML, SVG, i MathML da navedemo samo mali broj.

Srećom, Literate Programming sa XML-om se jednako dobro primenjuje na XML, tako da je moguće primeniti metodologiju pismenog programiranja na razvoj XML rečnika.

Ovaj referat opisuje dizajn i implementaciju sistema pismenog programiranja koristeći XML i XSLT. Sistem koji rezultira je podjednako sposoban da bude autor sistema na tradicionalnim programskim jezicima i sistemima koji su i sami izgrađeni iz XML-a. Referat uključuje nekoliko primera da pokaže ove funkcije i smernice stvarnim sistemima koji aktivno ekspoatišu snagu koju nudi.
_________________________________________________________________________________________________________________________

Literate programming [DMallLP] je programiranje i metodologija dokumentacije. Njegovo centralno načelo je da je dokumentacija važnija od izvornog koda i trebalo bi da bude u fokusu programerovih aktivnosti. Donald Knuth [DKnuth84] zapaža: Pismeno programiranje olakšava ovakav pristup, kombinujući kod i dokumentaciju u jedinstveni, ujednačeni izvorni dokument. Jedan interesantan aspekt ove kombinovane forme je da ona nije ni izvorni kod, ni dokumentacija. Umesto toga, sistem pismenog programiranja pruža alatke koje omogućavaju korisniku da automatski izvuče izvorni kod ili dokumentaciju, ali nijedna od tih izvučenih formi se nikad ne menja.

Alatka koja izvlači izvorni kod se tradicionalno zove zaplet (tangle), dok se alatka koja izvlači dokumentaciju naziva rasplet (weave). Ujednačeni format autorstva se tradicionalno naziva web document[1]. Pošto u ovde opisanom sistemu imamo XML web fajlove, nazivamo ih xweb fajlovi. Tako da autor “zapliće” svoj kod i “raspliće” dokumentaciju, ali uvek je autor “xweb”-a.

Postoje značajna pitanja vezana za učenje i obuku, a u vezi sa usvajanjem sistema kao što je ovaj. On je toliko radikalno različit od onoga na šta je većina programera navikla da radi, tako da može da dođe do otpora usvajanju ove nove metodologije. Sistem definitivno nameće kratkoročne gubitke u produktivnosti, ali dugoročne nagrade u razumevanju i održavanju programa mogu biti izvanredne. U svakom slučaju, ova pitanja izlaze izvan svrhe ovog referata.

Korišćenje sistema pismenog programiranja pruža neke zanimljive pogodnosti za mnoge stilove programiranja. Iz razloga što je kombinovani format mašinski obrađen da proizvede izvorni kod, autor više ne mora da održava ili piše kod na linearan način, kako kompjuter na kraju očekuje. Ovo, očigledno, ide u prilog vrh-dole i dno-gore dizajnerskih strategija. Ovo može biti korisno i za moderne metodologije programiranja, kao što je Ekstremno programiranje (Extreme Programming) [KBeck99].

Ovaj referat predpostavlja da ste donekle upoznati sa konceptima pismenog programiranja. Za više opštih informacija o pismenom programiranju, pogledajte [DKnuth84] i[DMallLP]. Za diskusije o drugim SGML/XML sistemima pismenog programiranja, pogledajte [CoverLP].

Kako radi Literate Programming?

Ukratko, literate programming dozvoljava autoru da razvije program kao logički skup “programskih fragmenata”. Svaki programski fragment sadrži neku malu, funkcionalnu jedinicu detaljno dokumentovane procesne logike. Programski fragmenti se mogu odnositi jedni na druge, omogućavajući autoru da konstruiše složene fragmente od jednostavnih. Autor je slobodan da organizuje te fragmente na bilo koji način koji olakšava njihovo dokumentovanje.

Mreža fragmenta i fragmentnih referenci formira kompletan program. Kada postoji polazna tačka, mreža se može zapetljati u program koji radi (sa programskih fragmentima koji su poređani da budu u skladu sa jezičkim procesorom, pre nego u skladu sa jednoličnom ekspozicijom) ili utkati u dokumentaciju.

Sofisticiranost zapleta i raspleta varira između sistema za literate programming. Na primer, neki zapletni procesori vode računa da prilagode imena za identifikaciju, tako da budu i kratka i jedinstvena (ovo je bilo neophodno za originalni Web sistem gde je jezički procesor bio Pascal prevodilac (compiler) koji nije prihvatao identifikacije duže od sedam karaktera). Knuth-ov zaplet (tangle) je takođe sprovodio i sistematsko “poružnjavanje” izvornog koda kako bi obeshrabrio programere za održavanje da rade direktno na zapetljanom kodu umesto Web izvora. Slično, rasplet (weave) programi mogu da ponude veoma sofisticirane funkcije, kao što je lepo štampanje fragmenata izvornog koda i generisanje specijalnih ideksa i saglasnosti.

Uprezanje snage XML-a

Tipični sistemi pismenog programiranja su prilično složeni. Izgrađeni su povrh nekih dokumentacionih sistema (kao što je teX) i opisani u terminima macro-a i drugih dokumentacionih grupa koje su potrebne da se opiše jedan xweb dokument.

Zaista, moji prvi pohodi ka XML sistemima pismenog programiranja su bili nadahnuti očekivanjem da je DocBook biti format dokumentacije donjeg sloja. Ipak, ubrzo je postalo očigledno da je to nepotrebno. Kada ustanovimo da dokumentacioni format uključuje nekoliko (namespaced) elemenata, moguće je primeniti pismeno programiranje u XML povrh bilo kog formata koji autor izabere: DocBook, TEI, XHTML, izaberite sami.

Ovo je moguće zato što sistem pismenog programiranja treba da bude u stanju da radi samo četiri stvari:
  1. Da raščlanjuje xweb dokument.
  2. Da identifikuje fragmente koda.
  3. Da identifikuje među-reference tih fragmenata.
  4. Da identifikuje gde “počinje” izvorni kod (source code).
XML čini sve ove zadatke lakima.

Sistem pismenog programiranja opisan u ovom referatu koristi dva elementa da postigne ove ciljeve: src:fragment identifikuje fragment i src:fragref identifikuje među-referencu uz fragment.

Src:fragref koristi XML ID/IDREF da ukaže na src:fragments. Fragment gde procesiranje počinje identifikuje se ID-jem. Uobičajeni ID je “top”.

Primer Literate Programming-a

Figura 1 prikazuje primer pismenog programiranja[2]. To je Perl program za računanje članova Fibonačijevog niza (Fibonacci series).

Figura 1. Fibonačijev niz XWeb File

<article xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<articleinfo>
<title>Calculating Members of the Fibonacci Series</title>
<author>
  <firstname>Norman</firstname>
  <surname>Walsh</surname>
</author>
</articleinfo>

<para>Ovaj trivijalni dokument opisuje jednostavnu, ponavljajuću
implementaciju Fibonačijevog niza u Perl-u. Primarna
motivacija za ovaj dokument je da se prikaže korišćenje Literat-a.
</para>

<section><title>Recursive Definition</title>

<para>The Fibonacci series begins: 1 1 2 3 5 8 13... Each member of
the series, after the first two, is the sum of the preceding two
members.</para>

<para>This can be implemented recursively by calculating the preceding
two members of the series and returning their sum:</para>

<src:fragment id="sub.fib.recursion">
&amp;fib($n-2) + &amp;fib($n-1);
</src:fragment>
</section>

<section><title>The <function>fib</function> Function</title>

<para>The heart of this program is the recursive function that
calculates the members of the Fibonacci series.</para>

<para>The first and second members of the Fibonnacci series are
<quote>1</quote>; all other values are calculated recursively.</para>

<src:fragment id="sub.fib">
sub fib {
    my $n = shift;

    if ($n &lt;= 2) {
        return 1;
    } else {
        return <src:fragref linkend="sub.fib.recursion"/>
    }
}
</src:fragment>
</section>

<section><title>Code Preamble</title>

<para>The program preamble simply establishes a default location for
the Perl executable and informs the interpreter that we want to use
the strict pragma.</para>

<src:fragment id="preamble">
#!/usr/bin/perl -w

use strict;
</src:fragment>
</section>

<section><title>Argument Checking</title>

<para>This program expects its argument on the command line and it expects
that argument to be an unsigned decimal integer.</para>

<src:fragment id="argcheck">
my $num = shift @ARGV || die;

die "Not a number: $num\n" if $num !~ /^\d+$/;
</src:fragment>
</section>

<section><title>The Program</title>

<para>The program prints out the Fibonacci number requested:</para>

<src:fragment id="top">
<src:fragref linkend="preamble"/>
<src:fragref linkend="argcheck"/>

print "Fib($num) = ", &amp;fib($num), "\n";

<src:fragref linkend="sub.fib"/>
</src:fragment>
</section>

</article>

Ovaj xweb može biti zapetljan u Perl, kao što je pokazano u Figuri 2 , ili utkan u DocBook tkoji kasnije može biti transformisan u HTML , ili PDF ili korišćen za bilo koju vrstu DocBook procesiranja.

Figura 2. Fibonačijev niz Tangled Perl File


#!/usr/bin/perl -w

use strict;


my $num = shift @ARGV || die;

die "Not a number: $num\n" if $num !~ /^\d+$/;


print "Fib($num) = ", &fib($num), "\n";


sub fib {
    my $n = shift;

    if ($n <= 2) {
        return 1;
    } else {
        return 
&fib($n-2) + &fib($n-1);

    }
}

Pisanje Literate Programming XWeb-a

Xweb fajl može biti napisan u bilo kom XML rečniku (ili mešavini rečnika) koji je pogodan za autora. Sistem opisan u ovom referatu se oslanja na sposobnost dodavanja nekoliko novih elementa ukupnom rečniku iz “http://nwalsh.com/xmlns/litprog/fragment” namespace-a. U ovom članku, koristimo namespace prefiks “src:” da identifikujemo elemente iz tog namespace-a.

Najvažniji elementi su src:fragment i src:fragref.

Identifikovanje fragmenata

Fragmenti izvornog koda se identifikuju u xweb fajlu sa src:fragment elementom. Ovaj element ima traženi id atribut (tipa ID)

Sav sadržaj (i samo sadržaj) src:fragment elementa će biti zapetljan da proizvede izvorni kod vaše aplikacije.

Reference na druge Fragmente

Pisanje gomile nepovezanih fragmenata ne bi bilo mnogo korisno ukoliko ne bi postojao način da se ukaže na to kako su oni povezani. Src:fragref element se koristi za referencu na druge fragmente. On ima vezani atribut koji svojom ID referencom ukazuje na ID src:fragment-a. Greška je da src:fragref ukazuje na bilo koji drugi tip elementa.

Unutar src:fragment, referenca fragmenta podrazumeva da će se referentni kod pojaviti na lokaciji reference kada je xweb zapetljan (tangled). Izvan fragmenta, referenca stvara vezu sa fragmentom.

Procesiranje očekivanja od fragmenata

Da bi se zapetljao (tangle) xweb, procesor zapleta mora da zna koji fragment je “top” (vrh) programa. U sistemu koji je opisan u ovom članku, top fragment je identifikovan ID-jem. Uobičajeni ID za top fragment je “top”, ali može se koristiti bilo koji ID.

Zaplet konstruiše program, gradeći prelazno zatvaranje fragmenata na koje se referiše top fragment.

Postoji jedno posebno semantičko pravilo povezano sa fragmentima. Ukoliko fragment počinje sa jednom ili više novih linija (newlines), prva nova linija (newline) se odbacuje. Slično tome, ukoliko se završava jednom ili više newlines, poslednji newline se takođe odbacuje.

Ovaj trik omogućava pisanje fragmenata kao što je ovaj:

<src:fragment id="preamble">
Some lines of code.
Some more code.
</src:fragment>

Bez uvođenja ovog inače lažnog belog reda (whitespace) iznad i ispod koda. Da ovaj trik nije sproveden, prethodni fragment bi morao da bude napisan ovako:

<src:fragment id="preamble">Some lines of code.
Some more code.</src:fragment>

što se teže čita i čini sečenje (cutting) i lepljenje (pasting) mnogo napornijim.

Literate XML

U poslednjih nekoliko godina, broj XML rečnika je eksplodirao. Gde je nekada bilo samo nekoliko, sada ih je na stotine. Uz to, mnogi od ovih novih rečnika imaju razne vrste sofisticiranih očekivanja u obradi: XSLT, W3C XML Schema, RELAX NG, Schematron, SAML, SVG, i MathML da navedemo samo mali broj.

Srećom, Literate Programming sa XML-om se jednako dobro primenjuje na XML, tako da je moguće primeniti metodologiju pismenog programiranja na razvoj XML rečnika.

Zapravo, sistem opisan u ovom članku je bio korišćen ne samo da sam sebe razvije, već i u razvoju DocBook XSL Stylesheets. Jedan od glavnih motivacionih faktora pri razvoju ovog sistema bio je da se obezbedi bolji mehanizam za gradnju i dokumentovanje DocBook stylesheets.

Pisanje Literate XML-a je lako. Figura 3 pokazuje jednostavnu W3C XML Schema-u implementiranu u literate stilu. Ovaj primer koristi XHTML kao rečnik za svoju dokumentaciju. Kao i Figura 1 , ovaj xweb može biti zapleten u XSD ili utkan u dokumentaciju koja kasnije može biti transformisana u HTML .

Raspetljavanje (weaving) je i dalje proces od dva koraka zato što rasplet (weave) proizvodi XML dokument koji sadrži usađene src:fragment i src:fragref elemente. Čak i u slučaju kada je okružujući XML markup XHTML, ovi elementi moraju biti stilizovani. Bilo bi relativno lako da se napravi weave stylesheet u jednom koraku za poseban slučaj kada je izvor bio XHTML, ali to bi moralo biti prilagođeno za svakog korisnika koji bi želeo da promeni način na koji su fragmenti formatirani. Izgleda da je teret održavanja ovih dodatnih weave stylesheet-ova veći nego pogodnost.

Figura 3. Jednostavna šema dokumenta u W3C XML Schema

<html xmlns="http://www.w3.org/TR/xhtml-basic"
      xmlns:xs='http://www.w3.org/2001/XMLSchema'
      xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
      xmlns:ex='urn:publicid:-:Norman+Walsh:Schema Example:EN'>
<head>
<title>Document Schema</title>
</head>
<body>

<div>
<h1>A Simple Document W3C XML Schema</h1>

<p>This schema defines the
<tt>urn:publicid:-:Norman+Walsh:Schema Example:EN</tt> namespace
by defining several elements and their complex types.
</p>

<p>Documents that conform to this schema have the general form:</p>

<pre>&lt;doc xmlns="urn:publicid:-:Norman+Walsh:Schema Example:EN">
  &lt;title>Sample Document&lt;/title>
  &lt;para>Some paragraphs.&lt;/para>
&lt;/doc></pre>
</div>

<div>
<h1><a name="types"/>The Types</h1>

<p>This schema only defines three element types: <tt>doc</tt>,
<tt>title</tt>, and <tt>para</tt>.</p>

<div>
<h2>The <tt>doc</tt> Type</h2>

<p>This is a document.</p>

<src:fragment id="doc.type">
  <xs:complexType name='doc'>
    <xs:sequence>
      <xs:element ref="ex:title" minOccurs='0' maxOccurs='1'/>
      <xs:choice minOccurs='1' maxOccurs='unbounded'>
        <xs:element ref='ex:para'/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</src:fragment>
</div>

<div>
<h2>The <tt>title</tt> Type</h2>

<p>This is a title.</p>

<src:fragment id="title.type">
  <xs:complexType name='title' mixed="true">
    <src:fragref linkend="role.attrib"/>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>
</src:fragment>
</div>

<div>
<h2>The <tt>para</tt> Type</h2>

<p>This is a paragraph.</p>

<src:fragment id="para.type">
  <xs:complexType name='para' mixed="true">
    <src:fragref linkend="role.attrib"/>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>
</src:fragment>
</div>
</div>

<div>
<h1>The <tt>role</tt> Attribute</h1>

<p>Each of the complex types in this schema allows an optional role attribute.
The role attribute is simply a string.</p>

<src:fragment id="role.attrib">
    <xs:attribute name="role" type="xs:string"/>
</src:fragment>
</div>

<div>
<h1>The Elements</h1>

<p>This schema defines one element of each <a href="#types">complex
type</a>.</p>

<src:fragment id="elements">
  <xs:element name="doc" type="ex:doc"/>
  <xs:element name="para" type="ex:para"/>
  <xs:element name="title" type="ex:title"/>
</src:fragment>
</div>

<div>
<h1>The Schema</h1>

<p>The schema wrapper surrounds all these definitions.</p>

<src:fragment id="top" mundane-result-prefixes="ex xs">
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
           xmlns:ex='urn:publicid:-:Norman+Walsh:Schema Example:EN'
           targetNamespace='urn:publicid:-:Norman+Walsh:Schema Example:EN'
           elementFormDefault='qualified'>
  <src:fragref linkend="doc.type"/>
  <src:fragref linkend="title.type"/>
  <src:fragref linkend="para.type"/>
  <src:fragref linkend="elements"/>
</xs:schema>
</src:fragment>
</div>

</body>
</html>


Ograničenja

Činjenica da Literate XML dokument mora da bude dobro formirani XML dokument, uvodi nekoliko ograničenja. Oko većine se može raditi.

Deklaracija tipa dokumenta

Ne postoji jednostavan način da se uključi deklaracija tipa dokumenta za izvorni dokument. Deklaracija tipa dokumenta u xweb-u je za sam xweb, a ne za izvor koji on stvara.

Da bi se zaobišao ovaj problem “http://nwalsh.com/xmlns/litprog/fragment” namespace uključuje src:passthrough element. Kada je zapetljan, sadržaj src:passthrough elementa (koji mora da sadrži samo tekst) je napisan sa onemogućenom funkcijom output escaping.

Zapetljavanje sledećeg fragmenta će stvoriti izvorni rečnik sa deklaracijom tipa dokumenta:

<src:fragment id="top">
<src:passthrough>&lt;!DOCTYPE foo PUBLIC "foo" SYSTEM "http://example.com/foo"&gt;
</src:passthrough>

<foo>...</foo>
</src:fragment>

Namespace Deklaracije

Kada se fragmenti distribuiraju kroz xweb dokument, ponekad je neophodno da se namespace deklaracije preslože. Na nesreću, XSLT ne može da pravi razliku između namespaces koji su deklarisani na datom elementu i ostalih namespaces koji su jednostavno u cilju.

Ovo ponekad ima za rezultat utkanu dokumentaciju sa daleko više namespace deklaracija od onoga što je potrebno ili interesantno. Da bi se zaobišao ovaj problem, svaki src:fragment može da identifikuje set neinteresantnih prefiksa. Namespaces sa posebno navedenim prefiksima neće biti predstavljeni u utkanoj dokumentaciji za taj fragment.

Atribut rutinski-rezultat-prefiksi (mundane-result-prefixes) sadrži listu prefiksa za koje namespace deklaracije neće biti generisane. Ovo može biti navedeno i kao stylesheet parametar, $mundane-result-prefixes.

Pogledajte sledeći primer:

<src:fragment id="equation">
  <xsl:template match="eq">
    <m:math xmlns:m="http://www.w3.org/1998/Math/MathML">
      <xsl:apply-templates/>
    </m:math>
  </xsl:template>
</src:fragment>

U ovom primeru, deklaracija MathML namespace-a je verovatno važna u kontekstu dokumentacije (zato što je lokalno deklarisana), ali deklaracija XSL namespace-a verovatno nije. Ukoliko jednostavno stavimo sve namespace deklaracije, dobićemo:

<src:fragment id="equation">
  <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="eq">
    <m:math xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:m="http://www.w3.org/1998/Math/MathML">
      <xsl:apply-templates xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
    </m:math>
  </xsl:template>
</src:fragment>

Ovo je prilično zbunjujuće, tako da potiskujemo XSL namespace sa mundane-result-prefixes:

<src:fragment id="equation" mundane-result-prefixes="xsl">
  <xsl:template match="eq">
  ...

i dobijamo:

<src:fragment id="equation">
  <xsl:template match="eq">
    <m:math xmlns:m="http://www.w3.org/1998/Math/MathML">
      <xsl:apply-templates/>
    </m:math>
  </xsl:template>
</src:fragment>

Podešavanja rutinskih rezultatskih prefiksa iz korena fragmenta, automatski se primenjuje na sve fragmente, tako da je često jedino koje treba podesiti.

Zaplet (tangle) stylesheet ignoriše ova podešavanja, mora da sagradi dokument sa potpuno validnim setom in-scope namespaces. Činjenica da može ponekad da sagradi dokument sa dodatnim namespace deklaracijama ne predstavlja problem zato što će one biti postojane.

Balansirani fragmenti

XML fragmenti moraju biti ispravno izbalansirani. U ne-XML programu, obično možete razbiti kod na fragmente proizvoljno. Kada je izvor XML, morate da održite dobro formirana ograničenja XML-a, tako da svi fragmenti moraju biti propisno izbalansirani. Ovo ponekad znači da dokumentacija sadrži dodatni nivo fragmentacije, ali to nije ozbiljan problem.

Šeme za Literate XML Dokumente

Nije lako razviti šeme koje mogu da potvrde Literate XML dokumente. Srećom, potvrda dokumentacije je obično veoma laka i korišćenje literate programiranja nema uticaja na potvrdu izvora. (ovaj problem validacije nije jedinstven za Literate XML dokumente, javlja se i u XSLT stylesheets koji koriste elemente literal rezultata i u drugim jezicima koji dozvoljavaju prilično proizvoljno mešanje namespaces.)

Literate Programming u XML Sistemu

Sistem je prilično mali, sastoji se uglavnom od tri XSL Stylesheets. Literate Programming sa XML-om se primenjuje korišćenjem pismenog programiranja. Sledeće, svaki od ovih stylesheets je dostupan kao xweb dokument i kao objavljena dokumentacija. Postoje neke dodatne alatke podrške za DocBook-based xwebs: Rasplitanje je jednostavno stvar procesuiranja xweb dokumenta sa odgovarajućom varijantom rasplet stylesheet-a. Rezultirajući XML dokument može, zatim, biti procesuiran bilo kojim sistemom za procesuiranje dokumentacije koji izaberete.

Zaplitanje je skoro isto, osim što, ukoliko top fragment u vašem xweb-u nije identifikovan “top” id-jem, moraćete da prođete odgovarajuću vrednost u $top parametru.

Ukoliko vas interesuje da skinete te alatke, pogledajte http://docbook.sourceforge.net/projects/litprog/.

Priznanja

Nekoliko ljudi je videlo rane nacrte ovog rada i dalo je mnogo bitnih i korisnih komentara. Posebno, želeo bih da se zahvalim Tony Coates, Chris Maden, Eve Maler, i Michael Sperberg-McQueen.

Reference

[CoverLP] Cover, Robin. The XML Cover Pages: Literate Programming with SGML and XML. http://xml.coverpages.org/xmlLitProg.html.

[KBeck99] Kent Beck. Extreme Programming Explained: Embrace Change. Addison-Wesley, 1999. ISBN 201-61641-6.

[DMallLP] Mall, D. Literate Programming. http://www.literateprogramming.com/.

[DKnuth84] Donald E. Knuth. "Literate Programming". The Computer Journal, 27(2):97-111, May 1984.

[DKnuth86] Donald E. Knuth. Computers and Typesetting: Volume B, TeX: The Program. Addison-Wesley, 1986. ISBN 0-201-13437-3.

[DBHPref] Walsh, Norman. HTML Parameter Reference. http://docbook.sourceforge.net/projects/xsl/doc/html/param.html.





Published (Last edited): 30-11-2012 , source: http://nwalsh.com/docs/articles/xml2002/lp/paper.html