Comment allez-vous parsingr syntaxiquement Markdown?

Edit: J’ai récemment entendu parler d’un projet appelé CommonMark, qui identifie et traite correctement les ambiguïtés de la spécification Markdown d’origine. http://commonmark.org/ Il a un excellent support de la bibliothèque C #.

Vous pouvez trouver la syntaxe ici .

La source qui suit avec le téléchargement est écrite en Perl , que je n’ai aucune intention de respecter. Il est criblé d’expressions régulières et repose sur des hachages MD5 pour échapper à certains caractères. Quelque chose ne va pas à propos de ça!

Je suis sur le sharepoint coder un parsingur pour Markdown . Quelle est l’expérience avec cela?

Si vous n’avez rien de significatif à dire à propos de l’parsing de Markdown, épargnez-moi le temps. (Cela peut paraître dur, mais oui, je cherche un aperçu, pas une solution, c’est-à-dire une bibliothèque tierce).

Pour aider un peu avec les réponses, les expressions régulières sont destinées à identifier des modèles ! NE PAS parsingr une grammaire complète. Que les gens envisagent de le faire est foobar.

  • Si vous pensez à Markdown, il repose fondamentalement sur le concept de paragraphes.
  • En tant que tel, une approche raisonnable pourrait consister à scinder l’entrée en paragraphes.
  • Il existe de nombreux types de paragraphes, par exemple, en-tête, texte, liste, blockquote et code.
  • Le défi consiste donc à identifier ces paragraphes et dans quel contexte ils se produisent.

Je serai de retour avec une solution, une fois que je trouve que c’est digne d’être partagé.

La seule implémentation de markdown que je connaisse, qui utilise un parsingur réel, est le peg-markdown de Jon MacFarleane . Son parsingur est basé sur un générateur d’parsingur syntaxique d’ expression syntaxique appelé peg .


EDIT: Mauricio Fernandez a récemment publié son parsingur Simple Markup Markdown , qu’il a écrit dans le cadre de son OcsiBlog Weblog Engine. Comme l’parsingur est écrit en OCaml , il est extrêmement simple et court (268 SLOC pour l’ parsingur , 43 SLOC pour l’ émetteur HTML ), mais extrêmement rapide (20% plus rapide que la réduction (écrit en C optimisé à la main) et 600 fois plus rapide. que BlueCloth ( Ruby )), même s’il n’est même pas encore optimisé pour la performance. Comme Mauricio ne l’utilise que pour son blog, il ya quelques écarts par rapport à la spécification officielle de Markdown , mais Mauricio a créé une twig qui annule la plupart de ces modifications .

J’ai publié une nouvelle implémentation de Markdown Java basée sur l’parsingur la semaine dernière, appelée pegdown . pegdown utilise un parsingur PEG pour créer un arbre de syntaxe abstrait, qui est ensuite écrit en HTML. En tant que tel, il est assez propre et beaucoup plus facile à lire, à maintenir et à étendre qu’une approche basée sur les regex. La grammaire PEG est basée sur l’implémentation de peg-markdown de John MacFarlanes C.

Peut-être quelque chose qui vous intéresse …

Si je devais essayer d’parsingr le markdown (et son extension Markdown extra ), je pense que j’essaierais d’utiliser une machine à états et de l’parsingr un caractère à la fois, en reliant certaines structures internes représentant des bits de texte au fur et à mesure. tout est analysé, générant la sortie des objects tous liés.

En gros, je construirais un arbre de type mini-DOM en lisant le fichier d’entrée.
Pour générer une sortie, je ne ferais que parcourir l’arbre et générer du HTML ou tout autre élément (PS, LaTex, RTF, …)

Des choses qui peuvent augmenter la complexité:

  • Le fait que vous puissiez mélanger HTML et markdown, bien que la règle puisse être facile à implémenter: ignorez simplement tout ce qui se trouve entre deux balises équilibrées et affichez-le textuellement.

  • Les URL et les notes peuvent avoir leur référence au bas du texte. L’utilisation de structures de données pour les hyperliens pourrait simplement enregistrer quelque chose comme:

    [my text to a link][linkkey] results in a structure like: URLStructure: | InnerText : "my text to a link" | Key : "linkkey" | URL :  
  • Les en-têtes peuvent être définis avec un soulignement, ce qui pourrait nous obliger à utiliser une structure de données simple pour un paragraphe générique et modifier ses propriétés à mesure que nous lisons le fichier:

     ParagraphStructure: | InnerText : the current paragraph text | (beginning of line until end of line). | HeadingLevel :  or 1-4 when we can assess | that paragraph heading level, if any. 

En tout cas, juste quelques reflections.

Je suis sûr qu’il y a beaucoup de petits détails à prendre en compte et je suis sûr que les Regex pourraient être utiles pendant le processus.
Après tout, ils étaient censés traiter le texte.

J’avais probablement lu la spécification de la syntaxe suffisamment de fois pour le savoir et avoir une idée de la manière de l’parsingr.

Lire le code parsingur existant est bien sûr génial, à la fois pour voir ce qui semble être la source principale de complexité, et si des astuces astucieuses sont utilisées. L’utilisation de la sum de contrôle MD5 semble un peu bizarre, mais je n’ai pas suffisamment étudié le code pour comprendre pourquoi cela se fait. Un commentaire dans une routine appelée _EscapeSpecialChars() indique:

Nous remplaçons chacun de ces caractères par la valeur de contrôle MD5 correspondante; c’est probablement exagéré, mais cela devrait nous empêcher d’entrer en collision avec les valeurs d’échappement par accident.

Remplacer un seul caractère par un MD5 complet semble extravagant, mais peut-être que cela a vraiment du sens.

Bien sûr, il serait judicieux d’envisager de créer une “vraie” syntaxe, pour un outil tel que Flex, pour sortir de la tourbière regex.

Si Perl n’est pas votre truc, il existe des implémentations Markdown dans au moins 10 autres langues . Ils n’ont probablement pas tous une compatibilité à 100%, mais ont tendance à être assez proches.

MarkdownPapers est une autre implémentation Java dont l’parsingur est défini dans une grammaire JavaCC .

Il existe des bibliothèques disponibles dans un certain nombre de langues, notamment php, ruby, java, c #, javascript. Je suggère de regarder certaines d’entre elles pour des idées.

Cela dépend de la langue que vous souhaitez utiliser, de la meilleure façon de le mettre en œuvre, il y aura des façons idiomatiques et non idiomatiques de le faire.

Les expressions rationnelles fonctionnent en Perl, car Perl et Regex sont les meilleurs amis.

Si vous utilisez un langage de programmation qui compte plus de trois autres utilisateurs, vous devriez pouvoir trouver une bibliothèque pour l’parsingr. Un rapide Google-ing révèle des bibliothèques pour CL, Haskell, Python, JavaScript, Ruby, etc. Il est hautement improbable que vous deviez réinventer cette roue.

Si vous devez vraiment l’écrire à partir de zéro, je vous recommande d’écrire un parsingur approprié. Avec cette technique, vous ne devrez pas échapper aux choses avec les hachages MD5. (Je suis d’accord que si vous devez faire quelque chose comme ça, il est temps de reconsidérer votre conception.)

Markdown est un JAWL (juste un autre langage wiki)

Il y a beaucoup de wiki open source que vous pouvez examiner le code de l’parsingur. La plupart utilisent REGEX

Consultez le wiki vis-à-vis, possède un pipeline de formateur multi-passes intéressant, une très bonne technique – voir /core/Formatter.cs et /core/FormatterPipeline.cs

Le mieux est d’utiliser / rejoindre un projet existant, ce genre de choses est toujours beaucoup plus difficile qu’il n’y paraît

Ici vous pouvez trouver une implémentation JavaScript de Markdown. Il s’appuie également fortement sur les expressions régulières, car c’est le moyen le plus rapide et le plus simple d’parsingr le texte.

Mais cela épargne la partie MD5.

Je ne peux pas aider directement avec le codage de l’parsing, mais peut-être que ce lien peut vous aider d’une manière ou d’une autre.