Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Amiga E - AmigaGuide
(Article écrit par Pierre Girard et extrait d'Amiga News - juillet/août 1996)
|
|
Salut, c'est encore moi. Ce mois-ci, nous allons étudier d'un peu plus près le format AmigaGuide. Nous utiliserons comme
support un petit programme qui permet de consulter plusieurs documents grâce à une interface AmigaGuide que nous créerons
(c'est clair, non ?). Qui ne connaît pas le format AmigaGuide. Quasiment toutes les documentations issues du domaine public
sont dans ce format qui a des avantages certains sur les fichiers ASCII.
Un document AmigaGuide est un ensemble de documents contenu dans un seul fichier. Chaque document peut être en relation avec
les autres grâce à des liens. Un document peut comporter n'importe quel nombre de liens pointant sur autant de documents.
Quand l'utilisateur clique sur un lien (matérialisé en général par un bouton), le document sur lequel pointe le lien est
affiché. C'est ce que l'on appelle l'hypertexte. L'utilisateur a donc l'avantage de pouvoir consulter la documentation dans
le sens qu'il veut, sans avoir à faire défiler tout le corps du texte.
Structure du fichier
La structure d'un fichier AmigaGuide est un peu compliquée et c'est pour cela que sont apparus divers utilitaires permettant
de réaliser simplement des documentations (comme AGW ou la création automatique d'aides dans MUIBuilder).
Tout document AmigaGuide doit absolument commencer par @database suivi du nom de la nouvelle base. Ensuite, il faut définir
un noeud principal avec @node MAIN "nom" qui prend fin avec @endnode. La structure principale étant définie, il ne reste
plus qu'à définir les différents noeuds et les liens qui vont avec. Les noeuds se définissent facilement, comme le noeud
principal (mais sans le MAIN). Par contre, les liens sont un peu plus compliqués à réaliser.
Un lien commence par @{ suivi du nom affecté au lien et de la commande à exécuter puis finit par }.
Les commandes d'action
Elle peuvent être assignées à un lien. Il en existe deux incontournables : "link" et "system".
"Link" établit un lien avec un noeud. Ainsi, si l'on écrit @{"Sommaire" link sommaire}, le fait de cliquer sur "sommaire" affichera
le texte inclu dans le noeud "@node Sommaire".
La commande "system" permet d'exécuter une commande AmigaDOS, ce qui sera bien utile pour notre programme. On peut par exemple
écrire @{"Liste des fichiers" system c:list}. Je ne ferai pas un inventaire exhaustif de toutes les commandes d'action. Sachez
cependant qu'il existe des commandes pour exécuter des macros ARexx, pour ouvrir un noeud dans une nouvelle fenêtre ou encore
pour quitter le document AmigaGuide en cours.
Les autres commandes
Elles n'ont pas forcément de rapport avec les liens mais peuvent conditionner la mise en page, la police de caractères... On peut
en souligner quelques-unes, comme @INDEX <nom/ noeud> qui spécifie le nom du noeud à appeler quand l'utilisateur
clique sur le bouton INDEX. @FONT <nom> <taille> spécifie la police de caractères à utiliser, ainsi que sa taille, alors
que @macro <nom> <commandes> définit une macro-commande qui sera utilisable à tout moment en appelant son nom.
Le programme
Si vous programmez (la preuve !) ou si vous possédez beaucoup de documentations sur votre disque dur de 600 Go, ce petit
utilitaire nommé GuideBrowser est fait pour vous ! Il permet de feuilleter tous les textes ASCII ou AmigaGuide d'un répertoire
donné. Par exemple, vous avez un répertoire plein de docs, et vous l'avez assigné en "docs:". Il vous suffit de taper GuideBrowser
docs: (ou sans argument, car docs: est le répertoire par défaut) pour que tous vos documents apparaissent sous la forme d'un
fichier AmigaGuide qu'il ne vous reste plus qu'à explorer ! Pour une fois (bon, disons deux ou trois) qu'un programme de la
rubrique Amiga E est utile, profitez-en !
Alors, comment ça marche ? C'est enfantin. Il suffit d'appliquer la méthode expliquée plus haut en créant un fichier AmigaGuide
qui sera affiché via Multiview (ou AmigaGuide). Je ne ferai pas beaucoup de commentaires sur le programme lui-même, car pour
une fois, le programme est détaillé et commenté. Cependant, voici quelques remarques. Faites bien attention en recopiant (ou
si vous changez quelque chose dans la procédure makeguide) de bien compter le nombre de caractères et de modifier le Write()
en conséquence.
Il est aussi possible de remplacer les Write(handle,10,1) par des Out(handle,10).
DEF flen,mem,handle=NIL,marque,i=0
DEF dir[120]:STRING
DEF command[120]:STRING
ENUM ER_MEM,ER_USAGE,ER_READ,ER_FILE
PROC makeguide()
IF (handle:=Open('t:GuideDOC.guide',NEWFILE))=NIL THEN Raise(ER_FILE)
-> initialisation de la database
Write(handle,'@database GuideBrowser',22)
Write(handle,10,1) -> linefeed
-> noeud principal
Write(handle,'@node main "GuideBrowser"',25)
Write(handle,10,1) -> linefeed
Write(handle,10,1) -> linefeed
REPEAT -> création du guide
Write(handle,'a{"',3) -> début d'un nouveau bouton
REPEAT -> on copie le nom du fichier
Out(handle,mem[i])
i++
UNTIL mem[i]=10 -> jusqu'au prochain linefeed
i++
-> on insère la commande à appeler + nom répertoire + nom fichier
Write(handle,'" system "dh0:system/multiview ',31)
Write(handle,dir,StrLen(dir))
Write (handle, MidStr (handle, mem, marque, i-marque), (i-marque)-1)
Write(handle,'"}',2) -> fin du bouton
Write(handle,10,1) -> linefeed
marque:=i
UNTIL i>=flen -> on recommence -> fin du fichier
Write(handle,'@endnode',8) -> fin du noeud
Write(handle,10,1) -> linefeed
Close(handle) -> on ferme le fichier
ENDPROC
PROC main() HANDLE
IF StrCmp(arg,'',1) THEN dir:='docs:' ELSE IF StrCmp(arg,'?',2) THEN Raise(ER_USAGE) ELSE dir:=arg
-> création de la commande à exécuter
StrCopy(command,'LIST >t:GuideBrowser.temp ',ALL)
StrAdd(command,dir,ALL)
StrAdd(command,' QUICK FILES NOHEAD',ALL)
Execute(command,NIL,NIL) -> on exécute
flen:=FileLength('t:Guidebrowser.temp')
IF (handle:=Open('t:Guidebrowser.temp',OLDFILE))=NIL THEN Raise(ER_READ)
mem:=New(flen+4) -> réservation mémoire
IF mem=NIL THEN Raise(ER_MEM) -> erreur mémoire ?
IF Read(handle,mem,flen)<>flen THEN Raise(ER_READ)
IF handle THEN Close(handle) -> on ferme le fichier
handle:=NIL -> réinitialisation de handle
makeguide() -> on appelle la procédure de création
Execute('Multiview t:GuideDoc.guide',NIL,NIL) -> visualisation
Dispose(mem) -> on récupère la mémoire
EXCEPT -> GESTION DES ERREURS
IF mem THEN Dispose(mem) -> on rend la mémoire ?
IF handle THEN Close(handle) -> on ferme le fichier ?
SELECT exception
CASE ER_MEM; WriteF('Pas assez de mémoire!\\n')
CASE ER_USAGE; WriteF('USAGE: GuideBrowser {dir} \\n')
CASE ER_READ; WriteF('Erreur de lecture !\\n')
CASE ER_FILE; WriteF('Erreur d''écriture !\\n')
ENDSELECT
ENDPROC
@ENDNODE
|
|