Question

  

Edit: J'ai récemment appris l'existence d'un projet appelé CommonMark, qui   identifie et gère correctement les ambiguïtés de l'original   Spécification de démarque. http://commonmark.org/ Il possède une excellente bibliothèque C #   soutien.

Vous pouvez trouver la syntaxe ici .

La source qui suit avec le téléchargement est écrite en Perl , ce que je n'ai pas l'intention de faire. honorant. Il est truffé d'expressions régulières et repose sur les hachages MD5 pour échapper à certains caractères. Quelque chose ne va pas à ce sujet!

Je suis sur le point de coder en dur un analyseur syntaxique pour Markdown . Quelle est l'expérience avec cela?

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

Pour vous aider un peu dans les réponses, les expressions rationnelles sont conçues pour identifier les modèles ! NE PAS analyser une grammaire entière. Ce que les gens considèrent comme ça, c'est foobar.

  • Si vous pensez à Markdown, il s’appuie fondamentalement sur le concept de paragraphe.
  • 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, citation 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 la trouverai digne d'être partagée.

Était-ce utile?

La solution

La seule implémentation de démarquage que je connaisse, qui utilise un analyseur syntaxique réel, est celle de de Jon MacFarleane . href = "https://GitHub.Com/JGM/PEG-Markdown/" rel = "noreferrer"> peg-markdown . Son analyseur est basé sur un Générateur d'analyse syntaxique d'expressions , appelé peg .

EDIT: Mauricio Fernandez a récemment publié son Analyseur Simple Markup Markdown , qu'il a écrit dans le cadre de son OcsiBlog , moteur de blogging. L’analyseur étant écrit en OCaml , il est extrêmement extrêmement simple et court (268 SLOC pour le analyseur , 43 SLOC pour le émetteur HTML ) et pourtant d'une vitesse fulgurante (20% plus rapide que discount (écrit en C optimisé à la main) et six cent fois plus rapidement que BlueCloth ( Ruby )), même s'il n'est pas encore optimisé pour la performance. Comme il est uniquement destiné à un usage interne par Mauricio pour son blog, il existe quelques écarts par rapport à la Markdown officiel. spécification , mais Mauricio a créé une branche qui annule la plupart de ces modifications .

Autres conseils

J'ai publié une nouvelle implémentation de Markdown Java basée sur un analyseur la semaine dernière, appelée pegdown . pegdown utilise un analyseur PEG pour créer d'abord un arbre de syntaxe abstraite, 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 expressions rationnelles. La grammaire PEG est basée sur l’implémentation de John MacFarlanes C "peg-markdown".

Peut-être quelque chose d'intéressant pour vous ...

Si je devais essayer d'analyser markdown (et son extension Markdown extra ) Je pense que j'essaierais d'utiliser une machine à états et de l'analyser, caractère par caractère, en reliant entre elles des structures internes représentant des bits de texte au fur et à mesure, une fois que tout sera analysé, générant ainsi le résultat des objets enchaînés.

En gros, je construirais une arborescence de type mini-DOM en lisant le fichier d'entrée.
Pour générer une sortie, il suffit de parcourir l’arborescence et d’envoyer du HTML ou autre chose (PS, LaTex, RTF, ...)

Éléments pouvant augmenter la complexité:

  • Le fait que vous puissiez mélanger HTML et markdown, bien que la règle puisse être facile à mettre en œuvre: ignorez 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 en bas du texte. L'utilisation de structures de données pour les liens hypertextes 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       : <null>
    
  • Les en-têtes peuvent être définis avec un soulignement, ce qui pourrait nous obliger à utiliser une simple structure de données pour un paragraphe générique et à modifier ses propriétés lors de la lecture du fichier:

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

Quoi qu'il en soit, juste quelques réflexions.

Je suis sûr qu'il y a beaucoup de petits détails à régler et je suis à peu près sûr que les regexes pourraient devenir utiles pendant le processus.
Après tout, ils étaient censés traiter du texte.

Je lirais probablement la spécification de syntaxe suffisamment de fois pour la connaître et comprendre comment l’analyser.

La lecture du code de l’analyseur existant est bien sûr brillante, à la fois pour voir ce qui semble être la source principale de complexité et si des astuces astucieuses sont utilisées. L'utilisation de MD5 checksumming semble un peu bizarre, mais je n'ai pas suffisamment étudié le code pour comprendre pourquoi il est utilisé. Un commentaire dans une routine appelée _EscapeSpecialChars () indique:

  

Nous remplaçons chacun de ces caractères par la valeur de somme de contrôle MD5 correspondante;   c'est probablement exagéré, mais cela devrait nous éviter de nous heurter à l'évasion   valeurs accidentelles.

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

Bien sûr, il serait judicieux d’envisager de créer un "vrai". syntaxe, pour un outil tel que Flex afin de sortir du marasme des expressions régulières.

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

MarkdownPapers est une autre implémentation Java dont l'analyseur est défini dans un grammaire JavaCC .

Il existe des bibliothèques disponibles dans un certain nombre de langues, notamment php, ruby, java, c #, javascript. Je suggérerais de regarder certaines de ces idées.

Cela dépend de la langue que vous souhaitez utiliser. Pour la meilleure façon de la 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 comportant plus de trois autres utilisateurs, vous devriez pouvoir trouver une bibliothèque pour l’analyser à votre place. UNE Google-ing rapide révèle les bibliothèques pour CL, Haskell, Python, JavaScript, Ruby, etc. Il est très peu probable que vous ayez besoin pour réinventer cette roue.

Si vous devez vraiment l'écrire à partir de zéro, je vous recommande d'écrire un analyseur approprié. Avec cette technique, vous ne devrez pas échapper à des choses avec hachage MD5. (Je conviens 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 existe de nombreux wiki open source sur lesquels vous pouvez examiner le code de l'analyseur. La plupart utilisent REGEX

Découvrez le wiki qui tourne, il a un pipeline de formatage intéressant, une technique très agréable - 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 parait

Vous trouverez ici une implémentation JavaScript de Markdown. Il s’appuie également beaucoup sur les expressions régulières, car c’est le moyen le plus rapide et le plus simple d’analyser le texte.

Mais cela épargne la partie MD5.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top