1#
2#
3# Mod�le HTG de base pour la g�n�ration de pages LaTeX
4# Doit �tre inclus en premier par le mod�le
5# Peut �tre compl�t� par des proc�dures issues du mod�le sp�cifique
6#
7# Historique
8#   1999/06/20 : pda : ajout du langage latex
9#   1999/07/02 : pda : simplification
10#   1999/07/26 : pda : ajout de lt et gt
11#
12
13###############################################################################
14# Mise en forme du texte
15###############################################################################
16
17proc htg_gras {} {
18    if [catch {set arg [htg getnext]} v] then {error $v}
19    return "\\textbf {$arg}"
20}
21
22proc htg_teletype {} {
23    if [catch {set arg [htg getnext]} v] then {error $v}
24    return "\\texttt {$arg}"
25}
26
27proc htg_italique {} {
28    if [catch {set arg [htg getnext]} v] then {error $v}
29    return "\\textem {>$arg}"
30}
31
32proc htg_souligne {} {
33    if [catch {set arg [htg getnext]} v] then {error $v}
34    return "\\textem {$arg}"
35}
36
37proc htg_retrait {} {
38    if [catch {set arg [htg getnext]} v] then {error $v}
39    return "\\begin {quote}\n$arg\n\\end {quote}"
40}
41
42proc htg_image {} {
43    if [catch {set source [htg getnext]} v] then {error $v}
44    if [catch {set texte  [htg getnext]} v] then {error $v}
45    return "<IMG SRC=\"$source\" ALT=\"$texte\">"
46}
47
48proc htg_liste {} {
49    if [catch {set arg [htg getnext]} v] then {error $v}
50    return "\\begin {itemize}\n$arg\n\\end {itemize}"
51}
52
53proc htg_enumeration {} {
54    if [catch {set arg [htg getnext]} v] then {error $v}
55    return "\\begin {enumerate}\n$arg\n\\end {enumerate}"
56}
57
58proc htg_item {} {
59    if [catch {set arg [htg getnext]} v] then {error $v}
60    return "\\item $arg\n"
61}
62
63proc htg_titre {} {
64    if [catch {set niveau [htg getnext]} v] then {error $v}
65    if [catch {set texte  [htg getnext]} v] then {error $v}
66    switch $niveau {
67	1 { set texte "\\begin {center}\n\\huge\\textbf {$texte}\n\\end {center}" }
68	2 { set texte "\\section {$texte}" }
69	3 { set texte "\\subsection {$texte}" }
70	4 { set texte "\\subsubsection {$texte}" }
71	5 { set texte "\\paragraph {$texte}" }
72    }
73    return $texte
74}
75
76proc htg_verbatim {} {
77    if [catch {set texte  [htg getnext]} v] then {error $v}
78    return "\\begin {verbatim}\n$texte\n\\end{verbatim}"
79}
80
81###############################################################################
82# Caract�res sp�ciaux
83###############################################################################
84
85proc htg_lt {} {
86    return {$<$}
87}
88
89proc htg_gt {} {
90    return {$>$}
91}
92
93###############################################################################
94# URLs et liens
95###############################################################################
96
97proc htg_lien {} {
98    if [catch {set texte [htg getnext]} v] then {error $v}
99    if [catch {set url   [htg getnext]} v] then {error $v}
100    return "\\textbf {$texte}\\footnote {$url}"
101}
102
103proc htg_ancre {} {
104    if [catch {set nom   [htg getnext]} v] then {error $v}
105    if [catch {set texte [htg getnext]} v] then {error $v}
106    return "\\label {$nom} $texte"
107}
108
109##############################################################################
110# Tableaux
111##############################################################################
112
113# <TABLE
114#	ALIGN=CENTER/LEFT/RIGHT			=> le tableau dans la page
115#	BGCOLOR=couleur
116#	BORDER=n
117#	BORDERCOLOR=?
118#	WIDTH=n%
119#
120# <TR
121#	ALIGN=CENTER/LEFT/RIGHT			=> le texte dans les cellules
122#	BGCOLOR=
123#	VALIGN=BASELINE/BOTTOM/CENTER/TOP	=> le texte dans les cellules
124#
125# <TD
126#	ALIGN=CENTER/LEFT/RIGHT			=> le texte dans la cellule
127#	BGCOLOR=
128#	COLSPAN=n
129#	ROWSPAN=n
130#	VALIGN=BASELINE/BOTTOM/CENTER/TOP
131#	WIDTH=n%
132
133proc htg_tableau {} {
134    if [catch {set attributs [htg getnext]} v] then {error $v}
135    if [catch {set defaut    [htg getnext]} v] then {error $v}
136    if [catch {set contenu   [htg getnext]} v] then {error $v}
137
138    #
139    # Analyser les attributs du tableau
140    #
141
142    set border 0
143    set center 0
144    foreach a $attributs {
145	set cv [split $a =]
146	set c [string tolower [lindex $cv 0]]
147	set v [string tolower [lindex $cv 1]]
148
149	switch $c {
150	    border	{
151		set border $v
152	    }
153	    align	{
154		if {[string compare $v center] == 0} then {
155		    set center 1
156		}
157	    }
158	}
159    }
160
161    #
162    # D�terminer les attributs des colonnes du tableau
163    #
164
165    set cols ""
166    foreach col $defaut {
167	set align l
168	foreach a $col {
169	    set cv [split $a =]
170	    set c [string tolower [lindex $cv 0]]
171	    set v [string tolower [lindex $cv 1]]
172
173	    switch $c {
174		align	{
175		    switch $v {
176			center	{ set align c }
177			left	{ set align l }
178			right	{ set align r }
179		    }
180		}
181		width	{
182		    # XXX ! Mettre la largeur correcte
183		    set align p@${v}mm
184		}
185	    }
186	}
187	if {$border > 0} then { append cols "|" }
188	append cols $align
189    }
190    if {$border > 0} then { append cols "|" }
191
192    #
193    # Parcourir les lignes et les cases, et les mettre en forme
194    #
195
196    set resultat ""
197    foreach ligne $contenu {
198	#
199	# la premi�re ligne est sp�ciale
200	#
201	if {$border > 0 && [string compare $resultat ""] == 0} then {
202	    append resultat "\\hline "
203	}
204
205	set numcol 0
206	foreach case $ligne {
207	    set nbcol    [lindex $case 0]
208	    set attrcase [lindex $case 1]
209	    set texte    [lindex $case 2]
210
211	    if {$numcol > 0} then {
212		append resultat "& "
213	    }
214
215	    if {$nbcol > 1} then {
216		# XXX ! int�grer les attributs de cette case
217		set r "\\multicolumn {$nbcol} {|l|} {$texte}"
218	    } else {
219		set r $texte
220	    }
221
222	    append resultat $r
223
224	    incr numcol
225	}
226	append resultat "\\\\ \n"
227	if {$border > 0} then {
228	    append resultat "\\hline "
229	}
230    }
231
232    set resultat "\\begin {tabular} {$cols}\n$resultat\n\\end {tabular}"
233
234    if {$center} then {
235	set resultat "\\begin {center}\n$resultat\n\\end {center}"
236    }
237
238    return $resultat
239}
240
241proc fusion-attributs {a1 a2} {
242    foreach a $a1 {
243	set cv [split $a =]
244	set c [lindex $cv 0]
245	set v [lindex $cv 1]
246	set tab($c) $v
247    }
248
249    foreach a $a2 {
250	set cv [split $a =]
251	set c [lindex $cv 0]
252	set v [lindex $cv 1]
253	set tab($c) $v
254    }
255
256    set r ""
257    foreach a [array names tab] {
258	append r "$a=$tab($a) "
259    }
260    return $r
261}
262
263#
264# Attributs des colonnes du tableau
265# Ceux-ci sont d�finis par \casedefauttableau {}, puis sont
266# renvoy�s � \tableau qui les propage ensuite vers les diff�rentes cases.
267# Chaque colonne poss�de plusieurs attributs (s�par�s par des espaces)
268# Les diff�rentes colonnes sont s�par�es par des ";"
269#
270
271proc htg_casedefauttableau {} {
272    if [catch {set attributs [htg getnext]} v] then {error $v}
273    return [list $attributs]
274}
275
276proc htg_bordure {} {
277    if [catch {set largeur [htg getnext]} v] then {error $v}
278    if [catch {set couleur [htg getnext]} v] then {error $v}
279    return [list BORDER=$largeur]
280}
281
282# BASELINE/BOTTOM/CENTER/TOP
283proc htg_centragevertical {} {
284    if [catch {set centrage [htg getnext]} v] then {error $v}
285    return ""
286}
287
288# CENTER/LEFT/RIGHT
289proc htg_centragehorizontal {} {
290    if [catch {set centrage [htg getnext]} v] then {error $v}
291    return [list ALIGN=$centrage]
292}
293
294proc htg_taille {} {
295    if [catch {set taille [htg getnext]} v] then {error $v}
296    return [list WIDTH=$taille]
297}
298
299proc htg_couleurfond {} {
300    if [catch {set couleur [htg getnext]} v] then {error $v}
301    return ""
302}
303
304#
305# Le contenu du tableau (les lignes et les cases) proprement dit
306# Une ligne est r�cup�r�e sous la forme d'une liste :	{case case ...}
307# o� chaque case est une liste :	{nbcols attributs texte}
308#
309
310proc htg_lignetableau {} {
311     if [catch {set texte [htg getnext]} v] then {error $v}
312     return [list $texte]
313}
314
315proc htg_casetableau {} {
316    if [catch {set attributs [htg getnext]} v] then {error $v}
317    if [catch {set texte     [htg getnext]} v] then {error $v}
318    return [list [list 1 $attributs $texte]]
319}
320
321proc htg_multicasetableau {} {
322    if [catch {set nbcol     [htg getnext]} v] then {error $v}
323    if [catch {set attributs [htg getnext]} v] then {error $v}
324    if [catch {set texte     [htg getnext]} v] then {error $v}
325
326    return [list [list $nbcol $attributs $texte]]
327}
328
329##############################################################################
330# M�morisation des parties
331##############################################################################
332
333proc htg_set {} {
334    global partie
335
336    if [catch {set variable [htg getnext]} v] then {error $v}
337    if [catch {set partie($variable) [htg getnext]} v] then {error $v}
338    return {}
339}
340
341proc htg_partie {} {
342    global partie
343
344    if [catch {set id [htg getnext]} v] then {error $v}
345    if [catch {set texte [htg getnext]} v] then {error $v}
346    set texte [nettoyer-latex $texte]
347    set partie(id) $texte
348    return {}
349}
350
351proc htg_recuperer {} {
352    global partie
353
354    if [catch {set id [htg getnext]} v] then {error $v}
355    return $partie($id)
356}
357
358##############################################################################
359# Mise en forme LaTeX
360##############################################################################
361
362proc nettoyer-latex {texte} {
363    # convertir les ~ en espaces ins�cables et les ~~ en ~
364    regsub -all {~} $texte {\&nbsp;} texte
365    regsub -all {\&nbsp;\&nbsp;} $texte {\~{}} texte
366    regsub -all {\&nbsp;} $texte {~} texte
367
368    return $texte
369}
370