2008-10-25 28 views
6

Es posible escribir contenido Markdown con sintaxis no válida. Inválido significa que la biblioteca BlueCloth no puede analizar el contenido y arroja una excepción. El ayudante markdown en Rails no capta ninguna excepción de BlueCloth y, debido a eso, la página completa no se procesa (en su lugar, se genera la página 500 Server Error).¿Cómo validar Markdown?

En mi caso, los usuarios pueden escribir el contenido de marcado y guardarlo en la base de datos. Si alguien utilizó una sintaxis inválida, todos los intentos sucesivos de representación de ese contenido fallan (Código de estado 500 - Error interno del servidor).

¿Cómo se soluciona este problema? ¿Es posible validar la sintaxis de Markdown en el nivel de modelo antes de guardarla en la base de datos?

+0

Es posible que desee saber que BlueCloth tiene varios problemas y que hay mejores bibliotecas de rebajas disponibles ahora: http://tomayko.com/writings/ruby-markdown-libraries-real-cheap-for-you-two-for-price-of-one –

+0

¿Podría compartir su ejemplo de rebajas no válidas? http://stackoverflow.com/questions/4751032/whats-an-example-of-some-invalid-markdown – Simon

+0

Como nota adicional: ver también [Babelmark] (http://babelmark.bobtfish.net/) para comparar resultados de otras implementaciones. – Arjan

Respuesta

9

Debería escribir su propio método de validación en el que inicializaría el objeto BlueCloth e intentar llamar al método to_html detectando cualquier excepción. Si detecta una excepción, la validación falla; de lo contrario, debería estar bien.

En su modelo:

protected: 

def validate 
    bc = BlueCloth.new(your_markdown_string_attribute) 
    begin 
    bc.to_html 
    rescue 
    errors.add(:your_markdown_string_attribute, 'has invalid markdown syntax') 
    end 
end 
1

que he hecho un poco de investigación y decidió utilizar RDiscount en lugar de BlueCloth. RDiscount parece ser mucho más rápido y más confiable que BlueCloth.

Es fácil integrar RDiscount en el entorno de Rails. Incluyen los siguientes cortó en su environment.rb y ya está listo para ir:

begin 
    require "rdiscount" 
    BlueCloth = RDiscount 
rescue LoadError 
    # BlueCloth is still the our fallback, 
    # if RDiscount is not available 
    require 'bluecloth' 
end 

(probado con rieles 2.2.0)