{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Readers.BibTeX
( readBibTeX
, readBibLaTeX
)
where
import Text.Pandoc.Options
import Text.Pandoc.Definition
import Text.Pandoc.Builder (setMeta, cite, str)
import Data.Text (Text)
import Citeproc (Lang(..), parseLang)
import Citeproc.Locale (getLocale)
import Data.Maybe (fromMaybe)
import Text.Pandoc.Error (PandocError(..))
import Text.Pandoc.Class (PandocMonad, lookupEnv)
import Text.Pandoc.Citeproc.BibTeX as BibTeX
import Text.Pandoc.Citeproc.MetaValue (referenceToMetaValue)
import Control.Monad.Except (throwError)
readBibTeX :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
readBibTeX = readBibTeX' BibTeX.Bibtex
readBibLaTeX :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
readBibLaTeX = readBibTeX' BibTeX.Biblatex
readBibTeX' :: PandocMonad m => Variant -> ReaderOptions -> Text -> m Pandoc
readBibTeX' variant _opts t = do
lang <- fromMaybe (Lang "en" (Just "US")) . fmap parseLang
<$> lookupEnv "LANG"
locale <- case getLocale lang of
Left e -> throwError $ PandocCiteprocError e
Right l -> return l
case BibTeX.readBibtexString variant locale (const True) t of
Left e -> throwError $ PandocParsecError t e
Right refs -> return $ setMeta "references"
(map referenceToMetaValue refs)
. setMeta "nocite"
(cite [Citation {citationId = "*"
, citationPrefix = []
, citationSuffix = []
, citationMode = NormalCitation
, citationNoteNum = 0
, citationHash = 0}]
(str "[@*]"))
$ Pandoc nullMeta []