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?
8
A
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
Merci, cela semble être une bonne approche pour résoudre le problème. Je vais essayer. –