python - 自定义 Markdown 解析

标签 python html ruby markdown html-email

<分区>

我每周为我的大学写一封摘要电子邮件,电子邮件格式如下:

############################
#          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&#39;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)

从那里开始,我认为您会拥有所需的东西,但显然您首先需要以更有条理的方式将它们缝合在一起 :-)

关于python - 自定义 Markdown 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347791/

相关文章:

php - 如何将表单数据存储在 MULTIPAGE 表单中?

html - 如何将这些链接之一变成下拉菜单?

html - 全宽显示子 div

ruby-on-rails - 如何删除 HTML 节点之间的空白?

ruby-on-rails - RefineryCMS I18n 翻译默认前端区域设置的问题

python - Cassandra 崩溃了,不知道出了什么问题

python - 如何在数据框中的同一行中添加以数字开头的字符串?

python - tkinter 和图像。使图像适合标签

java - 利用现有数据库的应用程序的 Web 框架?

python - 模板语法错误 : 'if' statement improperly formatted