Un Wiki stand-alone en PHP


7 avril 2007

Présentation

J'avais besoin d'un composant Wiki pour que cette fonctionnalité puisse être inclue dans n'importe quelle application, et pourquoi pas sur ce site même ?

Mon objectif était simple :

  • Un script court et auto-suffisant
  • De la rapidité/performance
  • Une bonne résilience aux données d'entrées invalides
  • La syntaxe Wiki doit être un paramètre du code et pas hardcodée
  • Doit être extensible par le biais de plug-ins (pour de nouveaux objets) ou de templates (pour leurs présentations)

Ce Wiki devait permettre de transformer une chaîne comme :

[[toc]]
==Titre principal

Voici une formule **très importante** pour la compréhension de la suite du chapitre :

<math>I_2=\frac{x-a}{2}f^{\prime\prime}(a)+\int_{a}^x\frac{x-t}{2}f^{(3)}(t)dt</math>

C'est un résultat capital à plus d'un titre :
# Il est élégant
# Il est aisé à dériver
# Il se retient facilement

==Deuxième partie

Texte **totalement** //non-important//

en une présentation HTML (par exemple) comme suit :

Le schéma

Pour obtenir ce résultat, j'aurai pu utiliser un des nombreux wikis disponibles, mais comme d'habitude, j'ai préféré le faire moi-même.

Pour ça, j'ai mixé un lexer et un parseur récursifs dans un même code et mis tout ça sous la forme d'une machine à états, décrite par des données et non pas du code.

Le raisonnement

Le premier constat c'est que les blocs à transformer ont des marqueurs de début et de fin, un mode de concrétisation, ou une template, et des options.

Par exemple pour transformer un bloc en gras le marqueur de début est '**', identique à celui de fin avec la possibilité d'être récursif (ce qui est mis en gras peut lui-même contenir d'autres mises en forme).

Un autre exemple est l'ajoût d'un titre. Cette fois le marqueur de début est '==', celui de fin est la fin de la ligne (\"\\n\") et l'option principale est de référencer le bloc produit dans la table des matières.

Le schéma est donc très simple et j'aboutit à un code de moins de 200 lignes, en comptant les options que je décris ci-dessous.

La syntaxe

'==', '===' etc.pour titres qui seront référencés dans la table des matières.
'http://www.example.com'une adresse web se transforme automatiquement en lien.
//pour mettre en italique un bloc de texte
**pour mettre en gras un bloc de texte
[URL ALT]pour ajouter un texte \"ALT\" qui pointe vers l'URL donnée
[{URL ALT}]pour ajouter une image d'URL donnée qui a \"ALT\" comme texte alternatif
----pour une ligne horizontale (eq. <hr/>)
\\nun simple retour à la ligne (eq. <br/>)
\\n\\ndébut d'un nouveau paragraphe (eq. <p>)
`deux backtick délimitent un bloc qui ne sera pas parsé par le module
\"> \"pour mettre en exergue un bloc de texte multiligne (eq. <blockquote>)
\"- \"un élément d'une liste à puces non-numérotées
\"# \"un élément d'une liste à puces numérotées
[[refs]]indique l'emplacement des notes de bas de page (créés par [URL])
[[toc]]crée la table des matières (contenant des pointeurs vers les titres décrits plus haut)
<math>...</math>insère une formule au format TeX

Les plug-ins

Comme plug-in de base, j'ai inclus celui des formules mathématique que je décris par ailleurs.

Les deux autres sont la possibilité d'avoir des notes en bas de pages (issu des blocs utilisant la notation [...]) et une table des matières automatique, créée à partir des titres.

Applications

Je n'ai pas écrit ce code uniquement pour m'amuser mais parce que l'édition de contenu des applications que je développe à titre professionnel m'imposait d'avoir une façon simple de créer des documents sans outils préalables.

Ainsi des sites commerciaux ou professionnels (donc privés) utilisent ce composant aujourd'hui même.

Reste à faire

La gestion des renvois des notes en bas de page n'est pas élégante du tout, c'est plus du hard-code qu'autre chose.

La gestion des tableaux est à faire, c'est crucial !

Au niveau du visuel, il faut : 1- générer le flux HTML et associer des classes CSS aux éléments comme les titres etc., 2- améliorer les templates existantes (qui sont basiques) et permettre de les modifier ou d'en ajouter de nouvelles, sur le schéma de [[toc]] et [[refs]].

Il faut gérer les antislashes pour indiquer que la ligne se poursuit à la suivante (c'est une pré-passe très courte à faire au début de la fonction principale).

Améliorer les notes en bas de page pour ajouter la possibilité d'ajouter des commentaires aux liens.

Les vins en bases de données


7 avril 2007

Les vins

On décrit ici les différentes tables d'une base de données modélisant des 'vins'. Ce terme est un peu vague quand on se penche dessus : ça peut être une bouteille donnée ou un vin d'un producteur ou encore le vin d'une région.

Les utilisateurs
    Ils peuvent se connecter en administrateur sur le site et peuvent modifier le contenu, poser leurs critiques etc.

Les vins
    Un chateau-margot grand-cru de chez Rossignol de 1964 à base de Chardonnay.
    Cette table
    Type du vin : blanc, rouge, rosé

Les terroirs
    Chablis etc
    Map binaire de coordonnées GPS (c'est peut-être un peu extrème mais ça m'intéresse)

Les cépages
    Chardonnay, Pinot noir, Chablis blanc etc
    Liés à un terroir
    Petit descriptif
    Type de raisin : blanc/noir
    Q : peut-il y avoir un même cépage dans plusieurs terroirs ? A priori oui, mais je veux une vision claire...

Vins<-->Cépages
    Many2many pour indiquer les cépages entrant dans la composition d'un vin donné

Terroir<-->Cépage = Parcelle

Les années : table représentant la bouteille sur une table (enfin !)
    Lien vers un vin
    Lien vers un producteur/récoltant

Récolte
    Date de début et de fin
    Nombre d'ouvriers

Les producteurs/récoltants/coopérative
    Nom, date de la première vendange
    Si récoltant :
        cépages récoltés et/ou utilisés (il peut acheter du raisin ailleurs et mélanger avec sa propre récolte)

Adresses
    Lien vers un producteur

Les critiques
    Une critique peut être formulée par un utilisateur ou pas
Accueil1 2 3 4 5 6 7