9

Ich verwende Redcarpet Markdown auf meiner Rails-Website. Oft möchte ich einem Absatz, einer Tabelle oder einem anderen Element Klassen (oder andere Attribute) hinzufügen, aber es lässt dies nicht zu. Wenn ich das Markdown-Element durch HTML ersetze, muss ich auch den inneren Markdown durch HTML ersetzen, was ein Ärgernis ist.Wie Redcarpet Markdown ändern, damit es Klassen behandeln kann?

Zum Beispiel möchte ich die Klasse "Tabelle" zum Markdown-Tabellenelement hinzufügen (so dass es Bootstrap-Tabellen-Styling bekommen), aber dann muss ich die Markdown-Tabelle durch HTML ersetzen.

Was ist die einfachste Lösung? Gibt es eine einfache Möglichkeit, den Markdown so zu modifizieren, dass er mit Klassen umgehen kann? Oder gibt es eine Möglichkeit, Markdown in einem HTML-Element zuzulassen?

Beispiel aktualisieren

Ich mag eine Klasse zu einem div, Tabelle oder Absatz hinzufügen, aber immer noch Abschlag hält innerhalb des Elements. Zum Beispiel möchte ich die folgende HTML generieren:

<p class="cool"> 
    <b>Hello world</b> <a href="http://google.com">Google</a> 
</p> 

Es gibt zwei mögliche Lösungen, aber ich weiß nicht, wie sie mit Redcarpet Markdown zu tun:

  1. spezieller Abschlag Syntax Get für Klassen, zB:

    {class: cool}
    **Hello world** [Google](http://google.com)

  2. Allo w Markdown in HTML-Elementen zu arbeiten:

    <p class="cool">
    **Hello world** [Google](http://google.com)
    </p>

Derzeit bin ich solche Elemente in reinen HTML ohne Abschlag nur tun. Aber wie kann ich # 1 oder # 2 zum Arbeiten bekommen?

+0

Könnten Sie ein Beispiel für die gewünschte Syntax und erwartete Ausgabe hinzufügen? –

+0

Wenn möglich, eine Probe der Art und Weise, die Sie gerade verwenden, um etwas zu schließen. –

+0

@UriAgassi Ich habe ein Beispiel hinzugefügt. –

Antwort

2

Sie können Ihre eigenen Renderer (basierend auf Redcarpet::Render::HTML) bauen, die die Methoden außer Kraft gesetzt werden Sie im Customizing Interesse:

Benutzerdefinierte Renderer werden erstellt, indem aus einem bestehenden Renderer vererben. Die Einbau-Renderer, HTML und XHTML können als solche erweitert werden:

# create a custom renderer that allows highlighting of code blocks 
class HTMLwithPygments < Redcarpet::Render::HTML 
    def block_code(code, language) 
    Pygments.highlight(code, :lexer => language) 
    end 
end 

markdown = Redcarpet::Markdown.new(HTMLwithPygments, :fenced_code_blocks => true) 

Aber neue Renderer können auch von Grund auf neu erstellt werden (siehe lib/redcarpet/render_man.rb für eine beispielhafte Implementierung eines Manpage Renderer)

<<snip>>

die folgenden Instanzmethoden können durch die rende umgesetzt werden rer:

<<snip>>

  • Tisch (header, Körper)

<<snip>>

  • raw_html (raw_ html)

Zum Beispiel Abschlag innen roh HTML zu ermöglichen, würde ich vorschlagen, ein <markdown> Element deklariert, die Sie extrahieren können, und mache (Warnung - nicht getesteten Code voraus):

def raw_html(html) 
    html.gsub(/<markdown>(.*)<\/markdown>/) { render $1 } 
end 

Überschreiben Sie diese Methoden, um entweder die benötigte Klasse zu Ihrer Tabelle hinzuzufügen oder rekursiv render von Elementen in Ihrem Raw-HTML aufzurufen.

+0

Wie würden Sie das Rendern rekursiv z. jedes div? –

+0

Beispielcode –

+0

hinzugefügt Vielen Dank. Also sollte ich diese Methode in einer Klasse 'MarkdownMore