123 votes

Comment feriez-vous pour l’analyse des démarques ?

Vous pouvez trouver la syntaxe ici.

La source qui suit avec le téléchargement est écrit en Perl, j'ai pas l'intention d'honorer. Il est truffé d'expressions régulières, et il s'appuie sur MD5 hachages pour échapper certains caractères. Quelque chose est tout simplement faux!

Je suis en train de coder un analyseur syntaxique pour Markdown. Qu'est-ce que l'expérience avec cela?

Si vous n'avez rien de constructif à dire à propos de l'analyse de Markdown, épargnez-moi le temps. (Cela peut sembler dur, mais oui, je suis à la recherche de compréhension, pas une solution, c'est une bibliothèque tierce).

Pour aider un peu avec les réponses, les expressions régulières sont destinés à identifier des motifs! Ne PAS analyser un ensemble de grammaire. Que les gens d'envisager de le faire est de foobar.

  • Si vous pensez à ce sujet Markdown, c'est fondamentalement basée sur le concept de paragraphes.
  • En tant que tel, une approche raisonnable pourrait être de diviser l'entrée en paragraphes.
  • Il existe de nombreux types de paragraphes, par exemple, en-tête, texte, liste, blockquote, et le code.
  • L'enjeu est donc d'identifier ces paragraphes et dans quel contexte ils se produisent.

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

66voto

Jörg W Mittag Points 153275

La seule démarque de la mise en œuvre je connais, qui utilise un véritable analyseur, est Jon MacFarleane's peg-markdown. Son analyseur est basé sur une Analyse de l'Expression de la Grammaire de l'analyseur générateur appelé la jambe.


EDIT: Mauricio Fernandez a récemment publié son Simple Balisage Markdown analyseur, qu'il écrivit dans le cadre de son OcsiBlog Weblog Moteur. Parce que l'analyseur est écrit en OCaml, il est extrêmement simple et court (268 SLOC pour le parser, 43 SLOC pour le HTML de l'émetteur), et pourtant incroyablement rapide (20% plus rapide que la réduction (écrit à la main optimisée C) et sixhundred fois plus rapide que BlueCloth (Ruby)), malgré le fait qu'il n'est même pas optimisé pour des performances encore. Parce qu'il est uniquement destiné à un usage interne par Mauricio lui-même pour son blog, il y a quelques déviations de l' officiel Démarque de la spécification, mais Mauricio a créé une branche qui reprend la plupart de ces changements.

17voto

Mathias Points 131

J’ai sorti une nouveau analyseur implémentation basée sur Java Markdown la semaine dernière, appelée pegdown. pegdown utilise un analyseur PEG pour tout d’abord créer une arborescence de syntaxe abstraite, qui n’est par la suite écrit en HTML. Comme tel, il est tout à fait propre et plus facile à lire, de maintenir et d’étendre qu’une approche de regex basé. La grammaire de PEG repose sur la mise en œuvre de John MacFarlanes C « peg-démarque ».

Peut-être quelque chose de vous intéresser...

6voto

Renaud Bompuis Points 10330

Si j'étais à essayer d'analyser markdown (et son extension Markdown extra) je pense que j'essaierais d'utiliser une machine de l'etat et de l'analyser d'un char à un moment, qui relie certaines structures internes représentant des morceaux de texte que je vais le long ensuite, une fois que tout est analysé, la génération de la sortie à partir des objets de toutes les cordes ensemble.

En gros, j'aimerais construire un mini-DOM-comme un arbre que j'ai lu le fichier d'entrée.
Pour générer une sortie, je viens de parcourir l'arbre et la production de code HTML ou autre chose (PS, LaTex, RTF,...)

Les choses qui peuvent augmenter la complexité:

  • Le fait que vous pouvez mélanger HTML et markdown, bien que la règle pourrait être facile à mettre en œuvre: il suffit de les ignorer tout ce qui est entre deux équilibré tags et de sortie dans le texte.

  • Les url et les notes peuvent avoir leur référence au bas du texte. À l'aide de structures de données pour des liens hypertextes pourraient simplement d'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éfinies avec un trait de soulignement, qui pourrait nous obliger à utiliser une simple structure de données pour un générique de paragraphe et de modifier ses propriétés comme nous pouvons le lire le 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.
    

De toute façon, juste quelques pensées.

Je suis sûr qu'il ya beaucoup de petits détails à régler et je suis assez sûr que les Regexes pourrait être utile au cours du processus.
Après tout, ils étaient destinés à traiter le texte.

3voto

unwind Points 181987

J'avais sans doute lu la syntaxe de spécification assez de temps pour le savoir, et avoir une idée de la façon de l'analyser.

La lecture de l'existant de l'analyseur de code est bien sûr génial, à la fois pour voir ce qui semble être la principale source de complexité, et le cas échéant, trucs astucieux sont utilisés. L'utilisation du calcul des sommes de contrôle MD5 semble un peu bizarre, mais je n'ai pas étudié le code suffisante pour comprendre pourquoi il est fait. Un commentaire dans une routine appelée _EscapeSpecialChars() membres de:

Nous sommes le remplacement de chaque personnage avec ses correspondants somme de contrôle MD5 valeur; c'est probablement exagéré, mais il devrait nous empêcher d'entrer en collision avec la fuite les valeurs par accident.

Remplacement d'un caractère par un MD5 ne semble pas extravagant, mais peut-être cela qui fait vraiment de sens.

Bien sûr, il serait intelligent pour envisager la création d'un "vrai" de la syntaxe, pour un outil comme Flex pour sortir de la regex de la tourbière.

2voto

Ken Points 2104

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X