// 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.