2010-01-11 8 views
8

Deseo implementar Markdown en un sistema de comentarios Rails CMS usando una biblioteca Ruby como Maraku o Kramdown. Necesito restringir qué funciones de Markdown pueden enviar los usuarios. En este sistema, los usuarios no pueden insertar imágenes, html o realizar ninguna edición pesada, pero el énfasis y los hipervínculos están bien.¿Cómo puedo restringir la sintaxis de Markdown en Ruby?

Esencialmente, deseo crear algo similar a this Textile filter, pero para la sintaxis de Markdown.

Respuesta

8

He estado utilizando un segundo paso después de la transformación de reducción para desinfectar los datos usando sanitize gem. Basado en listas blancas y muy configurable, puede lograr fácilmente lo que busca con él.

Para ahorrar algo de tiempo, aquí está mi módulo de formateo de texto, espero que lo ayude. La regla relajada incorporada era demasiado estricta para mí.

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

Gracias, este parece ser un buen enfoque para abordar el problema. Lo probaré. –

Cuestiones relacionadas