如何在电子邮件中设置Markdown的默认样式

时间:2015-08-14 17:46:41

标签: python django templates markdown

我正在使用Django-Markdown-deux为电子邮件模板呈现HTML。

考虑以下输入:

# Heading 1
Text goes here

这将呈现为:

<h1>Heading 1</h1>
<p>Text goes here</p>

有没有办法为每个元素添加默认样式?注意 styles 需要内联,因为这是电子邮件。 E.g:

<h1 style="color:#eee;font-family:'Helvetica Neue'">Heading 1</h1>

1 个答案:

答案 0 :(得分:2)

这不是Markdown本身可以做到的事情。但是,有一些Python库将采用HTML输入(和一些CSS)并输出带有内联样式的重新格式化HTML(如these answers指出)。因此,您需要获取Markdown的输出并将其传递到其中一个库中。

当您使用Django模板过滤器(我假设过滤器而不是Deux提供的标签)将Markdown呈现为HTML时,您需要创建第二个过滤器,其中包含一个CSS内联库和将Markdown过滤器的输出传递给您的自定义过滤器。您的自定义过滤器可能看起来像这样(未经测试):

from django import template
from django.utils.safestring import mark_safe
from pynliner import Pynliner

register = template.Library()

@register.filter(name="html2email")
def pynliner_filter(value):
    css = "h1 {color:#eee; font-family:'Helvetica Neue'}"
    p = Pynliner()
    return mark_safe(p.from_string(value).with_cssString(css).run())

然后,在你的模板中,你会这样做:

{{ myvar|markdown|html2email }}

值得注意的是,我在过滤器中对CSS进行了硬编码。将其扩展为可定制的是留给读者的练习。有关创建和加载自定义模板过滤器的更具体信息,请参阅Django's docs

如果您在模板中定义了样式(在<style>标签中),那么这些样式可能需要应用于整个文档(而不仅仅是Markdown生成的部分)。请注意,内联工具将接受完整的HTML文件(在其中定义CSS)并输出具有内联样式的文件。如果这是您的情况,那么您将不需要使用自定义模板筛选器。相反,在渲染模板之后,您需要通过Django视图中的内联工具传递HTML文档。也许是这样的:

def someview(...)
    # Do your pre-template stuff here ...
    html = template.render()
    p = Pyliner()
    email_body = p.from_string(html).run()
    # Send your email here (or whatever you are doing) ...

如果没有关于您的具体情况的更多信息,上面的代码会留下很多。仅解决了该特定问题的相关位。有一个工作视图还有很多。虽然,如果你已经有一个工作视图,那么你可能只需要用上面显示的几行来替换渲染模板的行。