将原始的Markdown文本传递给Jade

25

我正在尝试使用我的第一个Node.js Express 应用程序,并且如所有程序员都知道的那样,测试新框架时应该构建的第一件事是博客! 不管怎样,我想使用Markdown编写文章,然后在视图中呈现它。我看到Jade允许在视图本身中使用过滤器来完成此操作,但我无法使其正常工作。

为了简化情况,这里有一个我所说的示例。

//app.js
res.render("article", {
    md : "Hello World!\n\n*Woo*"
});

//article.jade
section
    :markdown
        #{md}

但是,这将输出如下内容:<section><h1>{md}</h1></section>...它没有替换我传递给它的变量。

然后我尝试了这个:

//article.jade
section
    :markdown
        !{md}

最终的输出结果如下:

<section><p>Hello World!

*Woo*</p></section>

所以,现在它不能解析Markdown!

我已经通过在app.js文件中解析Markdown,然后将HTML传递给视图进行显示来使其工作,但是我不知道,这似乎有点混乱。

有没有办法将变量传递到Jade过滤器中?


你有没有找到一个好的解决方案? - Declan Cook
只是作为补充说明为什么这个不能直接使用,过滤器在编译时运行,意味着它们无法支持动态内容。如此页面上的警告所说:http://jade-lang.com/reference/filters/ - Brandon Anzaldi
4个回答

20

你可以通过从Node传递给Jade的函数来实现这一点:

var md = require("node-markdown").Markdown;

然后将其作为本地变量传递到视图中:

res.render('view', { md:md, markdownContent:data });

然后通过调用函数在jade视图中呈现:

!= md(markdownContent)

15

节点模块node-markdown已经被弃用。 marked是先进的新版本。 你可以这样尝试

var md = require('marked');

你的路由器内部

res.render('template', { md: md });

在您的Jade模板内部

div!= md(note.string)

7

我认为jade不能直接做到这一点。 一种比预渲染markdown略微更加清晰的方法是创建一个名为markdown的帮助函数,该函数接受markdown字符串并返回HTML。 然后您可以执行以下操作:

section
    != markdown(md)

当您呈现jade模板并直接使用Markdown库将Markdown语法转换为HTML时,应在locals数据中包括markdown函数。


有一个很好的解决这个问题的方法... 有人尝试过基准测试来评估影响吗? - AJ.
3
所以,他们决定实现一个专门的 :markdown 过滤器,但是没有选择提供一种将外部 Markdown 文件加载到此过滤器中的机制?ಠ_ಠ - Šime Vidas

1

如果您正在使用{{link1:Scalate的Jade支持}},您可以输入:

section
    :&markdown
        #{md}

您也可以使用以下方式导入外部文件:

section
    :&markdown
        #{include("MyFile.md")}

我不认为这个答案是正确的。我给它点了赞,因为你让我很兴奋。但是经过进一步的研究,我没有找到任何Node js Scala实现。现在那个语法很棒,我也喜欢这个想法,但我认为它的时代还没有到来... - DigitalDesignDj
这可能不是你想要的答案,因为它在JVM上使用Scala而不是node.js,但是如果你正在使用Scalate的Jade支持,那么这个答案是有效的,我的回答顶部的链接可以带你进入相关文档页面。 - sroebuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接