// déclaration variables
var js_file:TStringList;
cssdate,cssResults,CssTitreResults,legende,inputsize,pathSystem,pathProj,TopicResult,source,titre,css,cssButton,cssEdit,invite: string;
Submit:string;
Data,ONom,Obj:TStringList;
i,j,nbr,start:integer;
key,data_i:string;
DateCreation,DateModification:string;
css_filename,css_filename_print:string;
SIGNATURE:string;
Print:boolean;
begin

// Les deux premières étapes ne doivent être effectuées qu'une seule fois pour l'ensemble du projet
SIGNATURE := 'search.spr';
if GetVarInt(SIGNATURE,0)=0 then
begin
SetVarInt(SIGNATURE,1); // pour ne pas les regénèrer

// -- Première étape, on va copier et mettre à jour les fichiers js du moteur de recherche
// -- il s'agit de Tipue 1.52 de www.tipue.com
js_file := TStringList.create;
TopicResult := GetParam('TopicResult','');
if TopicResult<>'' then TopicResult := TitreToHtmlFile(TopicResult);
// on détermine les répertoires source et cible
pathSystem := Path+'system.hew\';
pathProj := PathProjet;
if Condition('_HTMLHELP_') then pathProj:=pathProj+'htmlhelp\';
pathProj := pathProj+'html\';
// copier les fichiers js de tipue
js_file.LoadFromFile(pathSystem+'tip_form.js');
// on doit mettre à jour si nécessaire la variable contenant la page de résultat
if TopicResult<>'' then js_file.text := Replace(js_file.text,'"results.html"','"'+TopicResult+'"');
js_file.SaveToFile(PathProj+'tip_form.js');
js_file.LoadFromFile(pathSystem+'tip_search.js');
// on doit mettre à jour si nécessaire la variable contenant la page de résultat
if TopicResult<>'' then js_file.text := Replace(js_file.text,'"results.html"','"'+TopicResult+'"');
// mettre à jour aussi les css
CssTitreResults := GetParam('cssTitreResults','');
if CssTitreResults<>'' then cssTitreResults:='class="'+CssTitreREsults+'"';
js_file.text := Replace(js_file.text,'class="TITREsearchresult"',CssTitreResults);

CssResults := GetParam('cssResults','');
if CssResults<>'' then cssResults:='class="'+CssREsults+'"';
js_file.text := Replace(js_file.text,'class="CORPSsearchresult"',CssResults);


js_file.SaveToFile(PathProj+'tip_search.js');
// -- voilà les fichiers du moteur de recherche sont en place et à jour

// -- Deuxième étape on va créer la base de données qui va servir pour les recherches
// -- On va pour cela utiliser les mots clefs que vous avez définis pour vos rubriques
// -- on va aussi rajouter la première ligne des rubriques qui servira de résumé


// -- Data contient notre base de données
Data := TStringList.create;
Data.add('var s = new Array();');
// obtenir le nombre total de rubrique du projet
Nbr := GetTopicCount;

// liste pour manipuler les objets propres à chaque rubrique
ONom := TStringList.create;
Obj := TStringList.create;

// construire la liste index avec les mots clefs des rubrique
// tout d'abord on va construire la liste totale des mots clefs pour pouvoir les trier
for i:=0 to Nbr do
begin
Titre := GetTitreOf(i);
// -- la structure d'une entrée pour tipue est
// -- titre^url^résumé^mots clefs^0 ou 1
data_i := Titre+'^'+TitreToHtmlFile(Titre)+'^';

// on va maintenant rajouter le résumé
// ce résumé est soit défini par l'objet SearchResume associé à la rubrique
// si cet objet n'existe pas on prend la première ligne de la rubrique
GetObjets(i,ONom,Obj);
j := Onom.indexof('SearchResume');

if j=-1 then // l'objet associé n'existe pas
source := FirstLineTopic(Titre)

// begin
// la première ligne de la rubrique
// source := GetTextOf(GetProjet,Titre);
// on veut extraire le texte situé entre <<FIN ZONE FIXE>> et le premier retour chariot
// start := pos('<<FIN ZONE FIXE',source);)>>
<<FNT(COMMENT.--,-,-,-:// if start>0 then)>>
<<FNT(COMMENT.--,-,-,-:// begin)>>
<<FNT(COMMENT.--,-,-,-:// on empute le début)>>
<<FNT(COMMENT.--,-,-,-:// source := copy(source,start+15,length(source));)>>
<<FNT(COMMENT.--,-,-,-:// on cherche la fin de la balise)>>
<<FNT(COMMENT.--,-,-,-:// start := pos('>>',source);

// if start>0 then source := trim(copy(source,start+2,length(source)));
// end;
// maintenant on va chercher le retour chariot délimité par les caractère #13#10
// start := pos(#13+#10,source);
// if start>0 then source := trim(copy(source,1,start));
// if source='' then
// begin
// start := pos(#13+#10,source);
// if start>0 then source := trim(copy(source,1,start));
// end;
// end
else source := Obj.strings[j];
// on transforme le code source help&web en html
// on prend soin d'effacer les éventuels retour chariot #13#10
data_i:=data_i+Replace(HWToHtml(source),#13+#10,' ');

// obtenir la date de modification de la rubrique
GetDatesOf(i,DateCreation,DateModification);
cssDate := GetParam('cssDate','');
if cssDate<>'' then cssDate:=' class="'+cssDate+'"';
data_i := data_i+'<div'+CssDate+'>'+trim(DateModification)+'</div>^';

// obtenir le nombre de mots clefs pour la page i
j := GetKeysOf(i);
while j>-1 do
begin
// on ajoute les mots clefs
key := GetKey(j);
if key<>'' then data_i := data_i+key+' ';

j := j - 1;
end;
data_i := data_i+'^0'; // 0 indique que l'on affichera dans la même fenêtre
// on va remplacer les éventuels " par des ' pour éviter des problèmes d'interprétation javascript

data_i := Replace(data_i,'"',#39); // #39 = '

// on ajoute dans notre base de donnée au format tipue
Data.add('s['+IntToStr(i)+']="'+data_i+'";');
end;

// -- on sauvegarde la base
Data.SaveToFile(PathProj+'tip_data.js');

// -- ne pas oublier de libérer les listes
js_file.free;
data.free;
ONom.free;
Obj.free;


end; // fin des deux premières étapes


// -- 3ème étape on va définir le formulaire pour la recherche
writeln('<<WEB($html:+)>>');
invite := GetParam('Invite','Mots-clefs');
css := GetParam('css','');
if css<>'' then css:=' class="'+css+'"';
cssEdit := GetParam('css','');
if cssEdit<>'' then cssEdit:=' class="'+cssEdit+'"';
cssButton := GetParam('cssButton','');
if cssButton<>'' then cssButton:=' class="'+cssButton+'"';
inputSize := GetParam('InputSize','');
if inputSize<>'' then inputSize:=' size="'+inputSize+'" ';
Legende := GetParam('Legende','');

submit := GetParam('ButtonImage','');
if submit<>'' then // le bouton est une image
begin
submit := 'type="image" src="'+submit+'"'+cssbutton+' alt="'+GetParam('Button','Chercher')+'"';
end else begin // le bouton est un texte
submit := GetParam('Button','Chercher');
submit := 'type="submit"'+cssButton+' value="'+submit+'"';
end;

writeln('<form id="tip_form" name="tip_Form" onsubmit="search_form(tip_Form);return false">');
write('<div id="'+GetParam('idSearch','search')+'"'+css+'>');
if Legende<>'' then
begin
write('<label for="d">');
write(Legende);
write('</label> ');
end;
writeln('<input '+inputSize+'type="text"'+cssEdit+' name="d" id="d" accesskey="4" value="'+invite+'" onfocus="if (d_first){this.value='+#39+#39+';d_first = false;}"/> ');
writeln('<script type="text/javascript">d_first = true;document.getElementById("d").value = "'+invite+'";</script>');
writeln('<input '+submit+'/>');

//writeln('<input type="submit"'+cssButton+' value="'+GetParam('Button','Chercher')+'"/>');
write('</div></form>');
write('<<WEB($html:-)>>');

// on relie le script à la page
write('<<WEB(head:<script type="text/javascript" src="tip_form.js"></script>)>>');


Print := GetParam('Print','false')='true';

// créer, enregistrer et insérer le fichier css utilisé par notre liste

css_filename := GetParam('FilenameCss',GetProjet+'_hw.css');

// si on ne veut pas imprimer le menu il nous faut créer une feuille css pour le déclarer
if not Print then
begin
// obtenir la feuille de style impression
Data := TStringList.create;
css_filename_print := GetListCssFilename(data,'print');
// s'il n'y en a pas on en crée une
if css_filename_print='' then css_filename_print := 'print_'+css_filename;
data.free;
// mise à jour du fichier css externe print
// mais on va d'abord tester si on ne l'a pas déjà fait ;)
if GetVarInt('printsearch',0)=0 then
begin
SetVarInt('printsearch',1); // pour ne pas le recréer la prochaine fois
SetCss(css_filename_print,'#tip_form','display','none');
end;

// on rattache la feuille css à la page
// idem pour la feuille d'impression
if GetVarInt(css_filename_print+GetTitre,0)=0 then
begin
SetVarInt(css_filename_print+GetTitre,1); // pour ne le faire qu'une seule fois par page
// il existe 2 façons de lier une feuille de style mais en htmlhelp seule la première semble fonctionner...
if Condition('_HTMLHELP_') then
writeln('<<WEB(head:<link rel="stylesheet" media="print" type="text/css" href="')>>+css_filename_print+<<FNT(STRING.-,-,-,-:'" />)>>')
else
writeln('<<WEB(head:<style type="text/css" media="print">@import url( ')>>+css_filename_print+<<FNT(STRING.-,-,-,-:' );</style>)>>');
end;
end;


end;

end;
end.

Sommaire