使用 Redcarpet 将 markdown 转换为 html,内容为 table

Convert markdown to html with a table of contents using Redcarpet

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

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

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

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

The only thing I can think of is to render two separate html objects, then combine them.

这正是您需要做的。提醒一下,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>

考虑到你无论如何都需要生成所有这些,如何"messy"分别获得 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>

当然,你不一定要使用模板,但肯定是"clean"生成文档的方式。