我每周为我的大学写一封摘要电子邮件,电子邮件格式如下:
############################
# HEADER #
# ======================== #
# IMAGE | Title #
# | Description #
# ------------------------ #
# ... #
# ------------------------ #
# IMAGE | Title #
# | Description #
# ======================== #
# FOOTER #
############################
目前这些都是每周通过复制-粘贴-调整从一个可怕的 HTML 模板构建的。
我经常使用 Markdown 写博客,我想知道是否有某种方法可以轻松地使用它来解析包含摘要主要详细信息的文件以生成上述输出?
“摘要电子邮件”(包括其他字段)的基本结构是
- header
- main title
- subtitle
- date
- entry
- image
- title
- body
...
- entry
- image
- title
- body
- footer text
我想以上面的格式呈现它。
我有一些初步的想法,希望能在以下方面提供一些意见:
- YAML + Ruby/Python 中的自定义处理器 - 那么 markdown 格式的条目正文将如何工作?
- Redcarpet似乎允许自定义呈现,但我可以将其处理成上面的格式吗?
- Python Markdown - 我看到一些帖子谈论使用 python-markdown 扩展 markdown,但我不确定它在这里的适用性如何?
毫无疑问,我忽略了一些非常简单的实现。
** 更新 **
对于这个问题的含糊不清,我深表歉意。我真的无法对我正在尝试做的事情进行优雅的描述:(
最后,我使用了一个包含多行字符串的 YAML 文件,后来使用 Maruku 将其解析为 Markdown。
对于那些对其工作原理和最终结果感兴趣的人,该项目位于 github here 上。
这听起来像是 Jekyll 的一个很好的用例:https://github.com/mojombo/jekyll
或者,您可以使用任何模板系统(ERb、Haml 等)+ 任何 Markdown 系统(我喜欢 RedCarpet),然后使用一个简单的 Ruby 对象从 Markdown 文件中提取 YAML frontmatter:
class Page
def initialize(source_file)
self.filename = File.basename(source_file)
read_page(source_file)
end
attr_reader :filename, :metadata, :contents
private
attr_writer :filename, :metadata, :contents
def read_page(filename)
self.contents = File.read(filename)
begin
if (md = contents.match(/^(?<headers>---\s*\n.*?\n?)^(---\s*$\n?)/m))
self.contents = md.post_match
self.metadata = YAML.load(md[:headers])
end
rescue => e
puts "YAML Exception reading #{filename}: #{e.message}"
end
end
end
使用此对象,假设您有一个名为 first_post.md
的文件,其中包含以下内容:
---
title: First Post
category: essays
---
# My First Post!
It's *really* awesome
您可以使用 Page
对象按以下方式处理它:
page = Page.new("first_post.md")
p page.metadata[:title] #=> "First Post"
p page.metadata[:category] #=> "essays"
p page.contents #=> "# My First Post!\n\nIt's *really* awesome"
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
formatted_content = markdown.render(page.contents)
#=> "<h1>My First Post!</h1>\n\n<p>It's <em>really</em> awesome</p>\n"
从这里开始,您需要做的就是连接模板引擎。如果您已经在使用 HTML 模板,ERb may be easiest .
你有一个类似 layout.erb
的模板,它是一个混合了一些 Ruby 的 HTML 文件:
<html>
<body>
<h1><%= page.metadata[:title] %></h1>
<%= formatted_content %>
</body>
<html>
然后您将执行以下操作:
puts ERB.new(File.read("layout.erb")).result(binding)
从那里开始,我认为您会拥有所需的东西,但显然您首先需要以更有条理的方式将它们缝合在一起 :-)