使用Redcarpet将{markdown转换为带有目录的html

时间:2016-04-08 00:34:27

标签: ruby markdown redcarpet

我的目标是将降价文档转换为html,并在顶部显示目录。我看到Redcarpet有一个HTML_TOC选项,非常好。但是当我使用它时,它只呈现TOC,它不包括文档的其余部分。

renderer = Redcarpet::Render::HTML_TOC.new(with_toc_data: true)
markdown = Redcarpet::Markdown.new(renderer)
html = markdown.render(File.read(input_file))

如何在同一个html页面中呈现TOC和文档本身?

我唯一能想到的是渲染两个单独的html对象,然后将它们组合起来。但这有点乱,因为我必须在合并之前正确解析头部/身体标签。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

  

我唯一能想到的是渲染两个单独的html对象,然后将它们组合起来。

这正是你需要做的。作为提醒,Markdown无论如何都不会呈现完整的HTML文档。您只获得一个HTML片段。例如,一个简单的Markdown文档:

A simple Markdown document.

呈现为以下HTML片段:

<p>A simple Markdown document.</p>

但是,对于完整,有效的HTML文档,您至少需要以下内容:

<!DOCTYPE html>
<html>
  <head>
    <title>Page Title</title>
  </head>
  <body>
    <p>A simple Markdown document.</p>
  </body>
</html>

考虑到你需要生成所有这些,分别获得TOC和身体是多么“混乱”?

事实上,在更复杂的系统中,TOC可能在侧边栏或其他东西中。因此,使用模板系统,无论如何都可以将TOC单独传递给模板,然后将其放置在容器中,该容器将其与文档主体分离,以便通过CSS进行定位和样式化。

确切的模板语法可能会因您使用的工具而异,但可能会这样:

<!DOCTYPE html>
<html>
  <head>
    <title>{{ page.title }}</title>
  </head>
  <body>
    <aside>
      {{ page.toc }}
    </aside>
    <div id="body">
      {{ page.body }}
    </div>
  </body>
</html>

当然,您不必使用模板,但肯定是生成文档的“干净”方式。