Newsgroup: it.comp.lang.perl
Titolo: Template

Ciao!
Solitamente uso il modulo Text::Template per gestire la parte grafica dei
miei siti creati da CGI. E` semplice da utilizzare e molti provider lo
mettono a disposizioni.
Volevo sapere se qualcuno aveva utilizzato con successo altre soluzioni
(che possibilmente non richiedano mod_perl) e come si e` trovato.
     Grazie, Michele.
-- 
Michele Beltrame
m...@io.com
http://www.io.com/~mick/
ICQ# 76660101
==> FAQ di it.comp.lang.perl: 
http://www.borders.it/perl/faq/
==> Sei del triveneto e vuoi unirti ai Perl Mongers? Scrivimi!

 (che possibilmente non richiedano mod_perl) e come si e` trovato.
La soluzione più comoda e flessibile che ho provato è basata su un parser
HTML chiamato HTML-Tree:
 
http://homepage.mac.com/pauljlucas/software/html_tree/
La distribuzione del parser (scritto in C++) comprende anche due moduli
Perl: uno che riproduce in Perl la stessa interfaccia disponibile in C++
(concepita sulla falsa riga di DOM), l'altro che implementa un sistema di
gestione di template basato sull'uso dell'attributo CLASS, ideato per
mod_perl, ma probabilmente utilizzabile anche in altri contesti.
Adottando la stessa idea di fondo del secondo modulo, io ho sviluppato un
mio sistema di gestione dei template (HtmlTreeTemplate) che fa uso del
primo dei due moduli. Il mio modulo funziona perfettamente anche in
programmi CGI. Per mostrarti quanto è flessibile, ti faccio vedere un
esempio di come produco un output tabellare a partire da un array di
hash-ref (che è uno dei modi più comodi per memorizzare un recordset):
Nell'HTML ci metto qualcosa come:
 <table>
 <tr class='loop:Pippo' >
      <td class='text:Pippo.P1' > Dummy </td>
      <td class='text:Pippo.P2' > Dummy </td>
 </tr>
 </table>
Nel codice Perl:
  my $html = new HtmlTreeTemplate(  $file );
  my @recordset;
  push @recordset, { P1 => "campo P1 / 1", P2 => "campo P2 / 1" };
  push @recordset, { P1 => "campo P1 / 2", P2 => "campo P2 / 2" };
  $html->addLoop( "Pippo", \@recordset );
  $html->expand( \*STDOUT );
Questo sistema non usa placeholder, ma va scrivere le informazioni nelle
posizioni appropriate all'interno della struttura ad albero che
rappresenta il doocumento HTML. Nell'esempio in questione, i valori di P1
e P2 andranno a finire nell'elemento testuale che è contenuto nei tag <td>
(per intenderci: dove nel template ho scritto "Dummy" ) e il tag <tr>
verrà replicato per quanti sono gli elementi di @recordset.
Il grosso vantaggio di questa soluzione è che il template è costituito
esclusivamente da codice HTML, senza tag proprietari (in quanto viene
usato esclusivamente l'attributo CLASS): ci puoi perciò mettere del testo
fittizio e puoi visionarlo con browser anche prima che venga parsato.
Oltre a 'loop:' e 'text:' il mio modulo prevede anche una serie di keyword
per inserire dinamicamente informazioni negli attributi 'value', 'href',
'src' e per impostare l'attributo 'select', oltre alle keyword 'if' e
'unless' per escludere in modo condizionato rami della struttura html.
Se ti interessa, te lo faccio avere. (Non è su CPAN).
L'inconveniente è che l'HTML deve essere perfettamente ben formato; nessun
errore sintattico è tollerato.
Il parser, scritto in C++, è molto efficiente ed è compilabile sia su
sistemi *nix che Win32.
Max

!
Grazie per la risposta. Mandami pure la libreria, cosi` la provo. L'uso
che ne faro` dipende sempre da cosa installano i miei provider, comunque
sembra software interessante e vorrei dargli un'occhiata!
