Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use asciidoc with hakyll?

I followed this tutorial to create a basic static web page using hakyll. It includes a number of pages rendered from markdown in the posts directory, e.g. 2015-08-12-spqr.markdown.

I prefer asciidoc to markdown, and tried adding an asciidoc 2018-01-23_adoc-user-manual.asciidoc to the post directory. However, hakyll throws an error when attempting to compile the page:

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

Is this problem that pandocCompiler cannot handle asciidoc? Is it possible to use asciidoc with hakyll?

like image 516
mherzl Avatar asked Oct 19 '25 07:10

mherzl


1 Answers

Current Pandoc can write Asciidoc but cannot read it: Issue.

Besides, there seems no Asciidoc parser written in Haskell, so there's no pure Haskell solution.

However, Hakyll has unixFilter which can use any command which inputs from stdin and outputs to stdout. Therefore, you can call asciidoctor command for converting .asciidoc file.

Here's the step:

1. Install asciidoctor

Ubuntu

$ apt-get install asciidoctor

Fedora

$ dnf install asciidoctor

Arch Linux

$ pacman -S asciidoctor

Ruby Gem

$ gem install asciidoctor

2. Define pandocCompilerWithAsciidoctor

Add following code to site.hs

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

replace pandocCompiler in site.hs with pandocCompilerWithAsciidoctor

3. Recompile

$ stack build
$ stack exec site rebuild

Note that filename have to be 2018-01-23-adoc-user-manual.asciidoc instead of 2018-01-23_adoc-user-manual.asciidoc, or you get error: [ERROR] Missing field $date$ in context for item posts/2018-01-23_adoc-user-manual.asciidoc

like image 112
ymonad Avatar answered Oct 22 '25 06:10

ymonad