2010-01-11 9 views
8

Je souhaite implémenter Markdown dans un système de commentaires CMS Rails en utilisant une bibliothèque Ruby telle que Maraku ou Kramdown. J'ai besoin de restreindre quelles fonctionnalités de Markdown les utilisateurs peuvent soumettre. Dans ce système, les utilisateurs ne sont pas autorisés à insérer des images, html, ou effectuer des modifications lourdes, mais l'accent et les hyperliens sont corrects. Essentiellement, je souhaite créer quelque chose de similaire à this Textile filter, mais pour la syntaxe Markdown.Comment puis-je restreindre la syntaxe Markdown dans Ruby?

Répondre

8

J'ai utilisé une deuxième étape après la transformation de démarque pour assainir les données en utilisant le sanitize gem. Sa liste blanche basée et très configurable, vous pouvez facilement réaliser ce que vous recherchez. Pour vous faire gagner du temps, voici mon module de formatage de texte, j'espère que cela vous sera utile. La règle détendue intégrée était un peu trop stricte pour moi.

module TextFormatter 
    require 'sanitize' 

    module Formatters 
    MARKDOWN = 1 
    TEXTILE = 2 
    end 

    RELAXED = { 
     :elements => [ 
     'a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 
     'colgroup', 'dd', 'dl', 'dt', 'em', 'i', 'img', 'li', 'ol', 'p', 'pre', 
     'q', 'small', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 
     'tfoot', 'th', 'thead', 'tr', 'u', 'ul', 'del', 'ins', 'h1', 'h2', 'h3', 'h4', 'h5', 'h5', 'hr', 'kbd'], 

     :attributes => { 
     'a'   => ['href', 'title'], 
     'blockquote' => ['cite'], 
     'col'  => ['span', 'width'], 
     'colgroup' => ['span', 'width'], 
     'img'  => ['align', 'alt', 'height', 'src', 'title', 'width'], 
     'ol'   => ['start', 'type'], 
     'q'   => ['cite'], 
     'table'  => ['summary', 'width'], 
     'td'   => ['abbr', 'axis', 'colspan', 'rowspan', 'width'], 
     'th'   => ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 
         'width'], 
     'ul'   => ['type'] 
     }, 

     :protocols => { 
     'a'   => {'href' => ['ftp', 'http', 'https', 'mailto', 
            :relative]}, 
     'blockquote' => {'cite' => ['http', 'https', :relative]}, 
     'img'  => {'src' => ['http', 'https', :relative]}, 
     'q'   => {'cite' => ['http', 'https', :relative]} 
     } 
    } 



    def self.to_html(text, formatter = Formatters::MARKDOWN) 
    return "" unless text 

    html = case formatter 
      when Formatters::MARKDOWN then 
      RDiscount.new(text, :smart).to_html 
      when Formatters::TEXTILE then 
      RedCloth.new(text).to_html 
      end 

    Sanitize.clean(html, RELAXED) 
    end 
end 
+0

Merci, cela semble être une bonne approche pour résoudre le problème. Je vais essayer. –