2013-02-06 12 views
9

Chciałbym dodać prostą obniżkę do komentarzy użytkowników.niestandardowa obniżka przy wprowadzaniu przez użytkownika

Kiedy użytkownik przesyła ten komentarz:

Właśnie [karta: Black Lotus] człowieka. POW!

chciałbym go mieć wyświetlacz tak:

Właśnie Black Lotus człowieka. POW!

ale z dodatkowym kodem HTML:

I just got <span class="preview" data-card="/cards/card.id">Black Lotus</span> man. POW!

1) Spojrzałem na Redcarpet ale nie mogę dowiedzieć się, jak dodać [card:...] przecen do niego.

2) czy powinienem po prostu uruchomić wyrażenie regularne i zastąpić treść przed zapisaniem jej w DB, a następnie w tagu sanitize(ActionView::Helpers::SanitizeHelper)span przed wyświetleniem komentarza?

Odpowiedz

9

Odpowiadając na moje własne pytanie:

Definiowanie niestandardowego renderujący i nadpisanie normal_text sposób robi pracę.

class HTMLwithCards < Redcarpet::Render::HTML 
    def preprocess(full_document) 
    full_document.gsub(/\[card:(.*)\]/) do 
     card = Card.find_by_name($1) 
     if card 
     "<span class='preview' data-card='/cards/#{card.id}'>#{$1}</span>" 
     else 
     $1 
     end 
    end 
    end 
end 

a następnie można nazwać tak:

def markdown(text) 
    renderer = HTMLwithCards.new(hard_wrap: true, filter_html: true) 
    Redcarpet::Markdown.new(renderer).render(text).html_safe 
end 
+0

AFAIK trzeba użyć 'preprocess' zamiast' normal_text', więc jestem edycji tego. Jeśli wiesz o czymś, czego mi brakuje, popraw korektę. – iconoclast

+0

@iconoclast Nie będzie używać 'preprocess' w ten sposób wymaga wyłączenia' filter_html'? Myślę, że rozwiązaniem byłoby użycie 'normal_text' lub' postprocess' w zależności od tego, czy dbasz o to, czy twoja składnia zakłóci blokadę kodu –

Powiązane problemy