Wikini

MotWikiAccentue

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-54-145-124-143.compute-1.amazonaws.com
Les Wikis francophones évolués semblent généralement adopter la possibilité de MotWiki accentués comme WebSémantique. Cela paraît être de bon sens puisque les accents sont des marques orthographiques qui affectent le sens : comment sinon faire la différence entre UnHommeTue et UnHommeTué ?
Les MotWiki contenant des caractères accentués donnent des URL partiellement codées ; par exemple WebSémantique donne :
Pourquoi ces différences ?
Hors la lisibilité dégradée, quelles sont les incidences de l'emploi de telles URL ?
Comment sont-elles implémentées dans les différents moteurs de Wiki ?
Je n'ai pas encore de réponse très claire à toutes ces questions. -- CharlesNepote


Pour détecter un MotWiki, WikiNi utilise l'expression rationnelle suivante :
/^[A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*$/
ce qui veut dire tous les mots :
Au passage je crois que la virgule doit être supprimée de l'expression rationnelle.

Pour gérer les MotWikiAccentue, l'expression rationnelle deviendrait :
/^[A-Z\xc0-\xdd][a-z\xe0-\xff]+[A-Z0-9\xc0-\xdd][A-Za-z0-9\xc0-\xdd\xe0-\xff]*$/
ce qui veut dire tous les mots :

Pour réaliser ce changement dans WikiNi on peut envisager d'utiliser des constantes définissant chaque groupe de lettres :

Nous aurions donc par exemple pour /formatters/wakka.php :

A priori les modifications portent sur les fichiers :

La modification ajoute quelques octets de code mais on devrait gagner légèrement en performance du fait de l'emploi des constantes.
La modification est cependant d'importance et je ne voudrais pas tout casser... Si cela vous intéresse, je propose donc de publier une version CVS que l'on teste à plusieurs chez nous avant de la passer en production.
-- CharlesNepote (CharlesNepoteASuivreEnPriorite)

Oui, je suis intérressé par cette fonctionnalité, d'accord pour une mise à jour du CVS .... -- DavidDelon

La modification proposée est très spécifique à l'ISO-8859-1 (Latin-1). On pourrait préférer utiliser ereg (les expressions régulières standard POSIX, pas celles de Perl) de la manière suivante : ereg("^[[:upper:]][[:lower:]]+[[:upper:]][[:alnum:]]*$", $thing). -- ProgFou



Pour la virgule, il suffit d'essayer un MotWiki avec une virgule (comme Abc,Def) pour se rendre compte qu'elle est effectivement de trop. -- ProgFou

Quant à l'optimisation, l'idéal aurait été d'avoir accès à la fonction regcomp (standard POSIX, compilation d'une expression régulière en vue d'utilisations multiples), mais elle n'est apparement pas présente dans PHP (au moins juqu'en PHP 4.3.0). Je ne suis pas certain du gain obtenu en découpant l'expression en constantes, hormis niveau lisibilité bien sûr. -- ProgFou

Dans tous les cas, je ne vois pas ici la conversion des accents depuis l'URL reçue et au moment de la génération des pages Wiki ; est-ce déjà implémenté (avec des urldecode/urlencode bien placés) ? -- ProgFou.


Quoi qu'on décide, je propose dans un premier temps de construire les expressions rationnelles uniquement à partir de constantes. Cela permettra :
Nous aurions donc :
Dès lors, il devient facile pour un développeur de personnaliser ces chaines. S'il veut ajouter la possibilité du souligné-bas, il lui suffira de modifier comme suit :
[En ce qui me concerne ça me va. :) -- ProgFou] [C'est mis dans le CVS. -- ProgFou 20040720]

A priori les modifications portent sur les fichiers :
-- CharlesNepote

En faisant un grep -ri '.*\[[^-+"$<].*\-.*\]' wikini (version CVS) j'obtiens aussi :
- actions/mychanges.php : !preg_match("/[A-Z,a-z]/", $firstChar)
- actions/mypages.php : !preg_match("/[A-Z,a-z]/", $firstChar)
- actions/pageindex.php : !preg_match("/[A-Z,a-z]/", $firstChar)
- actions/trail.php : preg_replace("/^([A-Za-z0-9]+\)|-)/",'',$line) et preg_replace("/^(\[\[.*\]\]|[A-Za-z0-9]+)\s*(.*)$/","$1",$line)
- handlers/page/addcomment.php : preg_match("/^Comment([0-9]+)$/", $latestComment["tag"], $matches)
Ce qui veut dire que ces constantes seront même utiles globalement.
-- ProgFou

Bon, je viens de l'implémanter dans mon Wiki, et ça a fait ressortir pas mal de problèmes... Tout d'abord il faut faire bien attention à la détection des MotWiki et certains tests actuels ont du être modifiés (dans le test lui même, je ne parle pas des remplacement de constantes). Ensuite, il a fallu ajouter des urlencode à quelques endroits (je n'ai pas encore tout vérifié, mais ça a l'air d'aller). Et pour finir, mais pas le moindre des soucis, MySQL semble faire toutes ses recherches dans le jeu de charactère dans lequel il a été lancé, en reconnaissant les caractères accentués comme étant identiques à leur version sans accent ! Du coup les pages UnHommeTue et UnHommeTué ne sont pas différenciables !! Grmph... -- ProgFou

Bon. On peu commencer par les urlencode (tu peux publier ton code ? il y a peu d'endroits je suppose ?). Le problème de MySQL me semble mineur et n'altère pas véritablement le fonctionnement.
Peux-tu nous en dire plus sur les modifications des tests actuels (code ?). Je veux bien recetter à fond tout ça. -- CharlesNepote



J'ai modifié mon propre WikiNi (privé, désolé) dès ma première installation de WikiNi, afin de créer mon utilisateur : OlivierMengu?é.
C'était avant de découvrir cette page.
Voici ce que j'ai modifié pour que toutes les lettres accentuées de ISO-8859-1 soient supportées :
wakka.php:
- else if (preg_match("/[^[:alnum:]]/", $tag))
+ // OM Majuscules : À-ÖØ-Þ Minuscules : ß-öø-ÿ Tout : À-ÖØ-öø-ÿ
+ else if (preg_match("/[^[:alnum:]À-ÖØ-öø-ÿ]/", $tag))

- function IsWikiName($text) { return preg_match("/^[A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*$/", $text); }
+ function IsWikiName($text) { return preg_match("/^[A-ZÀ-ÖØ-Þ][a-zß-öø-ÿ]+[A-Z0-9À-ÖØ-Þ][A-Za-z0-9À-ÖØ-öø-ÿ]*$/", $text); }


formatter/wakka.php:
- else if (preg_match("/^[A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*$/s", $thing))
+ else if (preg_match("/^[A-ZÀ-ÖØ-Þ][a-zß-öø-ÿ]+[A-Z0-9À-ÖØ-Þ][A-Za-z0-9À-ÖØ-öø-ÿ]*$/s", $thing))

- "\b([A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*)\b|".
+ "(?![^A-Za-z0-9À-ÖØ-öø-ÿ_])([A-ZÀ-ÖØ-Þ][a-zß-öø-ÿ]+[A-Z0-9À-ÖØ-Þ][A-Za-z0-9À-ÖØ-öø-ÿ]*)(?=[^A-Za-z0-9À-ÖØ-öø-ÿ_])|".


Notez sur la dernière ligne le remplacement de \b par des expressions un peu plus complexes, mais qui donnent la même fonctionnalité en ajoutant le support des accents. '\b' est une condition indiquant une frontière de mot : on veut que le mot Wiki ne soit pas à l'intérieur d'un mot. Les conditions (?![...]) (condition "pas un caractère alphanum qui précède") et (?=[...]) (condition "pas un caractère alphanum qui suit"). Avec l'ancienne regexp, MotWikiAccentue doit matcher (notez ce qui se passe dans éMotWikiAccentueÉ ou ÉMotWikiAccentueÉ), mais pas aMotWikiAccentue, ni AMotWikiAccentue, ni _MotWikiAccentue, ni MotWikiAccentue_. Avec la nouvelle : OlivierMengu?é matchera, mais pas éOlivierMengu?é, ni ÉOlivierMengu?é, ni _OlivierMengué ou OlivierMengu?é_.
En lisant cette page je découvre le problème de MySQL rapporté par ProgFou. Il va falloir que je teste cela.
-- OlivierMengu?é (qui espère bien pouvoir bientôt créer sa micro-page perso sur WikiNi.net avec le mot wiki qui va bien).

Pour compléter : j'ai appliqué mon patch sur la version 0.4.1rc.
Je n'ai par rencontré de problème concernant les URLs : elle ne sont pas encodées, mais comme le jeu de caractères iso-8859-1 est spécifié, cela ne pose pas de problème.
Mais pour une vraie internationalisation il faudrait envisager un jeu de caractères plus large, ce que MySQL ne semble pas supporter.
-- OlivierMengu?é

Bonjour Olivier, content de voir que tu travailles aussi sur ce sujet ! Charles et moi avions déjà discuté implémentation, comme tu peux le voir plus haut dans cette page, et j'avais déjà fait une implémentation sur WikiTeki en suivant ces idées. Je vais publier ici mon .diff (d'ici quelques jours) afin que nous puissions continuer les discussions et intégrer une version commune au tronc actuel. -- ProgFou



Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]