2008-10-25 7 views
6

Il est possible d'écrire du contenu Markdown avec une syntaxe invalide. Invalide signifie que la bibliothèque BlueCloth ne parvient pas à analyser le contenu et déclenche une exception. L'assistant markdown dans Rails n'attrape aucune exception BlueCloth et, de ce fait, la page complète ne parvient pas à s'afficher (la page 500 Erreur de serveur s'affiche à la place).Comment valider Markdown?

Dans mon cas, les utilisateurs sont autorisés à écrire du contenu Markdown et à l'enregistrer dans la base de données. Si quelqu'un utilise une syntaxe incorrecte, toutes les tentatives de rendu successives de ce contenu échouent (code d'état 500 - Erreur interne du serveur).

Comment contournez-vous ce problème? Est-il possible de valider la syntaxe Markdown au niveau Model avant de sauvegarder dans la base de données?

+0

Vous voulez savoir que BlueCloth a diverses questions et qu'il ya des meilleures bibliothèques Markdown disponibles maintenant: http://tomayko.com/writings/ruby-markdown-libraries-real-cheap-for-you-two-for-price-of-one –

+0

Pourriez-vous partager votre exemple de démarque invalide? http://stackoverflow.com/questions/4751032/whats-an-example-of-some-invalid-markdown – Simon

+0

En aparté: voir aussi [Babelmark] (http://babelmark.bobtfish.net/) pour comparer contre résultats d'autres implémentations. – Arjan

Répondre

9

Vous devez écrire votre propre méthode de validation dans laquelle vous souhaitez initialiser l'objet BlueCloth et essayer d'appeler la méthode to_html en interceptant une exception. Si vous interceptez une exception, la validation échoue, sinon cela devrait fonctionner.

Dans votre modèle:

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

Je l'ai fait un peu de recherche et a décidé d'utiliser RDiscount au lieu de BlueCloth. RDiscount semble être beaucoup plus rapide et plus fiable que BlueCloth.

Il est facile d'intégrer RDiscount dans votre environnement Rails. Inclure les éléments suivants Snipped dans votre environment.rb et vous êtes prêt à aller:

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

(testé avec Rails 2.2.0)