[PLUTO-devel] Ingenium, step 1

Marco Marongiu bronto a tiscali.com
Gio 14 Lug 2005 12:04:37 CEST



Claudio Cattazzo ha scritto:
> On Thu, Jul 14, 2005 at 01:25:49AM +0200, Marco Marongiu wrote:
> [...]
> 
>>Nel documento finale in XML, ci sono degli errori che il parser ha
>>prontamente rilevato ma che non ho corretto:
> 
> 
> Non ho ben capito perché restano degli errori...
> Tra l'altro, ho visto che i vari file xps non sono particolarmente lunghi,
> vuoi dirmi che con così poco codice riesci già a gestire la gran parte dei
> tag del DTD?

Si :-D

>>Vi allego una tarball che sto per mettere anche su OGo. Spero possa
>>essere un buon punto di partenza per cominciare a lavorare su uno
>>stylesheet in XSL (oppure, se preferite, potremmo passare a XPathScript
>>e tanti saluti, ma questo preferisco che lo vediate voi).
> 
> 
> Io di XPathScript non so proprio nulla e, guardando un attimo i file che hai
> scritto, ho visto che ha una sintassi abbastanza diversa rispetto a XSL.

Se conosci Perl e un po` di XPath, sai gia` molto di XPathScript!

In estrema sintesi, XPathScript e` la "fusione" fra Perl e le
funzionalita` tipiche di XPath per manipolare i nodi. Se prendi i fogli
di stile che ci sono nella tarball che ho mandato noterai che:

* c'e` un foglio di stile principale, xpj.xps, che contiene lo scheletro
HTML della pagina che si andra` ad ottenere

* le parti di codice perl sono comprese fra pseudo-tag <% e %>, come
avviene in altri sistemi; le parti che servono a inserire direttamente
nella pagina il valore di un'espressione sono invece comprese fra i
pseudo-tag <%= e %> (p.e.: <title><%= $title %></title>)

* moduli esterni del foglio di stile sono importati con una sintassi
simile a quella dei server-side includes:

    <!--#include file="xpj/functions.xps"-->
    <!--#include file="xpj/templates.xps"-->

* in XPathScript e` possibile usare indifferentemente l'approccio
procedurale e quello "a template". Per esempio, la parte che genera
l'indice che compare in cima all'HTML e` essenzialmente procedurale:

      <div class="index">
      <%= dump_chapters_index( path => '/article/chapter',
                               base => 1 ) %>
      <%= dump_chapters_index( path => '/article/appendix',
                               base => 'A' ) %>
      <% if (findnodes('/article/biblio')) { %>
      <br><a href="#biblio">Bibliografia</a>
      <% } %>
      </div>

Viene chiamata la funzione dump_chapters_index (azz... doveva essere <%
e non <%=... da correggere!!!) con due parametri diversi che gli
indicano di quali sezioni deve creare l'indice. A sua volta, la funzione
dump_chapters_index e` fatta cosi':

      sub dump_chapters_index {
        my %parms = @_ ;

        croak "Node path missing" unless defined $parms{path} ;

        unless (defined $parms{base}) {
          carp "No base index, defaulting to 1" ;
          $parms{base} = 1 ;
        }

        my ($path,$base) = @parms{qw(path base)} ;

        my $chindex = $base ;
        foreach my $chapter (findnodes($path)) {
          my $chtitle = $chapter->findvalue('title/text()') ;
          my $label = $chindex ;
print qq(      <br><a href="#$label">$chindex. $chtitle</a>) ;

          if (my @sections = $chapter->findnodes('section')) {
print qq(      <ul>) ;
            my $secindex = 1 ;
            foreach my $section (@sections) {
              my $sectitle = $section->findvalue('title/text()') ;
              $label = "$chindex.$secindex" ;
print qq(        <li><a href="#$label">$label. $sectitle</a></li>) ;
              $secindex++ ;
            }
print qq(      </ul>) ;
          }
          $chindex++ ;
        }
      }

A parte l'indentazione barbara dovuta alle patch frettolose di ieri, il
funzinamento e` semplice: $chindex e` il contatore dei capitoli,
$secindex il contatore delle sezioni all'interno del capitolo. Per ogni
nodo <chapter> che viene trovato viene creata una label da mettere
nell'indice. Se il capitolo ha anche sezioni facciamo lo stesso lavoro
fino a esaurirle. A fine ciclo incrementiamo l'indice di capitolo e
ricominciamo il giro. Il risultato e` quello che vedete sulla pagina HTML.

* l'approccio "a template" viene invece applicato tramite la funzione
"apply_templates":

      <%= apply_templates('/article/chapter') %>
      <%= apply_templates('/article/appendix') %>
      <%= apply_templates('/article/biblio') %>

I template si definiscono, ovviamente, in termini di assegnazioni perl
ad una variabile predefinita, $t, che e` una reference ad un hash
multidimensionale. Possono essere semplici come:

      # <kw>
      $t->{kw}{pre}  = '<span class="keyword">' ;
      $t->{kw}{post} = '</span>' ;

oppure piu` complessi, eseguendo anche del processing elaborato:

      # Biographies
      $t->{bio}{testcode} = sub {
        my ($node,$t) = @_ ;

        my $pretag = qq(<p class="bio">) ;
        my $postag = '</p>' ;
        my $face = $node->findvalue('@face') ;

        if ($face) {
          $pretag .= qq(<img src="$face" align="left">) ;
          $postag = qq(<br clear="left">$postag) ;
        }

        $t->{pre}  = $pretag ;
        $t->{post} = $postag ;

        return 1 ;
      } ;


* in sostanza, e` possibile percorrere piu` volte e in diversi modi il
documento XML durante il processing per creare il documento finale.
Avevo provato a capire come ottenere lo stesso risultato con XSLT, ma mi
era sembrato molto macchinoso. Ma questa potrebbe essere tranquillamente
una mia deformazione mentale (molto Perl-oriented :-).

> Di XSL invece qualcosa so e non è difficile impararlo per semplici scopi,

...ma non e` detto che il processing di un documento XPJ sia un
"semplice scopo"...

> comunque il punto è che al momento, purtroppo, non ho tempo di dedicarmi
> alla creazione di un foglio di stile completo.

Uottebbaut Marcello?

> Come ho già detto, non conosco XPathScript, non so che vantaggi e svantaggi
> possa avere rispetto a XSL,

I principali:

* vantaggi: e` flessibile e potente almeno quanto Perl
* svantaggi: non e` uno standard, mentre XSL lo e`...

> ma di certo, data la situazione attuale del
> progetto, avere un foglio di stile in qualsiasi linguaggio quasi pronto già
> ora mi sembra un vantaggio non da poco.
> 
> Tu che ne pensi?

Che se vogliamo procedere nella politica dei piccoli passi, potremmo
cominciare con XPathScript ed elaborare una soluzione standard con piu`
calma. A questo punto pero` mi servirebbe un layout delle pagine su cui
definire il foglio di stile, e il CSS associato. Fate conto che entro
lunedi io partiro` per il mare e non avro` accesso alla rete; almeno per
il periodo 18-25 luglio saro` completamente fuori linea.

Credo inoltre che bisognerebbe spingere la parte di
creazione/adattamento di un editor, perche' vi posso assicurare che fare
la conversione a mano da HTML a XPJ, oltre a prendere molto tempo, e`
una gran rottura di scatole.

Boh, pensiamo ci un attimo e decidiamo come muoverci. Poi... muoviamoci
:-) Soprattutto, approfittiamo di questi mesi in cui anche il carico al
lavoro e` normalmente piu` basso, perche' una volta che arriveranno
settembre e ottobre torneremo tutti nelle sabbie mobili da cui stiamo
faticosamente uscendo in questo periodo di ferie.

Ciao!
--Marco


Maggiori informazioni sulla lista pluto-devel