// TitreChapitre.spr - v 1.0 © 2002 Escot-Sep christophe

// Titre dynamique avec numérotation des chapitres
// reprise des signets internes, liens vers rubrique parente et début chapitre

// paramètres:
// skip = liste des signets à ne pas reprendre => skip=signet;signet2

// img = nom d'une image à afficher juste devant le titre de la rubrique

var Fonte_Titre_Chapitre,
Fonte_Titre_Rubrique,
Fonte_Titre_Parent,
Fonte_Ordre_Chapitre,
Fonte_Signets,
FonteDef : string;

masque,titre,chapitre,defaut,tableau,level
,titre_chapitre,nom_chapitre:string;
i,this_num,this_level,level_chapitre,id_chapitre:integer;
continue:boolean;

signet,Nom,Skip,barre,image:string;

nbr:integer;

const MARK = '<'+'<';
EMARK = '>'+'>';
begin


// défini les fontes des divers éléments
Fonte_Titre_Chapitre := 'Verdana,16,$000000,G' ;
Fonte_Titre_Rubrique := GetElement(eFntTopic);
Fonte_Titre_Parent := 'Verdana,12,$000000,' ;
Fonte_Ordre_Chapitre := 'Verdana,12,$000000,G' ;
Fonte_Signets := 'Arial,8,$000000,-' ;
FonteDef := GetElement(eFntDefaultTopic);


this_num := GetNum; // obtenir le numéro de la rubrique

this_level := getlevelof(This_num);// niveau de la rubrique où est exécuté le script
level := inttostr(This_level-1);

i:=This_num;

if level='1' then Titre := Format(MARK+'FNT(%s:[ #' + '12])'+EMARK,[Fonte_Titre_Chapitre])
else begin
// création du masque, [ #-level] est un champ calculé qui fournit le titre parent

Titre := Format(MARK+'FNT(%s:[ #-'+level+'])'+EMARK,[Fonte_Titre_Chapitre]);

// déterminer le numéro de rubrique du chapitre parent
while GetLevelOf(i)<>2 do i:=i-1;

end;

// obtenir les titre et nom du chapitre
Titre_Chapitre:=GetTitreOf(i);
Nom_Chapitre :=GetNomOf(i);

// déterminer le numéro d'ordre du chapitre

level_chapitre:=1;
id_chapitre := i;

i := 0;
continue := true;
// on liste les rubriques à la recherche des chapitres
while continue do
begin
if getlevelof(i)=2 then
begin
// nous sommes sur un chapitre (niveau = 2)
// regarder si son titre correspond à celui du chapitre où se joue le script

if Titre_chapitre=GetTitreOf(i) then continue := false // on a trouvé on sort de la boucle

else level_chapitre:=level_chapitre+1; // non alors on continue et on augmente le numéro d'ordre
end;

if continue then
begin
i := i+1; // rubrique suivante
// on s'assure de ne pas dépasser le nombre total de rubrique
continue := i< GetTopicCount;
end;
end;

// nous pouvons préparer la chaine "Chapitre X"
Chapitre := 'Chapitre '+inttostr(level_chapitre);

Chapitre := format(MARK+'FNT(%s:%s)'+EMARK,[Fonte_Ordre_Chapitre,Chapitre]);

writeln('');
// nos données seront affichées dans un tableau de 3 colonnes
write('<<TABLE:250,700,800!,LEFT,90,,@BOTTOM,>><<TR:>><<TD: 0,0>>' );

// si level=1 on est au début du chapitre, on affiche juste le nom sans lien
if level='1' then Write(titre) else
begin

// autrement on va afficher le nom du chapitre et faire un lien vers celui-ci
Writeln(MARK + 'JMP(' +MARK+ 'FNT('+Fonte_Titre_Chapitre+':'+titre_chapitre+')'+EMARK+',%'+Nom_Chapitre+')'+EMARK );
// si la rubrique où nous somme est d'un niveau>3 cela veut dire que c'est
// au moins une sous-sous-rubrique, nous allons donc afficher le titre
// de la rubrique parente et y faire un lien

if GetLevelOf(GetNum)>3 then
begin
// on décale l'affichage vers la droite
write('    ');
// trouver la rubrique de niveau immédiatement inférieur, donc la rubrique parente
i := This_num;
while ((i>2) and (GetLevelOf(i)>=This_Level)) do i:=i-1;
// on crée un lien dessus
write(MARK+'JMP(' +MARK+ 'FNT('+Fonte_Titre_Parent+':[ #-1])'+EMARK+',%'+getNomof(i)+')'+EMARK );

end;

end;
// on passe à la deuième colonne qui affichera
// le titre de la rubrique et les éventuels liens internes (signet)
write('<</TD>><<TD: 2,0>>' );

// skip contient les noms des signets à ne pas reprendre
Skip := GetParam('SKIP','' );

// on peut aussi faire s'afficher une image en tête du titre
image:=getparam('img','');
if image<>'' then image := MARK+'BMP(C,'+image+',,,,1,1)'+EMARK+' ';

// Titre & nom de la rubrique
Titre := GetTitre;
Nom := GetNom;

// obtenir le nombre de signet de la rubrique
nbr := GetSignetCount(Titre);

barre :='';

// pour chaque signet, un lien à son nom
for i:=0 to nbr-1 do
begin
signet := GetSignetOf(Titre,i);
// on vérifie que le signet n'est pas das la liste des refusés
if (signet<>'')and(pos(Signet,Skip)=0) then

begin
// on construit notre barre des signets
barre := barre + MARK+'JMP(' + Signet + ',:'+Signet + ')'+EMARK;
// s'il reste encore un signet après on insére un - de séparation
if i< nbr-1 then barre:=barre+' - ';
end;
end;



// on affiche l'éventuelle image plus le titre
writeln(image+' '+MARK+'FNT('+Fonte_Titre_Rubrique+':TitreChapitre)'+EMARK);

// si nous avons trouvé des signet on défini une petite police et on les affiche
if barre<>'' then writeln(MARK+'FNT('+Fonte_signets+':)'+EMARK+barre);


// on ferme la deuxième colonne et on ouvre la troisième
write('<</TD>><<TD: 1,0>>');
// on y iscrit chapitre avec son numéro d'ordre
write(Chapitre);
// on ferme notre table et on défini la fonte par défaut de notre rubrique

write('<</TD>><</TR>><</TABLE>>'+MARK+ 'FNT('+FonteDef+':)'+EMARK);


end;


end.

Sommaire