hgbook

annotate it/ch11-template.xml @ 766:756eb54d48bb

Literal translation of Ch.11.
author Giulio@puck
date Sat Jul 25 16:48:03 2009 +0200 (2009-07-25)
parents
children 46c4ba8de2b1
rev   line source
Giulio@766 1 <chapter id="chap:template">
Giulio@766 2 <?dbhtml filename="personalizzare-l-output-di-mercurial.html"?>
Giulio@766 3 <title>Personalizzare l'output di Mercurial</title>
Giulio@766 4
Giulio@766 5 <para id="x_578">Mercurial offre un potente meccanismo basato sui template per permettervi di controllare il modo in cui visualizza le informazioni. Potete usare i template per generare uno specifico output per un singolo comando, o per personalizzare l'intera apparenza dell'interfaccia web predefinita.</para>
Giulio@766 6
Giulio@766 7 <sect1 id="sec:style">
Giulio@766 8 <title>Usare gli stili di output già pronti</title>
Giulio@766 9
Giulio@766 10 <para id="x_579">Distribuiti con Mercurial ci sono alcuni stili di output che potete usare immediatamente. Uno stile è semplicemente un template già pronto che qualcuno ha scritto e installato da qualche parte che Mercurial può trovare.</para>
Giulio@766 11
Giulio@766 12 <para id="x_57a">Prima di dare un'occhiata agli stili inclusi in Mercurial, rivediamo il suo output normale.</para>
Giulio@766 13
Giulio@766 14 &interaction.template.simple.normal;
Giulio@766 15
Giulio@766 16 <para id="x_57b">Questo ci dà qualche informazione, ma porta via un sacco di spazio&emdash;cinque righe di output per ogni changeset. Lo stile <literal>compact</literal> riduce questo spazio a tre righe, presentate in maniera sparsa.</para>
Giulio@766 17
Giulio@766 18 &interaction.template.simple.compact;
Giulio@766 19
Giulio@766 20 <para id="x_57c">Lo stile <literal>changelog</literal> ci suggerisce quale sia il potere espressivo del motore di template di Mercurial. Questo stile tenta di seguire le linee guida per i registri dei cambiamenti stabilite dal progetto GNU<citation>web:changelog</citation>.</para>
Giulio@766 21
Giulio@766 22 &interaction.template.simple.changelog;
Giulio@766 23
Giulio@766 24 <para id="x_57d">Non vi impressionerà sapere che lo stile di output predefinito di Mercurial è chiamato <literal>default</literal>.</para>
Giulio@766 25
Giulio@766 26 <sect2>
Giulio@766 27 <title>Impostare uno stile predefinito</title>
Giulio@766 28
Giulio@766 29 <para id="x_57e">Potete modificare lo stile di output che Mercurial userà per ogni comando modificando il vostro file <filename role="special">~/.hgrc</filename>, nominando lo stile che preferireste usare.</para>
Giulio@766 30
Giulio@766 31 <programlisting>[ui]
Giulio@766 32 style = compact</programlisting>
Giulio@766 33
Giulio@766 34 <para id="x_57f">Se scrivete un vostro stile, potete usarlo inserendo il percorso del vostro file di stile, oppure copiano il vostro file di stile in un luogo dove Mercurial possa trovarlo (tipicamente la sottodirectory <literal>templates</literal> della vostra directory di installazione di Mercurial).</para>
Giulio@766 35 </sect2>
Giulio@766 36 </sect1>
Giulio@766 37
Giulio@766 38 <sect1>
Giulio@766 39 <title>Comandi che supportano stili e template</title>
Giulio@766 40
Giulio@766 41 <para id="x_580">Tutti i comandi Mercurial di tipo <literal>log</literal> vi permettono di usare stili e template: <command role="hg-cmd">hg incoming</command>, <command role="hg-cmd">hg log</command>, <command role="hg-cmd">hg outgoing</command>, and <command role="hg-cmd">hg tip</command>.</para>
Giulio@766 42
Giulio@766 43 <para id="x_581">Al momento in cui scrivo questo manuale, questi sono i comandi che finora supportano stili e template. Dato che questi sono i comandi più importanti che hanno bisogno di un output personalizzabile, c'è stata poca pressione da parte della comunità utenti di Mercurial per aggiungere il supporto per stili e template ad altri comandi.</para>
Giulio@766 44 </sect1>
Giulio@766 45
Giulio@766 46 <sect1>
Giulio@766 47 <title>Nozioni di base sui template</title>
Giulio@766 48
Giulio@766 49 <para id="x_582">Nella sua forma più semplice, un template Mercurial è un frammento di testo. Parte del testo non cambia mai, mentre altre parti vengono <emphasis>espanse</emphasis>, o sostituite con nuovo testo, quando è necessario.</para>
Giulio@766 50
Giulio@766 51 <para id="x_583">Prima di continuare, diamo un'altra occhiata al semplice esempio del normale output di Mercurial</para>
Giulio@766 52
Giulio@766 53 &interaction.template.simple.normal;
Giulio@766 54
Giulio@766 55 <para id="x_584">Ora, eseguiamo lo stesso comando, ma usando un template per cambiare il suo output.</para>
Giulio@766 56
Giulio@766 57 &interaction.template.simple.simplest;
Giulio@766 58
Giulio@766 59 <para id="x_585">Questo esempio illustra il template più semplice possibile, composto solo da un frammento di testo statico stampato una volta per ogni changeset. L'opzione <option role="hg-opt-log">--template</option> per il comando <command role="hg-cmd">hg log</command> dice a Mercurial di usare il testo dato come template nel stampare ogni changeset.</para>
Giulio@766 60
Giulio@766 61 <para id="x_586">Notate che la stringa di template appena usata termina con il testo <quote><literal>\n</literal></quote>. Questa è una <emphasis>sequenza di escape</emphasis> che dice a Mercurial di stampare una carattere di nuova riga alla fine di ogni elemento di template. Se omettete questa nuova riga, Mercurial mostrerà ogni frammento di output uno dietro l'altro. Leggete la <xref linkend="sec:template:escape"/> per maggiori dettagli sulle sequenze di escape.</para>
Giulio@766 62
Giulio@766 63 <para id="x_587">Un template che stampa una stringa di testo fissata tutte le volte non è molto utile, perciò proviamo qualcosa di un po' più complesso.</para>
Giulio@766 64
Giulio@766 65 &interaction.template.simple.simplesub;
Giulio@766 66
Giulio@766 67 <para id="x_588">Come potete vedere, la stringa <quote><literal>{desc}</literal></quote> nel template è stata sostituita nell'output con la descrizione di ogni changeset. Ogni volta che Mercurial trova testo racchiuso tra parentesi graffe (<quote><literal>{</literal></quote> e <quote><literal>}</literal></quote>), proverà a sostituire le parentesi e il testo con l'espansione di qualunque cosa vi sia contenuta. Per stampare una parentesi graffa letterale, dovete effettuarne l'escape, come descritto nella <xref linkend="sec:template:escape"/>.</para>
Giulio@766 68 </sect1>
Giulio@766 69
Giulio@766 70 <sect1 id="sec:template:keyword">
Giulio@766 71 <title>Parole chiave comuni nei template</title>
Giulio@766 72
Giulio@766 73 <para id="x_589">Potete cominciare immediatamente a scrivere semplici template usando le seguenti parole chiave.</para>
Giulio@766 74
Giulio@766 75 <itemizedlist>
Giulio@766 76 <listitem><para id="x_58a"><literal role="template-keyword">author</literal>: stringa. Il nome non modificato dell'autore del changeset.</para>
Giulio@766 77 </listitem>
Giulio@766 78 <listitem><para id="x_58b"><literal role="template-keyword">branches</literal>: stringa. Il nome del ramo su cui il changeset è stato inserito. Sarà vuoto se il nome del branch è <literal>default</literal>.</para>
Giulio@766 79 </listitem>
Giulio@766 80 <listitem><para id="x_58c"><literal role="template-keyword">date</literal>: informazioni di data. La data in cui il changeset è stato inserito. Questa informazione <emphasis>non</emphasis> è pensata per essere letta dalle persone; dovete passarla attraverso un filtro che la presenterà in maniera appropriata. Leggete la <xref linkend="sec:template:filter"/> per maggiori informazioni sui filtri. La data viene espressa come una coppia di numeri. Il primo numero è una marcatura temporale che segue lo Unix UTC (e indica il numero di secondi trascorsi dal 1° gennaio 1970); il secondo è la differenza tra la zona temporale dell'autore del commit e l'UTC, in secondi.</para>
Giulio@766 81 </listitem>
Giulio@766 82 <listitem><para id="x_58d"><literal role="template-keyword">desc</literal>: stringa. Il testo della descrizione del changeset.</para>
Giulio@766 83 </listitem>
Giulio@766 84 <listitem><para id="x_58e"><literal role="template-keyword">files</literal>: lista di stringhe. Tutti i file modificati, aggiunti, o rimossi da questo changeset.</para>
Giulio@766 85 </listitem>
Giulio@766 86 <listitem><para id="x_58f"><literal role="template-keyword">file_adds</literal>: lista di stringhe. I file aggiunti da questo changeset.</para>
Giulio@766 87 </listitem>
Giulio@766 88 <listitem><para id="x_590"><literal role="template-keyword">file_dels</literal>: lista di stringhe. I file rimossi da questo changeset.</para>
Giulio@766 89 </listitem>
Giulio@766 90 <listitem><para id="x_591"><literal role="template-keyword">node</literal>: stringa. L'hash di identificazione del changeset, sotto forma di una stringa esadecimale di 40 caratteri.</para>
Giulio@766 91 </listitem>
Giulio@766 92 <listitem><para id="x_592"><literal role="template-keyword">parents</literal>: lista di stringhe. I genitori del changeset.</para>
Giulio@766 93 </listitem>
Giulio@766 94 <listitem><para id="x_593"><literal role="template-keyword">rev</literal>: intero. Il numero di revisione del changeset locale per il repository.</para>
Giulio@766 95 </listitem>
Giulio@766 96 <listitem><para id="x_594"><literal role="template-keyword">tags</literal>: lista di stringhe. Qualsiasi etichetta associata al changeset.</para>
Giulio@766 97 </listitem>
Giulio@766 98 </itemizedlist>
Giulio@766 99
Giulio@766 100 <para id="x_595">Alcuni semplici esperimenti ci mostreranno cosa aspettarci quando usiamo queste parole chiave. Potete vederne i risultati qui di seguito.</para>
Giulio@766 101
Giulio@766 102 &interaction.template.simple.keywords;
Giulio@766 103
Giulio@766 104 <para id="x_596">Come abbiamo notato prima, la parola chiave per la data non produce un output in forma leggibile, così dobbiamo trattarla in maniera speciale. Questo implica l'uso dei <emphasis>filtri</emphasis>, che verranno trattati in maniera più approfondita nella <xref linkend="sec:template:filter"/>.</para>
Giulio@766 105
Giulio@766 106 &interaction.template.simple.datekeyword;
Giulio@766 107 </sect1>
Giulio@766 108
Giulio@766 109 <sect1 id="sec:template:escape">
Giulio@766 110 <title>Sequenze di escape</title>
Giulio@766 111
Giulio@766 112 <para id="x_597">Il motore di template di Mercurial riconosce le sequenze di escape più comunemente usate nelle stringhe. Quando vede un carattere di backslash (<quote><literal>\</literal></quote>), guarda il carattere successivo e sostituisce i due caratteri con un unico rimpiazzo, come descritto qui di seguito.</para>
Giulio@766 113
Giulio@766 114 <itemizedlist>
Giulio@766 115 <listitem><para id="x_598"><literal>\</literal>:
Giulio@766 116 backslash, <quote><literal>\</literal></quote>, ASCII
Giulio@766 117 134.</para>
Giulio@766 118 </listitem>
Giulio@766 119 <listitem><para id="x_599"><literal>\n</literal>: nuova riga,
Giulio@766 120 ASCII 12.</para>
Giulio@766 121 </listitem>
Giulio@766 122 <listitem><para id="x_59a"><literal>\r</literal>: ritorno a capo, ASCII 15.</para>
Giulio@766 123 </listitem>
Giulio@766 124 <listitem><para id="x_59b"><literal>\t</literal>: tabulazione, ASCII
Giulio@766 125 11.</para>
Giulio@766 126 </listitem>
Giulio@766 127 <listitem><para id="x_59c"><literal>\v</literal>: tabulazione verticale, ASCII 13.</para>
Giulio@766 128 </listitem>
Giulio@766 129 <listitem><para id="x_59d"><literal>\{</literal>: parentesi graffa aperta, <quote><literal>{</literal></quote>, ASCII
Giulio@766 130 173.</para>
Giulio@766 131 </listitem>
Giulio@766 132 <listitem><para id="x_59e"><literal>\}</literal>: parentesi graffa chusa, <quote><literal>}</literal></quote>, ASCII
Giulio@766 133 175.</para>
Giulio@766 134 </listitem></itemizedlist>
Giulio@766 135
Giulio@766 136 <para id="x_59f">Come appena indicato, se volete che l'espansione di un template contenga una carattere <quote><literal>\</literal></quote>, <quote><literal>{</literal></quote>, o <quote><literal>{</literal></quote> letterale, dovete effettuarne l'escape.</para>
Giulio@766 137 </sect1>
Giulio@766 138
Giulio@766 139 <sect1 id="sec:template:filter">
Giulio@766 140 <title>Filtrare le parole chiave per modificarne i risultati</title>
Giulio@766 141
Giulio@766 142 <para id="x_5a0">Alcuni dei risultati dell'espansione dei template non sono immediatamente facili da usare. Mercurial vi permette di specificare una catena opzionale di <emphasis>filtri</emphasis> per modificare il risultato dell'espansione di una parola chiave. Avete già visto un filtro comune, <literal role="template-kw-filt-date">isodate</literal>, precedentemente in azione per rendere leggibile una data.</para>
Giulio@766 143
Giulio@766 144 <para id="x_5a1">Qui di seguito viene presentata una lista dei filtri più comunemente usati che Mercurial supporta. Mentre alcuni filtri possono essere applicati a qualsiasi testo, altri possono essere usati solo in circostanze specifiche. Il nome di ogni filtro è seguito prima da una indicazione su dove può essere usato e poi da una descrizione dei suoi effetti.</para>
Giulio@766 145
Giulio@766 146 <itemizedlist>
Giulio@766 147 <listitem><para id="x_5a2"><literal role="template-filter">addbreaks</literal>: qualsiasi testo. Aggiunge un elemento XHTML <quote><literal>&lt;br/&gt;</literal></quote> prima della fine di ogni riga tranne l'ultima. Per esempio, <quote><literal>foo\nbar</literal></quote> diventa <quote><literal>foo&lt;br/&gt;\nbar</literal></quote>.</para>
Giulio@766 148 </listitem>
Giulio@766 149 <listitem><para id="x_5a3"><literal role="template-kw-filt-date">age</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta l'età della data, relativa all'ora corrente. Produce stringhe come <quote><literal>10 minutes</literal></quote>.</para>
Giulio@766 150 </listitem>
Giulio@766 151 <listitem><para id="x_5a4"><literal role="template-filter">basename</literal>: qualsiasi testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">files</literal> e relative. Tratta il testo come un percorso e restituisce il nome di base. Per esempio, <quote><literal>foo/bar/baz</literal></quote> diventa <quote><literal>baz</literal></quote>.</para>
Giulio@766 152 </listitem>
Giulio@766 153 <listitem><para id="x_5a5"><literal role="template-kw-filt-date">date</literal>: parola chiave <literal role="template-keyword">date</literal>. Presenta una data in un formato simile al comando Unix <literal role="template-keyword">date</literal>, ma includendo la zona temporale. Produce stringhe come <quote><literal>Mon Sep 04 15:13:13 2006 -0700</literal></quote>.</para>
Giulio@766 154 </listitem>
Giulio@766 155 <listitem><para id="x_5a6"><literal role="template-kw-filt-author">domain</literal>: qualsiasi testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Trova la prima stringa che somiglia a un indirizzo email e ne estrae il componente del dominio. Per esempio, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>serpentine.com</literal></quote>.</para>
Giulio@766 156 </listitem>
Giulio@766 157 <listitem><para id="x_5a7"><literal role="template-kw-filt-author">email</literal>: qualsiasi testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Estrae la prima stringa che somiglia a un indirizzo email. Per esempio, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>bos@serpentine.com</literal></quote>.</para>
Giulio@766 158 </listitem>
Giulio@766 159 <listitem><para id="x_5a8"><literal role="template-filter">escape</literal>: qualsiasi testo. Sostituisce i caratteri speciali XML/XHTML <quote><literal>&amp;</literal></quote>, <quote><literal>&lt;</literal></quote> e <quote><literal>&gt;</literal></quote> con entità XML.</para>
Giulio@766 160 </listitem>
Giulio@766 161 <listitem><para id="x_5a9"><literal role="template-filter">fill68</literal>: qualsiasi testo. Manda a capo il testo per farlo stare in 68 colonne. Questo è utile prima di passare il testo attraverso al filtro <literal role="template-filter">tabindent</literal>, se volete che stia ancora in una finestra di 80 colonne con caratteri a spaziatura fissa.</para>
Giulio@766 162 </listitem>
Giulio@766 163 <listitem><para id="x_5aa"><literal role="template-filter">fill76</literal>: qualsiasi testo. Manda a capo il testo per farlo stare in 76 colonne.</para>
Giulio@766 164 </listitem>
Giulio@766 165 <listitem><para id="x_5ab"><literal role="template-filter">firstline</literal>: qualsiasi testo. Produce la prima riga del testo, senza alcun carattere di nuova riga alla fine.</para>
Giulio@766 166 </listitem>
Giulio@766 167 <listitem><para id="x_5ac"><literal role="template-kw-filt-date">hgdate</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta la data come una coppia di numeri leggibili. Produce una stringa come <quote><literal>1157407993 25200</literal></quote>.</para>
Giulio@766 168 </listitem>
Giulio@766 169 <listitem><para id="x_5ad"><literal role="template-kw-filt-date">isodate</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta una data come stringa di testo in formato ISO 8601. Produce una stringa come <quote><literal>2006-09-04 15:13:13 -0700</literal></quote>.</para>
Giulio@766 170 </listitem>
Giulio@766 171 <listitem><para id="x_5ae"><literal role="template-filter">obfuscate</literal>: qualsiasi testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Riproduce il testo in ingresso rappresentandolo come una sequenza di entità XML. Questo è utile per battere alcuni #spambot# particolarmente stupidi che effettuano lo #screen-scraping# per raccogliere indirizzi email.</para>
Giulio@766 172 </listitem>
Giulio@766 173 <listitem><para id="x_5af"><literal role="template-kw-filt-author">person</literal>: qualsiasi testo, ma utili soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Produce il testo prima di un indirizzo email. Per esempio, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>Bryan O'Sullivan</literal></quote>.</para>
Giulio@766 174 </listitem>
Giulio@766 175 <listitem><para id="x_5b0"><literal role="template-kw-filt-date">rfc822date</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta una data usando lo stesso formato impiegato nelle intestazioni email. Produce una stringa come <quote><literal>Mon, 04 Sep 2006 15:13:13 -0700</literal></quote>.</para>
Giulio@766 176 </listitem>
Giulio@766 177 <listitem><para id="x_5b1"><literal role="template-kw-filt-node">short</literal>: hash di changeset. Produce la forma breve di un hash di changeset, i.e. una stringa esadecimale di 12 caratteri.</para>
Giulio@766 178 </listitem>
Giulio@766 179 <listitem><para id="x_5b2"><literal role="template-kw-filt-date">shortdate</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta l'anno, il mese e il giorno della data. Produce una stringa come <quote><literal>2006-09-04</literal></quote>.</para>
Giulio@766 180 </listitem>
Giulio@766 181 <listitem><para id="x_5b3"><literal role="template-filter">strip</literal>: qualsiasi testo. Rimuove lo spazio bianco all'inizio e alla fine di una stringa.</para>
Giulio@766 182 </listitem>
Giulio@766 183 <listitem><para id="x_5b4"><literal role="template-filter">tabindent</literal>: qualsiasi testo. Produce il testo, facendo cominciare ogni riga tranne la prima con un carattere di tabulazione.</para>
Giulio@766 184 </listitem>
Giulio@766 185 <listitem><para id="x_5b5"><literal role="template-filter">urlescape</literal>: qualsiasi testo. Effettua l'escape di tutti i caratteri che sono considerati <quote>speciali</quote> dai riconoscitori di URL. Per esempio, <literal>foo bar</literal> diventa <literal>foo%20bar</literal>.</para>
Giulio@766 186 </listitem>
Giulio@766 187 <listitem><para id="x_5b6"><literal role="template-kw-filt-author">user</literal>: qualsiasi testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Restituisce la porzione dell'<quote>utente</quote> di un indirizzo email. Per esempio <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>bos</literal></quote>.</para>
Giulio@766 188 </listitem>
Giulio@766 189 </itemizedlist>
Giulio@766 190
Giulio@766 191 &interaction.template.simple.manyfilters;
Giulio@766 192
Giulio@766 193 <note>
Giulio@766 194 <para id="x_5b7">Se provate ad applicare un filtro a un frammeto di dati che non può elaborare, Mercurial fallirà e stamperà una eccezione Python. Per esempio, provare a utilizzare l'output della parola chiave <literal role="template-keyword">desc</literal> con il filtro <literal role="template-kw-filt-date">isodate</literal> non è una buona idea.</para>
Giulio@766 195 </note>
Giulio@766 196
Giulio@766 197 <sect2>
Giulio@766 198 <title>Combinare i filtri</title>
Giulio@766 199
Giulio@766 200 <para id="x_5b8">&Egrave; facile combinare filtri per produrre un output della forma che preferite. La seguente catena di filtri ripulisce una descrizione, poi si assicura che stia tranquillamente in 68 colonne, poi la indenta ulteriormente di 8 caratteri (almeno sui sistemi di tipo Unix, dove una tabulazione è convenzionalmente larga 8 caratteri).</para>
Giulio@766 201
Giulio@766 202 &interaction.template.simple.combine;
Giulio@766 203
Giulio@766 204 <para id="x_5b9">Notate l'uso di <quote><literal>\t</literal></quote> (un carattere di tabulazione) nel template per forzare la prima riga a essere indentata; questo è necessario dato che <literal role="template-keyword">tabindent</literal> indenta tutte le righe <emphasis>tranne</emphasis> la prima.</para>
Giulio@766 205
Giulio@766 206 <para id="x_5ba">Tenete a mente che l'ordine dei filtri in una catena è significativo. Il primo filtro viene applicato al risultato della parola chiave; il secondo al risultato del primo filtro; e così via. Per esempio, usare <literal>fill68|tabindent</literal> dà risultati molto diversi da <literal>tabindent|fill68</literal>.</para>
Giulio@766 207 </sect2>
Giulio@766 208 </sect1>
Giulio@766 209
Giulio@766 210 <sect1>
Giulio@766 211 <title>Dai template agil stili</title>
Giulio@766 212
Giulio@766 213 <para id="x_5bb">Un template a riga di comando fornisce un modo veloce e semplice per formattare un certo output. I template possono diventare prolissi, però, e quindi è utile essere in grado di dare un nome a un template. Un file di stile è un template con un nome, memorizzato in un file.</para>
Giulio@766 214
Giulio@766 215 <para id="x_5bc">Più di questo, usare un file di stile sblocca la potenza del motore di template di Mercurial in modi che non sono possibili usando l'opzione <option role="hg-opt-log">--template</option> a riga di comando.</para>
Giulio@766 216
Giulio@766 217 <sect2>
Giulio@766 218 <title>Il più semplice dei file di stile</title>
Giulio@766 219
Giulio@766 220 <para id="x_5bd">Il nostro semplice file di stile contiene solo una riga:</para>
Giulio@766 221
Giulio@766 222 &interaction.template.simple.rev;
Giulio@766 223
Giulio@766 224 <para id="x_5be">Questo dice a Mercurial, <quote>se stai stampando un changeset, usa il testo sulla destra come template</quote>.</para>
Giulio@766 225 </sect2>
Giulio@766 226
Giulio@766 227 <sect2>
Giulio@766 228 <title>La sintassi dei file di stile</title>
Giulio@766 229
Giulio@766 230 <para id="x_5bf">Le regole della sintassi per un file di stile sono semplici.</para>
Giulio@766 231
Giulio@766 232 <itemizedlist>
Giulio@766 233 <listitem><para id="x_5c0">Il file viene elaborato una riga alla volta.</para>
Giulio@766 234 </listitem>
Giulio@766 235 <listitem><para id="x_5c1">Gli spazi bianchi all'inizio e alla fine di una riga vengono ignorati.</para>
Giulio@766 236 </listitem>
Giulio@766 237 <listitem><para id="x_5c2">Le righe vuote vengono saltate.</para>
Giulio@766 238 </listitem>
Giulio@766 239 <listitem><para id="x_5c3">Se una riga comincia con un carattere <quote><literal>#</literal></quote> o <quote><literal>;</literal></quote>, l'intera riga viene trattata come un commento e saltata come se fosse vuota.</para>
Giulio@766 240 </listitem>
Giulio@766 241 <listitem><para id="x_5c4">Una riga comincia con una parola chiave, che deve cominciare con un carattere alfabetico o di sottolineatura e può contenere successivamente qualsiasi carattere alfanumerico o di sottolineatura. (Nella notazione per le espressioni regolari, una parola chiave deve corrispondere a <literal>[A-Za-z_][A-Za-z0-9_]*</literal>.)</para>
Giulio@766 242 </listitem>
Giulio@766 243 <listitem><para id="x_5c5">L'elemento successivo deve essere un carattere <quote><literal>=</literal></quote>, che può essere preceduto o seguito da una quantità arbitraria di spazio bianco.</para>
Giulio@766 244 </listitem>
Giulio@766 245 <listitem><para id="x_5c6">Se il resto della riga comincia e finisce con caratteri di apice o virgolette corrispondenti, viene trattato come il corpo di un template.</para>
Giulio@766 246 </listitem>
Giulio@766 247 <listitem><para id="x_5c7">Se il resto della riga <emphasis>non</emphasis> comincia con caratteri di apice o virgolette, è trattato come il nome di un file i cui contenuti verranno letti e usati come il corpo di un template.</para>
Giulio@766 248 </listitem></itemizedlist>
Giulio@766 249 </sect2>
Giulio@766 250 </sect1>
Giulio@766 251
Giulio@766 252 <sect1>
Giulio@766 253 <title>Esempi di file di stile</title>
Giulio@766 254
Giulio@766 255 <para id="x_5c8">Per illustrare come scrivere un file di stile, ne costruiremo alcuni esempi. Piuttosto che fornire un file di stile completo e camminarci attraverso, replicheremo il classico processo di sviluppo di un file di stile cominciando con qualcosa di molto semplice e cammninando attraverso una serie di esempi successivi più completi.</para>
Giulio@766 256
Giulio@766 257 <sect2>
Giulio@766 258 <title>Identificare errori in un file di stile</title>
Giulio@766 259
Giulio@766 260 <para id="x_5c9">Se Mercurial incontra un problema in un file di stile su cui state lavorando, stampa uno stringato messaggio di errore che, una volta che avete scoperto cosa significa, è in effetti piuttosto utile.</para>
Giulio@766 261
Giulio@766 262 &interaction.template.svnstyle.syntax.input;
Giulio@766 263
Giulio@766 264 <para id="x_5ca">Notate che <filename>broken.style</filename> tenta di definire una parola chiave <literal>changeset</literal>, ma dimentica di darle un qualsiasi contenuto. Quando gli si chiede di usare questo file di stile, Mercurial si lamenta prontamente.</para>
Giulio@766 265
Giulio@766 266 &interaction.template.svnstyle.syntax.error;
Giulio@766 267
Giulio@766 268 <para id="x_5cb">Questo messaggio di errore sembra minaccioso, ma non è troppo difficile da seguire.</para>
Giulio@766 269
Giulio@766 270 <itemizedlist>
Giulio@766 271 <listitem><para id="x_5cc">Il primo componente è semplicemente il modo che Mercurial ha di dire <quote>gliela dò su</quote>.</para>
Giulio@766 272 <programlisting>___abort___: broken.style:1: parse error</programlisting>
Giulio@766 273 </listitem>
Giulio@766 274 <listitem><para id="x_5cd">Successivamente arriva il nome del file di stile che contiene l'errore.</para>
Giulio@766 275 <programlisting>abort: ___broken.style___:1: parse error</programlisting>
Giulio@766 276 </listitem>
Giulio@766 277 <listitem><para id="x_5ce">Il nome del file è seguito dal numero di riga dove l'errore è stato incontrato.</para>
Giulio@766 278 <programlisting>abort: broken.style:___1___: parse error</programlisting>
Giulio@766 279 </listitem>
Giulio@766 280 <listitem><para id="x_5cf">Infine, viene fornita una descrizione di quello che è andato storto.</para>
Giulio@766 281 <programlisting>abort: broken.style:1: ___parse error___</programlisting>
Giulio@766 282 </listitem>
Giulio@766 283 <listitem><para id="x_5d0">La descrizione del problema non è sempre chiara (come in questo caso), ma anche quando è criptica, è quasi sempre elementare inspezionare visivamente la riga del file di stile che contiene il problema e vedere cosa c'è di sbagliato.</para>
Giulio@766 284 </listitem>
Giulio@766 285 </itemizedlist>
Giulio@766 286 </sect2>
Giulio@766 287
Giulio@766 288 <sect2>
Giulio@766 289 <title>Identificare univocamente un repository</title>
Giulio@766 290
Giulio@766 291 <para id="x_5d1">Se volete essere in grado di identificare un repository Mercurial in maniera <quote>abbastanza univoca</quote> usando una breve stringa come identificatore, potete usare la prima revisione contenuta nel repository.</para>
Giulio@766 292
Giulio@766 293 &interaction.template.svnstyle.id;
Giulio@766 294
Giulio@766 295 <para id="x_5d2">&Egrave; molto probabile che questo identificatore siaunico, quindi si rivela utile in molti casi. Ci sono alcune avvertenze.</para>
Giulio@766 296 <itemizedlist>
Giulio@766 297 <listitem><para id="x_5d3">Non funzionerà in un repository completamente vuoto, perché un tale repository non possiede la revisione zero.</para>
Giulio@766 298 </listitem>
Giulio@766 299 <listitem><para id="x_5d4">Non funzionerà nemmeno nel caso (estremamente raro) in cui un repository è l'unione di due o più repository precedentemente indipendenti che avete ancora in giro da qualche parte.</para>
Giulio@766 300 </listitem></itemizedlist>
Giulio@766 301 <para id="x_5d5">Ecco alcuni usi che potete fare di questo identificatore:</para>
Giulio@766 302 <itemizedlist>
Giulio@766 303 <listitem><para id="x_5d6">come chiave nella tabella di un datavase che gestisce i repository presenti su un server.</para>
Giulio@766 304 </listitem>
Giulio@766 305 <listitem><para id="x_5d7">come metà di una tupla {<emphasis>identificatore di repository</emphasis>, <emphasis>identificatore di revisione</emphasis>}. Salvate questa informazione da qualche parte quando esguite un assemblaggio automatico o un'altra attività simile, in modo che possiate <quote>rieseguire</quote> l'assemblaggio in seguito se necessario.</para>
Giulio@766 306 </listitem>
Giulio@766 307 </itemizedlist>
Giulio@766 308 </sect2>
Giulio@766 309
Giulio@766 310 <sect2>
Giulio@766 311 <title>Elencare file su più righe</title>
Giulio@766 312
Giulio@766 313 <para id="x_714">Supponete di voler elencare i file modificati da un changeset uno per riga, con una piccola indentazione prima di ogni nome di file.</para>
Giulio@766 314
Giulio@766 315 &interaction.ch10-multiline.go;
Giulio@766 316 </sect2>
Giulio@766 317
Giulio@766 318 <sect2>
Giulio@766 319 <title>Imitare l'output di Subversion</title>
Giulio@766 320
Giulio@766 321 <para id="x_5d8">Proviamo a emulare il formato di output predefinito usato da un altro strumento di controllo di revisione, Subversion.</para>
Giulio@766 322
Giulio@766 323 &interaction.template.svnstyle.short;
Giulio@766 324
Giulio@766 325 <para id="x_5d9">Dato che lo stile di output di Subversion è abbastanza semplice, è facile copiare e incollare un pezzo del suo output in un file e rimpiazzare il testo prodotto da Subversion con i valori di template che vorremmo vedere espansi.</para>
Giulio@766 326
Giulio@766 327 &interaction.template.svnstyle.template;
Giulio@766 328
Giulio@766 329 <para id="x_5da">Ci sono alcuni modi in cui questo template si discosta dall'output prodotto da Subversion.</para>
Giulio@766 330 <itemizedlist>
Giulio@766 331 <listitem><para id="x_5db">Subversion stampa una data <quote>leggibile</quote> (il <quote><literal>Wed, 27 Sep 2006</literal></quote> nel risultato dell'esempio precedente) tra parentesi. Il motore di template di Mercurial non fornisce un modo per visualizzare una data in questo formato senza stampare anche l'orario e la zona temporale.</para>
Giulio@766 332 </listitem>
Giulio@766 333 <listitem><para id="x_5dc">Emuliamo la stampa da parte di Subversion di righe <quote>separatrici</quote> piene di caratteri <quote><literal>-</literal></quote> concludendo il template con una riga di quel tipo. Usiamo la parola chiave <literal role="template-keyword">header</literal> del motore di template per stampare una riga separatrice come la prima riga di output (vedete più avanti), quindi ottenendo un output simile a quello di Subversion.</para>
Giulio@766 334 </listitem>
Giulio@766 335 <listitem><para id="x_5dd">L'output di Subversion include nell'intestazione il conteggio del numero di righe del messaggio di commit. Non possiamo replicare questa caratteristica in Mercurial, poiché attualmente il motore di template non fornisce un filtro che conti il numero di righe generate dal template.</para>
Giulio@766 336 </listitem></itemizedlist>
Giulio@766 337 <para id="x_5de">Non mi ci sono voluti più di uno o due minuti di lavoro per sostituire il testo letterale da un esempio dell'output di Subversion con alcune parole chiave e alcuni filtri per ottenere il template appena visto. Il file di stile fa semplicemente riferimento al template.</para>
Giulio@766 338
Giulio@766 339 &interaction.template.svnstyle.style;
Giulio@766 340
Giulio@766 341 <para id="x_5df">Avremmo potuto includere il testo del file di template direttamente nel file di stile, circondandolo con virgolette e rimpiazzando le nuove righe con sequenze <quote><literal>\n</literal></quote>, ma questo avrebbe reso il file di stile troppo difficile da leggere. La leggibilità è una buona guida quando state cercando di decidere se un certo testo appartiene a un file di stile o a un file di template a cui il file di stile fa riferimento. Nel caso il file di stile vi sembrasse troppo grande o disordinato se inserite un frammento letterale di testo, spostatelo invece in un template.</para>
Giulio@766 342 </sect2>
Giulio@766 343 </sect1>
Giulio@766 344 </chapter>