From 12cce1758ff82cced76fa1961076f99176ea2689 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Thu, 13 Jan 2022 19:11:50 +0200 Subject: LaTeX: parse thebibliography --- src/Text/Pandoc/Readers/LaTeX.hs | 32 +++++++++++++++++++++ src/Text/Pandoc/Readers/LaTeX/Parsing.hs | 2 ++ test/command/latex-thebibliography.md | 48 ++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 test/command/latex-thebibliography.md diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 20a2db76b..e4a3aaa58 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,28 @@ descItem = do bs <- blocks return (ils, [bs]) +bibItem :: PandocMonad m => LP m (Inlines, [Blocks]) +bibItem = do + blocks + controlSeq "bibitem" + sp + lbl <- opt <|> nextCite + cite_key <- untokenize <$> braced + bs <- blocks + return (lbl, [divWith (cite_key, [], []) bs]) + where + nextCite = do + st <- getState + let n = sTheBibItemNum st + 1 + setState st {sTheBibItemNum = n} + return . singleton . Str . T.pack . show $ n + +theBibliography :: PandocMonad m => LP m Blocks +theBibliography = + divWith ("", ["thebibliography"], []) . definitionList <$> + listenv "thebibliography" (many bibItem) + + 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 diff --git a/test/command/latex-thebibliography.md b/test/command/latex-thebibliography.md new file mode 100644 index 000000000..153fbfc13 --- /dev/null +++ b/test/command/latex-thebibliography.md @@ -0,0 +1,48 @@ +# The bibliography + +``` +% pandoc -f latex -t native +\begin{thebibliography}{100} + \bibitem[One1990]{one} The First. + \bibitem{two} The Second. + \bibitem[Three 1998]{three} The Third. + \bibitem{four} The Fourth. +\end{thebibliography} +^D +[ Div + ( "" , [ "thebibliography" ] , [] ) + [ DefinitionList + [ ( [ Str "One1990" ] + , [ [ Div + ( "one" , [] , [] ) + [ Para [ Str "The" , Space , Str "First." ] ] + ] + ] + ) + , ( [ Str "1" ] + , [ [ Div + ( "two" , [] , [] ) + [ Para [ Str "The" , Space , Str "Second." ] ] + ] + ] + ) + , ( [ Str "Three" , Space , Str "1998" ] + , [ [ Div + ( "three" , [] , [] ) + [ Para [ Str "The" , Space , Str "Third." ] ] + ] + ] + ) + , ( [ Str "2" ] + , [ [ Div + ( "four" , [] , [] ) + [ Para [ Str "The" , Space , Str "Fourth." ] ] + ] + ] + ) + ] + ] +] + +``` +