From f62f8b7ef2f1c2357fbd41f5226fe433e632e042 Mon Sep 17 00:00:00 2001
From: Igor Pashev <pashev.igor@gmail.com>
Date: Thu, 13 Jan 2022 19:11:50 +0200
Subject: LaTeX: parse thebibliography

---
 src/Text/Pandoc/Readers/LaTeX.hs         | 38 ++++++++++++++++++++++++++++++++
 src/Text/Pandoc/Readers/LaTeX/Parsing.hs |  2 ++
 2 files changed, 40 insertions(+)

(limited to 'src')

diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs
index 20a2db76b..37fa4adf0 100644
--- a/src/Text/Pandoc/Readers/LaTeX.hs
+++ b/src/Text/Pandoc/Readers/LaTeX.hs
@@ -741,6 +741,14 @@ looseItem = do
   skipopts
   return mempty
 
+looseBibItem :: PandocMonad m => LP m Blocks
+looseBibItem = do
+  inListItem <- sInListItem <$> getState
+  guard $ not inListItem
+  skipopts
+  void braced
+  return mempty
+
 epigraph :: PandocMonad m => LP m Blocks
 epigraph = do
   p1 <- grouped block
@@ -886,6 +894,7 @@ blockCommands = M.fromList
    , ("strut", pure mempty)
    , ("rule", rule)
    , ("item", looseItem)
+   , ("bibitem", looseBibItem)
    , ("documentclass", skipopts *> braced *> preamble)
    , ("centerline", para . trimInlines <$> (skipopts *> tok))
    , ("caption", mempty <$ setCaption inline)
@@ -975,6 +984,7 @@ environments = M.union (tableEnvironments blocks inline) $
    , ("togglefalse", braced >>= setToggle False)
    , ("iftoggle", try $ ifToggle >> block)
    , ("CSLReferences", braced >> braced >> env "CSLReferences" blocks)
+   , ("thebibliography", theBibliography)
    ]
 
 filecontents :: PandocMonad m => LP m Blocks
@@ -1211,6 +1221,34 @@ descItem = do
   bs <- blocks
   return (ils, [bs])
 
+bibItem :: PandocMonad m => LP m (Inlines, [Blocks])
+bibItem = do
+  blocks
+  controlSeq "bibitem"
+  sp
+  lbl <- opt <|> nextNum
+  cite_key <- untokenize <$> braced
+  bs <- blocks
+  return (lbl, [divWith (cite_key, [], []) bs])
+  where
+    nextNum = do
+      st <- getState
+      let n = sTheBibItemNum st + 1
+      setState st {sTheBibItemNum = n}
+      return . str . T.pack . show $ n
+
+theBibliography :: PandocMonad m => LP m Blocks
+theBibliography = do
+  updateState $ \st -> st {sTheBibItemNum = 0}
+  items <- listenv "thebibliography" (many bibItem)
+  is_ol <- (== length items) . sTheBibItemNum <$> getState
+  return $
+    divWith
+      ("", ["thebibliography"], [])
+      (if is_ol
+         then orderedListWith (1, Decimal, Period) $ map (head . snd) items
+         else definitionList items)
+
 listenv :: PandocMonad m => Text -> LP m a -> LP m a
 listenv name p = try $ do
   oldInListItem <- sInListItem `fmap` getState
diff --git a/src/Text/Pandoc/Readers/LaTeX/Parsing.hs b/src/Text/Pandoc/Readers/LaTeX/Parsing.hs
index 9eb4a0cbc..8fb6bd5bc 100644
--- a/src/Text/Pandoc/Readers/LaTeX/Parsing.hs
+++ b/src/Text/Pandoc/Readers/LaTeX/Parsing.hs
@@ -172,6 +172,7 @@ data LaTeXState = LaTeXState{ sOptions       :: ReaderOptions
                             , sFileContents  :: M.Map Text Text
                             , sEnableWithRaw :: Bool
                             , sRawTokens     :: IntMap.IntMap [Tok]
+                            , sTheBibItemNum :: Int
                             }
      deriving Show
 
@@ -199,6 +200,7 @@ defaultLaTeXState = LaTeXState{ sOptions       = def
                               , sFileContents  = M.empty
                               , sEnableWithRaw = True
                               , sRawTokens     = IntMap.empty
+                              , sTheBibItemNum = 0
                               }
 
 instance PandocMonad m => HasQuoteContext LaTeXState m where
-- 
cgit v1.2.3