Можно ли использовать Asciidoc с Хакиллом? - PullRequest
0 голосов
/ 24 января 2019

Я следовал этому руководству , чтобы создать простую статическую веб-страницу, используя хакилл. Он включает в себя количество страниц, отображаемых при уценке в каталоге posts, например, 2015-08-12-spqr.markdown.

Я предпочитаю asciidoc уценке, и попытался добавить asciidoc 2018-01-23_adoc-user-manual.asciidoc в каталог post. Однако 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? Можно ли использовать asciidoc с hakyll?

1 Ответ

0 голосов
/ 24 января 2019

Текущий Pandoc может писать Asciidoc, но не может его прочитать: Issue .

Кроме того, похоже, что парсер Asciidoc не написан на Haskell, поэтому нет чистого решения на Haskell.

Однако Hakyll имеет unixFilter , который может использовать любую команду, которая вводит из stdin и выводит в stdout.Поэтому вы можете вызвать команду asciidoctor для преобразования файла .asciidoc.

Вот шаг:

1.Установить asciidoctor

Ubuntu

$ apt-get install asciidoctor

Fedora

$ dnf install asciidoctor

Arch Linux

$ pacman -S asciidoctor

Ruby Gem

$ 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

и замените pandocCompiler в site.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

...