Parseur markdown en PHP

Le problème exposé dans ce sujet a été résolu.

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 !

+0 -0

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"

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).

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

+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

+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.

+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
`| `

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…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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