L'o7aCode : interpréteur syntaxique type "wiki"

Eléphanteau du PHP | 18 Messages

02 mars 2007, 02:39

-------------

Bonjour,

Je suis actuellement en train de développer --en php/xhtml/css-- divers applications que j'intègre dans mon domaine, et l'un des outils les plus requis par ces applications est de toute évidence un programme permettant de mettre en forme le contenu : ainsi bien pour rédiger les billets et commentaires des blogs que les topics des forums etc...

Il m'a donc fallu élaborer une syntaxe qui puisse à la fois être très simple d'utilisation (pour que tout le monde sache l'employer), et très complète pour répondre à mes exigences.

J'ai ensuite créé une classe d'objet qui se charge de l'interprétation, avec comme particularité de permettre facilement la restriction des éléments à interpréter. Ainsi pour les commentaires d'un billets, seuls quelques éléments de mise en page seront autorisés, le reste n'étant pas interprété.

Bon, je pense que vous montrer une application directe de la syntaxe est la meilleur façon de la présenter. Vous trouverez donc à cette page un formulaire permettant de la tester, dont la valeur par défaut est un petit tutoriel qui passe en revu à peu près tous les points, du plus simple/basique au plus compliqué/élaboré.

Ne voyant pas comment qualifier cette syntaxe, à mi chemin entre le BBCode et les syntaxes de wikis, j'ai décidé de lui donner un nom ; N'étant pas spécialement inspiré, et comme je l'ai inventé pour mes applications web, je lui ai donné le nom de mon nom de domaine, c'est ainsi du o7aCode.

J'ai même envi de dire o7aCode 1.1, en effet, ça fait un moment que l'interpréteur est stable, et depuis je lui ai apporté quelques améliorations.

Finalement, pourquoi ce topic ? Pour partager le programme : c'est au sein d'une communauté de programmeurs et d'utilisateurs qu'il se portera le mieux ! J'ai cherché à l'écrire le plus proprement possible, mais je pense que certains passages demande à être éclaircis.

Le programme est consultable à cette adresse : http://o7acode.o7a.net/show_class.php

Voici la feuille de style associée :
.left {
	float: left;
	margin-right: 1em;
}
.right {
	float: right;
	margin-left: 1em;
}
.center {
	float: center;
}
.hidden {
	display: none;
}
.code {
	border: 1px solid #444;
	overflow: auto;
}
.code, .code code {
	font-family: monospace;
	background-color: white;
	color: black;
	font-size: 1.2em;
	margin: 0;
	padding: 0;
}
Si l'option blockcode_with_color est à 1, le programme requière GeSHi, un colorisateur syntaxique.
include ('chemin/geshi.php');
Le colorisateur peut soit utiliser du css, soit intégrer directement les styles dans les balises, ce qui est beaucoup plus lourd à charger que du css. L'option blockcode_languages_with_css liste les langages avec lesquels vous souhaitez mettre du css. Pour que ces langages soient en couleur, il faut nécessairement que vous ayez mis les css associés, faite donc votre choix parmi cette liste :

http://o7a.net/functions/fromoutside/geshi.css

Par défaut, l'option vaut array('xml','php','css'), voici donc le css associé :

Code : Tout sélectionner

/* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */ .xml .imp {font-weight: bold; color: red;} .xml .coMULTI {color: #808080; font-style: italic;} .xml .es0 {color: #000099; font-weight: bold;} .xml .br0 {color: #66cc66;} .xml .st0 {color: #ff0000;} .xml .nu0 {color: #cc66cc;} .xml .sc0 {color: #00bbdd;} .xml .sc1 {color: #ddbb00;} .xml .sc2 {color: #339933;} .xml .sc3 {color: #009900;} .xml .re0 {color: #000066;} .xml .re1 {font-weight: bold; color: black;} .xml .re2 {font-weight: bold; color: black;} /* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */ .php .imp {font-weight: bold; color: red;} .php .kw1 {color: #b1b100;} .php .kw2 {color: #000000; font-weight: bold;} .php .kw3 {color: #000066;} .php .co1 {color: #808080; font-style: italic;} .php .co2 {color: #808080; font-style: italic;} .php .coMULTI {color: #808080; font-style: italic;} .php .es0 {color: #000099; font-weight: bold;} .php .br0 {color: #66cc66;} .php .st0 {color: #ff0000;} .php .nu0 {color: #cc66cc;} .php .me1 {color: #006600;} .php .me2 {color: #006600;} .php .re0 {color: #0000ff;} .php .re1 {color: #ff0000} /* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */ .css .imp {font-weight: bold; color: red;} .css .kw1 {color: #000000; font-weight: bold;} .css .kw2 {color: #993333;} .css .co1 {color: #a1a100;} .css .coMULTI {color: #808080; font-style: italic;} .css .es0 {color: #000099; font-weight: bold;} .css .br0 {color: #66cc66;} .css .st0 {color: #ff0000;} .css .nu0 {color: #933;} .css .re0 {color: #cc00cc;} .css .re1 {color: #6666ff;} .css .re2 {color: #3333ff;} .css .re3 {color: #933;} .css .re4 {color: #933;}

J'attend donc de votre part tout commentaire, suggestion ou demande d'éclaircissement.

Merci pour votre attention.
Modifié en dernier par o7a.net le 06 mars 2007, 17:52, modifié 10 fois.

ViPHP
ViPHP | 4674 Messages

02 mars 2007, 12:14

C'est pas trop mal.

Le code final est beau.


Juste un truc : tu t'es vraiment cassé la tête pour rien pour la colorisation syntaxique de PHP.
Si tu utilises la fonction highlight_* (file or string), avec les options du php.ini pour reconfigurer les couleurs, tu aurais le même résultat. Tu peux suivre ce lien pour plus d'explications : LXXXVIII. Fonctions diverses : Tableau 163. Options de configuration.
De cette façon, aucun oublie possible :)

Et un autre petit détail, pour toutes tes regex tu utilises comme marqueur de début et fin : # (dièse). Mais vu que ton o7acode utilise le même symbole pour lui-même, tu l'échappes à chaque fois (c'est souvent qu'on voit : '#(\#(.*)\#)#' par exemple). Tu pourrais simplement utiliser un autre symbole hehe :P Par exemple /(#(.*)#)/ ou `(#(.*)#)`.
Enfin c'est pas bien grave, c'est juste pour te faciliter l'écriture.

Sinon tu pourrais aussi mettre des commentaires dans ta classe :) Ce serait plus facile à lire.


Bon travail en général je trouve :)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

02 mars 2007, 18:34

Beau travail, j'aurai un seul bémol : pas assez configurable. Il faudrait qu'il soit aisé de désactiver telle ou telle fonctionnalité ou groupe de fonctionnalités (par exemple le PHP/HTML embarqué, qu'il faut impérativement interdire dans le cas d'un rédacteur non responsable)

Eléphanteau du PHP | 18 Messages

03 mars 2007, 02:20

Ah et bien justement, je faisais remarquer qu'il était facile de désactiver ce genre de fonctionnalités.

Exemple :
$interpreteur = new o7acode();

$interpreteur->setParam('active_title',0); // désactive l'interprétation des titres
$interpreteur->setParam('blended_with_xhtml',0); // empêche l'insertion d'html

// Etc ... Chaque élément interprété peut ainsi être désactivé ...

$html = $interpreteur->transform($o7acode);
HyWaN> Merci pour le lien, je vais me pencher sur la réécriture de la partie colorisateur syntaxique. Une question cependant : est-ce que cette fonction de php colorie aussi l'xml, html etc ... ? Autrement le colorisateur syntaxique que j'ai écrit pour l'xml est complet, je n'ai donc plus qu'à l'associer avec le colorisateur du php de php.

A vrai dire, je savais qu'il y avait déjà des colorisateurs syntaxiques d'écrit, et que je n'avais qu'à me servir, mais en écrire une version soit même est un très bon exercice de manipulation des expressions régulières ! Je pense notamment à cette application des stuctures conditionnelles de regex :

Code : Tout sélectionner

'#(?:(\')?(")?(/\*)?(//)?)(.*)(?(1)\1|(?(2)\2|(?(3)\*/|(?(4)(\r|$)|so it doesn\'t exist...^^))))#msU'
... qui permet d'isoler les chaines entre quotes et les commentaires, sans ordre de priorité. Ce qui permet aux quotes de désactiver les commentaires et réciproquement.

Pour les marqueurs regex, question d'habitude, je préfère laisser toujours des dièses ... même si j'ai occasionnellement des antislash à rajouter ... je ne trouve pas ça bien gênant ; Enfin... je comprend ce que tu veux dire, en effet, changer de marqueur dans ce cas de figure permet d'améliorer la lisibilité de l'expression régulière.

Quant-aux commentaires, je vais essayer de faire un effort, notamment pour les dernières méthodes qui sont pleines de boucles et des noms de variables peu bavards ... Ca n'est pas évident de commenter de tels programmes...
Modifié en dernier par o7a.net le 06 mars 2007, 23:24, modifié 1 fois.

ViPHP
ViPHP | 4674 Messages

03 mars 2007, 11:47

Les fonctions dont on parle ne colorisent que le PHP.
Si tu veux coloriser du XML, alors fais ton analyseur perso.

C'est vrai que ça aide pour les regex, mais c'est pas si compliqué que ça les regex. Il suffit de s'y faire, et après ça a du sens (si si je vous promet ;-))

Bonne continuation.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 1511 Messages

03 mars 2007, 12:09

Pour coloriser beaucoups de codes différends, il existe GeShI.
http://geshi.sourceforge.net/

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

03 mars 2007, 12:09

Bien vu pour l'activation/désactivation, je n'avais pas tilté.

Concernant la coloration syntaxique, passé l'exercice de style certes intéressant, il serait bon d'intégrer le projet qui fait autorité en ce domaine : GeSHi

Mammouth du PHP | 1511 Messages

03 mars 2007, 12:11

Désolé naho, j'ai été plus rapide que toi :lol:

Eléphanteau du PHP | 18 Messages

03 mars 2007, 18:04

GeShi, je viens justement de l'installer ! Car le colorisateur de php ne me plait guère ...

J'ai mis à jour le post principal.

Eléphanteau du PHP | 18 Messages

05 mars 2007, 18:19

Vous n'avez jamais eu du mal à trouver comment faire vos lettres accentuées et vos c-cédilles en majuscule avec le clavier ?

Il serait pratique de pouvoir précéder une lettre que l'on veut mettre en majuscule par une syntaxe, mais laquelle ? Vous avez des suggestions ? parce que là je ne suis pas inspiré ... Il ne faut pas qu'elle gène les autres syntaxes, qu'elle soit facile à taper, et si possible qu'on puisse comprendre le lien entre son choix et son utilité...

Autrement, vous n'avez pas une idée de projet où je pourrais éventuellement proposer l'intégration du programme ? Car il n'évoluera pas s'il n'est pas utilisé ou au moins testé ...

ViPHP
ViPHP | 4674 Messages

05 mars 2007, 18:40

Sur un clavier Mac, tous les caractères sont dessus.
Même le c cédille majuscule, pareil pour les accents etc.
Pas de bol ^^

Sinon je n'ai pas d'idées pour l'instant.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

05 mars 2007, 19:17

Sous Linux quand on active le caps-lock, cela met en majuscule les caractères (normal :) pas pour windows apparemment), donc en caps-lock, le "ç" devient majuscule tout simplement (et il faut appuyer sur "Maj" pour faire un "9").
On a de même avec AltGr accès au oe de oeuf, au S long allemand, aux lettres grecs, aux différents guillemets (les "" un peu obliques, les << et >>, etc...), et tout le reste.

Windows sapu (d'ailleurs ça m'énerve là au boulot d'avoir un clavier aussi diminué bêtement à cause de ce système idiot) ? :lol:


Bon plus concrètement, une idée que je ne trouve pas idiote (c'est rare concernant mes idées :P) : tu pourrais dire que ^x met la lettre "x" en majuscule. le "^" représentant la flêche qui va vers le haut. En espérant que tu ne l'as pas déjà réquisitionné sur une autre syntaxe, je n'ai pas regardé.
Par contre la regexp risque d'être couteuse avec un preg_replace_callback.

Tiens d'ailleurs, je pense aux guillemets, tu devrais aussi peut-être avoir une option qui remplace les guillemets "droits" par des guillemets "littéraires" automatiquement ("(.*?)" => <<$1>>)


Pour l'intégration du programme : dans un CMS (un mambot-editor de Joomla ?), dans un système de blog, dans un wiki, etc... Tu peux très bien regarder les projets existant et proposer des modules ou même des hacks pour intégrer ton moteur.

Eléphanteau du PHP | 18 Messages

05 mars 2007, 21:47

À vrai dire, je n'avais jamais remarqué pour le caps-lock ! merci pour l'astuce.

Cependant tout le monde n'est pas sous linux donc la syntaxe sera utile (pour les français).

En attendant vos avis, j'ai mis /^, avec la même idée : ^ = flèche vers le haut = agrandir la lettre.

Finalement, le slash n'est pas nécessaire car il est à ma connaissance assez rare de précéder une lettre d'un ^. Dans ce dernier cas, il y a toujours le backslash --qui, comme dans beaucoup de langages, désactive l'interprétation d'un caractère--.

Pour le regex, j'ai utilisé un preg_replace avec l'option 'e' et directement la fonction mb_strtoupper (strtoupper ne met en majuscule que les caractères dits alphabétiques : [a-z]).

Pour les guillemets, c'est le navigateur qui gère leur affichage : les citations sont mises entre <quote></quote>. Par défaut FF les met entre guillemets "droits", mais ça doit être personnalisable depuis la css.

Tu parles de coût d'exécution ... c'est une chose que j'ai tendance à mettre de coté lorsqu'il s'agit de php, et je n'ai encore rien optimisé, donc si vous avez des suggestions... (je ne connais pas tellement quelle fonction est plus gourmande qu'une autre).

Eléphanteau du PHP | 18 Messages

06 mars 2007, 04:04

Quand j'ai quelque chose à prendre en note, j'ai la fâcheuse tendance de le faire non pas sur un bout de papier mais en commentaire en plein milieu du programme en cours de développement (j'ai fait un effort pour celui-ci ;)).

J'ai ainsi profiter de ce programme pour mettre au point une nouvelle application sur mon site (en version beta-alpha-gamma écrite rapidement et pas très proprement) ; Il s'agit donc d'un bloque-note utilisant l'o7aCode. Vous pouvez le tester à cette adresse : http://notepad.o7a.net/ avec les logs test/test.

Dans un avenir plus ou moins proche, je rajouterais la possibilité de rendre une note public, et je mettrais au point une interface pour ordonner les notes qui pour le moment sont "en vrac" dans une liste.

Eléphanteau du PHP | 18 Messages

08 mars 2007, 04:57

Quelques News :