pandoc-citeproc как API: processCites 'не добавляет ссылки - PullRequest
0 голосов
/ 19 января 2019

У меня есть небольшой текстовый файл в уценке:

---
title: postWithReference
author: auf
date: 2010-07-29
keywords: homepage
abstract: |
    What are the objects of
    ontologists .

bibliography: "/home/frank/Workspace8/SSG/site/resources/BibTexLatex.bib"
csl: "/home/frank/Workspace8/SSG/site/resources/chicago-fullnote-bibliography-bb.csl"
---

An example post. With a reference to [@Frank2010a] and more[@navratil08].

## References

и обработайте его в Haskell с processCites', который имеет единственный аргумент, а именно данные Pandoc, полученные из readMarkdown. Библиография и стиль csl должны быть взяты из входного файла.

Процесс не выдает ошибок, но результат processCites совпадает с текстом ввода; ссылки не обрабатываются вообще. Для того же ввода ссылки разрешаются с помощью автономного pandoc (это исключает ошибки в библиографии и стиле csl)

pandoc -f markdown -t html  --filter=pandoc-citeproc -o p1.html postWithReference.md 

Следовательно, проблема заключается в API. У меня есть код:

markdownToHTML4 :: Text -> PandocIO Value
markdownToHTML4 t = do
  pandoc   <- readMarkdown markdownOptions  t
  let meta2 = flattenMeta (getMeta pandoc)

  -- test if biblio is present and apply 
  let bib = Just $ ( meta2) ^? key "bibliography" . _String
  pandoc2 <- case bib of
    Nothing -> return pandoc
    _ -> do
                res <- liftIO $ processCites' pandoc --  :: Pandoc -> IO Pandoc
                when (res == pandoc) $ 
                    liftIO $ putStrLn "*** markdownToHTML3 result without references ***" 
                return res

  htmltex <- writeHtml5String html5Options pandoc2

  let withContent = ( meta2) & _Object . at "contentHtml" ?~ String ( htmltex)
  return  withContent

getMeta :: Pandoc -> Meta
getMeta (Pandoc m _) = m

Что я неправильно понимаю? Есть ли какие-либо опции для чтения, необходимые для citeproc? Библиография - это файл BibLatex.

Я нашел в hakyll code комментарий, который я не могу понять в свете этого кода - возможно, кто-то знает, что это за намерение.

-- We need to know the citation keys, add then *before* actually parsing the
-- actual page. If we don't do this, pandoc won't even consider them
-- citations!

Ответы [ 2 ]

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

Первоначальная проблема была очень простой: я не включил опцию Ext_citations в markdownOptions. Когда он включен, пример работает (благодаря помощи, которую я получил со страницы выпуска pandoc-citeproc). Код ссылки обновлен ...

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

У меня есть обходной путь (не ответ на первоначальный вопрос, я все еще надеюсь, что кто-нибудь сможет определить мою ошибку!). Просто позвонить в автономный pandoc с помощью System.readProess и передать текст и получить результат обратно, даже не читая и не записывая файлы:

processCites2x :: Maybe FilePath -> Maybe FilePath -> Text ->   ErrIO Text
-- porcess the cites in the text (not with the API)
-- using systemcall because the standalone pandoc works with 
-- call: pandoc -f markdown -t html  --filter=pandoc-citeproc
-- with the input text on stdin and the result on stdout
-- the csl and bib file are used from text, not from what is in the arguments

processCites2x _ _  t  = do
        putIOwords ["processCite2" ] -- - filein\n", showT styleFn2, "\n", showT bibfn2]

        let cmd = "pandoc"
        let cmdargs = ["--from=markdown", "--to=html5", "--filter=pandoc-citeproc" ]

        let cmdinp = t2s t
        res :: String <- callIO $ System.readProcess cmd cmdargs cmdinp

        return . s2t $ res
        -- error are properly caught and reported in ErrIO

t2s и s2t - утилиты преобразования между строкой и текстом, ErrIO - это ErrorT Text a IO, а callIO - это, по сути, liftIO с обработкой ошибок.

...