Parseur markdown en PHP

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet

Bonjour,

Suite à ce topic, je me suis mis à coder un petit gestionnaire de doc en PHP/markdown. J'utilise Parsedown comme parseur, avec son extension "extra". Il couvre une très grande partie de la syntaxe markdown, cependant certaines (implémentées ici sur ZdS) sont bien utiles.

Pour les ->centre<-, ->droite->, ^exp^, ~ind~, ||touche||, je vais faire ça à coup de regex. Là ou je bloque un peu, c'est pour parser les blocs de type :

1
2
[[i]]
| une information

en

<div class="bloc-information">...</div> (sachant que la conversion en markdown du contenu du bloc se fera en aval par parsedown.

Merci d'éclairer ma lanterne !

Édité par elyppire

Llama ◦ FAQ PHPTuto WAMP

+0 -0
Staff

Tu n'aurais pas oublier de poser ta question ?

BTW, lors de mes ballade dans le monde Markdown, j'ai toujours vu citer multimarkdown comme markdown de reference dans le monde PHP (mais j'ai jamais testé)

+0 -0
Staff

en terme de regex, même si je n'aime pas trop la méthode, je dirais:

tu as besoin de :

  1. [[i]]\n
  2. (| un nombre indéfinis de caractères\n){un nombre indéfini de fois}
  3. \n

Donc je verrais : #[[i|information]]\n(\|(.*)\n)+\n#uUS

Édité par artragis

+0 -0
Staff

Perso dans nos extensions c'est fortement lié au module d'extension de Python-Markdown. En gros je parse l'entete puis les lignes suivantes tant quels commencent par un "|" (on me fournit directement "la suite" découpé en ligne) puis je demande de relancer le parseur sur le contenu à l'interieur.

Le markdown n'est pas super adapté à un traitement "uniquement à coup de regex"

+2 -0
Staff

Tu peux éventuellement voir du côté de ce code sur GitHub : c'est du JS mais la regex fonctionnait pas trop mal pour les tutoriels ;)

Après je plussoie Kje : les regex c'est vite le bordel pour du MD…

Sinon tu peux toujours utiliser le parseur Python de ZdS depuis PHP… :-°

Édité par viki53

Staff
Auteur du sujet

Enfin, moi, je me fiche des regex, ce qui m'importe, c'est le rendu final. Si vous avez des idées autre que regex, à la bonne heure :)

Je veux juste pouvoir parser deux trois codes custom que la lib' parsedown ne fait pas.

Édité par elyppire

Llama ◦ FAQ PHPTuto WAMP

+0 -0
Staff

Tout dépend comment parsedown fonctionne en fait. Dans le notre, j'ai mélangé regex et code plus classique en fonction du contexte pour choisir ce qui semblait être le plus surs. Mais comme je le disais, c'est fortement lié au comportement interne du parseur. A moins d'aller lire le code de parsedown, ça va etre difficile de te répondre (et honnetement j'ai un poil la flemme de regarder).

+0 -0

Salut !

En reprenant ce qu'a proposé artragis, je proposerais ceci, en tenant compte des différences de retours à la ligne (et là, je ne considère pas le vieux Mac, pour lequel on pourrait remplacer \r?\n par \R) : #\[\[i(nformation)?\]\]\r?\n(\|(.*)\r?\n)+\r?\n#uUS

Edit

En fait, le souci ne viendrait pas du flag U qui fait que ça ne capture que la première ligne ?
#\[\[i(nformation)?\]\]\R(\|(.*\R))+\R#uS fonctionne ?

Edit 2

Oubli d'une parenthèse dans la dernière mouture

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Staff
Auteur du sujet

Ce qui est fou, c'est que syntaxiquement, ca semble correct, mais dans la pratique, ça ne fonctionne pas. A noter que dans mon preg_replace, j'ai essayé \$2 et \$3.

Mon code de test est :

1
2
3
4
5
6
[[i]]
| un
| deux
| trois

Texte pour bien avoir un saut de ligne avant.

Edit : non plus :(

Édité par elyppire

Llama ◦ FAQ PHPTuto WAMP

+0 -0

Si tu veux un markdown PHP a peu plus à la sauce python-markdown, donc qui gère une sorte de véritable parseurs + blocs et facile à étendre, je te conseille de regarder Ciconia. Il est un peu plus lent que les solutions habituelles (regarde son benchmark) mais ça devrait le faire, en t'inspirant de comment il parse les citations

Édité par Talus

"Meh." Outil de diff PHP : Totem

+0 -0

Bon, j'ai celle-ci qui me paraît prometteuse : '`\[\[i(nformation)?\]\]\R((\| ?(.*)\R?)+)`uS

Edit

Ah, je pense que je comprends le souci, ça n'est remplacé que par la dernière ligne. Il faudra probablement utiliser celle ci-dessus (re-modifiée) pour d'abord récupérer avec les pipes en début de ligne, puis les enlever.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Staff
Auteur du sujet

J'ai vu, merci. Mais bon, je vais taper simple. Au moins, j'encapsule juste mon bloc dans une div spéciale, et le markdown à l'intérieur, c'est ma lib qui le génère.

J'ai peut d'avoir à faire une usine à gaz, alors que c'est justement pas mon but.

Llama ◦ FAQ PHPTuto WAMP

+0 -0

Pourquoi ne pas simplement explode() le texte ? C'est ensuite facile de tester si les lignes commencent par |, supprimer ces charactères, etc.

En gros je parse l'entete puis les lignes suivantes tant quels commencent par un "|" (on me fournit directement "la suite" découpé en ligne) puis je demande de relancer le parseur sur le contenu à l'interieur.

Tiens, pas le droit aux espaces dans du code inline ?

1
`| `

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+0 -0

Je me suis subitement demandé si preg_match_all(), puis ma regex, ne te permettrait pas de faire quelque chose ? Dans la mesure où tu récupérerais un tableau multidimensionnel avec tout ce qui a été capturé par masque…

Le plus ennuyeux resterait de savoir quand on passe à un autre bloc, en fait…

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte