\chapter{Le systeme \mifayn}

\section{Introduction}
\paragraph{}
Le site du Liederbrunne est gere par un programme, qui
bien que cree specialement cree pour le Liederbrunne
repond a des besoins qui ne sont pas que ceux du Liederbrunne.
C'est pourquoi, je publie ce programme sous license GPL\cite{GPL},
qui est une license OPEN SOURCE\cite{OPENSOURCE}.
Ce programme je l'ai appele \mifayn, parce que
Mifayn Is Fitting All Your Needs.
\paragraph{}
\mifayn est un compilateur
\footnote{Un compilateur est un programme qui a partir d'un fichier
source ecrit dans un certain langage respectant une certaine
syntaxe cree un ou plusieurs fichiers ecrit dans un autre langage
suivant certaines regles.
Certaines personnes croient que les informaticiens
ecrivent encore les programmes en binaire 
(une suite de zero et de un, le seul langage que comprennent
directement la machine)
alors que ca va faire maintenant belle lurette que l'on a cree
des compilateurs qui prennent en entree un fichier
source bien plus proche de la pensee du programmeur.
}
en ligne
\footnote{En ligne signifie que le programme se trouve et s'execute
sur le serveur web, pas chez vous. Vous ne voyez que le resultat 
de la compilation. Le fait que ce programme soit en ligne
a plusieurs avantages que je vous laisse deviner.}
de pages web.
\paragraph{}
\mypic{Programme-UnDocumentCsvOuvertDansUnTableur-1}{22}
\mypic{Programme-UnDocumentCsvOuvertDansUnTableur-2}{23}
\mypic{Programme-UnDocumentCsvOuvertDansUnTableur-3}{24}
\mifayn prend en entree un fichier tableur au format csv, 
(voir figures 
\ref{Programme-UnDocumentCsvOuvertDansUnTableur-1}, 
\ref{Programme-UnDocumentCsvOuvertDansUnTableur-2} et
\ref{Programme-UnDocumentCsvOuvertDansUnTableur-3}
),

\paragraph{}
en extrait les donnees
\mypic{Page-ExtractionDesDonnees}{12}
(voir figure \ref{Page-ExtractionDesDonnees}),

\paragraph{}
puis genere les pages web html et php3 que vous avez
vues lors de notre rapide presentation
\mypic{Page-ConstructionDesPages}{13}
(voir figure \ref{Page-ConstructionDesPages}),

\section{Le fichier source}
\subsection{Decouverte}
\paragraph{}
Je vous mentirais si je vous disais que le fichier source 
etait un veritable fichier tableur.
En fait, c'est plutot un fichier dont le format 
est tellement con que j'aurais honte si
j'etais un tableur qui ne le supporte pas.
\paragraph{}
Un fichier csv est en fait un simple fichier texte
dont on a decide que le caractere fin de ligne
separait les lignes, et qu'un certain caractere
(en l'occurence pour nous le caractere tabulation)
separait les colonnes.
\paragraph{}
Ce type de document n'est pas assez riche pour etre ouvert
directement par un tableur et doit normalement faire
l'objet d'une importation
\mypic{Programme-Importation-1}{20}
(voir figure \ref{Programme-Importation-1}) 
ou vous preciserez que le caractere
qui separe les colonnes est le caractere tabulation.
\mypic{Programme-Importation-2}{21}
(voir figure \ref{Programme-Importation-2}).
Lorsque vous exporterez a nouveau en csv, veillez a ce que 
le tableur ne rajoute pas de caractere guillemets '"' pour
encadrer les cellules qui comporte des blancs.
\paragraph{}
\mypic{Programme-UnFichierCsvDansUnEditeurDeTexte}{25}
La figure \ref{Programme-UnFichierCsvDansUnEditeurDeTexte} vous 
montre le fichier source ouvert avec un simple editeur
de texte\footnote{Sous windows, si vous utilisez notepad(le bloc note)
comme editeur de texte vous risquez d'avoir un texte qui ne fais
qu'une seule ligne. Je ne veux pas rentrer dans les details
(ca vient du fait que le caractere "fin de ligne" n'est pas encoder
de la meme facon sur windows que sur les autres systemes). Si vous
utiliser wordpad, vous n'aurez plus ce probleme}. Remarquer juste
que les colonnes ne sont pas aligne d'ou l'interet d'utiliser un tableur
\footnote{Et la vous allez me dire, AHHHH d'accord, maintenant 
je comprend pourquoi on appelle un tableur un tableur. Eh oui,
meme si maintenant un tableur vous fait meme le cafe
apres avoir cree un graphique en 3D qui tourne et tout et tout ... 
a l'origine, un tableur ne servait qu'a tabuler}.

\subsection{Analyse syntaxique}
\paragraph{}
Vous trouverez en annexe le fichier de configuration,
tel qu'il est a l'heure ou je vous ecris,
dont on a abbrege les lignes trop longues pour les besoins
de formatage et mis le numero de ligne en marge pour
qu'on puisse se referer a la meme chose.
\paragraph{}
La syntaxe du fichier est tres stricte
\footnote{Volontairement. On se souvient du langage html
qui a fait l'objet de tous les dialectes car les navigateurs
pour des raisons strategiques supportaient des documents
html mal formes. Maintenant, un navigateur conforme
a 100 \% avec la norme html se voit denigre car
ils ne peut pas lire les 20\% de pages web qui sont mals formes
}.
\begin{itemize}
\item
La premiere ligne est speciale, on l'appelle l'entete.
Elle ne se conforme pas autres regles.
\item
La premiere colonne
\footnote{Au sens tableur du terme. Je pense que vous avez compris
a quoi on fait reference meme si comme moi vous editez
le fichier de configuration avec un editeur de texte}
ne peut comporter que \myverb{BEGIN}, \myverb{END} ou rien.
\item
Les lignes commencant par un diese, ne sont pas interpretes,
utilisez les a volontee pour mettre vos commentaires!
Par exemple, les lignes 8, 31 et 36 sont des commentaires.
\item
les lignes vides (mais vraiment vide, c'est a dire
un espace n'est pas considere comme vide), ne sont pas pris
en compte.
Par exemple, la ligne 35 est une ligne vide.
\item
si vous utilisez un tableur, il est interdit
de quelque maniere que ce soit d'employer le caractere
tabulation ou retour a la ligne, pour des raisons
evidentes.
\end{itemize}
Je ne vais pas vous presentez les autres regles dans la mesure
ou elles sont nombreuses mais que si vous
ne vous aventurez pas hors des sentiez battus vous
n'aurez pas de probleme.
\paragraph{}
Sachez enfin, que toute erreur de syntaxe arrete
le processus de compilation avant l'etape de creation de fichiers
\footnote{En fait, pour etre precis, le processus de creation
de l'arbre interne continue pour continuer a rapporter 
le maximum d'erreurs de syntaxe en une seule passe.
Si vous ne comprenez rien, dites-vous juste que,
putain, ce compilateur a ete reflechi.
}
Vous aurez un message vous indiquant le ou les erreurs
,le numero de ligne ou l'erreur a ete signale,
et le debut de la ligne.
.
\paragraph{}
Examinons maintenant la logique du fichier.
Si vous etes anglophobe, sachez que les mots clefs \myverb{BEGIN} 
et \myverb{END} signifient respectivement debut et fin.
Ces mots clefs embrassent ce que j'appelle un bloc.
Lorsque \mifayn rencontre \myverb{BEGIN} il sait qu'il
doit rentrer dans un nouveau contexte dont le nom
est situe dans la 2eme colonne.
Par exemple, entre les lignes 31 et 33, on se trouve dans le 
contexte \myverb{LINKS}
\footnote{\myndt{Liens}}
; \mifayn s'attend a trouver
dans la deuxieme colonne une URL
\footnote{Universal Ressource Locator, 
\myndt{localisateur universel de ressource}
, par exemple \url{http://alsace.jfe.free.fr} 
ou \url{ftp://tux.u-strasbg.fr}
},
dans la troisieme un titre pour le lien,
dans la quatrieme une description en francais,
enfin, dans la cinquieme une description du lien en alsacien.
.
\subsection{Les differents contextes \mifayn pour le Liederbrunne}

Comme je l'ai deja mentionne, la premiere colonne est reservee aux
mots clefs \myverb{BEGIN} et \myverb{END}, c'est pourquoi,
dans ce qui suit, lorsqu'on fera reference a la position,
on commencera a compter a partir de la deuxieme colonne.

\begin{contextslist}
  \begin{context}{LINKS}{
    Le contexte \myverb{LINKS}
    \footnote{\myndt{Liens}} 
    (voir ligne 30)
    est utilise pour
    genere la page des liens.
  }
    \contextarg{URL}{l'adresse du lien} 
    \contextarg{TITRE}{le titre du lien, par exemple, association ALSACE}
    \contextarg{FRANCAIS}{une description en francais du lien}
    \contextarg{ALSACIEN}{une description en alsacien}
  \end{context}

  \begin{context}{SHOP}{
    Le contexte \myverb{SHOP}
    \footnote{\myndt{Magasin}}
    (voir ligne 11) contient une partie des donnees necessaires
    a la creation des pages web commandes.
  }
    \contextarg{TYPE}{
      Type du produit, correspond a l'entree \myverb{QUOI} dans
      le bloc \myverb{PRODUCTS}
    }
    \contextarg{TITRE}{titre du cd ou de la cassette}
    \contextarg{IMAGE SUFFIXE}{Toutes les images des pochettes
      de CDs sont stockes dans un certain repertoire sur
      le serveur. Ce sont toutes des images au format GIF
      ayant une largeur et une hauteur de 100 pixels.
      Ces images ont un nom de fichiers de la forme
      suivante : img\_(IMAGE\_SUFFIXE).gif.
      Maintenant que vous savez ca, oubliez-le de nouveau.
      Lorsqu'on fait reference a une image, on ne donne
      a \mifayn que IMAGE\_SUFFIXE, il completera lui-meme.
      De meme si vous voulez uploader une image sur le serveur
      (voir figure \ref{Page-UploaderUneImageSurLeServeur}),
      vous verrez un champs IMAGE\_SUFFIXE qui fait reference a la 
      meme chose. Par convention, on utilise
      i puis un nombre a deux chiffres pour celui-ci.
      Lorsque les 99 nombres ont ete utilises, on passera a j
      \footnote{puis a k, l, m, ...}.
    }
  \end{context}

  \begin{context}{PRODUCTS}{
    Le contexte \myverb{PRODUCTS}
    \footnote{\myndt{Produits}}
    (voir ligne 39). 
    Definit les prix pour chaque ligne de produit.
    Les prix sont indiques dans la devise 
    \myverb{OTHERS/Devise/VALEUR}
    \footnote{J'introduit cette notation, cela signifie
    le champ \myverb{VALEUR} de 
    l'entree \myverb{Devise} dans le bloc \myverb{OTHERS}}
    .
  }
    \contextarg{QUOI}{Quel ligne de produit ?}
    \contextarg{PRIX}{Le prix. Si le prix n'est pas un nombre
    entier, utiliser le point comme separateur decimal
    (a l'anglaise)}
  \end{context}
  
  \begin{context}{VITRINE}{
    Le contexte \myverb{VITRINE}
    (voir ligne 45) est utilise pour genere les pages
    "nos CDs".
    Une entree dans le bloc \myverb{VITRINE} de correspond
    pas forcement a une entree dans le bloc \myverb{SHOP}
    dans la mesure qu'un album peut exister en K7 et
    en cd, il y a aura alors 2 entrees dans \myverb{SHOP}
    mais on ne presentera l'album qu'une seule fois.
  }
    \contextarg{TITRE}{Titre de l'album}
    \contextarg{FRANCAIS}{Une belle presentation en francais}
    \contextarg{ALSACIEN}{Une belle presentation en alsacien}
    \contextarg{IMAGE SUFFIXE}{voir \myverb{SHOP/IMAGE\_SUFFIXE}}
  \end{context}

  \begin{context}{OTHERS}{
    Le contexte \myverb{OTHERS}
    \footnote{\myndt{Autres}}
    (voir ligne 61) est un fourre-tout.
  }
    \contextarg{CLEF}{Le nom de l'entree}
    \contextarg{VALEUR}{La valeur de l'entree}
  \end{context}
  
\end{contextslist}
