如何将我的markdown包装在HTML div中?


76

我正在使用实现GitHub风格的markdown的MarkEd

我有一些工作降价:

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

哪个创建:

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

我想将markdown部分包装在div中,例如:

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

但是,这将返回以下HTML:

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

例如,没有降价,在HTML中实际上是“ ##测试标题”。

如何正确地将降价包装在div中?

我发现以下解决方法,但是它很丑陋,而不是实际的解决方法:

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

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

</div>

1
您可能想查看标题部分,该标题部分根据标题将内容包装在部分中。
arve0

Answers:


75

降价促销

对于Markdown,这是设计使然。在Markdown参考的“内联HTML”部分中:

请注意,Markdown格式语法不会在块级HTML标记中处理。例如,您不能在HTML块内使用Markdown样式的强调

但是明确允许跨度级别的标签:

与块级HTML标记不同,Markdown语法在跨度级标记内处理。

因此,根据您的用例,您可能会使用aspan代替a div

通用商标

如果您使用的库实现CommonMark,那么您很幸运。规范的示例108109显示,如果在HTML块和markdown代码之间留空行,则内容将被解析为Markdown:

<div>

*Emphasized* text.

</div>

应该起作用,而以下情况不起作用:

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

并且,再次根据参考资料中的同一部分,某些实现会识别markdown=1HTML标记上的其他属性,以实现对其内部Markdown的解析。

虽然它似乎在StackOverflow中还不起作用:

在红色背景div中测试** Markdown **。

3
我试图对python中的markdown库(在pelican中使用)执行相同的操作,并且<div markdown = 1>技巧起作用了。非常感谢。
benttherules

作为记录:SO故意阻止div,脚本和其他内联元素。根本无法更改颜色(MathJax除外,但此处未启用)
Zoe

@lucas smart,这是您的在线测试代码,包括空行和md = 1:<div style="background: red" markdown=1> Testing **Markdown** inside a red-background div. </div>
Timo

22

GitHub Pages支持markdown="1"在HTML元素内部解析markdown的属性,例如

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

注意:从2019/03开始,这不适用于github.com,仅适用于GitHub Pages。

注意:markdown="1" HTML5不需要引号,如中所示,但如果您不使用引号(markdown=1),则GitHub不会将其识别为HTML。此外,目前支持还很有限。如果您的HTML元素大于单个段落,则可能会得到错误的输出。例如,由于错误,我无法在Mark内嵌入Markdown列表。

如果您发现自己处于markdown="1"无法使用但span可以使用的环境中,则可以使用另一种选择,以<span style="display:block">使块级类与之兼容,例如

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

提示: <span class="note"></span>比短<div class="note" markdown="1"></div>,因此如果您控制CSS,则可能更喜欢使用<span>并添加display: block;到CSS中。


1
markdown="1"在github上测试了。这是行不通的。链接
Foad

span解决方案可以在GitHub上完美找到。链接非常感谢。
始于

经过进一步调查,Github和Typora无法正确渲染此图像,而Visual Studio代码可以渲染!
FOAD

@Foad它工作在GitHub上的页面,而不是在GitHub本身,如证人文字**Tip:**出现在该页面,出现的提示:同一个文件的GHP渲染。我将澄清文本。
Qwertie

我还发现(在GitHub Pages上)markdown="1"必须是标记中的最后一个属性。例如,<div markdown="1" class="tip">Have **fun!**</div>无法正常工作。
加布里埃尔·卢西


2

不得已的选择:

一些库可能区分大小写。

尝试<DIV>而不是,<div>看看会发生什么。

Markdownsharp具有此特性-尽管在StackOverflow上它们仍然剥离所有DIV,所以不要指望它在这里起作用。


如果不正确,我会删除它,但是对我来说,这是我解决方案的一部分-听起来可能很奇怪
Simon_Weaver

2
听起来您只是在欺骗错误的Markdown解析器实现(区分大小写),将来可能会对其进行修补。
StrangeWill

5
那正是我所做的
Simon_Weaver

1
这是唯一与hugo合作的产品,感谢您的提示,希望我们永远不会为它打补丁!!!(以磨练span技巧的工作原理,但我需要使用div为它提供特殊的css类,不适用于span)
Julien Colomb

1

通过查看扩展标记的文档并修改html渲染器方法,您可以执行类似的操作,以使用解析的markdown替换标记之间的部分。我尚未进行广泛的测试,但是在最初的几次尝试中都奏效了。

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);
});

编辑

这个新的正则表达式将确保仅解析其与html标记之间带有行的markdown。

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);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.