3

我按照本教程使用 hakyll 创建了一个基本的静态网页。它包括许多从目录中的 markdown 呈现的页面posts,例如2015-08-12-spqr.markdown.

我更喜欢 asciidoc 而不是 markdown,并尝试将 asciidoc 添加2018-01-23_adoc-user-manual.asciidocpost目录中。但是,hakyll尝试编译页面时会引发错误:

Initialising...
  Creating store...
  Creating provider...
  Running rules...
Checking for out-of-date items
Compiling
  updated templates/default.html
  updated about.rst
  updated templates/post.html
  updated posts/2015-08-12-spqr.markdown
  updated posts/2015-10-07-rosa-rosa-rosam.markdown
  updated posts/2015-11-28-carpe-diem.markdown
  updated posts/2015-12-07-tu-quoque.markdown
  [ERROR] Hakyll.Web.readPandocWith: I don't know how to read a file of the type Binary for: posts/2018-01-23_adoc-user-manual.asciidoc
CallStack (from HasCallStack):
  error, called at lib/Hakyll/Web/Pandoc.hs:66:31 in hakyll-4.12.5.0-8ZITvFN5YREEKv6B76SCAd:Hakyll.Web.Pandoc

这是pandocCompiler无法处理的问题asciidoc吗?可以asciidochakyll吗?

4

1 回答 1

9

当前的 Pandoc 可以编写 Asciidoc 但无法读取它:Issue

此外,似乎没有用 Haskell 编写的 Asciidoc 解析器,因此没有纯 Haskell 解决方案。

然而,Hakyll 有unixFilter,它可以使用任何从标准输入输入并输出到标准输出的命令。因此,您可以调用asciidoctor命令来转换.asciidoc文件。

这是步骤:

1.安装asciidoctor

Ubuntu

$ apt-get install asciidoctor

软呢帽

$ dnf install asciidoctor

Arch Linux

$ pacman -S asciidoctor

红宝石

$ gem install asciidoctor

2. 定义 pandocCompilerWithAsciidoctor

将以下代码添加到site.hs

pandocCompilerWithAsciidoctor :: Compiler (Item String)
pandocCompilerWithAsciidoctor = do
  extension <- getUnderlyingExtension
  if extension == ".asciidoc" then
    getResourceString >>= withItemBody (unixFilter "asciidoctor" ["-"])
  else
    pandocCompiler

替换pandocCompilersite.hs_pandocCompilerWithAsciidoctor

3.重新编译

$ stack build
$ stack exec site rebuild

请注意,文件名必须2018-01-23-adoc-user-manual.asciidoc代替2018-01-23_adoc-user-manual.asciidoc,否则会出现错误:[ERROR] Missing field $date$ in context for item posts/2018-01-23_adoc-user-manual.asciidoc

于 2019-01-24T04:16:00.320 回答