Pregunta

  

Editar: Recientemente me enteré de un proyecto llamado CommonMark, que   Identifica correctamente y aborda las ambigüedades en el original.   Especificación de rebajas. http://commonmark.org/ Tiene una gran biblioteca de C #   apoyo.

Puede encontrar la sintaxis aquí .

La fuente que sigue con la descarga está escrita en Perl , del cual no tengo intenciones. honrando Está plagado de expresiones regulares, y se basa en los hash MD5 para escapar de ciertos caracteres. ¡Algo está mal al respecto!

Estoy a punto de codificar un analizador para Markdown . ¿Qué es la experiencia con esto?

Si no tiene nada significativo que decir sobre el análisis real de Markdown, perdóneme el tiempo. (Esto puede sonar duro, pero sí, estoy buscando información, no una solución, es decir, una biblioteca de terceros).

Para ayudar un poco con las respuestas, ¡las expresiones regulares están destinadas a identificar patrones ! NO analizar una gramática completa. Que la gente considere hacerlo es foobar.

  • Si piensas en Markdown, se basa fundamentalmente en el concepto de párrafos.
  • Como tal, un enfoque razonable podría ser dividir la entrada en párrafos.
  • Hay muchos tipos de párrafos, por ejemplo, encabezado, texto, lista, blockquote y código.
  • El desafío es, por lo tanto, identificar estos párrafos y en qué contexto ocurren.

Volveré con una solución, una vez que encuentre que vale la pena compartirla.

¿Fue útil?

Solución

La única implementación de markdown que conozco, que usa un analizador real, es Jon MacFarleane & # 8217; s peg-markdown . Su analizador se basa en un Análisis de gramática de expresión generador de analizador llamado peg .


EDITAR: Mauricio Fernandez lanzó recientemente su Analizador Simple Markup Markdown , que escribió como parte de su OcsiBlog Weblog Engine. Debido a que el analizador está escrito en OCaml , es extremadamente simple y corto (268 SLOC para el parser , 43 SLOC para el HTML emitter ), sin embargo, blazingly fast (20% más rápido que discount (escrito en C optimizado a mano) y sixhundred veces más rápido que BlueCloth ( Ruby )), a pesar de que aún no está optimizado para el rendimiento. Debido a que solo está destinado a uso interno por el mismo Mauricio para su blog, hay algunas desviaciones de Markdown oficial especificación , pero Mauricio ha creado una rama que revierte la mayoría de esos cambios .

Otros consejos

La semana pasada lancé una nueva implementación de Markdown Java basada en analizador, llamada pegdown . pegdown utiliza un analizador PEG para crear primero un árbol de sintaxis abstracto, que posteriormente se escribe en HTML. Como tal, es bastante limpio y mucho más fácil de leer, mantener y extender que un enfoque basado en expresiones regulares. La gramática PEG se basa en la implementación de John MacFarlanes C " peg-markdown " ;.

Tal vez algo de tu interés ...

Si tuviera que intentar analizar markdown (y su extensión Markdown extra ) Creo que intentaría usar una máquina de estados y analizarla un char a la vez, vinculando algunas estructuras internas que representan bits de texto a medida que avanzo, una vez que todo se analiza, generando la salida de los objetos encadenados.

Básicamente, construyo un mini árbol similar a DOM al leer el archivo de entrada. Para generar una salida, simplemente atravesaría el árbol y la salida HTML o cualquier otra cosa (PS, LaTex, RTF, ...)

Cosas que pueden aumentar la complejidad:

  • El hecho de que puede mezclar HTML y markdown, aunque la regla podría ser fácil de implementar: simplemente ignore cualquier cosa que esté entre dos etiquetas balanceadas y publíquela literalmente.

  • Las URL y las notas pueden tener su referencia en la parte inferior del texto. El uso de estructuras de datos para hipervínculos podría simplemente registrar algo como:

    [my text to a link][linkkey]
    results in a structure like: 
        URLStructure: 
        |  InnerText : "my text to a link"
        |  Key       : "linkkey"
        |  URL       : <null>
    
  • Los encabezados se pueden definir con un subrayado, que podría obligarnos a usar una estructura de datos simple para un párrafo genérico y modificar sus propiedades a medida que leemos el archivo:

    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 todos modos, solo algunos pensamientos.

Estoy seguro de que hay muchos pequeños detalles que cuidar y estoy bastante seguro de que Regexes podría ser útil durante el proceso.
Después de todo, estaban destinados a procesar texto.

Probablemente haya leído la especificación de la sintaxis suficientes veces para saberlo y tener una idea de cómo analizarlo.

La lectura del código del analizador existente es, por supuesto, brillante, tanto para ver cuál parece ser la principal fuente de complejidad, como si se utilizan trucos especiales especiales. El uso de la suma de comprobación MD5 parece un poco extraño, pero no he estudiado el código lo suficiente como para entender por qué se está haciendo. Un comentario en una rutina llamada _EscapeSpecialChars () indica:

  

Estamos reemplazando cada uno de estos caracteres con su correspondiente valor de suma de control MD5;   esto es probablemente excesivo, pero debería evitar que choquemos con el escape   valores por accidente.

Reemplazar un solo carácter por un MD5 completo parece extravagante, pero quizás realmente tenga sentido.

Por supuesto, sería inteligente considerar la creación de un " true " sintaxis, para una herramienta como Flex para salir del bog de regex.

Si Perl no es lo suyo, hay implementaciones de Markdown en al menos en otros 10 idiomas . Probablemente no todos tienen compatibilidad al 100%, pero tienden a ser bastante cercanos.

MarkdownPapers es otra implementación de Java cuyo analizador está definido en a JavaCC gramática.

Hay bibliotecas disponibles en varios idiomas, incluidos php, ruby, java, c #, javascript. Sugiero mirar algunas de estas ideas.

Depende del idioma que desee utilizar, para la mejor manera de implementarlo, habrá formas idiomáticas y no idiomáticas para hacerlo.

Los regex funcionan en perl, porque perl y regex son mejores amigos.

Si está utilizando un lenguaje de programación que tiene más de otros tres usuarios, debería poder encontrar una biblioteca para analizarla por usted. UNA Google rápido revela bibliotecas para CL, Haskell, Python, JavaScript, Ruby, y así sucesivamente. Es altamente improbable que necesites para reinventar esta rueda.

Si realmente tienes que escribirlo desde cero, te recomiendo escribir un analizador adecuado. Con esta técnica, no tendrás que escapar de las cosas. con hashes MD5. (Estoy de acuerdo en que si tienes que hacer algo como esto, es hora de reconsiderar su diseño.)

Markdown es un JAWL (solo otro idioma wiki)

Hay muchos wikis de código abierto por ahí que puedes examinar el código del analizador. La mayoría usa REGEX

Echa un vistazo a la wiki de screwturn, tiene una interesante canalización de formateadores de múltiples pasadas, una técnica muy buena: consulta /core/Formatter.cs y /core/FormatterPipeline.cs

Lo mejor es usar / unirse a un proyecto existente, este tipo de cosas siempre son mucho más difíciles de lo que parecen

Aquí puede encontrar una implementación de JavaScript de Markdown. También depende en gran medida de las expresiones regulares, ya que esta es la forma más rápida y sencilla de analizar el texto.

Pero ahorra la parte MD5.

No puedo ayudar directamente con la codificación del análisis, pero quizás este enlace pueda ayudarlo de una forma u otra.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top