/***************************************************************/ /* */ /* helpServerLoad.PKG */ /* */ /* module HelpServer */ /* fonctions de création de l'arbre des références de l'aide */ /* */ /* Loïc Berthelot juillet 2000 */ /* */ /***************************************************************/ var hlpsLangPath = "dms/tools/help/helpserver/Lang/";; var hlpsEnglishLang = "helpserver.french.lang";; /* noeud, élément d'aide */ struct HlpsEl = [ /* référence de l'élément textuel */ ref_HlpsEl : S, /* 1 si reponse, 0 si question, */ /* 2 si pointeur vers la référence précedente */ /* 3 si texte seulement (pour les titre par ex.) */ /* 4 si espace */ type_HlpsEl : I ] mkHlpsEl;; /*******************************************************************************/ /*******************************************************************************/ /** **/ /** BODY - INTERNAL FUNCTIONS **/ /** **/ /*******************************************************************************/ /*******************************************************************************/ /* renvoie la liste passée en paramètre moins les deux derniers */ /* éléments. */ /* !!!! ne marche qu'avec un nombre d'éléments pair */ fun _remove_twoLastElements_fromList (list, accu) = if (list == nil) then nil else if ((tl list) == nil) then nil else if ((tl (tl list)) == nil) then accu else _remove_twoLastElements_fromList (tl (tl list)) (listcat accu ((hd list)::(hd (tl list))::nil));; fun _get_twoLastElements_fromList (list) = if (list == nil) then nil else if ((tl list) == nil) then nil else if ((tl(tl list)) == nil) then (hd list)::(hd (tl list))::nil else _get_twoLastElements_fromList (tl (tl list));; /*****************************************/ /* */ /* _hlpsRefToList [S [I r1]] [I r1] */ /* */ /* traduit une référence d'un élément */ /* d'aide en liste d'entiers. */ /* la liste d'entiers correspond alors */ /* aux coordonnées de l'élément dans */ /* l'arbre. */ /* */ /*****************************************/ fun _hlpsRefToList (ref, accu) = if (!strcmp ref "") then accu else ( let strfind "_" ref 0 -> nextPos in let if (nextPos == nil) then [ref ""] else [(substr ref 0 nextPos) (substr ref (nextPos+1) (strlen ref))] -> [nbStr subref] in ( let atoi nbStr -> nb in _hlpsRefToList subref (listcat accu (nb::nil)); ); );; /****************************************************/ /* */ /* _hlpsPlaceRef [ [HlpsEl r1 r1 r1 r1] S [I r1]] I */ /* */ /* place dans l'arbre un élément d'aide, */ /* contenant la référence passée en */ /* paramètre, aux coordonnées passées en */ /* deuxième arguments. */ /* */ /****************************************************/ fun _hlpsPlaceRef (root, ref, coord) = let _remove_twoLastElements_fromList coord nil -> mountCoord in ( let TREE_SearchNodeWithCoordinates root mountCoord -> mount in let _get_twoLastElements_fromList coord -> nodeCoord in let hd nodeCoord -> height /*in let hd (tl nodeCoord) -> width*/ in let 1 -> i /*in let 0 -> j*/ in let mount -> father in ( while (i < height) do ( set father = TREE_FirstChild father; set i = i +1; ); let mkHlpsEl [ref 1] -> nodeEl in let TREE_MkNode nodeEl -> node in ( /* un père contient forcément une question */ let TREE_Val father -> valFather in set valFather.type_HlpsEl = 0; /* on ajoute le nouveau noeud fils */ TREE_AddNodeToChildTail father node; ); ); );; /**********************************************************/ /* */ /* _hlpsConstrTree [ [HlpsEl r1 r1 r1 r1] [[S r1] r1]] I */ /* */ /* construit l'arbre des références de */ /* l'aide en fonction de la liste des */ /* références passée en paramètre. */ /* */ /* effets de bord sur la racine de */ /* l'arbre. */ /* */ /**********************************************************/ fun _hlpsConstrTree (root, tList) = if (tList == nil) then 1 else ( let hd (hd tList) -> fstWord in if ((fstWord == nil) || (!strcmp fstWord "")) then nil else ( /* on récupère la référence de l'élément */ let hd (hd tList) -> ref /* debug */ /* on récupère les coordonées de l'élément en fonction de la ref */ in let _hlpsRefToList ref nil -> coord /* on place la ref de l'élément aux coordonnées */ in if ((_hlpsPlaceRef root ref coord) != nil) then nil else _DLGMessageBox _channel nil "helpServerLoad._hlpsConstrTree" (strcat "Erreur d'insertion d'un node au sein de l'arbre : reférence = " ref) 0; ); _hlpsConstrTree root (tl tList); );; /*******************************************************************************/ /*******************************************************************************/ /** **/ /** BODY - CALLABLE FUNCTIONS **/ /** **/ /*******************************************************************************/ /*******************************************************************************/ /*****************************************/ /* */ /* hlpsLoadTree [] [HlpsEl r1 r1 r1 r1] */ /* */ /* charge l'arbre des références de */ /* l'aide sur la racine passée en */ /* paramètre. */ /* renvoie la racine de l'arbre */ /* */ /*****************************************/ fun hlpsLoadTree() = let _checkpack (strcat hlpsLangPath hlpsEnglishLang) -> file in if (file == nil) then nil else ( let strextr _getpack file -> tList in ( /* on récupère la référence de l'élément */ let tList -> [head tail] in let if (((hd head) == nil) || (!strcmp (hd head) "")) then [(hd tail) (tl tail)] else [head tail] -> [head tail] in let hd head -> rootRef in /* on créé le noeud root */ let TREE_MkNode (mkHlpsEl [rootRef nil]) -> root in ( _hlpsConstrTree root tail; root; ); ); );;