Wie kann ich meinen Markdown in ein HTML-Div einbinden?

73

Ich verwende MarkEd, das Markdown mit GitHub-Geschmack implementiert .

Ich habe einen funktionierenden Abschlag:

## Test heading
a paragraph.
## second heading
another paragraph

Was schafft:

<h2 id="test-heading">Test heading</h2>
<p>a paragraph.</p>
<h2 id="second-heading">second heading</h2>
<p>another paragraph</p>

Ich möchte diesen Markdown-Abschnitt in ein Div einschließen, z.

<div class="blog-post">
## Test heading
a paragraph.
## second heading
another paragraph
</div>

Dies gibt jedoch den folgenden HTML-Code zurück:

<div class="blog-post">
## Test heading
a paragraph.
## second heading
another paragraph
</div>

ZB kein Markdown, wörtlich '## Test Heading' erscheint im HTML.

Wie kann ich meinen Abschlag richtig in ein Div einwickeln?

Ich habe die folgende Problemumgehung gefunden, sie ist jedoch hässlich und keine tatsächliche Lösung:

<div class="blog-post">
<div></div>

## Test heading
a paragraph.
## second heading
another paragraph

</div>
Mikemaccana
quelle
1
Vielleicht möchten Sie Header-Abschnitte auschecken, die den Inhalt basierend auf der Überschrift in Abschnitte umschließen.
Arve0

Antworten:

73

Abschlag

Für Markdown ist dies beabsichtigt. Aus dem Inline-HTML- Abschnitt der Markdown-Referenz:

Beachten Sie, dass die Markdown-Formatierungssyntax nicht in HTML-Tags auf Blockebene verarbeitet wird. Beispielsweise können Sie in einem HTML-Block keine Markdown- Betonung verwenden .

Für Tags auf Span-Ebene ist dies jedoch ausdrücklich zulässig:

Im Gegensatz zu HTML-Tags auf Blockebene wird die Markdown-Syntax in Tags auf Span-Ebene verarbeitet.

Abhängig von Ihrem Anwendungsfall könnten Sie also mit der Verwendung von a spananstelle von a davonkommen div.

CommonMark

Wenn die von Ihnen verwendete Bibliothek CommonMark implementiert , haben Sie Glück. Beispiel 108 und 109 der Spezifikation zeigen, dass der Inhalt als Markdown analysiert wird, wenn Sie eine leere Zeile zwischen dem HTML-Block und dem Markdown-Code beibehalten:

<div>

*Emphasized* text.

</div>

sollte funktionieren, während das Folgende nicht funktionieren sollte:

<div>
*Emphasized* text.
</div>

Wiederum erkennen einige Implementierungen gemäß demselben Abschnitt in der Referenz ein zusätzliches markdown=1Attribut im HTML-Tag, um das Parsen von Markdown darin zu ermöglichen.

Obwohl es in StackOverflow noch nicht zu funktionieren scheint:

Testen von ** Markdown ** in einem Div mit rotem Hintergrund.
LucasB
quelle
2
Ich habe versucht, dasselbe mit der Markdown-Bibliothek in Python (im Pelikan verwendet) zu tun, und der Trick <div markdown = 1> hat funktioniert. Danke vielmals.
Bendtherules
Für den Datensatz: SO blockiert absichtlich Divs, Skripte und andere Inline-Elemente. Das Ändern der Farbe ist überhaupt nicht möglich (mit Ausnahme von MathJax, aber das ist hier nicht aktiviert)
Zoe
@lucas smart, hier ist dein live getesteter Code mit Leerzeilen und md = 1:<div style="background: red" markdown=1> Testing **Markdown** inside a red-background div. </div>
Timo
21

GitHub Pages unterstützt das markdown="1"Attribut zum Parsen von Markdowns in HTML-Elementen, z

<div class="tip" markdown="1">Have **fun!**</div>

Hinweis: Ab 2019/03 funktioniert dies nicht mehr auf github.com, sondern nur auf GitHub-Seiten.

Hinweis:markdown="1" Anführungszeichen wie in werden von HTML5 nicht benötigt. Wenn Sie jedoch keine Anführungszeichen ( markdown=1) verwenden, erkennt GitHub diese nicht als HTML. Außerdem ist der Support derzeit fehlerhaft. Sie erhalten wahrscheinlich eine falsche Ausgabe, wenn Ihr HTML-Element größer als ein einzelner Absatz ist. Zum Beispiel konnte ich aufgrund von Fehlern keine Markdown-Liste in ein div einbetten.

Wenn Sie sich in einer Umgebung befinden, in der markdown="1"dies nicht funktioniert, aber spanfunktioniert, können Sie es auch verwenden, <span style="display:block">damit Klassen auf Blockebene damit kompatibel sind, z

<span style="display:block" class="note">It **works!**</span>

Tipp: <span class="note"></span> ist kürzer als <div class="note" markdown="1"></div>. Wenn Sie also das CSS steuern, möchten Sie es möglicherweise lieber verwenden <span>und display: block;zu Ihrem CSS hinzufügen .

Qwertie
quelle
1
Ich habe das markdown="1"auf Github getestet . es funktioniert nicht. Link
Foad
Die spanLösung funktioniert perfekt auf GitHub. link Vielen Dank.
Foad
Nach weiteren Untersuchungen können Github und Typora dies nicht richtig rendern, Visual Studio-Code jedoch!
Foad
@Foad funktioniert auf GitHub-Seiten, aber nicht auf GitHub selbst. Beobachten Sie beispielsweise den Text **Tip:**auf dieser Seite , der als Tipp angezeigt wird : beim GHP-Rendering derselben Datei . Ich werde den Text klarstellen.
Qwertie
Ich habe auch (auf GitHub-Seiten) gefunden, dass markdown="1"dies das letzte Attribut im Tag sein muss. Zum Beispiel <div markdown="1" class="tip">Have **fun!**</div>wird nicht funktionieren.
Gabriel Luci
10

Markdown Extra wird benötigt, um Markdown-Formatierungen in HTML-Blöcken durchführen zu können. Lesen Sie die hier angegebene Dokumentation -> https://michelf.ca/projects/php-markdown/extra/

Mit Markdown Extra können Sie Text im Markdown-Format in jedes Tag auf Blockebene einfügen. Sie tun dies, indem Sie dem Tag ein Markdown-Attribut mit dem Wert 1 hinzufügen - was markdown = "1" ergibt.

Adolfo Gomez Nasol
quelle
2

Letzter Ausweg:

Bei einigen Bibliotheken kann zwischen Groß- und Kleinschreibung unterschieden werden.

Versuchen Sie <DIV>stattdessen <div>und sehen Sie, was passiert.

Markdownsharp hat diese Eigenschaft - obwohl bei StackOverflow ohnehin alle DIVs entfernt werden, erwarten Sie also nicht, dass es hier funktioniert.

Simon_Weaver
quelle
Ich würde dies löschen, wenn es nicht wahr wäre, aber für mich war dies Teil meiner Lösung - so seltsam es auch klingen mag
Simon_Weaver
2
Klingt so, als würden Sie nur eine fehlerhafte Markdown-Parser-Implementierung (Groß- und Kleinschreibung beachten) austricksen, die möglicherweise in Zukunft gepatcht wird.
StrangeWill
5
Genau das habe ich getan
Simon_Weaver
1
Dies ist die einzige, die mit hugo funktioniert hat, danke für den Tipp und hoffen wir, dass er niemals gepatcht wird !!!! (Um die Span-Tricks zu verbessern, funktioniert es, aber ich muss div verwenden, um ihm eine spezielle CSS-Klasse zu geben, die nicht mit Span funktioniert.)
Julien Colomb
1

Wenn Sie sich die Dokumente zum Erweiternhtml von Markierungen ansehen und die Renderer-Methode ändern, können Sie die Teile zwischen Tags durch analysierte Markdowns ersetzen. Ich habe keine umfangreichen Tests durchgeführt, aber es hat bei meinen ersten Versuchen funktioniert.

const marked = require('marked');
const renderer = new marked.Renderer();
renderer.html = (mixedContent) => mixedContent.replace(/[^<>]+?(?=<)/g, (match) => {
    const tokens = marked.lexer(match);
    return marked.parser(tokens);
});

Bearbeiten

Dieser neue reguläre Ausdruck stellt sicher, dass nur Markdowns mit Zeilen zwischen ihm und den HTML-Tags analysiert werden.

const marked = require('marked');
const renderer = new marked.Renderer();
renderer.html = (mixedContent) => mixedContent.replace(/\n\n[^<>]+?\n\n(?=<)/g, (match) => {
    const tokens = marked.lexer(match);
    return marked.parser(tokens);
});
RyanDay
quelle